• 操作系统(三)| 进程管理上 进程状态 同步 互斥


    目录

    1 进程和程序区别

    2 进程状态

    2.1 进程的5种基本状态

    2.2 进程状态之间转换

    2.3 七状态模型

    3 进程描述

    3.1 进程控制块 PCB

    3.2 进程块组织方式

    4 进程控制

    5 进程同步 互斥

    5.1 区分进程互斥和同步

    5.2 核心方案

    5.3 其他方案

    方案1 设置锁变量

    方案2 严格轮转法

    方案3 Peterson解决方案

    方案4 关中断

    方案5 机器指令实现的互斥


    简单概述

    什么是进程? 是程序的1次执行(程序执行的1个实例) 每个进程有自己的地址空间。

    为什么引入进程? 多任务的需要。在内存中同时有多个可执行的进程,以提高效率(特别是CPU的利用率)。

    因此,需要对进程进行管理,以避免冲突: 借助于PCB,记录进程的描述和控制信息、上下文状态

    1 进程和程序区别

    进程是程序的1次执行。 进程(Process)和程序(Program)是两个不同的概念,它们在计算机科学中有明确的区别:

    1. 程序(Program)

      • 定义:程序是一组计算机指令的有序集合,这些指令被编写成一个文件,通常以可执行文件的形式存在。程序是静态的,它只是一段代码的集合,等待被执行。

      • 特点:程序包含了计算机程序员编写的源代码,它描述了一系列任务的算法和逻辑,但并没有实际执行。程序不占用计算机的内存空间,也不消耗计算机的CPU时间。

      • 例子:一个文本编辑器的程序文件、一个游戏的可执行文件、一个网页浏览器的应用程序等都是程序的例子。

    2. 进程(Process)

      • 定义:进程是计算机中正在运行的程序的实例。它是程序在内存中加载并执行时的活动状态,包括程序的代码、数据、执行状态、系统资源分配等。

      • 特点:进程是动态的,它占用计算机的内存空间,可以执行计算机指令,与其他进程并发运行。每个进程都有自己的独立内存空间,因此它们不会相互干扰。进程可以创建、启动、暂停、终止等。

      • 例子:当您运行一个文本编辑器、播放音乐、浏览网页或打印文档时,每个活动都对应一个独立的进程。

    总结来说,程序是静态的、不执行的计算机指令集合,而进程是程序的运行实例,它占用计算机内存,执行指令,并与其他进程一起协同工作。进程是计算机操作系统中的核心概念,它使多任务处理成为可能.

    可以将程序和进程比喻为烹饪的过程:

    1. 程序(Program)就像是一本菜谱。菜谱是一份详细的食物制作指南,它包含了食材清单、烹饪步骤和所需的厨具。但菜谱本身并不能做出美味的食物,它只是一份指导,等待着被厨师(计算机)读取和执行。就像您需要拿出菜谱并按照其中的步骤去做一道菜一样,计算机需要将程序加载到内存中并执行其中的指令。

    2. 进程(Process)就像是正在烹饪中的一道菜。当您选择一道菜谱并开始烹饪时,您实际上在制作一道具体的菜肴。这个菜肴有自己的成分、调味料和烹饪状态。它在火上烹煮、被切割、被摆盘等等。这个菜肴是实际被制作和提供给食客的,就像进程是正在计算机内存中运行和执行的程序实例。

    所以,程序就像是一份指导,而进程是实际的动态执行。程序是静态的,而进程是具体的、可见的操作。

    2 进程状态

    2.1 进程的5种基本状态

    (1)新建(new):进程正在被创建。 (2)就绪(ready):进程可运行,正等待获得处理机。 (3)运行(running):进程的指令正在被执行。 (4)阻塞(blocked)或等待:进程因等待某事件(如请求I/O)而暂停执行。 (5)完成(done):进程结束。

    2.2 进程状态之间转换

    2.3 七状态模型

    引入挂起(即 进程此时在外存等待)

    就绪(Ready):进程在内存且可立即进入运行状态 阻塞(Blocked):进程在内存并等待某事件的出现 阻塞挂起(Blocked, suspend):进程在外存并等待某事件的出现 就绪挂起(Ready, suspend):进程在外存,但只要进入内存,即可运行 运行 新建 完成

    注意 挂起都在外存

    挂起:把进程从内存转到外存

    激活:把进程从外存转到内存

    补充:

    时间片是操作系统给程序分配的时间,保证一个进程不会一直占用CPU资源不释放造成混乱

    3 进程描述

    3.1 进程控制块 PCB

    作用

    1 是OS管理和控制进程的数据结构。

    2 PCB记录着进程的描述信息。

    每个进程对应1个PCB。

    信息内容

    (1)进程本身的标识信息

    进程标识符pid(process ID):整数,由OS分配,唯一

    用户标识符uid(user ID):创建该进程的用户

    对应程序的地址:内存、外存

    (2)CPU现场 - 为进程正确切换所需

    所有寄存器的值

        或称进程上下文(context)

    因为要切换走进程!所以要保护当前进程的上下内容,使得切换回来的时候可以继续正常执行

    (3)进程调度信息

    进程的状态

    优先级

    使进程阻塞的条件

    占用CPU 、等待CPU的时间(用于动态调整优先级)

    (4)进程占用资源的信息

    进程间同步和通信机制,如信号量、消息队列指针

    打开文件的信息,如文件描述符表

    CPU现场 - 为进程正确切换所需

    所有寄存器的值

    或称进程上下文(context)

    Linux的进程控制块:task_struct

    进程创建时,由OS创建PCB;

    进程终止时,由OS撤销PCB;

    进程运行时,以PCB作为调度依据。

    3.2 进程块组织方式

    一般来说,系统把所有PCB组织在一起,并把它们放在内存的固定区域,构成PCB表。

    PCB表的大小决定了系统中最多可同时存在的进程个数。

    同一状态进程的PCB组成一个链表,不同状态对应多个不同的链表,如就绪链表、阻塞链表

    4 进程控制

    基本概念

    原语

    创建、撤销进程以及完成进程各状态之间的转换,由具有特定功能的原语完成

    原语 由若干指令构成的具有特定功能的函数

    具有原子性,其操作具有不可分割性

    如:

    进程创建原语

    进程撤销原语

    阻塞原语

    唤醒原语

    挂起原语

    激活(解挂)原语

    改变进程优先级

    5 进程同步 互斥

    在执行时间上互相重叠(或交替),一个进程的执行尚未结束,另一个进程的执行已经开始的执行方式。

    这样会有一个问题

    因为资源共享的问题,结果会产生不确定性

    为此,引入同步(synchronization)和互斥(mutual exclusion)。

    临界资源 一次只允许一个进程独占访问(使用)资源 ,越小越好

    临界区 进程中访问临界资源的的程序段

    5.1 区分进程互斥和同步

    互斥是指执行某个进程的时候访问某一临界资源的时候,另一个进程不能执行访问这一临界资源。

    经典只有互斥问题:打印机打印

    同步是指完成某一进程执行是有条件的,必须等另一个进程的某一资源结束才可以

    经典只有同步的问题:售票员售票

    既有互斥又有同步问题:消费者问题

    5.2 核心方案

    信号量

    利用信号量P-V操作可以实现进程的互斥访问

    利用信号量P-V 操作可以实现进程的同步访问

    5.3 其他方案

    实现互斥方案

    一个好的互斥方案应满足以下条件:

    (1)任何两个进程不能同时处于临界区。

    (2)临界区外的进程不应阻止其他进程进入临界区。

    (3)不应使进程在临界区外无休止地等待。就是说,临界区代码执行时间要短。

    (4)不应对CPU的个数和进程之间的相对运行速度作任何假设。

    方案1 设置锁变量

    即设置一个共享变量lock

    当lock=0的时候,临界区内无进程,初始值

    当lock=1的时候,临界区内有进程

    while(lock);
    lock=1;
    <临界区>
    lock=0;
    <非临界区>

    可能的问题

    1 会导致两个进程同时进入临界资源

    比如进程1走到lock=1的时候,还没来得及上锁(修改lock的值为1)就被切换走了,这时候其他进程 就可以避免while也进入临界区

    2 可能会存在盲等待 走到lock=0的时候,还没来得及解锁就被切换走了,这时候其他进程都进不来!

    所以这种方案是错误的,不能达到效果

    方案2 严格轮转法

    设置共享变量turn,以指示进入临界区的进程号

    以两个进程为例

    turn=0的时候允许进程0进入临界区,初始值

    turn=1的时候允许进程1进入临界区

    进程0

    while  (turn != 0);
    <临界区>
    turn = 1;
    <非临界区> 

    进程1

    while  (turn != 1);
    <临界区>
    turn = 0;
    <非临界区> 

    本质互为锁

    可能的问题

    进程可能会被临界区之外的进程阻塞

    方案3 Peterson解决方案

    设置一个共享变量process,代表此时进入临界区的进程号

    enter_region(process); //process是 进入/离开临界区的进程号
    <临界区>
    leave_region(process);
    <非临界区>
    ​

    当一个进程想进入临界区时,先调用enter_region函数,判断是否能安全进入,不能的话等待;当进程从临界区退出后,需调用leave_region函数,允许其它进程进入临界区。 两个函数的参数均为进程号

    以两个进程为例子

    #define  FALSE  0
    #define  TRUE   1
    #define   N        2 // 进程的个数
    int  turn;         // 轮到谁?•
    int  interested[N];    // 兴趣数组,表明第i个进程是否在临界区,所有元素初始值均为FALSE
    void  enter_region (int  process)  // process为进程号 0 或 1•{•        
        int  other;  // 另外一个进程的进程号•        
        other  =  1  -  process;    •        
        interested[process]  =  TRUE; // 表明本进程进入临界区•       
        turn  =  process;             // 设置标志位•       
        while ( turn == process && interested[other] == TRUE);
    }
    void  leave_region (int  process)•{•      
        interested[process]  =  FALSE; // 本进程将离开临界区•}

    方案4 关中断

    由于进程在切换进程的时候 必须进行中断处理,既然如此的话

    我们可以在一个程序进入临界区域之前,将中断功能给关闭,简称关中断!

    关中断;
    <临界区>;
    开中断;
    <非临界区>;

    缺点

    1 对多处理机系统无效,因为每个处理机有自己的中断开关

    2 关中断权利交给用户不合适

    方案5 机器指令实现的互斥

    即保证某些内容他是直接互斥的

  • 相关阅读:
    Hadoop与Spark中的Shuffle过程梳理
    Apache DolphinScheduler-3.2.0集群部署教程
    uniapp中扫码,进行网络判定,是否有网络扫码
    通过tushare接口完成股票的实际交易的方法有哪些?
    数据中台的那些“经验与陷阱”
    笔记本无线网卡天线接线柱掉了(AUX和MAIN两个接口)
    企业微信机器人对接GPT
    细讲Java连接Kafka构建生产者和消费者
    web组态(BY组态)接入流程
    测试管理并不好做,做好以下几点可直上云霄!
  • 原文地址:https://blog.csdn.net/Q52099999/article/details/134543150