操作系统之进程与线程1——进程概述

来源:互联网 发布:origin 矩阵 编辑:程序博客网 时间:2024/05/22 12:23

一、CPU管理、多进程概述


管理CPU时,引出 “进程、线程” 。

CPU如何操作呢?

  • 给定指令的初始地址,CPU即会自动+1取指执行(取指、取数据)

对于含有IO指令和不含IO指令的一段程序,CPU的执行时间要查好几个量级,因为CPU在硬件电路上工作,速度特别快,IO指令在磁盘(磁臂——机械结构)工作,所以执行速度差好几个量级。——可以把CPU看做人,其他指令操作都看成要做的事情,因此就可以产生 等待、先做别的事不断检查、等等操作。

同时,利用多程序提高CPU利用率,即一个CPU交替执行多道程序:并发。

怎么实现并发?

  • 要能在适当时间切出到另一个程序
  • 并且能在适当时间切回原程序(所以要记录原程序的返回地址PC,寄存器内容等等,OS中用PCB存放信息。)

现实生活类比:

此处类似于看书时候被打断,再重新看的事件。

  • 要记录打断之前的画面(PCB信息)。
  • 只有正在看的书才需要记录画面,不看的书不需要记录,即运行的程序要记录,而静态程序不需要。——因此,需要描述概念不同的两个东西:运行程序和静态程序(存在磁盘中):引入“进程”描述运行中的程序,而不同的进程状态(开始、等待、结束 ......)描述即用各自的PCB数据结构中。——多个程序同时运行,即并发就引入了“多进程”

总结:

OS管理CPU即要执行程序,而单道程序时CPU利用率太低,因此,使用多道程序同时运行(即并发),而程序的交替执行就需要记录运行中程序的样子,因此引入进程的概念。进程即是运行中的程序。

二、多进程


OS如何支持多进程?

  • 操作系统感知进程和操作、组织多进程唯一依赖进程的唯一标识:PCB。

OS如何组织多进程?

  • 以多个进程的PCB构成运行状态(一个进程)、就绪队列(万事俱备,只欠CPU)、磁盘等待队列(缺CPU之外的资源)。
  • 而OS即对进程分为各个状态分别进行管理,进程在各个状态、各个进程之间切换,交替推进运行。

OS如何切换多个进程?


  • 在切换之前保存现场信息(PCUR:PCB信息)
  • schedule() 函数负责多进程切换——先从就绪队列中找到(进程调度算法!!)下一个进程pNEW(PCB),并进行从pCUR到pNEW的切换。

简单的进程调度?

——即找出下一个进程pNEW

  • FIFO:各个进程之间绝对公平,未考虑进程执行的任务的区别;
  • Priority:优先级如何设定?可能产生某些进程的饥渴问题

如何完成进程的切换?


  • 将CPU中运行程序PCB保存至寄存器,并将下一个进程PCB输入CPU。
  • 保存现场、切换至新进程必须写一段汇编代码,严格组织各个寄存器。

多进程交替执行时,如何相互影响?

——进程都存储在内存中,相互可能存在耦合,对于用户编程而言,都是在内存上操作,所以可能在进程1上修改进程2的内存数据。

因此,必须要限制一个进程对另外进程的地址的读写。

  • 通过映射表,将多个进程操作地址映射到不同的物理内存中,使得进程相互之间不影响,内存管理部分内容。——可以看出内存管理也为多进程运行服务。
  • 通过各个进程映射的不同物理内存实现 地址分离(内存分离)


总结:

进程管理+内存管理形成了多进程图像。

交替执行时多进程之间如何实现相互合作?

——生产者-消费者实例

构建缓冲区,并以counter做连接。


当多个进程同时对缓冲区操作,并且进程之间交替运行时,可能只运行每个进程的部分语句,可能产生缓冲区混乱。(建议:要实际演练一次程序运行)——生产者进程++,消费者进程--之后counter应为5,但程序交替执行出现错误。


如何做到合理推进进程运行(核心在于进程同步)?

  • 在读/写counter时上锁,其他进程检查锁状态,s.t 必须满足一定条件才能进行进程切换,不允许任意切换。


总结: