简单理解什么是进程
什么是进程?
进程可以理解为一个正在运行的程序,它有一些比较重要的组成部分:
- 内存:进程被创建的时候,指令会被加载在内存中、以及一些初始化的数据也会被加载到内存中
- 寄存器:存放着下一步指令在内存中的位置,以及一些特殊的寄存器比如栈指针、堆指针等等
进程创建的流程
其实就是来探究一些如何把磁盘中的程序指令转化成一个进程。
- 把对应的代码和数据都加载到内存中
- 给堆(可能分配)、栈(main()函数的栈帧分配)等结构分配内存
- 初始化任务,如I/O任务的一些文件描述符
- 执行main()
进程状态
那对应的状态大致有5个:创建、就绪、运行、阻塞、结束
对于操作系统如何知道哪些进程是什么状态才能更好的调度进程?
操作系统使用了进程列表的方式存储不同状态的进程。
进程上下文切换
对于上下文切换,主要有CPU上下文切换、进程上下文切换、线程上下文切换这3种,大致的意思都差不多。
当进程的时间片用完或者是被阻塞需要放弃时间片又或者是被CPU调度等情况,就需要进行进程上下文切换,这里举例进程A转换到进程B,主要呢就是把进程A的寄存器信息保存到内核栈A中,系统调用完成以后,再将内核栈暂存的寄存器B信息恢复到进程的寄存器B中,实现一次换出再换入,接下来CPU就可以根据进程寄存器B内的值来执行B进程的指令了。
当进程A分到的时间片用完操作系统会产生一个时钟中断,运行预先配置的中断处理程序,操作系统查找陷阱表让进程A从用户态陷入到内核态(此时操作系统重新获得CPU的控制权,把进程A的寄存器保存到内核栈A中),操作系统会调用switch()调整内核栈指针指向内核栈B,然后把内核栈B的进程B的寄存器恢复,然后返回到用户态,此后调用的就是进程B了。
僵尸进程
可以理解为结束状态的进程就是僵尸进程,僵尸进程是已经退出但是还没有被清理的进程。
它会占有一定的内存空间,但是它的返回值可被创建它的父进程知晓这个子进程是否成功执行任务。(返回0说明成功)
进程调度
我们如何衡量进程任务去调度进程,用到一个周转时间,主要服务于短作业。
周转时间:完成时间 - 到达时间
- 先到先服务(FIFO):顾名思义,按照到达时间排序来调度进程,但是会出现长作业导致后来的短作业饥饿问题
- 短作业优先(SJF):顾名思义,短作业优先,但是可能导致长作业饥饿,或者是长作业调度期间,短作业才到达导致短作业饥饿问题
- 短完成时间优先(STCF):针对长作业调度期间,短作业才到达导致短作业饥饿问题,有这个抢占式的SJF(SJF本身是非抢占式的),可以抢占长作业的CPU
因为人类需要在电脑前等待反应,自然就需要提高等待的时间,也就出现了新的度量标准,响应时间,主要服务于长作业。
响应时间:首次调用时间 - 到达时间
- 轮转(RR):也就是时间分片,需要合理设置好分片的大小,摊销上下文切换的成本(保存和恢复寄存器、更换CPU缓存、TLB等状态),避免了长作业饥饿的问题,但是会损失一定的周转时间
兼顾周转时间和响应时间
- 多级反馈队列(MLFQ):结合了短作业优先以及轮转的优点,每个任务都先当作短作业放到第一层队列,减少了周转时间;以及配合时间片,避免了长作业饥饿,减少了响应时间
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 白兰!