Bài giảng Hệ điều hành (Operating Systems) - Hà Lê Hoài Trung - Chương 5: Phần 2 Đồng bộ và giải quyết tranh chấp (Process Synchronization)
? Đặt vấn đề (tại sao phải đồng bộ và giải
quyết tranh chấp ?)
? Vấn đề Critical section
? Các giải pháp phần mềm
? Giải thuật Peterson, và giải thuật bakery
? Đồng bộ bằng hardware
? Semaphore
? Các bài toán đồng bộ
? Critical region
? Monitor
i trước, sau đó mới đến đũa bên phải, trong khi đó triết gia ở vị trí chẵn cầm đũa bên phải trước, sau đó mới đến đũa bên trái Starvation? 50 Khoa KTMT Bài toán Readers-Writers (1) Readers - Writers W khơng được cập nhật dữ liệu khi cĩ một R đang truy xuất CSDL . Tại một thời điểm , chỉ cho phép một W được sửa đổi nội dung CSDL. Database R1 R2 R3 W1 W2 51 Khoa KTMT Bài toán Readers-Writers (2) Bộ đọc trước bộ ghi (first reader-writer) Dữ liệu chia sẻ semaphore mutex = 1; semaphore wrt = 1; int readcount = 0; Writer process wait(wrt); ... writing is performed ... signal(wrt); Reader Process wait(mutex); readcount++; if (readcount == 1) wait(wrt); signal(mutex); ... reading is performed ... wait(mutex); readcount--; if (readcount == 0) signal(wrt); signal(mutex); 52 Khoa KTMT Bài toán Readers-Writers (3) mutex: “bảo vệ” biến readcount wrt ‟ Bảo đảm mutual exclusion đối với các writer ‟ Được sử dụng bởi reader đầu tiên hoặc cuối cùng vào hay ra khỏi vùng tranh chấp. Nếu một writer đang ở trong CS và có n reader đang đợi thì một reader được xếp trong hàng đợi của wrt và n 1 reader kia trong hàng đợi của mutex Khi writer thực thi signal(wrt), hệ thống có thể phục hồi thực thi của một trong các reader đang đợi hoặc writer đang đợi. 53 Khoa KTMT Các vấn đề với semaphore Semaphore cung cấp một công cụ mạnh mẽ để bảo đảm mutual exclusion và phối hợp đồng bộ các process Tuy nhiên, nếu các tác vụ wait(S) và signal(S) nằm rải rác ở rất nhiều processes khó nắm bắt được hiệu ứng của các tác vụ này. Nếu không sử dụng đúng có thể xảy ra tình trạng deadlock hoặc starvation. Một process bị “die” có thể kéo theo các process khác cùng sử dụng biến semaphore. signal(mutex) … critical section … wait(mutex) wait(mutex) … critical section … wait(mutex) signal(mutex) … critical section … signal(mutex) 54 Khoa KTMT Critical Region (CR) Là một cấu trúc ngôn ngữ cấp cao (high-level language construct, được dịch sang mã máy bởi một compiler), thuận tiện hơn cho người lập trình. Một biến chia sẻ v kiểu dữ liệu T, khai báo như sau v: shared T; Biến chia sẻ v chỉ có thể được truy xuất qua phát biểu sau region v when B do S; /* B là một biểu thức Boolean */ „ Ý nghĩa: trong khi S được thực thi, không có quá trình khác có thể truy xuất biến v. 55 Khoa KTMT CR và bài toán bounded buffer Dữ liệu chia sẽ: struct buffer { int pool[n]; int count, in, out; } region buffer when (count < n) { pool[in] = nextp; in = (in + 1) % n; count++; } Producer region buffer when (count > 0){ nextc = pool[out]; out = (out + 1) % n; count--; } Consumer 56 Khoa KTMT Monitor (1) Cũng là một cấu trúc ngôn ngữ cấp cao tương tự CR, có chức năng như semaphore nhưng dễ điều khiển hơn Xuất hiện trong nhiều ngôn ngữ lập trình đồng thời như ‟ Concurrent Pascal, Modula-3, Java,… Có thể hiện thực bằng semaphore 57 Khoa KTMT Monitor (2) Là một module phần mềm, bao gồm ‟ Một hoặc nhiều thủ tục (procedure) ‟ Một đoạn code khởi tạo (initialization code) ‟ Các biến dữ liệu cục bộ (local data variable) Đặc tính của monitor ‟ Local variable chỉ có thể truy xuất bởi các thủ tục của monitor ‟ Process “vào monitor” bằng cách gọi một trong các thủ tục đó ‟ Chỉ có một process có thể vào monitor tại một thời điểm mutual exclusion được bảo đảm shared data entry queue … operations initialization code Mô hình của một monitor đơn giản 58 Khoa KTMT Cấu trúc của monitor monitor monitor-name { shared variable declarations procedure body P1 (…) { . . . } procedure body P2 (…) { . . . } procedure body Pn (…) { . . . } { initialization code } } 59 Khoa KTMT Condition variable Nhằm cho phép một process đợi “trong monitor”, phải khai báo biến điều kiện (condition variable) condition a, b; Các biến điều kiện đều cục bộ và chỉ được truy cập bên trong monitor. Chỉ có thể thao tác lên biến điều kiện bằng hai thủ tục: ‟ a.wait: process gọi tác vụ này sẽ bị “block trên biến điều kiện” a process này chỉ có thể tiếp tục thực thi khi có process khác thực hiện tác vụ a.signal ‟ a.signal: phục hồi quá trình thực thi của process bị block trên biến điều kiện a. Nếu có nhiều process: chỉ chọn một Nếu không có process: không có tác dụng 60 Khoa KTMT Monitor có condition variable Các process có thể đợi ở entry queue hoặc đợi ở các condition queue (a, b,…) Khi thực hiện lệnh a.wait, process sẽ được chuyển vào condition queue a Lệnh a.signal chuyển một process từ condition queue a vào monitor „ Khi đó, để bảo đảm mutual exclusion, process gọi a.signal sẽ bị blocked và được đưa vào urgent queue entry queue shared data ... operations initialization code a b 61 Khoa KTMT Monitor có condition variable (tt) local data condition variables procedure 1 procedure k initialization code . . . monitor waiting area entrance entry queue c1.wait condition c1 condition cn cn.wait urgent queue cx.signal . . . MONITOR exit 62 Khoa KTMT Monitor và dining philosophers monitor dp { enum {thinking, hungry, eating} state[5]; condition self[5]; 0 1 2 3 4 63 Khoa KTMT Dining philosophers (tt) void pickup(int i) { state[ i ] = hungry; test( i ); if (state[ i ] != eating) self[ i ].wait(); } void putdown(int i) { state[ i ] = thinking; // test left and right neighbors test((i + 4) % 5); // left neighbor test((i + 1) % 5); // right … } 64 Khoa KTMT Dining philosophers (tt) void test(int i) { if ( (state[(i + 4) % 5] != eating) && (state[ i ] == hungry) && (state[(i + 1) % 5] != eating) ) { state[ i ] = eating; self[ i ].signal(); } void init() { for (int i = 0; i < 5; i++) state[ i ] = thinking; } } 65 Khoa KTMT Dining philosophers (tt) Trước khi ăn, mỗi triết gia phải gọi hàm pickup(), ăn xong rồi thì phải gọi hàm putdown() dp.pickup(i); ăn dp.putdown(i); Giải thuật không deadlock nhưng có thể gây starvation. 66 Khoa KTMT Bài Tập Bài 1. Xét giải pháp đồng bộ hoá sau : while (TRUE) { int j = 1-i; flag[i]= TRUE; turn = j; while (turn == j && flag[j]==TRUE); critical-section (); flag[j] = FALSE; Noncritical-section (); } Đây có phải là một giải pháp bảo đảm 3 điều kiện không ? 67 Khoa KTMT Bài tập Bài 1 : Xét giải pháp phần mềm do Dekker đề nghị để tổ chức truy xất độc quyền cho hai tiến trình . Hai tiến trình P0, P1 chia sẻ các biến sau : var flag : array [0..1] of boolean; (khởi động là false) turn : 0..1; Cấu trúc một tiến trình Pi ( i =0 hay 1, và j là tiến trình còn lại ) như sau : repeat flag[i] := true; while flag[j] do if turn = j then begin flag[i]:= false; while turn = j do ; flag[i]:= true; end; critical_section(); turn:= j; flag[i]:= false; non_critical_section(); until false; Giải pháp này có phải là một giải pháp đúng thỏa mãn 4 yêu cầu không ? 68 Khoa KTMT Bài tập Giả sử một máy tính không có chỉ thị TSL, nhưng có chỉ thị Swap có khả năng hoán đổi nội dung của hai từ nhớ chỉ bằng một thao tác không thể phân chia : procedure Swap() var a,b: boolean); var temp : boolean; begin temp := a; a:= b; b:= temp; end; Sử dụng chỉ thị này có thể tổ chức truy xuất độc quyền không ? Nếu có, xây dựng cấu trúc chương trình tương ứng 69 Khoa KTMT Bài tập – semanphore Xét hai tiến trình xử lý đoạn chương trình sau : process P1 { A1 ; A2 } process P2 { B1 ; B2 } Đồng bộ hoá hoạt động của hai tiến trình này sao cho cả A1 và B1 đều hoàn tất trước khi A2 hay B2 bắt đầu . 70 Khoa KTMT Bài tập – semanphore Sử dụng semaphore để viết lại chương trình sau theo mơ hình xử lý đồng hành: A = x1 + x2; B = A*x3; C= A + x4; D= B + C; E = D*x5 + C; Giả sử cĩ 5 process mỗi process sẽ thực hiện 1 biểu thức. 71 Khoa KTMT Bài tập – semanphore Xét hai tiến trình sau : process A { while (TRUE) na = na +1; } process B { while (TRUE) nb = nb +1; } ‟ Đồng bộ hoá xử lý của hai tiến trình trên, sử dụng hai semaphore tổng quát, sao cho tại bất kỳ thời điểm nào cũng có nb < na <= nb +10 ‟ Nếu giảm điều kiện chỉ là na <= nb +10, giải pháp của bạn sẽ được sửa chữa như thế nào ? 72 Khoa KTMT Bài tập – semanphore Một biến X được chia sẻ bởi hai tiến trình cùng thực hiện đoạn code sau : do X = X +1; if ( X == 20) X = 0; while ( TRUE ); Bắt đầu với giá trị X = 0, chứng tỏ rằng giá trị X có thể vượt quá 20. Cần sửa chữa đoạn chương trình trên như thế nào để bảo đảm X không vượt quá 20 ? 73 Khoa KTMT Bài tập – semanphore Tổng quát hoá câu hỏi 8) cho các tiến trình xử lý đoạn chương trình sau : process P1 { for ( i = 1; i <= 100; i ++) Ai } process P2 { for ( j = 1; j <= 100; j ++) Bj } Đồng bộ hoá hoạt động của hai tiến trình này sao cho cả với k bất kỳ ( 2 k 100), Ak chỉ có thể bắt đầu khi B(k-1) đã kết thúc, và Bk chỉ có thể bắt đầu khi A(k-1) đã kết thúc.
File đính kèm:
- Bài giảng Hệ điều hành (Operating Systems) - Hà Lê Hoài Trung - Chương 5 Phần 2 Đồng bộ và giải quyết tranh chấp (Process Synchronization).pdf