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
        //本进程离开临界区
    }
    
  • 相关阅读:
    找出有序数组中绝对值最小的数
    warning:deprecated conversion from string constant to 'char *' 解决方案
    Wordnet 与 Hownet 比较
    心灵鸡汤
    冒泡排序
    .NET加密配置文件connectionStrings节点
    C#基础知识之方法重载总结
    [C#]工具类—FTP上传下载
    C#基础知识-对象初始化顺序
    自定义Dictionary支持线程安全
  • 原文地址:https://www.cnblogs.com/pluslius/p/10076092.html
Copyright © 2011-2022 走看看