操作系统在管理CPU的时候引出了多进程图像,通过多进程图像操作系统管理明白了CPU,CPU管理明白了别的硬件自然而然的就跟着带动起来了,所以多进程图像是操作系统的核心图像。
因为多进程的引入是为了管理好CPU,所以我们就先介绍CPU的管理方法。
1、CPU的工作原理
如图中所示,当PC=50时,CPU就会发出取址指令,把50放在地址总线上,当内存接收到信号后,就会将把位于地址50里的指令通过总线再传送给CPU。CPU得到该指令后,就会根据指令中的内容执行。
总结: 自动地取址、执行(PC自动累加)
CPU的管理方法就是把PC的初值设置为一段程序的开始地址,之后PC就会自动地累加工作,进行取值执行。
上图中的程序中,有I/O指令执行一条语句再比上没有I/O指令执行一条语句大约的比值是
1
0
6
10^6
106。
I/O指令会涉及磁盘的存取,因此I/O指令相对于其他计算指令来说执行起来会非常慢。如果CPU一直在等待I/O完成后,才去继续工作就会造成CPU的利用率非常的低。所以,为了提高CPU的利用率,可以在电脑进行I/O操作时,让CPU先去执行其他任务,当I/O操作完成后,再回来执行对应的后续操作。
当多个程序在内存中,通过切换程序,来减少CPU的空闲时间,提高CPU的利用率。
多道程序交替执行就会让CPU忙碌起来。
某一设备的利用率=某一设备使用时间 / 全部程序的执行时间
多道程序交替执行
就成为了管理CPU的核心。一个CPU上交替的执行多个程序,就引入了并发
的概念。实现的方式就是在适当的时候让PC进行切换。
在切换前,要记录好之前所执行程序的相关信息(程序执行到哪里、执行的样子等等),即程序在当前时刻下执行时的样子。此时运行的程序和静态程序不一样了。
因为静态程序和运行的程序情况不一样了,我们就单独把运行的程序拿出来当作一个事物,而这个事物用传统的观念不能很方便的去描述解决,就引入“进程”(这个概念去刻画这个新事物。
进程是进行(执行)中的程序。 这些与静态程序不一样的地方都存放在了一个新的数据结构PCB当中。
当CPU开始跑多个进程,而不是按顺序执行静态程序时,就大大提高了CPU的利用率。多个进程向前跑的样子,就是管理CPU的核心样子。
2、多进程图像
操作系统从刚开机时就形成了多进程图像,直到关机为止。
if(!fork()) { init(); }
使用fork()创建了一个进程,该进程执行了init()
,启动了一个shell。
其中shell
的核心代码就是while(1)
循环中,当用户再输入一句命令后,又会创建一个新的子进程并根据输入的命令进行执行。(用户执行任务也是创建一个进程,用于完成用户指定的任务)
实际上,用户启用计算机就是启用一堆进程,用户管理计算机就是管理一堆进程。
(1)如何组织多进程
PCB帮助操作系统感知和形成进程。使用PCB来形成一些队列,来组织多进程。多个进程所对应的PCB分别放置在不同的地方,通过队列连接起来。操作系统拥有它们的存储位置信息,可到对应位置进行获取。
将进程根据状态来区分开来,便于操作系统的管理。
区分阻塞态和就绪态:
(1)阻塞态:进程停止,缺必要的资源,给CPU调度机会也不能运行。
- 事件:
- 等待资源(临界资源、临界区)
- 信息交换(I/O输入输出、读写内存)
- 进程同步(停下来等待其他进程)
(2)就绪态:进程停止,资源都不缺,只缺CPU调度,给CPU调度就能运行
- 事件:
- 阻塞的进程获得等待的资源或信号 (阻塞态 —> 就绪态)
- 时间片轮转的情况下,进程的时间片用完了 (运行态 —> 就绪态)
- CPU调度给优先级更高的进程 (运行态 —> 就绪态)
(2)如何切换多进程
1)队列操作
保存现场状态,将进程放到阻塞队列或就绪队列中,再根据调度规则从就绪队列中调度一个进程来执行。
3)调度
3)切换
假设正在执行进程为p1,对应PCB1,要切换到的进程为p2,对应PCB2。
当要进行进程切换时,先通过赋值的方式,将当前CPU里的信息保存到PCB1之中。然后再将PCB2中的信息,赋值给CPU,从而完成了从p1进程到p2进程的切换。
(3)如何解决多进程交替时的相互影响?
当多个进程同时存在于内存时,可能会出现访问统一资源并对该资源进行改写的问题。这时,就需要限制对该资源对应的地址的读写操作
。
通过映射表
来实现地址空间的分离。
映射表是内存管理的核心!
进程1访问100地址时,经过映射表后得到的物理内存地址是782,进程2访问100地址时,得到的物理内存地址时1260,实现了多个进程各自只能访问各自的内存空间而互不影响,从而实现了多进程共存。而只有共存的进程,才可以进程交替执行,也就相当于进程共存为进程的交替执行提供了条件。
(4)如何让多进程合作?
进程1和进程2合作执行时,可能会出现同时修改7地址这个位置。
想要完成多进程的合作,核心在于进程同步(合理的推进顺序),在使用临界资源时将其上锁。
(5)总结
总结
进程的四个任务
(1)PCB
是OS中最重要的结构,贯穿始终,解决了如何组织多进程。
(2)写调度程序,解决了如何调度多进程(调度规则
)。
(3)操作寄存器完成切换,解决如何切换多进程(PCB与CPU信息
)。
(4)进程同步与合作,要有地址映射,解决了如何解决多进程相互的影响与合作。(映射表、同步与互斥
)