1. 静态库&动态库
1静态链接库的优点
(1)代码装载速度快,执行速度略比动态链接库快;
(2)只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。
2动态链接库的优点
(1)更加节省内存并减少页面交换;
(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
(3)不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
(4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
3不足之处
(1)使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
(2)使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见
2. Mask&Umask
Linux中的权限有r(读) w(写) x(执行),分别用数字4,2,1代表。
Umask是设置系统创建文件时的默认权限,是创建文件权限补码,对文件来说最大值是6
Umask设为为244,则创建的文件默认权限是422,文件的第一位是‘-’也就是-r—w–w-
3. 子进程&父进程
子进程继承父进程
用户号UIDs和用户组号GIDs
环境Environment
堆栈
共享内存
打开文件的描述符
执行时关闭(Close-on-exec)标志
信号(Signal)控制设定
进程组号
当前工作目录
根目录
文件方式创建屏蔽字
资源限制
控制终端
子进程独有
进程号PID
不同的父进程号
自己的文件描述符和目录流的拷贝
子进程不继承父进程的进程正文(text),数据和其他锁定内存(memory locks)
不继承异步输入和输出
父进程和子进程拥有独立的地址空间和PID参数。
子进程从父进程继承了用户号和用户组号,用户信息,目录信息,环境(表),打开的文件描述符,堆栈,(共享)内存等。
经过fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈,就像父进程把自己克隆了一遍。事实上,父进程只复制了自己的PCB块。而代码段,数据段和用户堆栈内存空间并没有复制一份,而是与子进程共享。只有当子进程在运行中出现写操作时,才会产生中断,并为子进程分配内存空间。由于父进程的PCB和子进程的一样,所以在PCB中断中所记录的父进程占有的资源,也是与子进程共享使用的。这里的“共享”一词意味着“竞争”
4. EXT文件
ext
第一代扩展文件系统,一种文件系统,于1992年4月发表,是linux核心所做的第一个文件系统。采用Unix文件系统(UFS)的元数据结构,以克服MINIX文件系统性能不佳的问题。
ext2
第二代扩展文件系统是LINUX内核所用的文件系统,用以代替ext。
ext3
EXT3是第三代扩展文件系统。Ext3文件系统是从Ext2文件系统发展而来,目前已经非常稳定可靠。它完全兼容ext2文件系统。
ext4
EXT4是第四代扩展文件系统,是ext3文件系统的后继版本。Ext4是Ext3的改进版,修改了Ext3中部分重要的数据结构,Ext4可以提供更佳的性能和可靠性,还有更为丰富的功能
详细内容可阅读:ext文件系统笔记
5. nohup命令
如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用 nohup 命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup 就是不挂起的意思( no hang up )
6. 常见退出命令
Esc:在vi的插入模式或者底行命令模式下进入命令模式
q:用来退出 man 手册查看命令或者配置文件的状态,或者more、less等命令查看文件的状态
exit:一般用于退出会话式程序或者交互式命令行,如ssh远程连接,切换 shell(Linux中)
quit:一般用于图形界面的退出
7. git合并
( 1 ) git merge
( 2 ) git pull
( 3 ) git cherry-pick
8. 与或非符号
! 为非运算
-a (and)表示并且,与运算
-o (or)表示或,或运算
9. Select 与 Epoll
select 和 epoll效率差异的原因:select采用轮询方式处理连接,epoll是触发式处理连接。
Select:
- Socket 数量限制:该限制可操作的 Socket 数由 FD_SETSIZE 决定,内核默认32*32=1024.
2.操作限制:通过遍历FD_SETSIZE(1024)个 Socket 来完成调度,不管哪个 Socket 是活跃的,都遍历一遍。
Epoll
- Socket 数量无限制:该模式下的 Socket 对应的fd列表由一个数组来保存,大小不限制(默认4k)。
2.操作无限制:基于内核提供的反射模式,有活跃 Socket 时,内核访问该 Socket 的 callback ,不需要遍历轮询。
但当所有的 Socket 都活跃的时候,所有的 callback 都被唤醒,会导致资源的竞争。既然都是要处理所有的 Socket ,那么遍历是最简单最有效的实现方式。
10. crond 命令
速记:分食(时)日月粥(周)
crond是linux用来执行周期性任务的进程
crontab基本格式 :
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用或者 /1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
时间配置段为 5 部分:f1 f2 f3 f4 f5,其中 f1 是表示分钟(0-59),f2 表示小时(0-23),f3 表示一个月份中的第几日(1-31),f4 表示月份(1-12),f5 表示一个星期中的第几天(0-6)。
当 f1 为 时表示每分钟都要执行,f2 为 时表示每小时都要执行程序,其余类推;
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推;
当 f1 为 /n 时表示每 n 分钟个时间间隔执行一次,f2 为 /n 表示每 n 小时个时间间隔执行一次,其余类推;
当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其余类推。
题中 /30 3 表示:每月的 3 号,每 30 分钟执行命令。
11. Linux运行级别
0 : 系统停机状态,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭。
1 : 单用户工作状态,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。
2 : 多用户状态,没有NFS支持。
3 : 完整的多用户模式,有NFS,登陆后进入控制台命令行模式。
4 : 系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
5 : X11控制台,登陆后进入图形GUI模式,XWindow系统。
6 : 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。运行init6机器就会重启
12. 磁盘默认权限
aqouta.user是用户磁盘配额需要的配置文件,而不是可执行文件
aquota.user 的权限是 -rw——,十进制值为 600
13. 常见的解/压缩命令
tar是操作.tar的命令
gzip是压缩.gz压缩包的命令
compress:压缩.Z文件
uncompress:解压缩.Z文件
14. 孤儿进程 & 僵尸进程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上 ,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表上面出面处理它的一切善后工作。 因此孤儿进程并不会有什么危害。
有时会刻意使进程成为孤儿。比如 守护进程daemon,nohup命令
15. Linux启动流程
1,BIOS加电自检
2,从硬盘0柱面 0磁道 第一扇区读512字节的MBR主引导记录
3,运行引导程序Grub并根据其配置加载kernel镜像后初始化
4,根据/etc/inittab中系统初始化配置执行/etc/rc.sysinit脚本
5,根据第3步读到的runlevel值启动对应服务
6,运行/etc/rc.local
7,生成终端待用户登录
16. 产生死锁的必要条件
(1) 互斥条件:一个资源每次只能被一个进程使用
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
(3) 不剥夺条件:进程已获得的资源,在使用完之前,不能强行剥夺
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
**产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
17. POSIX互斥锁
POSIX,英文全称Portable Operating System Interface,也就是可移植操作系统接口。
POSIX互斥锁是指统一接口的互斥锁,它有一些相关的函数。
POSIX互斥锁相关函数有以下:
pthread_mutex_init 初始化一个互斥量
pthread_mutex_lock 给一个互斥量加锁
pthread_mutex_trylock 加锁,如果失败不阻塞
pthread_mutex_unlock 解锁
pthread_mutex_destroy 销毁互斥锁