Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17388
  • 博文数量: 9
  • 博客积分: 427
  • 博客等级: 下士
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-04 17:41
文章分类

全部博文(9)

文章存档

2011年(1)

2010年(8)

我的朋友
最近访客

分类:

2010-09-04 17:50:25

问题起源:
    多个CPU访问一个共享内存,硬件没有提供读-修改-写指令,如何保证多个CPU在共享内存上的互斥访问?
 
    解决的思路来源于操作系统中的面包店算法。
 
    该算法的基本思想源于顾客在面包店中购买面包时的排队原理. 顾客在进入面包店前, 首先抓一个号, 然后按照号码由小到大的次序依次进入面包店购买面包. 这里, 面包店发放的号码是由小到大的, 但是两个或两个以上的顾客却有可能得到相同的号码(使所抓号码不同需要互斥), 如果多个顾客抓到相同的号码, 则规定按照顾客名字的字典次序进行排序, 这里假定顾客是没有重名的. 在计算机系统中, 顾客就相当于进程, 每个进程有一个唯一的标识, 我们用P的下面加一个下标来表示. 例如: 对于 Pi和Pj, 如果有i
该算法的实现需要如下两个数据结构:
  int choosing[n];
  int number[n];
前者表示进程是否正在抓号,正在抓号的进程choosing[i]为1,否则为0, 其初值均为0. 后者用来记录各个进程所抓到的号码, 如number[i]为0, 则进程Pi没有抓号, 如number[i]不为0, 则其正整数值为进程Pi所抓到的号码, 其初值均为0.
    为了方便起见, 我们定义下述表记法:
  ● (a,b)<(c,d) 如果 a  ● max(a0,…,an-1) 其值为一正整数k, 对于所有i, 0≤i≤n-1, k≥ai.
do
{
             
  choosing[i] = true;
  number[i] = max{number[0],number[1],…,number[n-1]}+1;//选号码
  choosing[i] = false;
  for(j = 0; j    {
    while (choosing[j]);
    while ((number[j] != 0) && (number[j],j)<(number[i],i));
  };
  //临界区
  number[i] = 0;
  //其余部分
}while(1);

理解:
   第一个试图进入临界区的进程Pi在没有其它进程竞争时顺利进入其临界区。满足了有空就进的要求。
当有竞争者Pk(i
在Pi进程中j==i时,number[j]==number[i],且j==i所以(number[j],j)<(number[i],i)不成立,退出while语句。j==k时,number[k]==number[i],且k>i所以(number[j],j)<(number[i],i))不成立,退出while语句。对与其它非i和k的j值,number[j]!=0不成立,退出while语句。
在pk进程中j==i时,number[j]
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gerryzhou/archive/2010/09/02/5859474.aspx
阅读(644) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Linux下PCI设备驱动程序开发

给主人留下些什么吧!~~