操作系统八股文02-进程管理
1. 进程组成
- PCB
- 程序段
- 数据段
进程状态保存在PCB中
2. 进程状态及调度
**调度类别:**作业调度、中级调度、进程调度(eg. FCFS、SJF、时间片轮转、多级反馈队列)
3. 进程与线程
3.1 基本概念
-
进程:为了更好的实现操作系统的并发操作,资源分配的基本单位
-
线程:为了提高操作系统的并发操作效率,调度的基本单位
同一进程中的线程共享进程中的资源,所以访问资源时需要保证线程安全(eg. 锁、信号量、条件变量、原子操作)
3.2 上下文切换
- 进程上下文切换:需要保存寄存器、用户栈、PC寄存器、状态码、文件表、页表等
- 线程上下文切换:需要保存寄存器、用户栈、PC寄存器等
4. 进程组、Session、终端
4.1 进程组
- 一组进程的集合
- 每个Group存在一个Leader,PGID = leader PID
4.2 Seesion
- 一个或多个Group可构成一个Session
- 每个Session存在一个Leader,SID = Leader PID
- Session中的Group可称为Job,一个Session中包括一个前台Job和若干个后台Job
- 前台Job:继承Session的stdin、stdout、stderr
- 后台Job:继承Session的stdout、stderr(jobs 查看后台job)
- 前台Job转后台Job
- ~ &
- ctrl+z,再执行bg
- nohup ~ &
4.3 终端
- 命令行界面,通过shell指令实现OS与User的交互
- 一个Session和与一个终端绑定,作为输入输出的接口
- 终端异常退出过程
- 终端hongup
- 内核向Session Leader发送SIGHUP信号
- Session Leader向其他进程发送SIGHUP信号,杀死Session中的其他进程
- Session Leader结束
- 终端使用exit退出,不发送SIGHUP信号
5. 特殊进程
5.1 父子进程
- 父进程中调用fork创建子进程
Fork返回值:返回0,表示当前为子进程;返回非0,表示当前为父进程,返回值为子进程的PID。
- 父子进程暂时共享资源,当子进程读写操作时才复制资源
5.2 孤儿进程
- 正常情况下,父进程fork出的子进程的资源由父进程负责回收(父进程通过调用wait/waitpid等待子进程结束并回收资源)
- 当父进程未调用wait/waitpid直接结束,而子进程仍在运行时,子进程变为孤儿进程
- 当进程变为孤儿进程时,其父进程变为init进程(PPID=1),并由init进程负责回收其资源
5.3 僵尸进程
- 当子进程结束且退出状态没有被父进程捕获到(wait/waitpid)时,子进程未真正结束,而是变为僵尸进程
- 解决方法
- 父进程阻塞调用wait/waitpid
- 父进程在SIGCHLD信号上绑定处理函数,并在函数中调用wait/waitpid
- 父进程忽略SIGCHLD信号(SIG_IGN),此时子进程由init进程负责自动回收
- 两次fork创建子进程(可看作孙子进程),此时子进程变为孤儿进程,结束时由init进程负责自动回收
- 补救办法
- Kill 父进程,此时僵尸进程变为孤儿进程,由init进程负责自动回收
5.4 守护进程
- 后台运行,自己为Group Leader和Session Leader,独立于终端(见5)
- 创建方法
- 后台job + stdout、stderr重定向 + bash exit
- nohup ~ &
- fork fork & + 重定向
Nohup 使进程忽略SIGHUP信号
6. 进程间通信
- 管道
- 无名管道:一种特殊的内存文件,只存在于内存中,单向
- 有名管道:FIFO文件,存在于文件系统中,单向
- 共享内存:临界资源,需手动实现互斥访问,访问速度快
- 消息队列:无需提供同步方法,进程可根据消息类型选择接受
- 套接字:IP + port,可实现不同主机间的进程通信
- 信号:SIGHUP、SIGCHLD、ctrl+c、Kill
- 信号量
- System V 信号量
- 常用于进程间通信,使用ID标识
- 内核对象,独立与进程,内核管理
- POSIX 信号量
- POSIX 有名信号量
- 与System V 信号量类似,使用名字标识
- 在/dev/shm/中产生文件,管理时通过文件进行
- POSI 无名信号量
- 需要指定内存地址(私有内存用于线程通信,共享内存用于进程通信)
- 一般用于线程/父子进程通信
- POSIX 有名信号量
- System V 信号量
7. 进程同步机制
- 同步:直接制约关系,调整进程顺序
- 互斥:间接制约关系,临界资源访问
- PV操作、管程与条件变量、生产者与消费者
8. 死锁
- 多个进程因竞争资源而造成的僵局
8.1 死锁产生的必要条件
- 互斥条件
- 不剥夺条件
- 请求保持条件
- 循环等待条件
8.2 死锁处理策略
- 鸵鸟策略:不做任何操作
- 死锁预防:进程开始前破坏四个必要条件之一
- 死锁避免:进程运行过程中分配资源时,使用银行家算法寻找安全序列
- 死锁检测和解除:发送死锁时进行如下操作
- 检测:资源分配图是否可简化
- 解除:资源剥夺、进程撤销、进程回退