- 多进程图像:操作系统把多个进程记录好,按照合理的次序推进(分配资源,进行调度),所得的图像就是多进程图像。
L9 多进程图像概述
多进程图像:操作系统把多个进程记录好,按照合理的次序推进(分配资源,进行调度),所得的图像就是多进程图像。
在前面system模块执行到
main.c
,将操作系统建立起来以后,到最后一句if(!fork()){init();}
启动了shell,用户就可以通过在shell上输入命令来让计算机完成一系列的任务,即建立了进程。所以★用户使用计算机就是建立了一堆进程,操作系统管理计算机就是通过CPU管理这建立的一堆进程。多进程图像贯穿始终,从计算机启动开始到关机结束。在Windows系统里,通过打开任务管理器就可以看到启动的一系列进程。
★多进程的组织
★多进程的组织 = PCB + 状态 + 队列。
由前所述,为了记录进程在某一时刻的信息,需要PCB,即进程控制块来记录(★操作系统通过PCB来感知进程),将这些进程的进程控制块合理地组织起来,就形成了多个队列:
一个CPU一次只能执行一个进程,所以执行队列里只有一个PCB;
当执行队列里的PCB所代表的进程完成执行以后,就可以让就绪队列里的下一个PCB进入执行队列,开始执行该进程;
另外有一些进程可能要等待某事件完成,比如拿到磁盘的使用权才能开始执行,所以要先在磁盘等待队列,当获得磁盘的使用权后就可以进入就绪队列等待执行。
所以通过上述例子,就可以★将进程大致分为就绪态、运行态和阻塞态三个状态,通过PCB+状态+队列,就可以对多进程进行组织了。操作系统就是在这些状态的基础上,对多进程进行管理。
★多进程的交替
★多进程的交替:队列操作 + 调度 + 切换。
调度:从就绪队列中找到下一个将要进入执行的进程,可以有很多种不同的调度算法;
切换:要从CPU中保存上一个进程的信息到对应的PCB中,并将要执行的进程的信息从对应的PCB中读取到CPU中。
多进程的相互影响
多个进程同时存在于内存中可能会相互影响,如下所示:
进程1中的代码要将寄存器ax中的值存到地址为100处,但地址为100处存储的是进程2的代码,就会引起冲突,所以在多进程管理时还要考虑到多个进程之间相互影响的情况。可以通过映射表来解决,这将在内存管理章节进行介绍。
★多进程的合作
从一个很经典的例子来看多进程的合作:生产者-消费者例子。
生产者往共享数据中添加item,消费者从共享数据中取出item,通过counter来限制生产者添加item(当counter==BUFFER_SIZE时,不能再让生产者添加item了)和消费者取出item(当counter==0时,不能再让消费者取出item了),但是因为多进程是交替运行的,所以可能会产生问题。
就像下面所示,由于生产者和消费者进程是交替运行的,又都执行了一次,所以counter应该等于初始值5,但由于交替执行,所以可能存在右侧这个执行序列,最后导致counter的值为4,就出现错误了。
其中一个解决办法是可以给counter上锁:如下所示,在生产者进程运行时,给counter上锁,使得消费者进程在counter上锁时不能运行,只有当生产者进程运行完,将counter开锁后,消费者进程才能开始运行并给counter上锁,等消费者进程运行完后又给counter开锁,最终使得多进程在合理的顺序上进行推进,而不是随意交替推进。
最后总结一下,多进程图像涉及到多进程的组织(PCB、状态和队列)、多进程的交替(队列操作、调度和切换)、多进程的相互影响(涉及到内存映射表)和多进程的同步与合作(锁、信号量机制等),接下来将在后面的课程中对这些内容进行详细的介绍。