文章目录
7.进程:
7.1程序运行需要通过操作系统的加载器来实现,加载器是操作系统中的程序,当执行程序时,加载器负责将此应用程序加载内存中去执行
7.2操作系统下的应用程序在运行 main 函数之前需要先执行一段引导代码,最终由这段引导代码去调用应用程序的 main 函数
7.3进程是操作系统分配资源的最小单位
7.4进程有单线程进程和多线程进程
7.5进程终止函数:
atexit 库函数用于注册一个进程在正常终止时要调用的函数,该终止函数只有在调用 exit 时才会被调用
7.6进程的内存布局:
代码段(正文段),数据段,未初始化数据段,栈(向下增长),堆(向上增长)
7.7创建子进程:
fork,vfork
7.8孤儿进程和僵尸进程:
在子进程结束时,父进程需要用到 wait/waitpid 给子进程收尸,如果父进程未给子进程收尸,子进程将成为僵尸进程
如果父进程先于子进程结束,子进程将成为孤儿进程被 init 进程收养
7.9exec 族函数:
execl,execlp,execle,execv,execvp,execvpe
7.10进程状态:
就绪态,运行态,僵尸态,可中断睡眠状态(浅度睡眠),不可中断睡眠状态(深度睡眠)以及暂停态
7.11进程关系:
7.11.1无关系(相互独立),父子进程关系,进程组以及会话
7.11.2进程组:
#获取进程对应的进程组 id
getpgrp,getpgid
#加入一个现有的进程组或创建一个新的进程组
setpgrp,setpgid
7.11.3会话:
#获取进程的会话 id
getsid
#创建一个会话
setsid
7.12守护进程:
pid = gid = sid,守护进程自成会话
7.13单例模式和多例模式:
使用文件锁实现单例模式:
服务器程序使用这种方法来保证程序的单例模式运行,在 Linux 系统中 /var/run/ 目录下有很多以 .pid 为后缀结尾的文件
7.14向进程发送信号:
kill,sigqueue
7.15进程间通信(IPC):
7.15.1进程隔离:
进程的隔离实现,使用了虚拟地址空间。进程A的虚拟地址和进程B的虚拟地址不同,这样就防止进程A将数据信息写入进程B
7.15.2虚拟地址空间:
1).32位系统最大寻址范围是4GB
2).Linux 系统将最高的1G字节供内核使用,称为内核空间,而较低的 3G 字节供各个进程使用,称为用户空间
3).进程的用户空间是独立的,而内核空间是共有的,进程切换时,用户空间切换,内核空间不变
7.15.3IPC 通信原理:
内核空间调用 copy_from_user 和 copy_to_user 实现同一块内核缓存区和不同进程的用户空间内存缓存区的数据交换
7.15.4IPC 通信方式:
无名管道,有名管道,消息队列,信号量,信号,共享内存,Socket