• Operation System


    Person's solution 是用来一种基于软件的解决关键区域问题的算法(critical-section).

    它并不是完美的,有可能不对地工作。并且是限制解决两个进程同步的问题。

    可是它非常easy,非常原始,学习起来也是非常轻松的。

    代码例如以下:

    do {
         flag[i] = true;
         turn = j;
         while (flag[j] && turn == j);
         critical section
         flag[i] = false;
         remainder section
    } while (true);

    flag[]事实上是一个2个变量的数组。这里的i标志一个进程,而j标志还有一个进程。

    critical section代表是须要相互排斥进入的一个区间,比方须要改动一些关键的共享数据,这个时候不能让两个进程同一时候改动,否则就会出现不可预知的结果了。记得好像见过阿里巴巴笔试有这种题目。

    有remainder section并不是关键区域,所做的操作是能够并行操作的,结果互不影响。

    这里基本的目的就是两个进程相互排斥地进入critical section。

    那么为什么这个算法是可行的呢?

    这种算法可行,须要满足三个条件:

    1 Mutual exclusion: 相互排斥进入

    2 Progress : 在非remaider section的进程能在一定时间内进入critical section

    3 Bounded waiting: 保证一个进程的等待时间不会过长


    分析:

    如果1 : 两个进程P1, P2同一时候运行了do语句:语句运行为:P1 flag[i] = true; P2 flag[j] = true; P1 turn = j; P2 turn = i; P1 while(flag[j] && turn == j) ;

    这个时候因为P2已经运行了turn = i语句,所以turn == i,那么P1的语句while(flag[j] && turn == j)的turn ==j就为假了,所以这个时候退出循环,P1进入critical section。

    然后P2 while (flag[i] && turn == i);由于这个时候flag[i] 和turn ==i都为真,那么P2就处于等待状态。由于P1和P2是等同的,所以这个情况下,仅仅能有一个进程能够进入critical section的。条件1成立。

    假设继续运行,那么就能够分析条件2也是成立的:由于P1进入了critical section之后运行完成,退出来,那么flag[i] = false,这个语句运行之后,P2 while(flag[i] && turn == i)的flag[i]就为假了。之歌时候P2就能够进入critical section了。

    那么继续分析条件3,能够知道P2的等待时间仅仅是P1运行critical section的时间。这个等待时间一般不会过长。

    其它情况就更加不会冲突了,能够列举全部语句运行的顺序知道,不管两个进程的语句怎样运行,这个算法都是成立的。


    --參考资料:Operating System Concepts



  • 相关阅读:
    完全N叉树寻找祖先
    MySql_Front新建数据库遇到访问地址冲突问题
    C++金额的中文大写
    STL_sort cmp
    螺旋数组
    ~
    Struts向JSP中传值
    Struts1-配置文件部分
    jQuery Ajax 的 load()方式
    jquery animate
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3815675.html
Copyright © 2020-2023  润新知