第三章:进程概念【进程状态、进程控制块、进程调度、进程操作、进程通信】

目录

3.1 进程概念

3.1.1 进程

3.1.2 进程状态

3.1.3 进程控制块(PCB)

3.2、进程调度

3.2.1 调度队列

3.2.2 调度程序

3.2.3 上下文切换

3.3 进程操作

3.3.1 进程创建

3.3.2 进程终止

3.4 进程间通信


3.1 进程概念

3.1.1 进程

进程包含了程序代码当前活动(其中当前活动通过程序计数器和处理器寄存器的内容表示)两个部分,进程是执行中的程序。

具体有:

  •     文本段(代码段)
  •     数据段(全局变量)
  •     栈(stack)(包含临时数据、函数参数、返回地址、局部变量)
  •     堆(heap)(进程运行期间动态分配的内存)
  •     程序计数器

    注意: 程序是被动实体,进程是活动实体(其中当前活动通过程序计数器和处理器寄存器的内容表示)

    两个进程可以与同一程序联系,虽然文本段相同。但是数据段、堆栈段不同。

 

3.1.2 进程状态

进程有5种状态,包括:

  •     New(新的)
  •     Running(运行)
  •     Waiting(等待)
  •     Ready(就绪)
  •     Terminated(终止)

注意:一次只有一个进程能在一个处理器上运行(Running态),但在处理器上运行的时候,其他进程可以进行IO操作。

3.1.3 进程控制块(PCB)

每一个进程都需要分配一定的信息,这些信息的仓库就叫做PCB,PCB有以下功能:

    系统利用PCB 控制 和 管理 进程
    PCB是进程存在的唯一标志
    操作系统通过PCB感知进程的存在

PCB中包含以下内容(信息):

    进程状态:新的、就绪、运行、等待、停止
    程序计数器:表示进程要执行的下个指令的地址
    CPU寄存器:与程序计数器一起,在出现中断时状态信息需要保存,使进程能够正确执行
    CPU调度信息:包括优先级、调度队列的指针等(见第五章)
    内存管理信息:包括基地址、界限寄存器的值、页表、段表(见第八章)
    记账信息:包括CPU时间、实际使用时间、时间界限、记账数据、作业和进程数量等
    IO状态信息:分配给进程的IO设备列表,打开的文件列表等

进程间的CPU切换:

3.2、进程调度

    目的:使CPU的利用率最大化,需要优化进程调度的方法

    进程调度程序选择一个进程到CPU上执行(一个CPU一个时间段只能执行一个程序,其余程序需要等待CPU空闲重新调度)

3.2.1 调度队列

作业(Job)队列:包含了系统中所有的进程。
就绪(Ready)队列:包含了系统中,驻留在内存中就绪的,等待运行的进程。
    该队列通常用链表实现,头结点指向第一个最后一个PCB块的指针,每个PCB块包括指向下一个PCB的指针域
设备(Device)队列:包含了等待特定IO设备的进程列表
    进程可能会有IO请求,请求时可能IO设备在处理其他请求,所以该进程需要等待。

就绪队列和各种设备队列(可能有多个设备队列)示意图:

    

进程调度队列图:
  进程可能发出I/O请求,并被放到I/O队列。
  进程可能创建一个新的子进程,并等待其终止。
  进程可能由于中断而被强制释放CPU,并被放回到就绪队列。

3.2.2 调度程序

    通常对于批处理系统,进程更多的是被提交、放到大容量存储设备(通常为磁盘)的缓冲池中,保存在那里以便之后执行,在这之后,需要通过调度程序来选择缓冲池中的进程装入内存,并执行。

三级调度示意图:

1.高级调度 / 长期调度程序 / 作业调度程序 :将已进入系统并处于后备状态的作业按某种算法选择一个或一批,为其建立进程,并进入主机,当该作业执行完毕时,还负责回收系统资源,在批处理系统中,需要有作业调度的过程,以便将它们分批地装入内存,在分时系统和实时系统中,通常不需要长期调度。它的频率比较低,主要用来控制内存中进程的数量。

2.中期调度 / 交换调度:将进程从内存或从CPU竞争中移出,从而降低多道程序设计的程度,之后进程能被重新调入内存,并从中断处继续执行,这种交换的操作可以调整进程在内存中的存在数量和时机。其主要任务是按照给定的原则和策略,将处于外存交换区中的就绪状态或等待状态的进程调入内存,或把处于内存就绪状态或内存等待状态的进程交换到外存交换区。

3.低级调度 / 短期调度程序 / 进程调度 / CPU调度:这也是通常所说的调度,一般情况下使用最多的就是短期调度。它的主要任务是按照某种策略和算法将处理机分配给一个处于就绪状态的进程,分为抢占式和非抢占式。
    CPU进程调度算法【FCFS、SJF、优先级、RR、多级队列、多级反馈队列调度】

总结:短期调度执行的频率最高。短期调度在内存作业中选择就绪执行的作业,并为他们分配CPU。中期调度作为一种中等程度的调度程序,尤其被用于分时系统,一个交换方案的实施,将部分运行程序移出内存,之后,从中断处继续执行,从而改善进程组合或者因内存要求的改变引起了可用内存的过度使用而需要释放内存。长期调度确定哪些作业调入内存以执行. 它们主要的不同之处是它们的执行的频率。短期调度必须经常调用一个新进程,由于在系统中,长期调度处理移动的作业时,并不频繁被调用,可能在进程离开系统时才被唤起。

3.2.3 上下文切换

中断使CPU从当前任务改变为运行内核子程序。当发生一次中断的时候,系统需要保存当前程序的上下文,在恢复程序时需要恢复程序的上下文。

    将CPU切换到另一个进程需要保存当前程序的状态并恢复另一个程序的状态,这个任务叫做上下文切换

    进程的上下文也就是进程的PCB。

上下文切换的类型:

    状态保存(state save):保存当前CPU的状态(不论是内核模式还是用户模式)
    状态恢复(state restore):重新开始之前保存的状态

    上下文切换是额外开销,切换时系统不能做其他任何有用的工作。其消耗的时间为几毫秒,具体的时间消耗和硬件支持密切相关

    有的操作系统提供了多组寄存器集合,上下文切换只需要简单改变当前寄存器组的指针。

3.3 进程操作

绝大多数系统内的进程能够并发执行,并动态的创建和删除,因此操作系统应该提供一种机制来创建 / 终止进程(即进程操作)

3.3.1 进程创建

    进程树:进程在执行过程中,能够继续创建进程(系统调用),创建进程的进程为父进程,被创建的进程是子进程,以此类推,形成了进程树

    一般系统都有一个根进程,负责创建其他所有的进程,这样一个系统的进程树只有一棵

进程是需要一定的资源的(CPU时间,内存,文件,IO设备),在一个进程创建子进程的时候,在父进程和子进程之间需要分配 / 共享资源,有以下几种情况:

  •     从操作系统哪里获取资源
  •     从父进程中获取资源(限制子进程只能从父进程中获取资源能防止创建过多的进程导致系统超载)

在进程创建时,该进程会得到:

  •     各种物理和逻辑资源
  •     父进程传递来的初始化数据或输入
  •     通常子进程会返回给父进程自身的标识符(系统中唯一标识进程身份的id)

在进程执行时,有以下几种情况:

  •     父进程和子进程并发执行
  •     父进程等待,直到子进程执行完毕

创建的新进程的地址空间有两种可能

  •     子进程是父进程的复制品(有相同的程序和数据)
  •     子进程内装入另一个新程序

关于fork()和exec():

  •     fork命令创建一个新的进程
  •     exec命令在fork命令后执行,用于将新的程序装入进程的内存空间

    用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段
    用fork可以创建新进程,用exec可以执行新程序。exit函数和两个wait函数处理终止和等待终止。这些是我们需要的基本的进程控制原语。

3.3.2 进程终止

进程终止的时间:

  •     执行完最后语句,并使用系统调用exit()请求操作系统删除自身。
  •     一个进程通过适当的系统调用终止另一个进程(通常这个进程需要是被终止进程的父进程,并且这需要知道被终止进程的标识符

父进程终止子进程的原因一般有:

  • 子进程使用的资源超过了父进程分配的资源
  • 分配给子进程的任务不再需要
  • 父进程退出,在这种情况下,操作系统不允许子进程继续.有些系统如果一个进程终止,那么它所有的子进程都终止。这叫做级联终止。通常由操作系统来启动。

进程终止后:

    进程会返回状态值(通常为整数)到父进程
    所有进程资源会被操作系统释放

如果父进程终止,那么其所有子进程会以init进程作为父进程。因此,子进程仍然有一个父进程来收集状态和执行统计。

      僵尸进程与孤儿进程的产生原因、危害,解决办法

3.4 进程间通信

并发执行的进程有两类,一类是 独立进程,不能影响其他进程并且不被其他进程影响。
另一类是协作进程,能影响其他进程或被其他进程影响。

允许进程协作的优点:

  •     信息共享
  •     提高运算速度
  •     模块化
  •     方便

因此协作进程需要一种进程间通信机制(IPC)来允许进程相互交换数据与信息。

进程通信有共享内存和信息传递两种类型:



1. 共享内存系统:

  比消息传递更快

  只在建立共享内存区时需要系统调用

2. 消息传递系统:

  不需要避免冲突

  通常需要系统调用实现,需要更多的内核介入的时间消耗

更多细节!!!!:进程通信方式详解【管道、消息队列、共享内存、信号量】

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值