2014-04-18 148 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

謝謝!我現在正在嘗試的是實現「原始」情況,爲流程分配值。感謝你的回答,我現在知道我正朝着正確的方向前進。 :) –