1.操作系统的多进程图像
操作系统main函数中最后 if(!fork()) {init();} ,也就是main函数最后创建了第1个进程,init执行了shell(Windows)桌面。
操作系统管理和组织进程都使用PCB(Process Control Block),不同的程序的PCB放在不同的位置,用于记录该进程运行时的状态。操作系统对进程进行分类,例如等待执行的进程和等待某些事件完成的进程,例如等待磁盘读写。
![](/i/l/?n=23&i=blog/3219843/202308/3219843-20230823210852686-768354236.png)
![](/i/l/?n=23&i=blog/3219843/202308/3219843-20230823210922733-1520726283.png)
![](/i/l/?n=23&i=blog/3219843/202308/3219843-20230823210932611-1363068434.png)
- 新建态:系统完成创建进程的一系列工作。只能转换到就绪态
- 就绪态:拥有除CPU之外的其他所需的所有资源。当拥有CPU时就可以转换到运行态
- 运行态:用于CPU和所需的所有资源
- 当时间片到或者处理机被抢占了,就转换到就绪态;
- 当进程用“系统调用”的方式申请某种系统资源或者请求等待某个事件的发生,则进入阻塞态(主动)
- 阻塞态:没有所需要的资源。当所需要的资源得到分配时,进入就绪态(被动)
- 终止态:进程运行结束或者出现不可修复的错误时,由运行态转到终止态
进程切换的三个部分:队列操作+调度+切换
pCur.state = 'W'; // 启动磁盘读写,将当前进程设置为阻塞状态 schedule(); // 将pCur放到DiskWaitQueue schedule() { pNew = getNext(ReadyQueue); // 从就绪队列找到下一个进程,调度函数算法非常复杂 switch_to(pCur,pNew); // 保存当前进程的现场,把下一个进程的现场恢复 }
把当前进程的现场保存到pCur中(PCB),把切换程序的pNew(PCB)读取到寄存器中
多个进程同时存在于内存的问题:不同进程的地址可能影响其他进程的代码,这可能导致其他进程的崩溃。操作系统需要维护一张映射表,将内存映射到实际的内存地址中,把不同的进程隔离开来保证进程的安全,下图中同样对内存100的操作分别映射到了内存地址780和内存地址1260。
![](/i/l/?n=23&i=blog/3219843/202308/3219843-20230823212257632-420283698.png)