Cùng nắm kiến thức trong Lecture 7 Đồng bộ quá trình này thông qua việc tìm hiểu các nội dung sau: Khái niệm cơ bản, tranh chấp “Critical section”, các giải pháp, sử dụng lệnh máy thông thường, giải thuật Peterson, và giải thuật bakery, sử dụng lệnh cấm ngắt hoặc lệnh máy đặc biệt, semaphore, sonitor,...Mời các bạn cùng tham khảo!
Đồng Bộ Quá Trình BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Nội dung Khái niệm Tranh chấp “Critical section” Các giải pháp Sử dụng lệnh máy thông thường Giải thuật Peterson, giải thuật bakery Sử dụng lệnh cấm ngắt lệnh máy đặc biệt Semaphore Monitor BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Bài tốn đồng Khảo sát process/thread thực thi đồng thời chia sẻ liệu (ghi shared memory) hệ thống uniprocessor, shared memory multiprocessor Nếu khơng có kiểm sốt truy cập liệu chia sẻ chúng rơi vào tình trạng khơng nhất qn (inconsistent) Để trì nhất quán liệu, hệ thống cần có chế bảo đảm thực thi có trật tự process đồng thời BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Bài toán đồng (tt.) Hai lớp bài toán đồng bộ: Hợp tác (cooperation) Bài toán producer-consumer: bounded buffer Tranh giành (contention) Bài toán loại trừ tương hỗ: đồng nhiều trình sử dụng tài nguyên không chia sẻ đồng thời (như printer) Bài toán Dining Philosophers BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Đồng thời vs song song Trên uniprocessor hay shared memory multiprocessor, trình chạy đồng thời Trên shared memory multiprocessor, trình chạy song song BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Bài tốn Producer-consumer Ví dụ Bounded buffer, thêm biến đếm count #define BUFFER_SIZE 10 typedef struct { } item; item buffer[BUFFER_SIZE]; int in = 0, out = 0, count = 0; /* 10 buffers */ BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Bài tốn Producer-consumer (tt.) Quá trình Producer item nextProduced; while(1) { while (count == BUFFER_SIZE); /* nothing */ buffer[in] = nextProduced; troû count++; in = (in + 1) % BUFFER_SIZE; } Quá trình Consumer item nextConsumed; while(1) { while (count == 0); /* nothing */ troû nextConsumed = buffer[out]; count ; out = (out + 1) % BUFFER_SIZE; biến count chia sẻ } BK producer và consumer TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Bài tốn Producer-consumer (tt.) BK Các lệnh tăng/giảm biến count tương đương ngôn ngữ máy là: Producer count++: register1 = count register1 = register1 + count = register1 Consumer count : register2 = count register2 = register2 - count = register2 Trong đó, registeri là ghi CPU TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Đồng lệnh đơn nguyên Mã máy lệnh tăng và giảm biến count thực thi xen kẽ Giả sử count Chuỗi thực thi sau xảy ra: 1: producer register1 := count {register1 = 5} producer register1 := register1 + {register1 = 6} consumer register2 := count {register2 = 5} consumer register2 := register2 - {register2 = 3: producer count := register1 {count = 6} 4: consumer count := register2 {count = 4} 2: Cả hai process thao tác đồng thời lên biến chung count Trị biến chung không nhất quán thao tác hai process Giải pháp: lệnh count++, count phải đơn nguyên (atomic), nghĩa thực lệnh đơn, không thực thi đan xen BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Race condition Race condition: nhiều process truy xuất thao tác đồng thời lên liệu chia sẻ (như biến count); kết cuối việc truy xuất đồng thời phụ thuộc thứ tự thực thi lệnh thao tác liệu Để liệu chia sẻ nhất quán, cần bảo đảm cho process thao tác lên liệu chia sẻ Do đó, cần có chế đồng hoạt động process BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 10 Bài tốn “Dining Philosophers” (tt.) Giải thuật Dữ liệu chia sẻ: semaphore chopstick[5]; Khởi đầu biến là Triết gia thứ i: { wait(chopstick[ i ]) wait(chopstick[ (i + 1) % ]) … eat … signal(chopstick[ i ]); signal(chopstick[ (i + 1) % ]); … think … BK } while (1); TP.HCM 3 4 Khoa Khoa học & Kỹ thuật Máy tính 1 45 Bài tốn “Dining Philosophers” (tt.) Giải pháp gây deadlock Một số giải pháp giải deadlock Khi tất triết gia đồng thời cầm đũa bên tay trái lấy đủa tay phải deadlock Cho phép nhiều nhất triết gia ngồi vào bàn Cho phép triết gia cầm đũa hai đũa sẵn sàng (nghĩa là tác vụ cầm đũa phải xảy CS) Triết gia ngồi vị trí lẻ cầm đũa bên trái trước, sau đến đũa bên phải, triết gia vị trí chẵn cầm đũa bên phải trước, sau đến đũa bên trái Starvation? BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 46 Bài tốn Readers-Writers Giải thuật Dữ liệu chia sẻ semaphore mutex = 1; semaphore wrt = 1; int readcount = 0; Các writer process wait(wrt); writing is performed signal(wrt); Các 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); BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 47 Bài tốn Readers-Writers (tt.) mutex: “bảo vệ” biến readcount wrt Bảo đảm mutual exclusion writer Được sử dụng reader cuối cùng vào hay khỏi vùng tranh chấp Nếu writer CS có n reader đợi thì reader xếp hàng đợi wrt và n - reader hàng đợi mutex Khi writer thực thi signal(wrt), hệ thống phục hồi thực thi reader đợi writer đợi BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 48 Các vấn đề với semaphore BK Nếu tác vụ wait(S) và signal(S) nằm rải rác rất nhiều process Người lập trình khó nắm bắt hiệu ứng chúng Nếu khơng sử dụng xảy deadlock starvation Một process bị “die” kéo theo process khác sử dụng biến semaphore signal(mutex) … critical section … wait(mutex) wait(mutex) … critical section … wait(mutex) signal(mutex) … critical section … signal(mutex) TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 49 Monitor Phần tử ngôn ngữ cấp cao Xuất nhiều ngôn ngữ lập trình đồng thời Concurrent Pascal, Modula-3, Java,… Có thể thực semaphore BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 50 Monitor (tt.) Kiểu module phần mềm, bao gồm Một nhiều thủ tục (procedure) Một đoạn code khởi tạo (initialization code) Các biến liệu cục (local data variable) operations BK initialization code Ngữ nghĩa monitor shared data … entry queue Shared variable truy xuất thủ tục monitor Process “vào monitor” cách gọi thủ tục monitor Các thủ tục monitor loại trừ tương hỗ Mô hình monitor đơn giản TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 51 Cấu trúc monitor monitor monitor-name { shared variable declarations procedure body P1 (…) { } procedure body P2 (…) { } procedure body Pn (…) { } { initialization code } } BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 52 Condition variable Nhằm cho phép 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 cục và truy cập bên monitor Chỉ thao tác lên biến điều kiện hai thủ tục: a.wait: process gọi tác vụ này bị “block biến điều kiện” a process này tiếp tục thực thi có process khác thực tác vụ a.signal a.signal: phục hồi trình thực thi process bị block biến điều kiện a Nếu có nhiều process: chọn Nếu khơng có process: khơng có tác dụng BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 53 Monitor có condition variable shared data a b operations initialization code BK entry queue Các process đợi entry queue đợi condition queue (a, b,…) Khi thực lệnh a.wait, process chuyển vào condition queue a Lệnh a.signal chuyển process từ condition queue a vào monitor • Khi đó, để bảo đảm mutual exclusion, process gọi a.signal bị blocked và đưa vào urgent queue TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 54 Monitor có condition variable (tt.) entry queue monitor waiting area entrance MONITOR local data condition c1 procedure c1.wait condition variables condition cn cn.wait urgent queue BK cx.signal procedure k initialization code exit TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 55 Monitor dining philosophers monitor dp { enum {THINKING, HUNGRY, EATING} state[5]; condition self[5]; BK } TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 56 Monitor 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 … } BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 57 Monitor 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; } BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 58 Monitor dining philosophers (tt.) Trước ăn, triết gia phải gọi hàm pickup(), ăn xong thì phải gọi hàm putdown() đói dp.pickup(i); ăn dp.putdown(i); suy nghĩ Giải thuật khơng gây deadlock gây starvation không thực phân bố vì điều khiển tập trung BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính 59 ... học & Kỹ thuật Máy tính Bài tốn đồng (tt.) Hai lớp bài toán đồng bộ: Hợp tác (cooperation) Bài toán producer-consumer: bounded buffer Tranh giành (contention) Bài toán loại trừ tương... memory multiprocessor, trình chạy song song BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Bài tốn Producer-consumer Ví dụ Bounded buffer, thêm biến đếm count #define BUFFER_SIZE 10 typedef struct... in = 0, out = 0, count = 0; /* 10 buffers */ BK TP.HCM Khoa Khoa học & Kỹ thuật Máy tính Bài tốn Producer-consumer (tt.) Q trình Producer item nextProduced; while(1) { while (count == BUFFER_SIZE);