Hệ điều hành (4) - Liên lạc và đồng bộ hóa giữa các tiến trình

Bài trước: Hệ điều hành (3) - Quản lý tiến trình
-----

5         Liên lạc và đồng bộ hóa giữa các tiến trình

5.1       Liên lạc giữa các tiến trình




Tiến trình độc lập và tiến trình hợp tác?

Một tiến trình không bị ảnh hưởng bởi một tiến trình khác gọi là tiến trình độc lập, ngược lại gọi là tiến trình hợp tác (cooperation process).

Các tiến trình cần phải hợp tác và liên lạc với nhau là để chia sẻ thông tin, như dùng chung tập tin, bộ nhớ, hoặc hợp tác hoàn thành công việc.

Cơ chế liên lạc giữa các tiến trình

Tuy nhiên, do mỗi tiến trình có một không gian địa chỉ riêng biệt nên chúng không thể dễ dàng trực tiếp liên hệ với nhau, vì vậy, hệ điều hành sẽ cung cấp các cơ chế để các tiền trình có thể liên lạc được với nhau. Khi đó, hệ điều hành cần phải giải quyết các vấn đề chính sau:

– Liên kết tường minh hay tiềm ẩn

– Liên lạc theo chế độ đồng bộ hay không đồng bộ

– Liên lạc giữa các tiến trình trong hệ thống tập trung và hệ thống phân tán

Ví dụ một số cơ chế để liên lạc giữa các tiến trình,

– Liên lạc bằng tín hiệu (signal)

– Liên lạc bằng đường ống (pipe)

– Liên lạc qua vùng nhớ chia sẻ (shared memory)

– Liên lạc bằng thông điệp (message)

– Liên lạc qua socket

5.1.1       Liên lạc bằng tín hiệu


Mỗi tiến trình sở hữu một bảng tín hiệu, mỗi tín hiệu được sử dụng để thông báo cho tiến trình về một sự kiện nào đó xảy ra. Với mỗi tín hiệu sẽ có một hàm xử lý tín hiệu (signal handler) do phần cứng hoặc hệ điều hành cung cấp.

5.1.2       Liên lạc bằng đường ống


Là một kênh liên lạc trực tiếp giữa hai tiến trình, dữ liệu xuất của tiến trình này được chuyển thành dữ liệu nhập của tiến trình kia dưới dạng một dòng các byte (theo một chiều duy nhất).


5.1.3       Liên lạc qua vùng nhớ chia sẻ


Có một vùng nhớ vật lý mà các tiến trình cần liên lạc nhau đều truy cập được.

5.1.4       Liên lạc bằng thông điệp


Các tiến trình không chia sẻ tài nguyên chung và liên lạc với nhau bằng cách gửi/nhận các thông điệp.

5.1.5       Liên lạc qua socket


Là thiết bị truyền thông hai chiều tương tự như tập tin, có thể đọc/ghi lên đó, các thao tác đọc/ghi chính là sự trao đổi dữ liệu (có thể trao đổi giữa các máy khác nhau).


5.2       Đồng bộ hóa giữa các tiến trình


Đồng bộ các tiến trình là gì ?

Đồng bộ các tiến trình là bảo đảm các tiến trình xử lý song song không tác động sai lệch đến nhau.

Tại sao phải đồng bộ giữa các tiến trình ?

– Yêu cầu độc quyền truy xuất (mutual exclusion) : tại một thời điểm, chỉ có một tiến trình được quyền truy xuất một tài nguyên không thể chia sẻ.

– Yêu cầu phối hợp (synchronization) :  các tiến trình cần hợp tác với nhau để hoàn thành công việc. Ví dụ chương trình in sẽ xuất kí tự vào buffer, chương trình điều khiển máy in (printer driver) sẽ lấy kí tự trong buffer ra để in. Hai tiến trình này phải phối hợp với nhau để làm sao chương trình in không được xuất kí tự vào buffer khi buffer đầy mà phải chờ printer driver lấy bớt dữ liệu trong buffer ra.

Từ hai yêu cầu trên, chúng ta có hai "bài toán đồng bộ" cần giải quyết là bài toán "độc quyền truy xuất" (bài toán miền găng) và bài toán "phối hợp thực hiện".


5.2.1       Miền găng


Miền găng (critical section) là một đoạn mã của tiến trình có khả năng xảy ra lỗi khi truy xuất tài nguyên dùng chung (ví dụ biến, tập tin).


Bốn điều kiện của bài toán miền găng :

(1) Tại một thời điểm không có hai tiến trình cùng ở trong miền găng

(2) Không có giả thiết về tốc độ của các tiến trình, cũng như về số lượng bộ xử lý

(3) Một tiến trình bên ngoài miền găng không được ngăn cản các tiến trình khác vào miền găng

(4) Không có tiến trình nào phải chơ vô hạn để được vào miền găng


5.2.2       Các giải pháp đồng bộ


Có năm nhóm giải pháp để giải quyết bài toán đồng bộ là :

– Busy waiting

– Sleep and wakeup

– Semaphore

Monitor

– Message


5.2.3       Nhóm giải pháp Busy waiting (bận thì đợi)



Giải pháp này chia thành hai loại:

– Sử dụng phần mềm

– Sử dụng phần cứng

Giải pháp phần mềm :

– Thuật toán 1 :

– Thuật toán 2 :

– Thuật toán Peterson :

Giải pháp phần cứng (đọc thêm)

– Cấm ngắt :

– Sử dụng lệnh TSL (test and set lock) :

5.2.4       Nhóm giải pháp Sleep and wakeup (ngủ và đánh thức)



– Sử dụng lệnh Sleep và Wakeup :

– Sử dụng cấu trúc Semaphore :

5.2.5       Sử dụng cấu trúc monitor



Bài toán "năm nhà hiền triết ăn tối".

5.3       Tình trạng tắc nghẽn (deadlock)


Đọc thêm.

5.4       Thực hành


Lab 11. Lập trình bài toán Người sản xuất – Người tiêu thụ. Tham khảo: https://drive.google.com/open?id=0B4FOelgeetqJX1VuN1dBNkJQaHM


Lab 12. Lập trình bài toán “Dining philosophers”. Tham khảo (trang 94, 95): https://drive.google.com/file/d/1P_zsBstk_qvbf531CAV_-rV9GxSE7WwV/view

5.5       Câu hỏi ôn tập


1.      Có năm nhóm giải pháp để giải quyết bài toán đồng bộ là :

A. Busy waiting, Peterson, Semaphore, Monitor, Message

B. Semaphore, Busy waiting, Sleep and wakeup, Monitor, Message

C. Monitor, Busy waiting, Sleep and wakeup, TSL, Message

D. Sleep and wakeup, Busy waiting, Semaphore, Deadlock, Message

2.      Ví dụ một số cơ chế để liên lạc giữa các tiến trình :

A. Signal, pipe, Shared memory, Message, Socket

B. Pipe, Shared memory, Signal, Monitor, Socket

C. Shared memory, Signal, Pipe, Sleep and wakeup, Message,

D. Pipe, Signal, Message, Port, Shared memory


--------
Cập nhật: [09/10/2019]
-------
Bài tiếp theo: Hệ điều hành (5) - Quản lý bộ nhớ & bộ nhớ ảo
Danh sách các bài học