操作系统概念_第三章_进程

一、初识进程


进程组成

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

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

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


进程状态

进程有5种状态,包括:

  1. New(新的)
  2. Running(运行)
  3. Waiting(等待)
  4. Ready(就绪)
  5. Terminated(终止)

这里写图片描述

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


进程控制块(PCB)

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

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

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

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

二、进程调度

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

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


调度队列

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

讨论进程调度的常用方法是队列图
这里写图片描述
其中包括了就绪队列和设备队列(可能有多个设备队列)


调度程序

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

进程选择由相应的调度程序执行,有两类调度程序:

  • 长期调度程序(long-term schedule) / 作业调度程序(job schedule):负责从缓冲池中选择进程,装入内存以便执行
  • 短期调度程序(short-term schedule) / CPU调度程序(CPU schedule):从执行的进程中选择进程,并为之分配CPU

有的系统,如分时系统,加入了中期调度程序(medium-term schedule),其核心思想是能将进程从内存(或CPU竞争中)移出,从而降低多道程序设计的难度(??),之后,进程可被重新调入内存,并从中断处执行。通过中期调度程序,进程可换出,并在之后换入,这种方案称为交换(第八章讨论)
这里写图片描述

各类进程调度的特点:

  1. 长期调度程序执行的不频繁(进程创建期间可能间隔数分钟)
  2. 短期调度程序执行的非常频繁(毫秒级),因此需要程序执行的速度非常快
  3. 长期调度程序控制多道程序(multiprogramming)设计的程度,在稳定情况下,创建进程的速度应该等于进程离开系统的平均速度

进程的类型

  • IO为主(就是操作主要是IO传输)
  • CPU为主(就是操作主要是各种运算)

上下文切换

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

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

进程的上下文也就是进程的PCB,上文提到过它的组成

上下文切换的类型:

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

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


进程操作

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


进程创建

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

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

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

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

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

  • 各种物理和逻辑资源
  • 父进程传递来的初始化数据输入

通常子进程会返回给父进程自身的标识符(系统中唯一标识进程身份的id)

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

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

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

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

关于fork()和exec():(待补充)

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

进程终止

进程终止的时间:

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

父进程终止子进程的原因一般有:
- 子进程使用的资源超过了父进程分配的资源
- 分配给子进程的任务不再需要
- 父进程退出,在这种情况下,操作系统不允许子进程继续

进程终止后:

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

进程间通信

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

允许进程协作的优点:

  1. 信息共享
  2. 提高运算速度
  3. 模块化
  4. 方便

因此协作进程需要一种进程间通信机制(IPC)来允许进程相互交换数据与信息。有共享内存和信息传递两种类型
这里写图片描述


共享内存系统

  • 生产者-消费者问题
  • 无限缓冲-有限缓冲方式

消息传递系统

需求:

  1. 两个进程之间需要有通信线路
  2. 要解决命名问题
  3. 要解决同步机制
  4. 要解决缓冲方式

IPC系统实例(略)

客户机-服务器系统通信(略)


猜你喜欢

转载自blog.csdn.net/sailist/article/details/79874145