Bài giảng Lập trình đồng thời và phân tán - Bài 3: Những cơ sở đồng bộ hoá có cấu trúc gồm 3 phần cung cấp cho người học các kiến thức: Busy-waiting problem, semaphore, monitor. Mời các bạn cùng tham khảo nội dung chi tiết.
LẬP TRÌNH ĐỒNG THỜI & PHÂN TÁN BÀI 3: NHỮNG CƠ SỞ ĐỒNG BỘ HOÁ Giảng viên: Lê Nguyễn Tuấn Thành Email: thanhlnt@tlu.edu.vn Synchonization primitives NỘI DUNG Busy-waiting problem Semaphore Monitor Bài giảng có sử dụng hình vẽ sách “Concurrent and Distributed Computing in Java, Vijay K Garg, University of Texas, John Wiley & Sons, 2005” Busy-waiting problem ▪ Những giải pháp trước gặp vấn đề chung: bận chờ (busy-wait) sử dụng vòng lặp while ▪ Khi luồng khơng thể vào CS, liên lục kiểm tra điều kiện while ▪ Điều khiến luồng thực công việc khác => gây lãng phí chu trình CPU ▪ Thay phải kiểm tra liên tục điều kiện vào CS, luồng kiểm tra điều kiện trở thành true khơng lãng phí chu trình CPU Synchnization primitives ▪ Những sở đồng hóa giúp giải vấn đề bận chờ ▪ Hai cấu trúc đồng phổ biến: ▪ Semaphore Dijkstra đề xuất, năm 1968 ▪ Monitor phát minh P B Hansen C A R Hoare, năm 1972 Phần Semaphore Semaphores were invented by Edsger Dijkstra, 1968 Source: https://www.e-reading.club/chapter.php/102147/92/Li%2C_Yao_-_Real-Time_Concepts_for_Embedded_Systems.html Semaphore nhị phân (1) ▪ Một biến value kiểu boolean P(): if (value == false) { Thêm thân luồng vào hàng đợi khóa lại; ▪ Một hàng đợi } value = false; tiến trình bị khóa ▪ Hai thao tác ngun tử: P() V() Được thực thi nguyên tử V(): value = true; if (hàng đợi không rỗng) { Đánh thức luồng hàng đợi; } Được thực thi nguyên tử 10 35 Ngữ nghĩa Monitor (2) Các phương thức sử dụng bên Monitor synchronized (object) { … object.wait(); … object.notify(); … object.notifyAll(); … } Dừng thực thi luồng tại, thả khoá, đặt luồng vào hàng đợi object chờ luồng khác đánh thức Nếu hàng đợi không rỗng, chọn luồng tùy ý hàng đợi đánh thức Nếu hàng đợi khơng rỗng, đánh thức tất luồng hàng đợi 36 Hai kiểu Monitor Luồng Luồng synchronized (object) { … object.wait(); synchronized (object) { … object.notify(); } Luồng nên tiếp tục thực vào thời điểm này? … … } Do có luồng bên Monitor thời điểm Hai khả … 37 Hoare-style Monitor (1) Blocking condition variables Luồng Luồng synchronized (object) { … object.wait(); synchronized (object) { … object.notify(); … } … } Luồng vào monitor sau luồng gọi hàm notify() 38 Hoare-style Monitor (2) Blocking condition variables Luồng Luồng synchronized (object) { if (x != 1) object.wait(); synchronized (object) { if (x==1) object.notify(); assert(x==1); // x phải x++; } // x khơng } Luồng lo lắng thay đổi trạng thái môi trường, biến điều kiện, so với ban 39 Mesa-style Monitor (1) Nonblocking condition variables Luồng Luồng synchronized (object) { … object.wait(); synchronized (object) { … object.notify(); … } … } Luồng tiếp tục thực sau gọi hàm notify() Sau luồng khỏi monitor, luồng vào monitor 40 Mesa-style Monitor (2) Nonblocking condition variables Luồng Luồng synchronized (object) { if (x != 1) object.wait(); synchronized (object) { if (x==1) object.notify(); assert(x == 1); //phải } // x khác } Trạng thái môi trường luồng phép vào monitor thay đổi so với ban đầu 41 Mesa-style Monitor (3) Nonblocking condition variables Luồng Luồng synchronized (object) { while (x != 1) object.wait(); synchronized (object) { x=1; object.notify(); assert(x == 1); //phải } assert(x == 1); //phải } Luồng phải sử dụng while để đảm bảo trạng thái môi trường phù hợp (Lý do: luồng phép vào monitor, thức dậy, để tiếp tục chạy, vòng 42 Hai cấu trúc sử dụng Monitor Java public synchronized void myMethod () { … … … public void myMethod () { synchronized (this) { … … … = } } } Các phương thức tĩnh đồng hóa 43 Sử dụng Monitor cho số toán đồng 44 Bài toán 1: Nhà sản xuất & Người tiêu thụ (1) object sharedBuffer; void consume() { // or fetch void produce() { // or deposit synchronized (sharedBuffer) { synchronized (sharedBuffer) { while (bộ đệm rỗng) while (sharedBuffer đầy) sharedBuffer.wait(); sharedBuffer.wait(); Lấy phần tử khỏi đệm; Thêm phần tử vào đệm; if (bộ đệm không đầy) if (bộ đệm không rỗng) sharedBuffer.notify(); sharedBuffer.notify(); } } } } 45 46 Lớp Bounded buffer monitor Bài toán 2: Người đọc – Người ghi int numReader, numWriter; Object object; void writeDB() { void readDB() { synchronized (object) { synchronized (object) { while (numReader > || while (numWriter > 0) numWriter > 0) object.wait(); object.wait(); numReader++; numWriter = 1; } } // đọc liệu từ DB (không // ghi liệu vào DB (không cần phải monitor); cần phải monitor); synchronized (object) { synchronized (object) { numReader ; numWriter = 0; object.notify(); object.notifyAll(); } } } Luồng đánh thức phải } người ghi hay người đọc? Chứng minh 47 Bài toán 3: Bữa tối Triết gia public synchronized void acquire(int i) { state[i] = hungry; checkStartEating(i); while (state[i] != eating) Util.myWait(this); } public synchronized void release(int i) { state[i] = thinking; checkStartEating(left(i)); checkStartEating(right(i)); } void checkStartEating(int i) { if ( (state[left(i)] != eating) && (state[right(i)] != eating) && (state[i] == hungry) ) { state[i] = eating; notifyAll(); } 48 } Tài liệu tham khảo ▪ Concurrent and Distributed Computing in Java, Vijay K Garg, University of Texas, John Wiley & Sons, 2005 ▪ Tham khảo: ▪ Principles of Concurrent and Distributed Programming, M Ben-Ari, Second edition, 2006 ▪ Foundations of Multithreaded, Parallel, and Distributed Programming, Gregory R Andrews, University of Arizona, Addison-Wesley, 2000 ▪ The SR Programming Language: Concurrency in Practice, Benjamin/Cummings, 1993 ▪ Xử lý song song phân tán, Đoàn văn Ban, Nguyễn Mậu Hân, Nhà xuất Khoa học Kỹ thuật, 2009 49 ... truy cập đồng thời vào CSDL chia sẻ Rằng buộc ghi-ghi: Hai người ghi không truy cập đồng thời vào CSDL chia sẻ Nhiều người đọc đồng thời truy cập CSDL chia sẻ 20 21 Giải pháp cho Bài toán Người đọc... Quá trình Quá trình đọc liệu đọc liệu Quá trình ghi liệu Quá trình ghi liệu endRead() endWrite() endWrite() startRead() Readerj startRead() endRead() Starvation of a writer ? 22 Bài toán 3: Bữa... 19 Bài toán 2: Người đọc & Người ghi ▪ Phối hợp truy cập tới sở liệu chia sẻ nhiều người đọc nhiều người ghi ▪ Các buộc đồng bộ: Rằng buộc đọc-ghi: Một người đọc người ghi không truy cập đồng thời