Bài tập về sản xuất và tiêu thụ

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Bài tập về sản xuất và tiêu thụ

Bài gửi  VoThanhTrung41 (HLT3) on 24/3/2014, 10:19

Tiến trình sản xuất (Producer) tạo ra dòng thông tin để tiến trình tiêu thụ (Consumer) sử dụng.

- Ví dụ: Compiler và Assembler vừa là nhà sản xuất vừa là nhà tiêu thụ. Compiler tạo ra mã dùng cho Assembler, tiếp theo Assembler sản sinh mã máy làm đầu vào cho Loader hoặc Linkage Editor.

- Phát biểu bài toán: Bộ nhớ đệm Buffer bao gồm một số hữu hạn các khoang chứa (Items). Producer lần lượt đưa các sản phẩm S1, S2,…vào các khoang của Buffer. Consumer lấy sản phẩm ra theo đúng thứ tự. Công việc của các tiến trình phải đồng bộ với nhau: không đưa ra sản phẩm khi hết chỗ trống, không lấy được sản phẩm khi chưa có.

- Thuật giải đồng bộ hoá bằng 3 đèn hiệu: semFull (quản lý số sản phẩm có trong bộ đệm, giá trị ban đầu bằng 0), semEmpty (quản lý số khoang còn trống, giá trị ban đầu bằng số khoang của bộ đệm) và Mutex (đảm bảo tính loại trừ tương hỗ, nghĩa là mỗi thời điểm chỉ có 1 tiến trình sản xuất hay tiêu thụ được truy cập/cập nhật tài nguyên dùng chung, giá trị ban đầu bằng 1).

o Thuật giải cho Producer:
wait(semEmpty);
wait(Mutex);

// Đưa sản phẩm vào Buffer

..........................

signal(semFull);

signal(Mutex);


o Thuật giải cho Consumer:

wait(semFull);

wait(Mutex);

// Lấy sản phẩm từ Buffer

..........................

signal(semEmpty);
signal(Mutex);.

VoThanhTrung41 (HLT3)

Tổng số bài gửi : 34
Join date : 23/03/2014

Xem lý lịch thành viên

Về Đầu Trang Go down

Re:Bài toán sản xuất – tiêu thụ được cụ thể hóa trong hệ thống phân tán như sau:

Bài gửi  LamQuocVu(HLT3) on 24/3/2014, 22:14


- Vùng đệm chung có N mục được thay bằng N thông điệp
- Khởi đầu, quá trình tiêu thụ gởi N thông điệp rỗng cho quá trình sản
xuất.
- Khi quá trình sản xuất muốn ghi 1 mục, nó lấy một thông điệp rỗng để
ghi và gởi lại cho quá trình tiêu thụ.
Trong mô hình này, số thông điệp còn lại luôn là một giá trị hằng, nên
chúng có thể được lưu giữ trên một vùng nhớ có kích thước xác định.
void producer(void)
{ int item;
message m;
while (TRUE) {
item = produce_item(); /* generate someth
receive(consumer, &m); /* wait for an emp
build_message(&m, item); /* construct a mes
send(consumer, &m); /* send item to co
}
}
void consumer(void)
{
int item, i;
message m;
for (i = 0; i < N; i++) send(producer, &m);
while (TRUE) {
receive(producer, &m);
item = extract_item(&m);
send(producer, &m);
consume_item(item);
}
}
Nếu quá trình sản xuất thực hiện nhanh hơn quá trình tiêu thụ, số thông
điệp trống sẽ hết. Nên quá trình sản xuất sẽ bị chặn và đợi cho đến khi có
thông điệp trống. Ngược lại, tất cả thông điệp sẽ trống và đợi quá trình
sản xuất ghi dữ liệu. Tương tự quá trình tiêu thụ bị chặn và đợi một thông
điệp full.
Vấn đề còn lại và xác định địa chỉ cho thông điệp. Có hai phương pháp
cho định địa chỉ. Thứ nhất, mỗi quá trình có một địa chỉ và địa chỉ thông
điệp xác định theo địa chỉ quá trình. Ví dụ: địa chỉ của một quá trình xác định theo địa chỉ socket (địa chỉ máy + địa chỉ cổng I/O). Cách còn lại là
sử dụng một hộp thư (mailbox) của mỗi máy để lưu giữ thông điệp.

LamQuocVu(HLT3)

Tổng số bài gửi : 31
Join date : 17/03/2014

Xem lý lịch thành viên

Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


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