Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh

Khái niệm cơ bản

? Các process/thread thực thi đồng thời chia sẻ code, chia

sẻ dữ liệu (qua shared memory, file).

? Nếu không có sự điều khiển khi truy cập các dữ liệu chia

sẻ thì có thể xảy ra trường hợp không nhất quán dữ liệu

(data inconsistent).

? Để duy trì sự nhất quán dữ liệu, hệ thống cần có cơ chế

bảo đảm sự thực thi có thứ tự của các process đồng thời.

? Ví dụ Bounded-Buffer (ch.4) thêm biến đếm count

#define BUFFER_SIZE 10

# typedef struct {

 } item;

item buffer[BUFFER_SIZE];

int in = 0, out = 0, count = 0;

Race Condition

? Race condition: nhiều

process truy xuất và thao

tác đồng thời trên dữ liệu

chia sẻ.

– Kết quả cuối cùng của việc

truy xuất đồng thời này phụ

thuộc thứ tự thực thi của các

lệnh thao tác dữ liệu.

? Chúng ta cần bảo đảm sao

cho tại mỗi thời điểm có một

và chỉ một process được

truy xuất, thao tác trên dữ

liệu chia sẻ. Do đó, cần có

cơ chế đồng bộ hoạt động

của các process này.

? Các lệnh tăng, giảm biến

tương đương trong ngôn ngữ

máy là:

? (P) count ++;

– register1 := count

– register1 := register1 +1

– count := register1

? (C) count --;

– register2 := count

– register2 := register2 -1

– count := register2

? Trong đó, registeri là các thanh

ghi của CPU

 

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 1

Trang 1

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 2

Trang 2

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 3

Trang 3

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 4

Trang 4

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 5

Trang 5

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 6

Trang 6

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 7

Trang 7

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 8

Trang 8

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 9

Trang 9

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 30 trang duykhanh 3880
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh

Bài giảng Hệ điều hành - Chương 3: Đồng bộ và giải quyết tranh chấp - Lê Ngọc Minh
false;
 Remainder Section
 }
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -30-
 15
 Semaphore
‰ Là công cụ đồng bộ cung cấp bởi OS mà không đòi hỏi
 busy waiting
‰ Semaphore S là một biến số nguyên, ngoài thao tác
 khởi động biến thì chỉ có thể được truy xuất qua hai tác
 vụ có tính đơn nguyên (atomic) và loại trừ (mutual 
 exclusive)
 – wait(S) hay còn gọi là P(S): giảm giá trị semaphore. Nếu giá trị
 này âm thì process thực hiện lệnh wait() bị blocked.
 – signal(S) hay còn gọi là V(S): tăng giá trị semaphore. Nếu giá trị
 này âm, một process đang blocked bởi một lệnh wait() sẽ được
 hồi phục để thực thi.
‰ Tránh busy waiting: khi phải đợi thì process sẽ được đặt
 vào một blocked queue, trong đó chứa các process đang
 chờ đợi cùng một sự kiện.
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -31-
 Hiện thực Semaphore 
‰ Định nghĩa semaphore như một record
 typedefstru c t {
 intvalue;
 structprocess *L ; /* process queue */
 } sem aphore;
‰ Giả sử có hai tác vụ đơn:
 – block: tạm treo process nào thực thi lệnh này.
 – wakeup(P): hồi phục quá trình thực thi của một
 process P đang blocked .
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -32-
 16
 Hiện thực Semaphore (t.t)
‰ Các tác vụ semaphore được định nghĩa như sau
 wait(S):
 S.value--;
 if (S.value < 0) { 
 add this process to S.L;
 block;
 }
 signal(S): 
 S.value++;
 if (S.value <= 0) {
 remove a process P from S.L;
 wakeup(P);
 }
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -33-
 Hiện thực Semaphore (t.t)
‰ Khi một process phải chờ trên semaphore S, nó
 sẽ bị blocked và được đặt trong hàng đợi
 semaphore
 – Hàng đợi này là danh sách liên kết các PCB
‰ Tác vụ signal() thường sử dụng cơ chế FIFO để
 chuyển một process từ hàng đợi và đưa vào
 hàng đợi ready
‰ block() và wakeup() thay đổi trạng thái của
 process – đó là các system call cơ bản.
 – Block: chuyển từ running sang waiting
 – wakeup: chuyển từ waiting sang ready
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -34-
 17
 Hiện thực Mutex với Semaphore
‰ Dùng cho n process ‰ Shared data:
 semaphore mutex; 
‰ Khởi tạo S.value = 1
 /*initially mutex.value = 1*/
‰ Chỉ duy nhất một 1 
 ‰ Process Pi: 
 process được vào CS 
 (mutual exclusion)
 do {
 wait(mutex);
‰ Để cho phép k process 
 critical section
 vào CS, khởi tạo
 S.value = k signal(mutex);
 remainder section
 } while (1);
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -35-
 Đồng bộ process bằng semaphore
‰ Hai process: P1 và P2 ‰ Để đồng bộ hoạt động
 theo yêu cầu, P1 phải
 định nghĩa như sau: 
‰ Yêu cầu: lệnh S1 trong
 P1 cần được thực thi S1;
 trước lệnh S2 trong P2 signal(synch);
 ‰ Và P2 định nghĩa như sau:
‰ Định nghĩa semaphore 
 “synch” dùng đồng bộ wait(synch);
 S2;
‰ Khởi động semaphore:
 synch.value= 0
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -36-
 18
 Nhận xét
‰ Khi S.value >=0: số process có thể thực thi wait(S)mà
 không bị blocked = S.value
‰ Khi S.value<0: số process đang đợi trên S = |S.value|
‰ Atomic và mutual exclusion: không được xảy ra trường
 hợp 2 process cùng đang ở trong thân lệnh wait(S) và
 signal(S) (cùng semaphore S) tại một thời điểm (ngay cả
 với hệ thống multiprocessor) 
 ⇒ do đó, đoạn mã định nghĩa các lệnh wait(S) và
 signal(S) cũng chính là vùng xảy ra tranh chấp (critical 
 section)
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -37-
 Nhận xét (t.t)
‰ wait() và signal() phải thực thi atomic và mutual 
 execution
‰ Vùng tranh chấp của các tác vụ wait(S) và signal(S) 
 thông thường rất nhỏ: khoảng 10 lệnh.
‰ Giải pháp cho vùng tranh chấp wait(S) và signal(S):
 – Uniprocessor: có thể dùng cơ chế cấm ngắt (disable 
 interrupt) để giải quyết tranh chấp (trong một khoảng thời
 gian rất ngắn). Phương pháp này không làm việc trên hệ
 thống multiprocessor.
 – Multiprocessor: có thể dùng các giải pháp software (như
 Dekker, Peterson) hoặc giải pháp hardware (test-and-set, 
 swap). Vì CS rất nhỏ nên chi phí cho busy waiting sẽ rất
 thấp.
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -38-
 19
 Deadlock và Starvation
‰ Deadlock – hai hay nhiều process đang chờ đợi vô
 hạn định một sự kiện không bao giờ xảy ra (vd: sự
 kiện do một trong các process đang đợi tạo ra).
‰ Gọi S và Q là hai biến semaphore được khởi tạo = 1
 P0 P1
 P(S); P(Q);
 P(Q); P(S);
 MM
 V(S); V(Q);
 V(Q) V(S);
‰ Starvation (indefinite blocking) có thể xảy ra khi
 chúng ta bỏ process vào hàng đợi và lấy ra theo cơ
 chế LIFO.
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -39-
 Các loại semaphore
‰ Counting semaphore: một số nguyên có giá trị
 không hạn chế.
‰ Binary semaphore: một số nguyên có giá trị nằm
 trong khoảng [0,1]. Binary semaphore rất dễ
 hiện thực.
‰ Chúng ta có thể hiện thực counting semaphore 
 S bằng binary semaphore.
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -40-
 20
 Các bài toán đồng bộ
‰ Bài toán Bounded-Buffer
 – Dữ liệu chia sẻ:
 SEMAPHORE full, empty, mutex;
 – Khởi tạo:
 full = 0;
 empty = BUFFER_SIZE;
 mutex = 1;
circular buffer
 out in
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -41-
 Bounded Buffer (t.t)
 PRODUCER CONSUMER
do { do { 
 wait(full)
 nextp= new _item (); wait(mutex);
 wait(em pty); nextc= get_buffer_item (out);
 wait(mutex); 
  signal(mutex);
 insert_to_buffer(nextp); signal(em pty);
 signal(mutex); consum e_item (nextc);
 signal(full); 
} while (1); } while (1);
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -42-
 21
 Bài toán “Dining Philosopher”
‰ 5 triết gia ngồi ăn và suy
 nghĩ
‰ Mỗi người cần 2 chiếc
 đũa để ăn
‰ Trên bàn chỉ có 5 đũa
‰ Bài toán này minh hoạ sự
 khó khăn trong việc phân
 phối tài nguyên giữa các
 ‰Dữ liệu chia sẻ:
 process sao cho không semaphore chopstick[5];
 xảy ra deadlock và
 starvation
 ‰Khởi đầu các biến đều là 1
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -43-
 Bài toán “Dining Philosopher”
 Triết gia thứ i:
 do {
 wait(chopstick[i])
 wait(chopstick[ (i+1) % 5 ] )
 eat
 signal(chopstick[i]);
 signal(chopstick[ (i+1) % 5] );
 think
 } while (1);
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -44-
 22
 Bài toán “Dining Philosopher”
‰ Giải pháp trên có thể gây ra deadlock
 – Khi tất cả triết gia đói bụng cùng lúc và đồng thời
 cầm một chiếc đũa bên tay trái ⇒ deadlock
‰ Một số cách giải quyết deadlock
 – Cho phép nhiều nhất 4 triết gia ngồi vào cùng một lúc.
 – Cho phép triết gia cầm đũa khi cả hai chiếc đũa đều
 sẵn sàng (nghĩa là tác vụ cầm đũa phải xảy ra trong
 CS)
 – Triết gia ngồi ở vị trí lẻ cầm đũa bên trá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
‰ Có thể xảy ra trường hợp starvation (tại sao?)
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -45-
 Bài toán Readers-Writers
‰ Dữ liệu chia sẻ ‰Reader Process
 semaphore mutex=1;
 semaphore wrt = 1; wait(mutex);
 integer readcount =0; readcount++;
 if (readcount == 1)
‰ Writer process wait(wrt);
 wait(wrt); signal(mutex);
 ... ...
 writing is performed reading is performed
 ... ...
 signal(wrt); wait(mutex);
 readcount--;
 if (readcount == 0)
 signal(wrt);
 signal(mutex):
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -46-
 23
 Bài toán Readers-Writers (t.t)
‰ 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), chúng ta có thể
 phục hồi thực thi của một trong các reader đang
 đợi hoặc writer đang đợi ⇒ dựa vào scheduler
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -47-
 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, 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) wait(mutex) signal(mutex)
 critical section critical section critical section
 wait(mutex) wait(mutex) signal(mutex)
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -48-
 24
 Critical Region (CR)
‰ Critical Region còn được gọi là conditional critical region 
 (CCR)
‰ Cơ sở: dựa trên semaphore, xây dựng cấu trúc ngôn ngữ
 cấp cao, 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 chung v chỉ có thể được truy xuất qua phát biểu sau
 region v when B do S
‰ Các region tham chiếu đến cùng một biến chia sẻ thì bị
 loại trừ tương hỗ.
‰ Khi một process muốn thực thi các lệnh trong region, 
 biểu thức Boolean B được kiểm tra. Nếu B=true, lệnh S
 được thực thi. Nếu B= false, process bị trì hoãn cho đến
 khi B = true và không có process nào đang ở trong
 region cùng tham chiếu đến biến v.
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -49-
 CR và bài toán bounded-buffer
 Dữ liệu chia sẻ: Producer
 region buffer when (count < n) {
 structbuffer 
 pool[in] = nextp;
 { in = ( in + 1 ) % n;
 intpool[n]; count++;
 intcount; }
 intin;
 Consum er
 intout;
 } region buffer when (count > 0){
 nextc = pool[out];
 out = ( out + 1 ) % n;
 count--;
 }
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -50-
 25
 Monitor
‰ Cũng là một cấu trúc ngôn ngữ cấp cao (high-level 
 language construct) 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, uC++, Java...
‰ Có thể hiện thực bằng semaphore (!!!)
 shared data
 ... Entry queue
 operations
 initialization
 code
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -51-
 Monitor
‰ Là một module phần mềm trong đó bao gồm
 – Một hoặc nhiều thủ tục/hàm (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
‰ Hiện thực monitor (tham khảo tài liệu)
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -52-
 26
 Cấu trúc của Monitor
 m onitor m onitor-nam e
 {
 shared variable declarations
 procedure body P1 () {
 . . .
 }
 procedurebody P2 () {
 . . .
 } 
 procedure body Pn () {
 . . .
 } 
 {
 initialization code
 }
 }
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -53-
 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ể truy xuất và thay đổi bằng hai thủ tục:
 – cwait(a): 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ụ csignal(a);
 – csignal(a): 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.
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -54-
 27
 Monitor có condition variable
 shared data entrance queue
 a
 b ª Các process có thể đợi ở
 entrance queue hoặc đợi ở các
 condition queue (a, b,...)
 ª Khi thực hiện lệnh cwait(a), 
 ... process sẽ được chuyển vào
 condition queue a
 operations ª Lệnh csignal(a) chuyển một
 process trong condition queue a
 vào monitor
 initialization ª Do đó, process gọi csignal(cn) 
 code sẽ bị blocked và được đưa vào
 urgent queue
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -55-
 Monitor có condition variable
 entrance
 queue
m onitor waiting area entrance
 MONITOR
 local data
 condition c1
 conditional variable
 cw ait(c1)
 Procedure 1
 ...
 condition cn ...
 cw ait(cn) Procedure k
 urgent queue initialization code
 csignal exit
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -56-
 28
 Monitor và Dining Philosopher
type dining-philosophers = monitor 
{
 var state : array [0..4] of :(thinking, hungry, eating);
 var self : array [0..4] of condition;
 procedure pickup (i: 0..4);
 begin
 state[i] := hungry;
 test (i);
 if state[i] ≠ eating then self[i].wait;
 end;
}
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -57-
 Monitor và Dining Philosopher
 monitor dp
 {
 enum {thinking, hungry, eating} state[5];
 condition self[5];
 void pickup(int i); 
 void putdown(int i);
 void test(int i);
 void init() 
 {
 for (int i = 0; i < 5; i++)
 state[i] = thinking;
 }
 }
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -58-
 29
 Dining Philosopher (t.t)
 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);
 test((i+1) % 5);
 }
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -59-
 Dining Philosopher (t.t)
 void test(int i) {
 if ( (state[(I + 4) % 5] != eating) &&
 (state[i] == hungry) &&
 (state[(i + 1) % 5] != eating)) {
 state[i] = eating;
 self[i].signal();
 }
 }
‰ 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);
 /* yum...yum...yum */
 dp.putdown(i);
 Khoa Công Nghệ Thông Tin – Đại Học Bách Khoa Tp.HCM -60-
 30

File đính kèm:

  • pdfbai_giang_he_dieu_hanh_chuong_3_dong_bo_va_giai_quyet_tranh.pdf