操作系统知识概要
进程概念: 进入到内存中执行的应用程序成为一个进程
进程是由 [ 程序段 ] + [ 数据段 ] + [ PCB ] 构成
PCB(记录进程资源及状态信息)
- PID
- 优先级
- 资源分配清单
一、进程调度算法
批处理
- 先来先服务 【缺点】:短进程等待时间过长
- 短作业优先 【缺点】:长进程等待时间过长
- 高响应比优先
响应比 = (等待时间+要求服务时间)/ 要求服务时间
并发
- 时间片轮转 规定执行时间 + 先来先服务
- 虚拟轮转 为了使IO密集型跟上响应时间,阻塞解除会进入到辅助队列,优先被调度
- 优先级调度
二、页面置换算法
1. 最佳置换算法OPT
- 一段时间内不被使用的页面
2. 先入先出FIFO
- 淘汰最早进入内存的
3. 最久未使用LRU
4. 时钟置换CLOOCK
- 通过标志位判断页面是否被修改,优先淘汰未修改页面
三、僵尸进程与孤儿进程
我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。
孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸状态是一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会在以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
僵尸进程与孤儿进程的区别:
孤儿进程是子进程还在运行,而父进程挂了,子进程被init进程收养。僵尸进程是父进程还在运行但是子进程挂了,但是父进程却没有使用wait来清理子进程的进程信息,导致子进程虽然运行实体已经消失,但是仍然在内核的进程表中占据一条记录,这样长期下去对于系统资源是一个浪费。僵尸进程将会导致资源浪费,而孤儿则不会。
那么如何避免僵尸进程
- fork两次。原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程
- 通过信号机制。子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程