2025年进程控制块是描述进程状态和特性的数据结构一个进程(进程控制块是专为用户进程设置的私有数据结构)

进程控制块是描述进程状态和特性的数据结构一个进程(进程控制块是专为用户进程设置的私有数据结构)定义 前趋图是一个有向无环图 DAG 用于描述进程之间执行的前后关系 其实就是一个拓扑排序 结点 表示一个程序段或进程 或一条语句 有向边 结点之间的偏序或前序关系 注意 前趋图中禁止存在循环 一个程序由若干个程序段组成 而这些程序段的执行必须是顺序的 这种程序执行的方式就称为程序的顺序执行 1 顺序性 处理机的操作严格按照程序所规定的顺序执行 2 封闭性 程序一旦开始执行 其计算结果不受外界因素的影响 3 可再现性



定义:前趋图是一个有向无环图(DAG),用于描述进程之间执行的前后关系,其实就是一个拓扑排序。
– 结点:表示一个程序段或进程,或一条语句
– 有向边:结点之间的偏序或前序关系“→”

注意:前趋图中禁止存在循环!

一个程序由若干个程序段组成,而这些程序段的执行必须是顺序的,这种程序执行的方式就称为程序的顺序执行。

(1) 顺序性
处理机的操作严格按照程序所规定的顺序执行。
(2) 封闭性
程序一旦开始执行,其计算结果不受外界因素的影响。
(3) 可再现性
程序执行的结果与它的执行速度无关(即与时间无关),而只与初始条件有关。

上图中可以抽象出四个程序,列出其前趋图,发现S1和S2互不干扰,可以并发执行。

(1)间断性
在多道程序设计的环境下,程序的并发执行,以及为完成一项任务而相互合作,这些程序之间要共享系统的资源,形成了相互制约的关系,即形成了一定的先后顺序。相互制约导致并发程序具有“执行—暂停—执行”这种间断性的活动规律。
(2)失去封闭性
程序在并发执行时,系统的资源状态由多道程序来改变,程序运行失去封闭性。程序的运行受到其他程序的影响。
(3)不可再现性
程序在并发执行时,多次运行初始条件相同的同一程序会得出不同的运行结果。

  • 进程:在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,是可并发执行的程序在一个数据集合上的运行过程。

  • 进程的结构: 程序+数据+PCB

  • /ul>

    blockquote>

    进程控制块(Processing Control Block)是系统为了管理进程设置的一个专门的数据结构。系统用它来记录进程的外部特征,描述进程的运动变化过程。同时,系统可以利用PCB来控制和管理进程,所以说,PCB是系统感知进程存在的唯一标志。

    /blockquote>

    ul>

  • 动态性 可动态地创建、结束进程,进程由创建而产生,由调度而执行,有撤销而消亡。
  • 并发性 多个进程实体同存于内存中,且能在一段时间内同时运行。
  • 独立性 进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。
  • 制约性(异步性) 因访问共享数据/资源或进程间同步而产生制约,按各自独立的、不可预知的速度向前推进。
  • /ul>

    h5>联系:

    /h5>

    ul>

  • 进程是操作系统处于执行状态程序的抽象(进程 = 程序 + 执行状态)。
  • 同一个程序的多次执行过程对应为不同进程(异步性导致)。
  • 进程执行需要的资源(内存和CPU)
  • /ul>

    h5>区别:

    /h5>

    ul>

  • 进程是动态的,程序是静态的,程序是有序代码的集合,进程是程序的执行。
  • 进程是暂时的,程序是永久的
  • 进程与程序的组成不同
  • /ul>

    h5>(1)就绪状态(Ready)

    /h5>

    p>进程已获得除CPU之外的所有必需的资源,一旦得到CPU控制权,立即可以运行。

    /p>

    h5>(2)运行状态(Running)

    /h5>

    p>进程已获得运行所必需的资源,它正在处理机上执行。

    /p>

    h5>(3)阻塞状态(Blocked)

    /h5>

    p>正在执行的进程由于发生某事件(如等待I/O)而暂时无法执行时,便放弃处理机而处于暂停状态,称该进程处于阻塞状态或等待状态。

    /p>

    p>当我们刚开始运行程序的时候,操作系统需要为该进程分配所需的内存空间等系统资源,并为其创建、初始化PCB。(如 分配进程标识符PID),此时,该进程就处于创建态。而当进程结束时 (正常结束或者由于bug导致进程无法继续执行下去,如 整数除0错误),操作系统会回收分配给该进程的系统资源以及撤销该进程的PCB…,目的是为了撤销该进程,此时,该进程就处于终止态。

    /p>

    ul>

  • 创建态
    进程正在被创建,操作系统为该进程分配系统资源、初始化PCB。
  • 终止态
    进程正在被撤销,操作系统会回收该进程拥有的系统资源、撤销PCB。
  • /ul>

    p>


    – NULL→创建


    一个新进程被产生出来执行一个程序。


    – 创建→就绪


    当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态。


    – 就绪→运行


    处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行

    /p>

    p>

    1.挂起操作的引入

    虚拟存储中交换的需要(挤死了,还轮不到你用CPU,别占着茅坑不拉屎,滚到外存去)

    /p>

    p>

    2.引起挂起源于操作后三个进程状态的转换

    /p>

    ul>

  • 活动就绪→静止就绪
  • 活动阻塞→静止阻塞
  • 静止就绪→活动就绪
  • 静止阻塞→活动阻塞
  • /ul>

    ul>

  • OS对各类资源的管理与使用,通过对应的DS的描述与操作来实现
  • OS对各类资源使用的状态信息,通过DS的建立、维护来实现
    操作系统管理控制进程运行所用的信息集合,如图:
  • 操作系统用PCB来描述进程的基本情况以及运行变化的过程
  • PCB是进程存在的唯一标志,每个进程都在操作系统中有一个对应的PCB
  • 进程创建:生成该进程的PCB,进程终止:回收它的PCB,进程的组织管理:通过对PCB的组织管理来实现。
  • /ul>

    ul>

  • 作为独立运行基本单位的标志。
  • 能实现间断性运行方式。
  • 提供进程管理所需要的信息。
  • 提供进程调度所需要的信息。
  • 实现与其它进程的同步与通信。
  • /ul>

    ul>

  • 调度和状态信息:调度进程和处理机使用情况
  • 进程间通信信息:进程间通信相关的各种标识
  • 存储管理信息:指向进程映像存储空间数据结构
  • 进程所用资源:进程使用的系统资源,如打开文件等
  • 有关数据结构连接信息:与PCB相关的进程队列
  • /ul>

    ul>

  • 链接方式
    同一状态的进程其PCB成一链表,多个状态对应多个不同的链表
  • /ul>

    p>

    /p>

    ul>

  • 索引表
    同一状态的进程归入一个索引表(由索引指向PCB),多个状态对应多
    个不同的索引表
  • /ul>

    p>

    /p>

    p>内核:把常用的或与硬件关联度高的模块打包放到离硬件进的地方,常驻内存,提高效率。

    OS的内核

    运行在

    处理机的内核模式

    下,并在该模式下提供所有OS应具备的功能。

    /p>

    p>问:什么是处理机的内核模式?

    /p>

    ul>

  • 系统模式:又称管态或内核态,具有高特权,能执行一切指令,可访问所有寄存器和内存
  • 用户模式:又称目态,具有低特权,仅能执行规定的指令,仅可访问规定寄存器和内存
  • /ul>

    ul>

  • 支撑功能(底层):中断处理,时钟管理,原语操作
    > 原语(Primitive),由若干指令组成,用于完成一定功能的过程。一个原语,是一个原子操作,是一个不可分割的执行单位,执行过程不允许被中断。其中的所有指令,要么全部执行,要么全不执行,运行在系统态,常驻内存。(两“全部”特性)
  • 资源管理功能:进程管理,存储管理,设备操作
  • /ul>

    p>在OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进程,而把被创建的进程称为子进程。子进程可继续创建更多的孙进程,由此便形成了一个进程的层次结构。

    /p>

    ul>

  • 用户登录
  • 作业调度
  • 用户请求创建一个新进程
  • 正在运行的进程执行了
  • 创建进程的系统调用
  • /ul>

    ul>

  • 正常结束:批处理最后的Halt指令、分时的logs off 等
  • 异常结束:越界错误、非法指令等
  • 外界干预:操作员或操作系统干预、父进程请求、父进程终止
  • /ul>

    p>找出被终止进程的PCB —– 若进程状态为运行态,置CPU调度标志为真,若其有子孙进程,终止其子孙进程并回收其资源 —– 回收终止进程的资源 —– 回收终止进程的PCB。

    /p>

    ul>

  • 进入阻塞的条件:
    请求并等待系统服务,无法马上完成
    启动某种操作,无法马上完成
    需要的数据没有到达
  • 只有进程自身才能知道何时需要等待某种事件的发生(block原语)
  • 阻塞过程:调用阻塞原语阻塞自己 -> 将PCB中状态改为阻塞,加入阻塞队列 -> 进程调度
  • /ul>

    ul>

  • 唤醒进程的情况:
    被阻塞进程需要的资源可被满足
    被阻塞进程等待的事件到达
  • 进程只能被别的进程或操作系统唤醒(wakeup原语)
  • /ul>

    ul>

  • 若处于活动就绪,则改为静止就绪;
  • 若处于活动阻塞,则改为静止阻塞;
  • 若挂起的进程正在执行,改为静止就绪后重新进行进程调度。
  • /ul>

    ol>

  • 激活原语先将进程从外存调入内存;
  • 检查该进程的状态:
    • 若为静止就绪,则改为活动就绪;
    • 若为静止阻塞,则改为活动阻塞。
  • /ol>

    p>

    进程同步:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。

    /p>

    ul>

  • 竞争关系(互斥):
    并发进程之间因相互争夺独占性资源而产生的竞争性制约关系(间接相互制约关系)
  • 协作关系(同步)):
    并发进程之间为完成共同任务,基于某个条件来协调执行先后关系而产生的协作制约关系(直接相互制约关系)
  • /ul>

    ul>

  • 临界资源:一段时间内只允许一个进程访问的资源称为临界资源或独占资源。
  • 临界区(critical section):每个进程中访问临界资源的那段代码称为临界区,每次只允许一个进程进入临界区,进入后,不允许其他进程进入。
  • 进入区(entry section):用于进入临界区前检查临界区是否已经被访问。
  • 退出区(exit section):将临界区正在被访问的标志恢复成未被访问。
  • 剩余区(remainder section):进程中其他部分称为剩余区。
  • /ul>

    p>这样,进程的代码就组织成了下面的形式:

    /p>

    pre>

    /pre>

    ul>

  • 空闲让进:没有进程在临界区时,任何进程可进入
  • 忙则等待:有进程在临界区时,其他进程均不能进入临界区
  • 有限等待:等待进入临界区的进程不能无限期等待
  • 让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态)
  • /ul>

    p>

    /p>

    blockquote>

    中断:中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

    /blockquote>

    p>之所以会引发临界区的冲突访问,其根源在于一个进程在访问临界区时发生了进程的调度,使得另一个进程也进入了临界区进行访问。因此,在进程访问临界区时禁止调度就可以解决这个问题。

    /p>

    p>

    进入临界区:

    禁止所有中断,并保存标志;

    离开临界区:

    使能所有中断,并恢复标志

    /p>

    ul>

  • 缺点:
    1. 禁用中断后,进程无法被停止:整个系统都会为此停下来,可能导致其他进程处于饥饿状态
    2. 临界区可能很长,无法确定响应中断所需的时间(可能存在硬件影响)
    3. 不适用多处理器系统,在一个处理器上关闭中断,不能防止进程在其它处理器上执行相同的临界区代码
  • /ul>

    ul>

  • 共享变量
  • /ul>

    pre>

    /pre>

    ul>

  • 进入区代码
  • /ul>

    pre>

    /pre>

    p>

    记忆技巧:

    “非常谦让的代码”,准备进入了(flag[i] = true),则先让别人进入(turn =j)。

    /p>

    ul>

  • 退出区代码
  • /ul>

    pre>

    /pre>

    ul>

  • 缺点:复杂,需要两个进程间的共享数据项。并没有做到让权等待原则,而是在忙等待,浪费CPU时间。
  • /ul>

    h4>a. 概念:

    /h4>

    p>锁是一个抽象的数据结构,一个二进制变量(锁定/解锁),使用锁来控制临界区访问。


    一共有两个操作:


    Lock::Acquire()锁被释放前一直等待,然后得到锁。


    Lock::Release()释放锁,唤醒任何等待的进程。


    使用锁机制的临界区访问伪代码如下:

    /p>

    pre>

    /pre>

    h4>b. 实现方式:

    /h4>

    p>原子操作指令:现代CPU体系结构提供一些特殊的原子操作指令,实现了两个或两个以上动作的原子性,当这种指令执行时,被它访问的内存位置将不允许被其它指令同时访问。常见的比如测试和置位(Test-and-Set )指令和交换指令(exchange)。

    /p>

    p>伪代码分别如下:

    /p>

    pre>

    /pre>

    p>lock赋值为1,返回lock的初始值。

    /p>

    pre>

    /pre>

    p>交换ab的值。

    /p>

    p>

    实现自旋锁(spin lock)

    /p>

    p>自旋锁这个概念是相对于互斥锁而言的。对于自旋锁,当一个进程不能得到锁资源时,并不会放弃CPU而进入阻塞状态,而是不断地在那里进行循环检测,因此称它为自旋锁。

    /p>

    pre>

    /pre>

    p>解释:最初的时候value为0,ts返回值为0,并且value变为1表示锁已经被获取,并且退出循环。如果有第二个进程,就会一直执行ts语句(value为1,返回1),直到第一个进程release之后立即获取锁。

    /p>

    pre>

    /pre>

    p>

    利用ts指令实现无忙等待锁

    无忙等待锁的基本思想和自旋锁是一样的,只是一旦进程不能进入临界区,则将它加入等待队列,并且进入阻塞状态。在一个进程释放了锁资源后,再挑选等待队列中的一个阻塞进程,并将它唤醒。

    /p>

    pre>

    /pre>

    h4>c. 优缺点

    /h4>

    ul>

  • 优点:
    适用于单处理器或者共享主存的多处理器中任意数量的进程同步
    简单并且容易证明
    支持多临界区
  • 缺点:
    忙等待消耗处理器时间
    可能导致饥饿,进程离开临界区时有多个等待进程的情况
    死锁,拥有临界区的低优先级进程,请求访问临界区的高优先级进程获得处理器并等待临界区
  • /ul>

    p>为了解决同步互斥问题,操作系统会提供一些高级抽象方法供应用进程调用,这样应用进程就不需要自己利用繁琐的软件方法来解决同步互斥了。存在三种高级抽象方法,分别是锁,信号量与条件变量,其中锁也在上面那篇中讨论过了,这里主要是讨论信号量机制。

    /p>

    p>信号量代表了当前剩余系统资源数量。如果有某个进程申请占用资源,信号量的值-1,反之有进程释放资源,信号量的值+1。要实现上述的两个过程需要有两个原子操作:P操作和V操作,分别表示

    尝试减少

    增加

    信号量的值。这两个原子操作连同表示剩余资源数的值封装在一起称为信号量,所以,信号量就是一种

    抽象数据类型。

    /p>

    ul>

  • 当一个资源请求占用资源时,先查看当前值,如果说明当前有多余的资源,分配出去,并且;如果说明当前资源不足,依然进行,但是要将进程放入阻塞队列。

    /li>

    li>

    当一个进程释放资源时,将表示当前空余资源+1,若,说明有进程在阻塞队列中等待资源的释放,则将队列中相应的进程取出将其唤醒;若,说明当前没有进程在队列中,直接结束程序即可。

    /li>

    li>

    伪代码如下:

    /li>

    li>整数型与记录型信号量:


    两者区别就是记录型信号量多了一个阻塞队列(一般为链表形式链接全部阻塞进程),相比于整数型,记录型不会出现“忙等”现象,上述的伪代码也是采用记录型信号量。

    /li>

    strong>即要么把它所请求的资源全部分配给进程,要不一个也不。

    /strong>

    br /> 伪代码如下:

    strong>为了实现两进程之间的同步,信号量必须成对地出现在两个不同的进程中,并且其位置也要相互匹配。

    /strong>

    li>采用面向对象方法,简化了进程间的同步控制

    /li>

    li>任一时刻最多只有一个进程执行管程代码

    /li>

    li>正在管程中的进程可临时放弃管程的互斥访问,等待事件出现时恢复(避免死锁)

    /li>

    li>作用:在模块/对象中收集相关共享数据,定义访问共享数据的方法。

    /li>

    li>一个锁:控制管程代码互斥访问。

    /li>

    li>0或多个条件变量:管理共享数据的并发访问。

    /li>

    li>条件变量是管程内的等待机制:


    进入管程的进程因资源被占用而进入等待状态


    每个条件变量表示一种等待原因,对应一个等待队列

    /li>

    li>Wait()操作 :将自己阻塞在等待队列中,唤醒一个等待者或释放管程的互斥访问

    /li>

    li>Signal()操作:将等待队列中的一个进程唤醒,等待队列为空,则等同空操作

    /li>

    strong>核心:

    /strong>

    li>能否互斥访问共享资源(不能同时访问共享数据);

    /li>

    li>当公共容器满时,生产者能否继续生产(生产者应阻塞并唤醒消费者消费);

    /li>

    li>当公共容器为空时,消费者能否继续消费(消费者应阻塞并唤醒生产者生产)。

    /li>

    p>

    生产者和消费者对缓冲区互斥访问是互斥关系(异步的),同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,他们也是同步关系。

    /p>

    br />

    div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='http://fangkaipeng.com/wp-content/uploads/2021/03/wp_editor_md_85c5780ded4af0d251a64ad1cf1ef126.jpg'>

    /div>

    br /> 写者:读取和修改数据

    br /> 要求:“读 – 读”允许,“读 – 写”互斥, “写- 写”互斥

    br /> 读者计数readcount:正在进行读的读者数目,初始化为0,共享变量,用于读写互斥的控制。

    br /> 信号量rmutex:控制对读者计数的互斥修改,初始化为1。

    li>写者优先策略


    只要有读者正在读状态,后来的读者都能直接进入,如读者持续不断进入,则写者就处于饥饿。

    /li>

    li>写者优先策略


    只要有写者就绪,写者应尽快执行写操作,如写者持续不断就绪,则读者就处于饥饿。

    /li>

    li>

    低级通信:

    进程间仅交换一些状态和少量数据。如:进程之间的互斥和同步。缺点:(1)效率低 (2)通信对用户不透明

    /li>

    li>

    高级通信:

    进程间可交换大量数据。用户可直接利用操作系统提供的一组通信命令,高效地传送大量数据的一种通信方式。操作系统隐藏了进程通信的细节,对用户透明,减少了通信程序编制上的复杂性。

    /li>

    strong>数据结构

    /strong>或

    strong>共享存储区

    /strong>,通过这些空间进行通信。

    li>基于共享数据结构的通信方式


    进程公用某些数据结构,借以实现诸进程间的信息交换。如生产者-消费者问题的有界缓冲区。由程序员负责公用数据结构的设置及对进程间同步的处理,操作系统只提供共享存储器。通信效率低,只适合传递相对少量的数据,属于低级通信。

    /li>

    li>基于共享存储区的通信方式


    在存储器中划出一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信。通过共享存储分区实现进程之间的信息交换。共享内存是把

    同一个物理内存区域

    同时映射到

    多个进程的内存地址空间

    的通信机制。


    通信过程:

    (1)申请共享存储分区;


    (2)将共享存储分区映射到本进程地址空间中;


    (3)进行数据读写;


    (4)解除共享存储分区映射;


    (5)删除共享存储分区;



    特点:

    最快的方法,一个进程写另外一个进程立即可见,没有系统调用干预没有数据复制,不提供同步,由程序员提供同步。

    /li>

    strong>管道:

    /strong> 指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。

    br />

    strong>管道机制提供的协调能力:

    /strong> 互斥(读写互斥);同步(管道空停止读,管道满停止写);确定对方是否存在,只有对方存在的时候才能通信。

    strong>通信命令(原语)进行通信

    /strong>。

    li>

    通信原语:

    Send(Receiver, message); 发送一个消息给接收进程


    Receive(Sender, message); 接收Sender发来的消息

    /li>

    li>

    消息格式:

    单机系统环境:环境相同,消息格式简单


    网络环境:环境不同,传输距离很远,消息格式比较复杂。

    /li>

    li>

    进程同步方式:

    在进程之间进行通信时,辅以进程同步机制,使诸进程间能协调通信。发送进程或接收进程在完成消息的发送或接收后,都存在两种可能性:进程或者继续发送(接收)或者阻塞,出现三种情况:


    发送进程阻塞、接收进程阻塞


    发送进程不阻塞、接收进程阻塞


    发送进程和接收进程均不阻塞

    /li>

    li>

    通信链路:

    为使在发送进程和接受进程之间能进行通信,必须在两者之间建立一条通信链路。

    /p>

    ul>

  • 根据通信链路的建立方式:
    显示连接:先用 “建立连接”命令(原语) 建立一条通信链路; 通信;用显式方式拆除链路。——用于计算机网络
    隐式连接:发送进程无须明确提出建立链路的要求,直接利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。——用于单机系统
  • 根据通信链路的连接方法:点–点连接通信链路,多点连接通信链路
  • 根据通信方式的不同:单向通信链路,双向链路
  • 根据通信链路容量的不同:无容量通信链路,有容量通信链路
  • /ul>

    img class="lazyload lazyload-style-1" src="http://fangkaipeng.com/wp-content/uploads/2021/03/wp_editor_md_e4d99965ef8d63f5d6ef126db214262f.jpg" decoding="async" data-original="http://fangkaipeng.com/wp-content/uploads/2021/03/wp_editor_md_e4d99965ef8d63f5d6ef126db214262f.jpg" src="https://fangkaipeng.com/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" alt="" />

    strong>进程的资源分配角色:

    /strong>

    br /> 进程由一组相关资源构成,包括地址空间(代码段、数据段)、打开的文件等各种资源。

    strong>线程的处理机调度角色:

    /strong>

    br /> 线程描述在进程资源环境中的指令流执行状态,线程间各自独立。

    strong>线程的特性:

    /strong> 线程间并发执行,共享相同的地址空间。

    strong>线程的优点:

    /strong>

    br /> 一个进程中可以同时存在多个线程。

    br /> 各个线程之间可以并发地执行,切换效率高。

    br /> 各个线程之间可以共享地址空间和文件等资源。

    strong>线程的缺点:

    /strong>

    br /> 一个线程崩溃,会导致其所属进程的所有线程崩溃。

    strong>OS独立调度和分派的基本单位

    /strong>,线程是

    strong>CPU调度的基本单位

    /strong>。

    br /> https://blog.csdn.net/Shine__Wong/article/details/101453197

    br /> https://blog.csdn.net/Shine__Wong/article/details/101108284

编程小号
上一篇 2025-03-05 13:40
下一篇 2025-02-19 20:51

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/36662.html