Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

GÓP Ý DÙM E

Go down

GÓP Ý DÙM E Empty GÓP Ý DÙM E

Bài gửi  nguyentruongan03(HLT3) 7/4/2014, 01:10

Câu 4: Vấn đề Người sản xuất – Người tiêu thụ (Producer-Consumer)
Vấn đề: hai tiến trình cùng chia sẻ một bộ đệm có kích thước giới hạn. Một trong hai tiến trình đóng vai trò người sản xuất – tạo ra dữ liệu và đặt dữ liệu vào bộ đệm- và tiến trình kia đóng vai trò người tiêu thụ – lấy dữ liệu từ bộ đệm ra để xử lý.
Để đồng bộ hóa hoạt động của hai tiến trình sản xuất tiêu thụ cần tuân thủ các quy định sau :
• Tiến trình sản xuất (producer) không được ghi dữ liệu vào bộ đệm đã đầy (synchronisation)
• Tiến trình tiêu thụ (consumer) không được đọc dữ liệu từ bộ đệm đang trống.(synchronisation)
• Hai tiến trình sản xuất và tiêu thụ không được thao tác trên bộ đệm cùng lúc . (exclusion mutuelle)



Giải pháp:

1. Semaphore
Sử dụng ba semaphore : full, đếm số chỗ đã có dữ liệu trong bộ đệm; empty, đếm số chỗ còn trống trong bộ đệm; và mutex, kiểm tra việc Producer và Consumer không truy xuất đồng thời đến bộ đệm.
BufferSize = 3;        // số chỗ trong bộ đệ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 dữ liệu mới
    down(&empty);             // giảm số chỗ trống
    down(&mutex);         // báo   hiệu vào miền găng
    enter_item(item);     // đặt dữ liệu vào bộ đệm
    up(&mutex);             // ra khỏi miền găng
    up(&full);           // tăng số chỗ đầy
  }
}

Consumer()
{
  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 dữ liệu từ bộ đệm
    up(&mutex); // ra khỏi miền găng
  up(&empty); // tăng số chỗ trống  
    consume_item(item); // xử lý dữ liệu
}
}
2. Monitor
Định nghĩa một monitor ProducerConsumer với hai thủ tục enter và remove thao tác trên bộ đệm. Xử lý của các thủ tục này phụ thuộc vào các biến điều kiện full và empty.
   condition full, empty;
   int count;
 
 procedure enter();
  {
  if (count == N)
    wait(full);         // nếu bộ đệm  đầy, phải chờ
    enter_item(item);       // đặt dữ liệu vào bộ đệm
    count ++;               // tăng số chỗ đầy
    if (count == 1)   // nếu bộ đệm không trống
    signal(empty); // thì kích hoạt Consumer
  }
 procedure remove();
 {
  if (count == 0)
    wait(empty)   // nếu bộ đệm  trống, chờ
    remove_item(&item); // lấy dữ liệu từ bộ đệm
    count --;       // giảm số chỗ đầy
  if (count == N-1)   // nếu bộ đệm không đầy
        signal(full); // thì kích hoạt Producer
 }
 count = 0;
 end monitor;

 Producer();
 {
    while (TRUE)
  {
produce_item(&item);  
ProducerConsumer.enter;
  }
 }
 Consumer();
 {
    while (TRUE)
  {
ProducerConsumer.remove;
consume_item(item);
  }
 }

3. Trao đổi thông điệp
Thông điệp empty hàm ý có một chỗ trống trong bộ đệm. Tiến trình Consumer bắt đầu công việc bằng cách gởi 4 thông điệp empty đến Producer. Tiến trình Producer tạo ra một dữ liệu mới và chờ đến khi nhận được một thông điệp empty thì gởi ngược lại cho Consumer một thông điệp chứa dữ liệu . Tiến trình Consumer chờ nhận thông điệp chứa dữ liệu, và sau khi xử lý xong dữ liệu này, Consumer sẽ lại gởi một 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 dữ liệu
    send(consumer,&m); // gởi dữ liệu đến Consumer
  }
}

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 dữ liệu
    remove_item(&m,&item); // lấy dữ liệu từ thông điệp
      send(producer, &m);       // gởi thông điệp empty
      consumer_item(item);         // xử lý dữ liệu
  }
}

nguyentruongan03(HLT3)
Khách viếng thăm


Về Đầu Trang Go down

Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết