文章目录
- 什么是进程控制
- 总览
- 如何实现进程控制?
- 如何实现原语的“原子性”?
- 进程控制相关的原语
- 创建原语
- 撤销原语
- 子进程与父进程
- 阻塞与唤醒原语
- 切换原语
- 小结
什么是进程控制
控制进程的状态变换
总览
如何实现进程控制?
原语实现
假设不是原语实现,若此时进程PCB2等待的事件发生,当负责进程控制的内核程序将state设为1后,由于不是原语实现,所以此时如果接收到中断信号,那么会被中断信号打断.,此时会出现PCB2state=1,但它仍在阻塞队列指令中,state值矛盾。所以用原语不会发生
如何实现原语的“原子性”?
正常情况
关中断指令后才会检查中断,此时如果之前有中断信号,那么会处理该中断
如果关开中断不是特权指令的话,那么可能会出现进程关闭中断,从而一直霸占CPU的现象。
进程控制相关的原语
分配资源:内存空间
创建原语
用户登录:创建一个用户管理进程
作业调度:外存中的一个程序放入内存(将要执行的)
撤销原语
要终止一个进程时使用的,会将进程转换为终止态,最终消失
子进程与父进程
父进程是创建子进程的原始进程,而子进程则是由父进程通过fork系统调用创建出的一个新进程。具体如下:
- 父子进程的关系:
- 在Linux系统中,除了初始进程(进程0)之外,所有进程都是由其他进程通过fork()函数创建的。
- 调用fork()的进程称为父进程,而新创建的进程称为子进程。
- 一个进程只能有一个父进程,但可以有多个子进程。
- fork系统调用:
- fork()函数被调用一次,但在父进程和子进程中都会返回一次。
- 在子进程中,fork()的返回值是0;而在父进程中,返回的是新创建的子进程的进程ID。
- 父子进程的执行顺序:
- fork之后,父进程和子进程的执行顺序是不确定的。操作系统内核负责调度这- 两个进程,它们可能会交替运行。
- 子进程的特点:
- 子进程是父进程的一个复制品,它继承了父进程的大部分属性,包括文件描述符、环境变量等。
- 子进程可以通过exec系列函数替换自己的映像,从而执行新的程序。
- 父子进程的通信:
- 父子进程可以通过管道、信号、共享内存等多种方式进行通信。
- 父进程通常用于创建子进程并等待其完成,或者与子进程进行数据交换。
- 了解父子进程的概念和关系对于理解Unix/Linux系统的进程模型至关重要,也是进行多进程编程的基础。
阻塞与唤醒原语
阻塞原语:使进程运行态转换到阻塞态
唤醒原语:使进程由阻塞态转换到就绪态
有阻塞一般就有唤醒,所以二者是成对出现的
切换原语
会让一个进程从运行态转换到就绪态和另一个进程从就绪态转换到运行态
运行环境信息(进程上下文):相关寄存器信息
小结
创建和终止进程控制原语会用到分配/回收资源
更新PCB一般包括修改进程状态或保护/恢复运行环境