1. Trang chủ
  2. » Luận Văn - Báo Cáo

Các vấn đề cổ điển của đồng bộ hoá

11 253 1

Đ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

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 110,94 KB

Nội dung

Các vấn đề cổ điển đồng hoá Các vấn đề cổ điển đồng hoá Bởi: Giảng viên Trần Hạnh Nhi Vấn đề Người sản xuất – Người tiêu thụ (Producer-Consumer) Vấn đề: hai tiến trình chia sẻ đệm có kích thước giới hạn Một hai tiến trình đóng vai trò người sản xuất – tạo liệu đặt liệu vào đệm- tiến trình đóng vai trò người tiêu thụ – lấy liệu từ đệm để xử lý Hình 3.17 Producer Consumer Để đồng hóa hoạt động hai tiến trình sản xuất tiêu thụ cần tuân thủ quy định sau : Tiến trình sản xuất (producer) không ghi liệu vào đệm đầy.(synchronisation) Tiến trình tiêu thụ (consumer) không đọc liệu từ đệm trống.(synchronisation) Hai tiến trình sản xuất tiêu thụ không thao tác đệm lúc (exclusion mutuelle) 1/11 Các vấn đề cổ điển đồng hoá Giải pháp: Semaphore Sử dụng ba semaphore : full, đếm số chỗ có liệu đệm; empty, đếm số chỗ trống đệm; mutex, kiểm tra việc Producer Consumer không truy xuất đồng thời đến đệm BufferSize = 3; // số chỗ đệm semaphore mutex = 1; // kiểm soát truy xuất độc quyền semaphore empty = BufferSize; // số chỗ trống semaphore full = 0; // số chỗ đầy Producer() { int item; while (TRUE) { produce_item(&item); // tạo liệu down(&empty); // giảm số chỗ trống down(&mutex); // báo hiệu vào miền găng enter_item(item); // đặt liệu vào đệm up(&mutex); // khỏi miền găng up(&full); // tăng số chỗ đầy } } Consumer() { 2/11 Các vấn đề cổ điển đồng hoá int item; while (TRUE) { down(&full); // giảm số chỗ đầy down(&mutex); // báo hiệu vào miền găng remove_item(&item); // lấy liệu từ đệm up(&mutex); // khỏi miền găng up(&empty); // tăng số chỗ trống consume_item(item); // xử lý liệu } } Monitor Định nghĩa monitor ProducerConsumer với hai thủ tục enter remove thao tác đệm Xử lý thủ tục phụ thuộc vào biến điều kiện full empty monitor ProducerConsumer condition full, empty; int count; procedure enter(); { if (count == N) wait(full); // đệm đầy, phải chờ enter_item(item); // đặt liệu vào đệm count ++; // tăng số chỗ đầy if (count == 1) // đệm không trống 3/11 Các vấn đề cổ điển đồng hoá signal(empty); // kích hoạt Consumer } procedure remove(); { if (count == 0) wait(empty) // đệm trống, chờ remove_item(&item); // lấy liệu từ đệm count ; // giảm số chỗ đầy if (count == N-1) // đệm không đầy signal(full); // kích hoạt Producer } count = 0; end monitor; Producer(); { while (TRUE) { produce_item(&item); ProducerConsumer.enter; } } Consumer(); 4/11 Các vấn đề cổ điển đồng hoá { while (TRUE) { ProducerConsumer.remove; consume_item(item); } } Trao đổi thông điệp Thông điệp empty hàm ý có chỗ trống đệm Tiến trình Consumer bắt đầu công việc cách gởi thông điệp empty đấng Producer Tiến trình Producer tạo liệu chờ đến nhận thông điệp empty gởi ngược lại cho Consumer thông điệp chứa liệu Tiến trình Consumer chờ nhận thông điệp chứa liệu, sau xử lý xong liệu này, Consumer lại gởi thông điệp empty đến Producer, BufferSize = 4; Producteur() { int item; message m; // thông điệp while (TRUE) { produce_item(&item); receive(consumer,&m); // chờ thông điệp empty create_message(&m, item); // tạo thông điệp liệu send(consumer,&m); // gởi liệu đến Consumer } 5/11 Các vấn đề cổ điển đồng hoá } Consumer() { int item; message m; for(0 to N) send(producer, &m); // gởi N thông điệp empty while (TRUE) { receive(producer, &m); // chờ thông điệp liệu remove_item(&m,&item);// lấy liệu từ thông điệp send(producer, &m); // gởi thông điệp empty consumer_item(item); // xử lý liệu } } Mô hình Readers-Writers Vấn đề : Nhiều tiến trình đồng thời sử dụng sở liệu Các tiến trình cần lấy nội dung sở liệu gọi tiến trình Reader, số tiến trình khác lại có nhu cầu sửa đổi, cập nhật liệu sở liệu chung này, chúng gọi tiến trình Writer Các quy định đồng hóa việc truy xuất sỡ liệu cần tuân thủ : Không cho phép tiến trình Writer cập nhật liệu sở liệu tiến trình Reader khác truy xuất nội dung sở liệu (synchronisation) Tại thời điểm , cho phép tiến trình Writer sửa đổi nội dung sở liệu (mutuelle exclusion) Giải pháp: 6/11 Các vấn đề cổ điển đồng hoá Semaphore Sử dụng biến chung rc để ghi nhớ số lượng tiến trình Reader muốn truy xuất sở liệu Hai semaphore sử dụng : mutex, kiểm soát truy cập đến rc;và db, kiểm tra truy xuất độc quyền đến sở liệu semaphore mutex = 1; // Kiểm tra truy xuất rc semaphore db = 1; // Kiểm tra truy xuất sở liệu int rc; // Số lượng tiến trình Reader Reader() { while (TRUE) { down(&mutex); // giành quyền truy xuất rc rc = rc + 1; // thêm tiến trình Reader if (rc == 1) // Reader down(&db); // cấm Writer truy xuất liệu up(&mutex); // chấm dứt truy xuất rc read_database(); // đọc liệu down(&mutex); // giành quyền truy xuất rc rc = rc - 1; // bớt tiến trình Reader if (rc == 0) // Reader cuối up(&db); // cho phép Writer truy xuất db up(&mutex); // chấm dứt truy xuất rc use_data_read(); } 7/11 Các vấn đề cổ điển đồng hoá } Writer() { while (TRUE) { create_data(); down(&db); // giành quyền truy xuất db write_database(); // cập nhật liệu up(&db); // chấm dứt truy xuất db } } Monitor Sử dụng biến chung rc để ghi nhớ số lượng tiến trình Reader muốn truy xuất sở liệu Một tiến trình Writer phải chuyển sang trạng thái chờ rc > KHi khỏi miền găng, tiến trình Reader cuối đánh thức tiến trình Writer bị khóa monitor ReaderWriter condition OKWrite, OKRead; int rc = 0; Boolean busy = false; procedure BeginRead() { if (busy) // db bận, chờ wait(OKRead); rc++; // thêm Reader 8/11 Các vấn đề cổ điển đồng hoá signal(OKRead); } procedure FinishRead() { rc ; // bớt Reader if (rc == 0) // Reader cuối signal(OKWrite); // cho phép Writer // truy xuất db } procedure BeginWrite() { if (busy || rc != 0) // db bận, hay wait(OKWrite); // Reader đọc db,chờ busy = true; } procedure FinishWrite() { busy = false; If (OKRead.Queue) signal(OKRead); else signal(OKWrite); 9/11 Các vấn đề cổ điển đồng hoá } Reader() { while (TRUE) { ReaderWriter.BeginRead(); Read_database(); ReaderWriter.FinishRead(); } } Writer() { while (TRUE) { create_data(&info); ReaderWriter.BeginWrite(); Write_database(); ReaderWriter.FinishWrite(); } } Trao đổi thông điệp Cần có tiến trình server điều khiển việc truy xuất sở liệu 10/11 Các vấn đề cổ điển đồng hoá Các tiến trình Writer Reader gởi thông điệp yêu cầu truy xuất đến server nhận từ server thông điệp hồi đáp tương ứng Reader() { while (TRUE) { send (server, RequestRead); receive (server, value); print(value); } } Writer() { while (TRUE) { create_data(&value); send (server, RequestWrite,value); receive (server,OKWrite); } } 11/11 [...].. .Các vấn đề cổ điển của đồng bộ hoá Các tiến trình Writer và Reader gởi các thông điệp yêu cầu truy xuất đến server và nhận từ server các thông điệp hồi đáp tương ứng Reader() { while (TRUE) { send (server, RequestRead); receive (server, value); print(value); } } Writer() .. .Các vấn đề cổ điển đồng hoá Giải pháp: Semaphore Sử dụng ba semaphore : full, đếm số chỗ có liệu đệm; empty, đếm số chỗ trống đệm; mutex, kiểm tra việc Producer Consumer không truy xuất đồng. .. Trao đổi thông điệp Cần có tiến trình server điều khiển việc truy xuất sở liệu 10/11 Các vấn đề cổ điển đồng hoá Các tiến trình Writer Reader gởi thông điệp yêu cầu truy xuất đến server nhận từ server... đặt liệu vào đệm count ++; // tăng số chỗ đầy if (count == 1) // đệm không trống 3/11 Các vấn đề cổ điển đồng hoá signal(empty); // kích hoạt Consumer } procedure remove(); { if (count == 0) wait(empty)

Ngày đăng: 14/01/2016, 15:09

TỪ KHÓA LIÊN QUAN

w