第二章 进程的描述与控制(一)

第二章 进程的描述与控制(一)

1. 进程的描述

  1. 进程控制块(PCB):系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。

    PCB中包括PID(用于ID(UID)),分配内存大小,I/O设备使用和文件使用情况等。

  2. 进程实体:由程序段、相关的数据段和PCB三部分便构成了进程实体(又称进程映像)。一般情况下,我们把进程实体简称为进程。

  3. 进程:进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位

  4. 进程的特征:

    进程和程序是两个不同的概念,程序是静态的,是一系列的指令集合,进程是动态的,是程序一次执行过程。

    • 动态性:进程的实质是进程实体的执行过程。是动态地产生、变化和消亡的。
    • 并发性:多个进程实体同存于内存中,且能在一段时间内同时运行。
    • 独立性:进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。
    • 异步性:进程是按异步方式运行的,按各自独立的、不可预知的速度向前推进。

2. 进程的基本状态及转换

  1. 进程的五种状态
    1. 创建状态:进程正在被创建时,操作系统分配资源、初始化PCB,最后把进程转入就绪态并插入到就绪队列中。
    2. 就绪状态:进程已处于准备好运行的状态,获得了出CPU的所有资源,只要再获得CPU,便可立即执行。
    3. 执行状态:进程已获得CPU,正在执行。
    4. 阻塞状态:正在执行的进程由于发送某件事情(如I/O请求、申请缓冲区失败等)暂时无法继续执行时的状态,等待获取资源。处于阻塞状态的进程放入阻塞队列。
    5. 终止状态:进程执行结束,等待操作系统进行善后处理,清零PCB,返还存储空间。

  1. 三种基本状态转换

    处于就绪状态的进程,在调度程序为之分配了处理机之后便可执行,其状态由就绪态转变为执行态。

    正在执行的进程如果因为时间片用完而被剥夺处理机暂停执行时,其状态便由执行态转为就绪态。

    如果因为发生某事件,致使当前进程的执行受阻(例如进程访问某临界资源,而该资源正被其他进程访问时),使之无法继续执行,由执行态转变为阻塞态。

    阻塞态的进程在获取出CPU后的所有资源后,由阻塞态转变为就绪态。

  2. 挂起操作和进程状态的转换

    1. 挂起操作引入原因
      • 终端用户需要:终端用户在自己程序运行器件发现有可疑问题,希望暂停程序运行,以便用户研究执行情况或对程序进行修改。
      • 父进程请求:父进程挂起自己的某个子进程,一边考查和修改该子进程或协调个子进程间的活动。
      • 负荷调节的需要:实时系统的工作负荷较重,可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,保证系统能够正常运行。
      • 操作系统需要:操作系统挂起某些进程,以便检查运行中的资源使用情况或进行记账。
    2. 引入挂起原语操作后的进程状态转换
      1. 活动就绪 → \rightarrow 静止就绪:当进程处于未被挂起的就绪状态时,称为活动就绪状态,表示为Readya,此时进程可以表示接收调度。当用原语Suspend将该进程挂起后,该进程便转变为静止就绪状态,表示为Readys,处于Readys状态的进程不再被调度执行。
      2. 静止就绪 → \rightarrow 活动就绪:处于Readys状态的进程若用激活原语Active激活后,该进程将转变为Readya状态。
      3. 活动阻塞 → \rightarrow 静止阻塞:进程处于未被挂起的阻塞状态称为活动阻塞状态,表示为Blockeda。当Suspend用原语将它挂起后,进程便转变为静止阻塞状态,表示为Blockeds。静止阻塞状态在获取等待资源后,从静止阻塞状态转变为禁止就绪状态。
      4. 静止阻塞 → \rightarrow 活动阻塞:处于Blockeds状态的进程若用激活原语Active激活后,该进程将转变为Blockeda状态。
      5. 创建 → \rightarrow 活动就绪:在当前系统的性能和内存容量均允许的情况下,完成对进程创建的必要操作后,相应的系统进程将进程的状态转换为活动就绪状态。
      6. 创建 → \rightarrow 静止就绪:考虑到系统当前资源状况和性能的要求,不分配给新建进程所需资源,主要是主存,相应的系统将进程状态转变为静止就绪状态,被安置在外存,不参与调度,此时进程创建工作尚未完成。

  3. 进程的组织方式

    1. 链式方式

      按照进程状态将PCB分为多个队列

      操作系统持有指向各个队列的指针

    2. 索引方式

      根据进程状态的不同,建立几张索引表

      操作系统持有指向各个索引表的指针

3. 进程控制

进程控制时进程管理种最基本的功能,主要包括创建新进程、终止已完成的进程、将因发生异常情况而无法继续运行的进程至于阻塞状态、负责进程运行中的状态转换等功能。

3.1 操作系统内核

  1. 通常将一些与硬件紧密相关的模块、各种常用设备的驱动程序以及运行频率较高的模块,都安排在紧靠硬件的软件层,将它们常驻内存,通常被称为OS内核
  2. 处理机的执行状态分为系统态用户态两种:
    1. 系统态:又称为管态,内核态。具有较高的特权,能执行一切指令,访问所有寄存器和存储区。
    2. 用户态:又称为目态。具有较低特权的执行状态,仅能执行规定的指令,访问指定的寄存器和存储区。

3.2 进程的创建

  1. 进程层次结构

    OS中,允许一个进程创建另一个进程,通过把创建进程的进程称为父进程,而把被创建的进程称为子进程。

    子进程可以继承父进程所拥有的资源。当子进程被撤销时,将从父进程获得的资源归还给父进程。撤销父进程会撤销其所有子进程。

  2. 引起创建进程的事件

    1. 用户登录:分时系统中,用户登录成功,系统为该用户创建一个进程。

    2. 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程。

    3. 提供服务:用户向操作系统提出某些请求时,会建立一个进程处理该请求。

    4. 应用请求:由用户进程主动请求创建一个子进程。

  3. 创建原语

    1. 申请空白PCB。
    2. 为新进程分配所需资源。
    3. 初始化进程控制块PCB。
    4. 将PCB插入就绪队列中。

3.3 进程的终止

  1. 引起进程终止的事件
    1. 正常结束:进程任务已经完成,准备退出运行。
    2. 异常结束:进程运行时发生了某种异常事件,使程序无法继续执行。如越界错、保护错、非法指令、特权指令错、运行超时、等待超时、算术运算错、I/O故障等。
    3. 外界干预:进程应外界的请求而终止运行。
  2. 撤消原语
    1. 从PCB集合中找到终止进程的PCB。
    2. 若被终止程序正处于执行状态,应立即终止该进程的执行。
    3. 终止所有子进程。
    4. 将该进程的全部资源归还给父进程或操作系统。
    5. 将被终止的PCB从所在队列中移除。

3.4 进程的阻塞和唤醒

  1. 引起进程阻塞的事件

    1. 向系统请求共享资源失败。
    2. 等待相互合作的其他进程完成工作。
  2. 阻塞原语

    1. 找到要阻塞的进程对应的PCB。
    2. 保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行。
    3. 将PCB插入相应事件的等待队列中。

    阻塞时进程自身的一种主动行为。

  3. 引起进程唤醒的事件

    1. 等待的事件发生。
  4. 唤醒原语

    1. 在事件等待队列中找到PCB。
    2. 将PCB从等待队列中移除,设置进程为就绪态。
    3. 将PCB插入就绪队列,等待被调度。

3.5 进程的挂起与激活

  1. 进程的挂起

    系统出现引起进程挂起事件时,检查被挂起进程的状态,把该进程的PCB复制到某个指定的内存区域,方便用户或父进程考查进程的运行情况。若被挂起的进程正在运行,则转向调度程序重新调度。

  2. 进程的激活过程

    系统发生激活进程的事件时,激活原语先将进程从外存调入内存,检查该进程的现行状态进行修改。若采用的是抢占调度策略,则每当有静止就绪进程被激活而插入就绪队列时,检查是否要进行重新调度。

4. 进程通信

4.1 共享存储系统

共享存储系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间通过这些空间进行通信。

  1. 基于共享数据结构的通信方式

    要求进程公用某些数据结构,借以实现诸进程间的信息交换。操作系统仅提供共享存储器,由程序员负责对公共数据结构的设置及进程间同步的处理

    适于传递相对少量的数据,通信效率低下,属于低级通信。

  2. 基于共享存储区的通信方式

    在内存中划出一块共享存储区域,诸进程可通过对该共享区的读或写交换信息,实现通信,数据的形式和位置甚至访问控制都是由进程负责

    属于高级通信,需要通信进程在通信前,先向系统申请获得共享存储区的一个分区,并将其附加到自己的地址空间中,便可以对其中的数据进行正常读、写。当不再需要时,将其归还给共享存储区。

4.2 管道通信系统

“管道”是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件(内存缓冲区)。

一个管道只能实现半双工通信,实现双向同时通信要建立两个管道。

各进程要互斥访问管道(由操作系统负责实现互斥)。

管道写满时,写进程阻塞。管道读空时,读进程阻塞。

4.3 消息传递系统

进程间的数据交换以**格式化的消息(消息头/消息体)**为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

基于消息传递系统的通讯方式属于高级通信方式,可分为

  • 直接通信方式:发送进程利用OS所提供的发送原语,直接把消息发送给目标进程。
  • 间接通信方式:发送和接收进程,都通过共享中间实体(称为邮箱)的方式进行消息的发送和接收,完成进程间的通信。

附录:关于消息传递两种方式的实现,后续补充。

5. 线程基本概念及实现

进程的引入目的是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量。线程的引入是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。可以理解为“轻量级进程”,是一个基本的CPU执行单元,也是程序执行流的最小单位。

5.1 线程与进程的比较

  1. 调度的基本单位

    在传统的OS种,进程时作为独立的调度和分派的基本单位,在每次被调度时,都需要进行上下文切换,开销大。在引入线程的OS中,线程作为调度和分派的单位,线程时能独立运行的基本单位,当线程切换时,仅需保留和设置少量寄存器内容,切换代价远低于进程。同一进程的线程切换不会导致进程的切换,不同进程的线程切换会引起进程的切换。

  2. 并发性

    引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,设置还允许一个进程中的所有线程都能并发执行。

  3. 拥有资源

    进程可以拥有资源,并作为系统中拥有资源的一个基本单位。而线程本身并不拥有系统资源,而是仅有一点必不可少的、能保证独立运行的资源。线程允许多个线程共享该进程所拥有的资源

  4. 独立性

    同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。进程之间拥有独立的地址空间和其他资源,防止进程之际爱你彼此干扰和破坏,不允许其他进程的访问。而同一进程中的线程共享进程的内存地址空间和资源。

  5. 系统开销

    传统的进程间并发,需要切换进程的运行环境,系统开销很大。线程间并发,如果是同一个进程内的线程切换,则不需要切换进程环境,系统开销小。引入线程后,并发所带来的系统开销减小。

  6. 支持多处理机系统

    在多处理机系统中,对于传统的进程,即单线程进程,不管有多少处理机,该进程只能运行在一个处理机上。但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,使它们并发执行。

5.2 线程的属性

  1. 线程是处理机调度的单位。
  2. 多CPU计算机中,各个线程可占用不同的CPU。
  3. 每个线程都有一个线程ID,线程块(TCB)。
  4. 线程也有就绪、阻塞、运行三种基本状态。
  5. 线程几乎不拥有系统资源。
  6. 同一进程的不同线程间共享进程资源。
  7. 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预。
  8. 同一进程中的线程切换、不会引起进程切换。
  9. 不同进程中的线程切换,会引起进程切换。
  10. 切换同进程内的线程,系统开销很小。
  11. 切换进程,系统开销较大。

5.3 线程的实现

  1. 内核支持线程

    内核空间为每一个内核线程设置了一个线程控制块,内核根据该控制块而感知某线程的存在,并加以控制。调度是以线程为单位进行的

    优点:

    • 多处理器系统中,内核能够同时调度同一进程中的多个线程并行执行。
    • 进程中的一个线程被阻塞了,内核可以调度该进程中的其他线程占有处理器云心,也可运行其它进程中的线程。
    • 内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小。
    • 内核本身也可才有多线程技术,提高系统的执行速度和效率。

    缺点:

    对于用户的线程切换而言,其模式切换的开销较大,在同一个进程中,从一个线程切换到另一个线程时,需要从用户态转到核心态进行,这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核实现的,系统开销较大。

  1. 用户级线程

    用户级线程是在用户空间中实现的。对线程的创建、撤销、同步与通信等功能,都无需内核的支持。其调度仍是以进程为单位进行的。

    优点:

    • 线程切换不需要转换到内核空间,节省了模式切换的开销。
    • 调度算法可以是进程专用,不同进程可以根据自身需要选择不同的调度算法,对自身的线程进行管理和调度。

    缺点:

    • 系统调用阻塞问题。在基于进程机制的OS中,大多数系统调用将使进程阻塞。当线程执行一个系统调用是,不仅该线程被阻塞,而且该进程中所有线程都会被阻塞
    • 在单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多重处理的优点,内核每次分给一个进程的仅有一个CPU,进程中仅有一个线程能执行,其他线程只有等待

  1. 组合方式

    组合方式线程系统中,内核支持多个内核支持线程的建立、调度和管理,同时,也允许用户应用程序建立、调度、和管理用户级线程。一些内核支持线程对应多个用户级线程,这是用户级线程通过时分多路复用内核支持线程实现的

    1. 多对一模型,即将用户线程映射到一个内核控制线程。

      • 优点:用户级线程的切换在用户空间即可完成,不需要切换多道核心态,线程管理的系统开销小,效率高。
      • 缺点:当一个用户级线程被阻塞后,这个进程都会被阻塞,并发性不高,多个线程不可在多核处理机上并行运行。

    2. 一对一模型,即将每个用户级线程映射到一个内核控制线程。

      • 优点:当一个线程别阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
      • 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,线程管理的成本高、开销大。

    3. 多对多模型,即将许多用户线程映射到同样数量或更少数量的内核线程上。

      • 克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),有克服了一对一模型中一个用户进程长有太多内核级线程,开销太大的缺点。
      • 内核级线程才是处理机分配的单位。

5.4 线程的组织与控制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值