(第三节)操作系统--多进程图谱概述
写在最前面:本篇文章参考哈工大操作系统课程。主要是对操作系统中多进程图谱的概述,为下几节内容做好铺垫。
CPU管理的直观想法
由cpu的管理引出了
多进程图谱
,进而带动其他硬件设备的管理。
CPU的使用
管理cpu之前首先要使用cpu,而管理的目的就是为了让cpu的使用更加高效。
如上图所示,CPU的工作原理:
取指-执行
。
即根据PC地址获取内存中存储的代码并解析执行之,同时累加读取后续代码进行下一步操作。
所以管理cpu的一个最直观的方法就是:
设置好初PC地址
。
一个问题
到这里,有一个问题:
CPU的利用率
。我们以下面这个程序为例:
如图所示,一个含有IO指令的程序比之不含有IO指令的程序要慢很多。
所以我们就会面临一个问题:在执行IO指令时CPU要干什么,是等待还是执行其他程序?
问题的解决
解决方法:
多程序交替执行
上图可见,通过交替执行程序可以显著提高利用率
。而利用率的提高不就是CPU管理的目的吗。
问:如何进行程序的交替执行呢?
答:通过修改PC指针即可完成。
新问题:只是修改寄存器PC就可以了吗?
回答:不。还需要记录信息:
切换前后程序的状态要保存
。
如图所示,进行查询的交替执行时不仅仅要进行PC的修改,还要保存好每一个程序的状态信息
。
因为运行中的程序与静态程序是不一样的,为此我们引入进程
的概念。
进程的引入
进程就是正在执行的程序
。而多进程的并发
执行就是CPU管理的核心部分。
下面我们将接着进程的概念进行介绍,搭建起一个大概的多进程图像。
多进程图像
前面我们介绍了:
为什么要有多进程
下面就要来看:操作系统如何实现多进程
。
什么是多进程图像
在用户层面:多进程图像就是打开了多个应用程序
在操作系统层面:多进程图像就是管理好这些进程,记录这些进程的状态信息、资源调度等,负责各个进程的推进。
系统的第一个进程
如图所示,就是一个多进程的例子:首先启动1号进程也就是shell进程
,此进程通过fork()
创建新的进程执行用户指令。一个进程执行完毕后可以通过exit()
退出(shell进程不会退出)。
每执行一个任务都要启动一个进程,通过多个进程的推进实现计算机工作。
一个直观的画面:
任务管理器
如图所示,我们的计算机中正在执行很多进程。 操作系统就是通过管理进程来管理计算机的使用。
如何实现多进程图像
之后几个部分会详细介绍多进程图像的实现,这个部分主要是一个引子。
多进程的组织方式:
PCB+状态+队列
如图所示,进程有三个状态:运行态
、就绪态
、阻塞态
将PCB
放在不同的区域以标识进程的不同状态,这些区域叫做队列
。
通过进程状态的转换
来实现进程的管理。
多进程的交替实现:
队列操作+调度+切换
我们以具体的代码来看多进程交替的实现思路,这也是并发的基本含义。
一个很关键的函数:schedule()
。
其作用就是实现进程状态的转换
,即pCur
和pNew
的切换。
当然其中涉及到进程的调度问题也就是
getNext
:
进程的调度
是一个很复杂、深刻的问题,后面会专门拿出一个部分具体介绍,当然也是介绍一些简单的调度策略。
进程的切换也就是
switch_to()
- 首先这个函数实现了进程状态信息的保存,将
pCur
信息保存到对应的PCB中。 - 之后实现进程的切换,即将
pNew
信息传入CPU中
多进程的相互影响:内存冲突问题
问题:多个进程的内存空间存在冲突。
解决方法:多进程的
内存分离
,通过映射表
实现。(是后面内存管理的主要内容)
多进程的合作
通过下面几个例子来理解多进程之间的合作
共享数据
在多进程交替执行时可能会出现问题。
例如发生以下问题:
因为交替执行程序,可以导致共享变量的错误赋值,从而影响到整个程序的执行。
解决方法:
进程同步
通过锁机制
来实现进程的同步以实现进程的合理推进
。
一个总结:
第二部分主要是介绍一下多进程图像的组织与切换问题,为之后的学习打好基础。
下面我们也将根据上图介绍,用4个部分内容介绍多进程图像这一核心模块。