1.操作系统的多进程图像
操作系统main函数中最后 if(!fork()) {init();} ,也就是main函数最后创建了第1个进程,init执行了shell(Windows)桌面。
操作系统管理和组织进程都使用PCB(Process Control Block),不同的程序的PCB放在不同的位置,用于记录该进程运行时的状态。操作系统对进程进行分类,例如等待执行的进程和等待某些事件完成的进程,例如等待磁盘读写。
- 新建态:系统完成创建进程的一系列工作。只能转换到就绪态
- 就绪态:拥有除CPU之外的其他所需的所有资源。当拥有CPU时就可以转换到运行态
- 运行态:用于CPU和所需的所有资源
- 当时间片到或者处理机被抢占了,就转换到就绪态;
- 当进程用“系统调用”的方式申请某种系统资源或者请求等待某个事件的发生,则进入阻塞态(主动)
- 阻塞态:没有所需要的资源。当所需要的资源得到分配时,进入就绪态(被动)
- 终止态:进程运行结束或者出现不可修复的错误时,由运行态转到终止态
进程切换的三个部分:队列操作+调度+切换
pCur.state = 'W'; // 启动磁盘读写,将当前进程设置为阻塞状态 schedule(); // 将pCur放到DiskWaitQueue schedule() { pNew = getNext(ReadyQueue); // 从就绪队列找到下一个进程,调度函数算法非常复杂 switch_to(pCur,pNew); // 保存当前进程的现场,把下一个进程的现场恢复 }
把当前进程的现场保存到pCur中(PCB),把切换程序的pNew(PCB)读取到寄存器中
多个进程同时存在于内存的问题:不同进程的地址可能影响其他进程的代码,这可能导致其他进程的崩溃。操作系统需要维护一张映射表,将内存映射到实际的内存地址中,把不同的进程隔离开来保证进程的安全,下图中同样对内存100的操作分别映射到了内存地址780和内存地址1260。
但实际上多进程之间可能存在合作关系,比如打印机进程需要读取word进程的内容来完成打印的工作,这时可以提交到共享缓冲区。但这里可能存在一个问题,因为进程1和进程2是交替进行的,可能进程1首先读取到空间7是空的,接下来切换到进程2也读取到空间7是空的,开始向空间7写入,接下来切换到进程1继续在这里写入,会导致写入缓冲区的内容是错误的。所以操作系统需要管理一个合理的进程推进顺序。 标签:操作系统,PCB,pCur,线程,进程,就绪,读取 From: https://www.cnblogs.com/stuxuan/p/17652782.html