2014-04-18 151 views
1

我很难理解和实现Peterson的N个进程算法(也称为Filter算法)。我正在尝试使用共享内存在C中进行聊天。我使用的是可以在Wikipedia中发现的算法的版本:在聊天中实现Peterson的算法

// initialization 
level[N] = { -1 };  // current level of processes 0...N-1 
waiting[N-1] = { -1 }; // the waiting process of each level 0...N-2 

// code for process #i 
for(l = 0; l < N-1; ++l) { 
    level[i] = l; 
    waiting[l] = i; 
    while(waiting[l] == i && (there exists k ≠ i, such that level[k] ≥ l)) { 
     // busy wait 
    } 
} 

// critical section 

level[i] = -1; // exit section 

我有一个程序叫server.c和另一个叫client.c,我打算用算法,以便每个客户端都可以访问共享内存在自己的轮回。

据我所知,我的算法实现应该在每个客户端内运行。我的问题是:如果每个客户端都是程序client.c的不同实例,我怎么知道正在运行的客户端的数量(N的值)?另外,如果每个client.c的新实例都不知道有多少实例已经运行过,我怎么知道i的值(我会是进程的数量)?

如果我的问题不清楚,请让我知道,因为英语不是我的母语。

非常感谢!

+0

这些结构被认为是在共享内存中,所以这不适用于单独的程序实例,除非您将控制变量所在的区域标记为共享。但是,一旦你这样做,你可以有一个计数器,告诉你有多少并发用户。 –

+0

非常感谢您的回答。实际上,我正在为我的控制变量使用共享内存区域的一部分(我现在正在开发,所以我不知道它是否工作)。我很担心,因为控制变量可以在给定的时间被两个或更多不同的用户同时访问 - 这正是算法试图解决的问题。因此,为了使用该算法知道如何访问共享内存区域,我需要知道共享内存区域中的n的值,并反之亦然:... S –

回答

0
> How do I know the amount of clients running (the value of N) 
> if every client is a different instance of the program client.c? 

Peterson的解决方案要求所有参与的进程或线程都有权访问共享内存资源。该共享存储器段将包含水平[]和等待[]数组,以及N.

> also, how do I know the value of i (i would be the number of the process) 
> if each new instance of client.c is unaware of how many instances have 
> been run before? 

的值。在更原始的情况下有参与的进程,或线程的一组数,每个被分配这是'我'的价值。唯一的要求是它们是唯一的,并且i> = 0,并且我的< N.(也许你的实现可以从命令行参数分配'i')

在更高级的实现中,每个进程可能获取(然后增加)共享内存段中的'i'。当然,这样的实施必须确保每个参与者的启动方式不会引起i的争议。

+0

谢谢!我现在正在尝试的是实现“原始”情况,为流程分配值。感谢你的回答,我现在知道我正朝着正确的方向前进。 :) –