盒子
盒子
文章目录
  1. 进程的同步与通信
  2. 进程同步问题实例

进程与线程

进程的组成

  1. 进程控制块PCB

    使程序能成为独立运行的单位,并可和其他进程并发执行

  2. 程序段
  3. 数据段
  4. 堆栈

操作系统内核

  • 核心态
  • 能执行一切命令,访问所有寄存器和存储区

  • 用户态
  • 只能执行规定的命令,访问指定的寄存器和存储区

  • 原语
  • 由若干条指令构成,是原子操作

    内核在执行某些基本操作时,往往时利用原语操作实现的

    创建原语要做的事情:

    1. 申请空白PCB
    2. 为进程分配资源
    3. 初始化PCB
      1. 初始化进程描述信息
      2. 初始化处理机状态信息
      3. 初始化进程控制信息
    4. 将新进程插入就绪队列

    撤销原语要做的事情:

    1. 查找撤销进程的PCB
    2. 终止正在执行的进程,并进行进程调度
    3. 终止子进程
    4. 归还资源
    5. 移除所在队列

    阻塞原语要做的事情:

    1. 停止进程的执行
    2. 将进程插入阻塞队列,改变进程在PCB的状元
    3. 重新调度

    唤醒原语要做的事情:

    1. 将进程从阻塞队列解下
    2. 将进程插入就绪队列
    3. 改变进程在PCB的状态

    挂起原语要做的工作:

    1. 检查被挂起进程的状态
    2. 若是就绪状态或正在运行则将其变为就绪挂起状态,若在阻塞则变为阻塞挂起状态

    激活原语要做的事情:

    1. 检查被激活进程的状态
    2. 若处于就绪挂起状态则变为就绪状态,若处于阻塞挂起状态则变为阻塞状态
    3. 若系统为抢占式系统,则进行进程调度

    进程 的两个基本属性:

    1. 进程是拥有资源的独立单位
    2. 进程是独立调度和分派的基本单位

    线程 是系统独立调度和分派的基本单位,不拥有资源只有TCB及堆栈

    进程模型

    进程的同步与通信

    同步机制应遵循的准则

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待
  • 互斥实现的硬件方法

  • 禁止中断
  • 专用机器指令
    1. TS指令

      无法实现让权等待

    2. Swap指令

    互斥实现的软件方法

  • 单标志算法
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //进程0
    while (turn!=0)
    //...
    //临界区
    turn = 1;
    //剩余区

    //进程1
    while (turn!=1) do
    //...
    //临界区
    turn = 0;
    //剩余区

    无法保证空闲让进

  • 双标志、先检查算法
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //进程0
    while (flag[1])
    ...
    flag[0]=true;
    //临界区
    flag[0] =false;
    //剩余区;

    //进程1
    while ( flag[0])
    ...
    flag[1]=true;
    //临界区
    flag[1] =false;
    //剩余区

    无法保证忙则等待

  • 双标志、先修改后检查算法
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //进程0
    flag[0]=true;
    while (flag[1])
    ...
    //临界区
    flag[0] =false;
    //剩余区

    //进程1
    flag[1]=true;
    while (flag[0])
    ...
    //临界区
    flag[1] =false ;
    //剩余区

    无法保证空闲让进

  • 先修改、后检查、后修改算法
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //进程0
    flag[0]=true;
    turn=1;
    while (flag[1]) && (turn==1)
    ...
    //临界区
    flag[0] =false ;
    //剩余区

    //进程1
    flag[1]=true;
    turn=0;
    while (flag[0]) && (turn==0)
    ...
    //临界区
    flag[1] =false ;
    //剩余区

    保证了空闲让进和忙则等待

  • 信号量和PV操作
  • 进程同步问题实例

  • 生产者-消费者问题
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    semaphore mutex =1;  
    semaphore empty = n;
    semaphore full = 0;
    //生产者进程
    void producer() {
    while(true){
    produce an item in data_p;
    P(empty);
    P(mutex);
    buffer[i] = data_p;
    i = (i + 1) % n;
    V(mutex);
    V(full);
    }
    }
    //消费者进程
    void consumer(){
    while(true){
    P(full);
    P(mutex);
    data_c = buffer[j];
    j = (j + 1) % n;
    V(mutex);
    V(empty);
    consume the item in data_c;
    }
    }
    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫