zoukankan      html  css  js  c++  java
  • 进程互斥

    竞争条件

    processA
              操作同一个数据
    processB
    

    进程互斥

    由于各进程要求使用共享资源(变量,文件等)
    而这些资源需要排他性使用
    个进程之间竞争使用这些资源
     -- 这一关系称为进程互斥
     
    临界资源
      系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源或共享变量
    临界区
      各个进程中对某个临界资源(共享变量)实施操作的程序片段
     
    临界区的使用原则
      1.没有进程在临界区时,想进入临界区的进程可以进入
      2.不允许2各进程同时进入临界区
      3.临界区外运行的进程不得阻塞其他进程进入临界区
      4.不得使进程无限期等待进入临界区
    

    软件解法

    1.错误解法
    
    P:
    ...
    while (free)
    free = true;
    临界区
    free = false;
    ...
    
    Q:
    ...
    while (free)
    free = true;
    临界区
    free = false
    
    free:临界区空闲标志
      true:有进程在临界区
      false:无进程在临界区
    初值: free为false
    
    //P加锁时,CPU切换到了Q加完锁后,CPU切换到了P,P也进行了加锁,借鉴意义,将加锁,解锁封装成原语操作,此时就正确了
    
    1.错误解法
    P:
    ...
    while(not turn)
    临界区
    turn = false
    ...
    
    Q:
    ...
    while(turn)
    临界区
    turn = true
    
    ...
    
    turn:谁进临界区的标志
       true: P进程临界区
       false: Q进程临界区
    初值任意
    
    //P想进临界区,Q不想进临界区,P永远进不了临界区
    
    1.错误解法
    P:
    
    ...
    pturn = true;
    while (qturn)
    临界区
    pturn = false
    ...
    
    Q:
    ...
    qturn = true;
    while(pturn)
    临界区
    qturn = false
    ...
    
    pturn,qturn,初值为false
    p进入临界区的条件,pturn ^ not qturn
    q进入临界区的条件,not pturn ^ qturn
    
    //P想进临界区时,CPU切换成Q进程,Q想进临界区时,CPU切换到了P,P,Q互相谦让都进不去临界区
    
    dekker算法
    P:
    
    pturn = true
    while (qturn){
        if(turn == 2){
            pturn = false;
            while(turn == 2){
                pturn = true;
            }
        }
        临界区
    }
    turn = 2;
    pturn = false
    
    Q:
    qturn = true;
    while(pturn){
        if(turn == 1){
            qturn = false;
            while(turn == 1)
            qturn = true;
        }
        临界区
        turn = 1
        qturn = false
    }
    
    //循环判断turn的值,如果turn=1Q就让出CPU给Q,并且不断循环,看自己什么时候可以上CPU
    //自旋锁问题造成了忙等待,该进程只有等时间片用完了才会切换CPU
    
    peterson算法
    
    enter_region(i)
    临界区
    leave_region(i)
    
    //内部实现
    #define FALSE 0
    #define TRUE 1
    #define N 2 //进程的个数
    int turn //轮到谁
    int interested[N]; //兴趣数组,初始值为FALSE
    
    void enter_region(int process){
        //process = 0 or 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
        //本进程离开临界区
    }
    
  • 相关阅读:
    Python运行时遇到UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(128)的问题
    Android 网络通信架构学习
    将Windows MyEclipse的web项目移植到Debian下
    build-essential : Depends: libc6-dev but it is not going to be installed or libc-dev 解决办法
    Debian可用的源 —— 23% waiting for headers解决办法
    将访问服务器的工作交由Service承担
    Servlet回传的数据显示在界面上
    Android客户端和Servlet服务器端通过JSON交互
    Welcome to My Blog!
    【三木夜话】无穷级的恐惧
  • 原文地址:https://www.cnblogs.com/pluslius/p/10076092.html
Copyright © 2011-2022 走看看