操作系统的核心就是多进程管理
单个CPU如果顺序执行程序,效果如图. 读磁盘是一个很消耗时间的操作
但是读磁盘并不是一个需要cpu的操作
,所以cpu在读磁盘的时候去如果去执行程序B的话,cpu利用率就会增加
那么问题来了,当从程序A切换到B再切换回去的时候,如何知道已经执行到哪里了呢? 这时候就需要有一个数据结构来存储 cpu切换之前的状态
叫做 PCB.
PCB
PCB用来描述一个进程.一个操作系统中,运行着多个PCB,操作系统是如何管理的
进程的状态
操作系统根据进程的状态将进程分类
当一个进程需要处理IO事件的时候,操作系统就把该PCB放到 阻塞队列中
,等IO读取完毕后操作系统再将 PCB 放回 就绪队列
.
多进程如何调度
当一个线程需要读写磁盘的时候,操作系统会将该线程状态设置为 wait
然后放入等待队列中.
然后调用调度器 调度器 通过算法获得下一个需要执行的PCB
把当前的PCB和下一个PCB进行交换
多进程如何切换
上面说了操作系统如何选出下一个将要被CPU调度的进程,那么接下来看进程是如何切换的.
swich(pCur,newCur){
pCur.ax = CPU.ax;
pCur.bx = CPU.bx;
...
pCur.cs = CPU.cs;
CPU.ax = newCur.ax;
CPU.bx = newCur.bx;
....
CPU.cs = newCur.cs;
}
很简单,就是把新的进程的PCB给CPU就可以自动执行了
多进程的影响
多个进程在执行的时候, 同时都被放在了内存中
. 那么进程A可能就会操作到进程B里面的数据.
线程1
------------------
mov ax, 10010b
mov [100], ax
-------------------
线程2
-------------------
100: 10023
-------------------
这样直接就会把内存100的数据改掉,而这内存100本了是线程2所使用的.
操作系统使用 内存映射表
来解决这个问题