Tôi đang cố gắng hiểu Thuật toán N-Process của Peterson và tôi đã xem qua câu hỏi này.Cố gắng hiểu Thuật toán N-Process của Peterson
Câu hỏi: Giả sử 3 quy trình có ID tiến trình 0, 1 and 2
. Các quá trình này thực hiện đồng thời trên một bộ xử lý uni và sử dụng thuật toán N-process của Peterson để kiểm soát việc thực thi phần quan trọng. Mỗi quá trình chạy mã giả sau đây:
lock(pid);
<critical section>;
unlock(pid
nơi lock()
và unlock()
chức năng được quy định như
lock(for Process i):
/* repeat for all partners */
for (count = 0; count < (NUMPROCS-1); count++) {
flags[i] = count;
turn[count] = i;
"wait until (for all k != i, flags[k]<count) or (turn[count] != i)"
}
Unlock (for Process i):
/* tell everyone we are finished */
flags[i] = -1;
Giả sử trạng thái của hệ thống tại bất kỳ thời gian nhất định được xác định bởi <flags[0], flags[1], flags[2], turn[0], turn[1]>
giá trị và id của quá trình thực hiện hiện tại. Giả sử rằng trạng thái hiện tại của hệ thống là <0,0,0,2,-1>
với quá trình 0
hiện đang thực hiện. Hiển thị một cách cụ thể cho ba quy trình để chạy đến khi hoàn thành bắt đầu từ trạng thái này. Khi bạn theo dõi việc thực hiện đồng thời ba quy trình, hãy hiển thị trạng thái của hệ thống ở từng bước.
quan sát của tôi
Processes chạy đồng thời trên một đơn CPU không thể thực thi trên CPU cùng một lúc. Chỉ một trong số họ có thể thực hiện trên CPU tại một thời điểm. Trong khi quá trình đang thực hiện trên CPU, nó có thể thực hiện bất kỳ phần nào của mã của nó.
// NUMPROCS = 3
- Đối với i = 0
lock(for Process 0):
for (count = 0; count < 2; count++) {
flags[0] = count;
turn[count] = 0;
"wait until (for all k != 0, flags[k]<count) or (turn[count] != 0)"
}
Unlock (for Process 0):
flags[0] = -1;
- Đối với i = 1
lock(for Process 1):
for (count = 0; count < 2; count++) {
flags[1] = count;
turn[count] = 1;
"wait until (for all k != 1, flags[k]<count) or (turn[count] != 1)"
}
Unlock (for Process 1):
flags[1] = -1;
- Đối với i = 2
lock(for Process 2):
for (count = 0; count < 2; count++) {
flags[2] = count;
turn[count] = 2;
"wait until (for all k != 2, flags[k]<count) or (turn[count] != 2)"
}
Unlock (for Process 2):
flags[2] = -1;
Câu hỏi của tôi là Nơi để bắt đầu truy tìm mã? Nó được đưa ra rằng flags[0]=0, flags[1]=0, flags[2]=0, turn[0]=2, turn[1]=-1
nhưng làm thế nào nó sẽ giúp chúng tôi bắt đầu từ đâu để tìm mã?
Nếu chúng ta bắt đầu từ ngay trước khi vòng lặp for của quá trình
0
sau đó tất cả các giá trị lần lượt sẽ được thiết lập để giá trị khác nhau khác so với những gì được đưa ra cho chúng tôi.Nếu chúng tôi giả định bằng cách thực hiện câu hỏi có nghĩa là quy trình
0
nằm trong phần quan trọng của chúng tôi thì vòng lặp cho quy trình tiếp theo sẽ đặt giá trị cho một thứ khác.
Tại sao chúng được cung cấp cho chúng tôi giá trị trạng thái và cách chúng có thể giúp chúng tôi tìm nơi bắt đầu theo dõi mã.
Sẽ thật tuyệt nếu tôi nhận được một số gợi ý để giúp tôi bắt đầu theo dõi mã.
Cảm ơn và xin lỗi vì câu hỏi dài.