Bài giảng lập trình hệ điều hành chương 5 đồng bộ tiến trình

55 458 0
Bài giảng lập trình hệ điều hành   chương 5  đồng bộ tiến trình

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 quán 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 hoà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 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 nguyên 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 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 [...]... (thỏa mãn cả 3 điều kiện) cho 2 tiến trình • Giả sử các lệnh load và store là nguyên tử (không thể bị ngắt) • Hai tiến trình chia sẽ hai biến: o int turn; o Boolean flag[2] • turn – chỉ định tiến trình nào được phép vào miền tương trục • flag – cho biết tiến trình nào đã sẵn sàng vào miền tương trục o flag [i] = true ⇒Pi sẵn sàng bước vào miền tương trục của nó 10/29/2013 18 Chương 5: Đồng bộ hóa do {... (1); => Không thõa điều kiện 2 10/29/2013 16 Chương 5: Đồng bộ hóa • Các biến chia sẻ: o boolean flag[2]; khởi đầu flag[0] = flag[1] = false o flag[i] = true ⇒Pi sẵn sàng bước vào miền tương trục của nó • Tiến trình P1: do { flag[i] := true; while (flag[j]) ; critical section flag [i] = false; remainder section } while (1); => Không thỏa mãn điều kiện 2 10/29/2013 17 Chương 5: Đồng bộ hóa • Giải quyết... 10/29/2013 12 Chương 5: Đồng bộ hóa • Các biến chung: o boolean lock; khởi đầu lock = false; • Tiến trình Pi: do { while (lock) ; lock = true; critical section lock = false; remainder section } while (1); => Không giải quyết được vấn đề 10/29/2013 15 Chương 5: Đồng bộ hóa • Các biến chung: o int turn; khởi đầu turn = 0 o turn = i ⇒Pi có thể bước vào miền tương trục của nó • Tiến trình Pi do { while... được đảm bảo 2 Yêu cầu tiến triển được thỏa mãn 3 Yêu cầu chờ đợi hữu hạn được đáp ứng 10/29/2013 19 Chương 5: Đồng bộ hóa • • • • • Nhiều hệ thống cung cấp phần cứng hỗ trợ đồng bộ hóa Tất cả các giải pháp này dựa trên ý tưởng bảo vệ miền tương trục bằng "khóa" Vô hiệu hóa các ngắt: khi một tiến trình bắt đầu thực thi trong miền tương trục thì các ngắt bị vô hiệu hóa đến khi tiến trình thoát khỏi miền... Xét tiến trình P1 và P2 yêu cầu lệnh S1 thực thi trước S2 P1: S1; signal(synch); P2: wait(synch); S2; 10/29/2013 31 Chương 5: Đồng bộ hóa • Định nghĩa một semaphore như là một cấu trúc gồm có: o Một giá trị integer o Một danh sách các tiến trình đang đợi trên nó typedef struct { int value; struct process *L; } semaphore; • Giả sử ta đã có hai thao tác được cung cấp bởi hệ điều hành như những lời gọi hệ. .. cơ bản: block() – ngưng tạm thời tiến trình gọi thao tác này wakeup(P) khởi động lại tiến trình P đã gọi thao tác block() trước đó 10/29/2013 32 Chương 5: Đồng bộ hóa • Yêu cầu: không có bất kỳ 2 tiến trình nào có thể thực thi cùng lúc hai thao tác wait() và signal() => critical-section problem • Cài đặt wait() và signal(): o Hệ thống đơn xử lý: vô hiệu hóa các ngắt o Hệ thống đa xử lý: • Dùng busy waiting... là ngắn => giảm bớt thời gian tiến trình phải dùng cho busy waiting 10/29/2013 33 Chương 5: Đồng bộ hóa wait(semaphore *S) { S->value ; if (S->value < 0) { add this process to S->list; block(); } } signal(semaphore *S) { S->value++; if (S->value list; wakeup(P); } } 10/29/2013 34 Chương 5: Đồng bộ hóa • Khóa chết – hai hoặc nhiều tiến trình đang chờ đợi vô hạn một... – một lệnh được hoàn thành trước khi lệnh khác được thực thi o Atomic = non-interruptible 10/29/2013 21 Chương 5: Đồng bộ hóa • Lệnh test_and_set đọc và sửa đổi nội dung của một word một cách nguyên tử: boolean test_and_set(boolean *target) { boolean rv = *target; *target = true; return rv; } 10/29/2013 22 Chương 5: Đồng bộ hóa • Dữ liệu chia sẻ: boolean lock = false; • Tiến trình Pi: do { while (Test_And_Set(lock))... Loại trừ hỗ tương (Mutual Exclusion) Nếu tiến trình Pi đang thực thi trong miền tương trục, thì không có tiến trình nào khác có thể thực thi trong miền tương trục của chúng 2 Tiến triển (Progress) Nếu không có tiến trình nào đang thực thi trong miền tương trục và tồn tại vài tiến trình muốn được thực thi trong miền tương trục của chúng, thì việc lựa chọn một tiến trình được vào miền tương trục của nó... bởi một trong các tiến trình đang chờ đợi khác • Giả sử có 2 semaphore S và Q có giá trị 1 P0 wait (S); wait (Q); signal (S); signal (Q); P1 wait (Q); wait (S); signal (Q); signal (S); • Sự đói CPU –bị nghẽn (block) không hạn định Một tiến trình có thể không bao giờ được xóa khỏi hàng đợi trong semaphore 10/29/2013 35 Chương 5: Đồng bộ hóa 1 Vùng đệm có kích thước giới hạn 2 Bộ đọc – bộ ghi 3 Các triết gia ăn tối ... 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. .. 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... (true); 10/29/2013 39 Chương 5: Đồng hóa • Một tập liệu (data set) chia sẻ nhiều tiến trình thực thi đồng thời o Readers: tiến trình đọc, không cập nhật liệu o Writers: tiến trình thực thi hai thao

Ngày đăng: 14/04/2016, 15:18

Tài liệu cùng người dùng

Tài liệu liên quan