【操作系统笔记(四)】CPU管理的核心:多进程图像

其他章节笔记:

(一)操作系统的启动
(二)系统调用
(三)操作系统历史
(四)多进程管理图像
(五)进程,用户级线程与内核级线程
(六)进程同步与信号量
(七)内存管理


进程

CPU管理

CPU运行一条I/O指令往往比运行一条运算指令要花费更多的时间,而等待外设交互的很大一段时间里,CPU都处于空闲状态。为了保证CPU的效率,引入多进程的概念,即CPU处于空闲状态时,执行其他进程的运算指令。
当中断一条正在运行的程序转而去执行其他程序时,需要保存原有运行程序的数据信息,不然这些信息可能会被覆盖。运行的程序成为进程,进程是程序+运行产生的信息的总和,存储进程的数据结构成为进程控制块(PCB,process control block)。

  • 进程与程序:进程是动态的,程序是动态的。进程=程序+运行产生的数据信息。
  • 进程与线程:线程其实是一种轻量级的进程。一个应用可以包含多个进程,一个进程可以包含多个线程。多个进程之间不共享内存,一个进程的多个线程间共享内存。

多进程图像

多进程图像从启动开始到关机结束

  • main中的fork()创建了第一个进程,让一号进程执行shell程序。接下来shell会调用fork()来创建进程,执行用户输入命令对应的程序;用户程序通过fork()创建出新进程来执行相应任务。
    shell核心代码
  • 一个进程执行完毕后可以通过调用exit()来退出自己,但shell不会调用exit()退出自己,除非关机。
    在这里插入图片描述

多进程如何组织:PCB+状态+队列

  • 操作系统中的进程状态主要包括:运行态(当前占有CPU的进程状态),就绪态(只要获得CPU资源就可以开始执行的进程状态),阻塞态(缺少某些条件,即使得到CPU资源也不可以执行的进程状态)。
  • 三个状态分别对应三条队列:运行队列,就绪队列,阻塞队列。
  • 对于只有一个CPU的电脑,意味着只能有一个进程正在被运行,即运行队列长度为1;阻塞态缺少的条件不同,所以根据条件区分有不同的阻塞队列;就绪队列只要获得CPU资源就可以执行,只需要一条即可。
  • 根据进程状态,可以绘制出如下的进程生命周期图:
    在这里插入图片描述

多进程如何交替:队列操作+调度+切换

  • 切换发生在CPU空闲的时候,当前程序执行了需要CPU等待的指令或者进程执行了exit()指令时CPU都处于空闲,这些空闲点也称为调度点。
    在这里插入图片描述
  • schedule函数执行进程切换功能:
    在这里插入图片描述
    获取就绪队列中的一个进程的PCB,然后把CPU正在执行的进程的PCB换为新PCB。至于获取哪一个进程,就涉及到调度。最简单的思维就是FIFO,即排在队首的先运行,而实际应用中,排队的进程轻重缓急不同,不能单一而论。

多进程如何互相影响

进程间可能相互影响。比如进程1修改了内存地址100的指令,而内存地址100处存放的是进程2的数据,这样会导致进程2的崩溃或处理错误。

  • 解决这个问题的方法就是地址隔离。每个进程操作的地址不直接是真实的物理内存地址,而是要经过页表映射才能得出真实的物理地址,以此实现两个进程的隔离。
  • GDT[CS]+IP再经过页表的映射才能找到真实物理地址,每个进程都对应一个页表。

多进程如何合作 :生产者-消费者模型

不同的进程之间有时需要合作,比如一个进程负责写数据,一个负责读数据。要建立合作关系可以建立进程间的共享缓存区。而因为进程间是交替执行的,如果不好好管理合作,就会出现奇奇怪怪的错误,比如还没有写完数据就读数据。

  • 进程间的一个基本的合作模型:生产者-消费者模型
    其中往共享缓存区中写的进程称为生产者进程,而从共享缓存区中读的进程称为消费者进程,两个进程通过共享缓存区进行通信与合作。
    在这里插入图片描述
    第一段是共享缓存区的定义,第二部分是生产者进程的代码,第三部分是消费者进程的代码。生产者与消费者是依托counter来运行的,counter相当于两部分都能改动的全局变量。当生产者发现“counter == BUFFER_SIZE”时,缓存区已满,此时生产者不再写入数据;当消费者发现“counter == 0”时,此时缓存区为空,此时消费者不再读出数据,等待生产者写入数据。
  • 核心是counter的维护。但因为进程间随时可以切换,所以可能导致一个进程对counter的维护还没有完成就切走了,于是导致错误,比如:
    在这里插入图片描述
    解决的方法就是要保证对counter的修改的完整性,要改就改完,改不完就不要改。
    实现的形式就是给counter上锁,进入修改的代码段时上锁,直至完成修改才释放锁。(这个概念和java讲的多线程上锁很像)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值