进程
进程是由【正文段 ,用户数据段,】(程序), 系统数据段共同组成的一个执行环境。
进程的状态
三态模型 运行-等待(阻塞)-就绪
其中,同一时间,只会存在一个运行态的进程,而我们平时看到的似乎多进程同时运行,其实不然,cpu是快速的在它们之间切换。
进程控制块PCB linux/sched.h
struct tast.struct
1>状态信息 保存着进程的状态(进行/阻塞)
2>链接信息 保存有头节点,链接子,父,兄的进程
3>各种标实符
4>进程点通信信息 (管道,消息队列,共享内存)
5>时间 定时器的信息
6>调度信息 (优先级,调度策略等)
7>文件系统信息
8>虚拟内存信息
9>处理器环境信息
linux进程的组织方式
- 进程链表
从inito进程开始向后链接组成双向循环链表(遍历一遍麻烦) - hash表
定义一个数字M,定义hash表从0-M,令pid%M得到的值链在相应的hash表节后(遍历时候有较强的专注性) - 就绪队列
- 等待队列
根据不同的状态排不同的链表
进程调度
原则:
公平
高效
响应时间
周转时间
吞吐量
几种调度策略:
- 时间片轮转
每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。 - 优先权调度
可抢占优先权调度,系统把处理机分配给优先权最高的进程,使之执行·但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。 - 多级反馈
多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。当一个新进程进入内存后,首先将它放入第一队列(优先级最高的队列)的末尾,按照FCFS原则排队等待调度。由于在同一队列中的进程是采用时间片轮转法,则不存在抢占剥夺式的情况。
创建进程的步骤
- 分配PCB 复制父进程的PCB
- 检查进程是否过多
- 将子进程设为等待状态
- 为进程分配有效pid
- 更新PCB(无法从父进程获取的)
- 把新进程插入进程链表,确保进程间亲属关系
- 进程设为就绪,插入就绪队列
- 让父子进程平分时间片
- 返回子进程pid