Bài giảng Lập trình hệ điều hành - Chương 5: Đồng bộ tiến trình cung cấp cho người học các kiến thức: Vấn đề miền tương trục, giải pháp phần mềm, giải pháp phần cứng, Semaphores, các bài toán đồng bộ hóa cổ điển, Monitors. Mời các bạn cùng tham khảo.
Khoa Công Nghệ Thông Tin & Truyền Thông Đại học Cần Thơ Giảng viên: Hà Duy An Vấn đề miền tương trục Giải pháp phần mềm Giải pháp phần cứng Semaphores Các toán đồng hóa cổ điển Monitors 10/29/2013 Chương 5: Đồng hóa • Các tiến trình thực thi đồng thời o Có thể bị ngắt vị trí • Các tiến trình đồng thời truy cập lên liệu chia sẻ → tình trạng khơng qn liệu (inconsistency) • Việc trì quán liệu yêu cầu chế để đảm bảo thực thi cách có thứ tự tiến trình có hợp tác với • Xét trường hợp: Bài toán Người sản xuất – Người tiêu thụ (Producer – Consumer Problem) với vùng đệm có kích thước giới hạn (bounded-buffer) 10/29/2013 Chương 5: Đồng hóa • Dữ liệu chia sẻ: #define BUFFER_SIZE 10 typedef struct { } item; item buffer[BUFFER_SIZE]; int in = 0; int out = 0; int counter = 0; 10/29/2013 Chương 5: Đồng hóa while (true) { /* produce an item in next produced */ while (counter == BUFFER_SIZE) ; /* nothing */ buffer[in] = next_produced; in = (in + 1) % BUFFER_SIZE; counter++; } 10/29/2013 Chương 5: Đồng hóa while (true) { while (counter == 0) ; /* nothing */ next_consumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; counter ; /* consume the item in next consumed */ } 10/29/2013 Chương 5: Đồng hóa • counter++ cài đặt: register1 = counter register1 = register1 + counter = register1 • Counter cài đặt: register2 = counter register2 = register2 - counter = register2 • Xét thực thi đan xen với “count = 5” giá trị khởi tạo: S0: producer execute register1 = counter {register1 = 5} S1: producer execute register1 = register1 + {register1 = 6} S2: consumer execute register2 = counter {register2 = 5} S3: consumer execute register2 = register2 – {register2 = 4} S4: producer execute counter = register1 {counter = } S5: consumer execute counter = register2 {counter = 4} 10/29/2013 Chương 5: Đồng hóa • Nếu hai producer consumer cố gắng cập nhật vùng đệm đồng thời, phát biểu assembly bị phủ lấp • Sự phủ lấp phụ thuộc vào cách producer consumer định thời • Tình trạng đua tranh (Race Condition): tình trạng mà vài tiến trình truy cập thay đổi lên liệu chia sẻ giá trị cuối liệu chia sẻ phụ thuộc vào tiến trình hồn thành cuối Để ngăn chặn tình trạng đua tranh, tiến trình cạnh tranh phải đồng hóa 10/29/2013 Chương 5: Đồng hóa • Xét hệ thống có n tiến trình {p0, p1, … pn-1} • Mỗi tiến trình có đoạn mã lệnh gọi miền tương trục (critical section): o Tiến trình cập nhật liệu dùng chung o Khi tiến trình miền tương trục, khơng tiến trình khác phép thực thi miền tương trục chúng => Vấn đề miền tương trục (critical-section problem): thiết kế giao thức giải vấn đề 10/29/2013 10 Chương 5: Đồng hóa { wait(rw_mutex); /* writing is performed */ signal(rw_mutex); } while (true); 10/29/2013 42 Chương 5: Đồng hóa { wait(mutex); read_count++; if (read_count == 1) wait(rw_mutex); signal(mutex); /* reading is performed */ wait(mutex); read_count ; if (read_count == 0) signal(rw_mutex); signal(mutex); } while (true); 10/29/2013 43 Chương 5: Đồng hóa • Năm triết gia ngồi bàn tròn, bát cơm đũa hình, vừa ăn vừa suy nghĩ • Khi suy nghĩ, triết gia không giao tiếp với triết gia khác • Khi đói, ơng ta cố gắng chọn đũa gần (giữa ông ta láng giềng) Ơng ta lấy đũa thời điểm, lấy đũa dùng láng giềng • Khi có đũa, triết gia ăn đặt đũa xuống ăn xong, sau suy nghĩ tiếp • Dữ liệu chia sẻ: semaphore chopstick[5]; Khởi đầu, giá trị 10/29/2013 44 Chương 5: Đồng hóa • Philosopher i: { wait(chopstick[i]) wait(chopstick[(i+1) % 5]) … // eat … signal(chopstick[i]); signal(chopstick[(i+1) % 5]); … // think … } while (TRUE); 10/29/2013 45 Chương 5: Đồng hóa • Giải thuật bảo đảm khơng có láng giềng ăn lúc, gây khóa chết (tình triết gia đói người lấy đũa bên trái) đói tài nguyên • Các giải pháp khả dụng: o Cho phép nhiều triết gia ngồi bàn o Cho phép triết gia lấy đũa hai đũa sẵn dùng o Dùng giải pháp bất đối xứng Ví dụ triết gia lẻ lấy đũa trái trước, đến đũa phải, triết gia chẵn thao tác ngược lại 10/29/2013 46 Chương 5: Đồng hóa • Sử dụng khơng đúng: o signal(mutex) … wait(mutex) o wait(mutex) … wait(mutex) o Thiếu wait(mutex) signal(mutex) hay hai • Khóa chết đối tài ngun 10/29/2013 48 Chương 5: Đồng hóa • Monitor cấu trúc ngơn ngữ lập trình (programming language construct), cung cấp chế đồng hóa mức ngơn ngữ cấp cao (highlevel language synchronization construct) giúp thuận tiện hiệu để đồng hóa tiến trình • Abstract data type (ADT): kiểu liệu trừu tượng: liệu bao bọc hàm bên ngoài, hàm phép truy cập đến liệu => monitor type ADT Chỉ tiến trình thưc thi bên monitor thời điểm => hàm bên monitor thực thi thời điểm • 10/29/2013 monitor monitor‐name { // shared variable declarations procedure P1 (…) { …. } procedure Pn (…) {……} initialization_code (…) { … } } 49 Chương 5: Đồng hóa 10/29/2013 50 Chương 5: Đồng hóa • Condition x, y; • Hai thao tác biến điều kiện: o x.wait () – ngưng tạm thời tiến trình gọi thao tác x.signal () o x.signal () – phục hồi lại tiến trình gọi x.wait () • Nếu khơng có tiến trình chờ biến điều kiện x hàm signal() không gây ảnh hưởng 10/29/2013 51 Chương 5: Đồng hóa 10/29/2013 52 Chương 5: Đồng hóa • Giả sử tiến trình P gọi x.signal() tiến trình Q chờ biến điều kiện x, để tránh hai tiến trình thực thi lúc monitor, hai lựa chọn sau dùng: • • • Signal and wait: P chờ Q rời khỏi monitor chờ điều kiện khác Signal and continue: Q chờ P rời khỏi monitor chờ điều kiện khác Lựa chọn thứ sử dụng kèm theo với điều kiện P phải thoát khỏi monitor sử dụng ngôn ngữ Concurrent Pascal Nhiều ngơn ngữ lập trình cài đặt chế đồng xác với ý tưởng monitor mô tả (bao gồm C# Java) Một số ngơn ngữ lập trình khác (như Erlang) cung cấp chế tương tự 10/29/2013 53 Chương 5: Đồng hóa • Dùng ngơn ngữ Pascal đơn giản hóa (Pidgin Pascal) minh họa sử dụng Monitor giải toán Producer-Consumer 10/29/2013 monitor ProducerConsumer condition full, empty; integer count; procedure insert(item: integer); begin if count = N then wait(full); insert_item(item) ; count := count + 1 ; if count = 1 then signal( empty) end; function remove: integer; begin if count = 0 then wait(empty); remove = remove_item; count := count ‐ 1 ; if count = N‐ then signal(full) end; count := 0; end monitor; 54 Chương 5: Đồng hóa procedure producer; begin while true begin item = producer_item; ProducerConsumer.insert(item) end end; 10/29/2013 procedure consumer; begin while true begin item = ProducerConsumer.remove; consume_item(item) end end; 55 Chương 5: Đồng hóa ... phục hồi lại tiến trình gọi x.wait () • Nếu khơng có tiến trình chờ biến điều kiện x hàm signal() không gây ảnh hưởng 10/29/2013 51 Chương 5: Đồng hóa 10/29/2013 52 Chương 5: Đồng hóa ... 10/29/2013 Chương 5: Đồng hóa • Xét hệ thống có n tiến trình {p0, p1, … pn-1} • Mỗi tiến trình có đoạn mã lệnh gọi miền tương trục (critical section): o Tiến trình cập nhật liệu dùng chung o Khi tiến trình. .. tiến trình phải dùng cho busy waiting 10/29/2013 33 Chương 5: Đồng hóa wait(semaphore *S) { S->value ; if (S->value < 0) { add this process to S->list; block(); } } signal(semaphore *S) { S->value++;