CHƯƠNG 2 : QUẢN LÝ TIẾN TRÌNH
2.4. ĐỒNG BỘ HÓA TIẾN TRÌNH ĐỒNG THỜI
2.4.1. Các vấn đề đối với tiến trình đồng thời
Trong hệ thống với một CPU, thời gian CPU được phân phối cho các tiến trình đang tồn tại trong hệ thống, tại mỗi thời điểm, chỉ một tiến trình duy nhất được thực hiện. Đối với hệ thống nhiều CPU, một số tiến trình có thể thực hiện song song với nhau. Mặc dù vậy, trong cả hai trường hợp, vấn đề quản lý tương tranh đều được đặt ra tương tự nhau. Lý do là ngay cả khi chỉ có một CPU, do thời gian thực hiện và hành vi của từng tiến trình khơng thể dự đoán trước, cũng như do đặc điểm điều độ và khả năng xảy ra ngắt trong hệ thống, hoạt động của tiến trình có thể xen kẽ theo những cách không thể xác định trước.
Sau đây là một số vấn đề có thể xảy ra với tiến trình đồng thời, tùy thuộc vào quan hệ giữa các tiến trình.
a. Tiến trình cạnh tranh tài nguyên với nhau
Ngay cả khi tiến trình khơng biết về sự tồn tại của nhau, giữa tiến trình vẫn có quan hệ gián tiếp và có thể bị ảnh hưởng do cùng có nhu cầu sử dụng một số tài nguyên như bộ nhớ,
đĩa, thiết bị ngoại vi hoặc kênh vào/ra. Xét trường hợp hai tiến trình cũng có nhu cầu sử dụng một tài nguyên. Mặc dù mỗi tiến trình khơng trao đổi thơng tin với tiến trình kia nhưng do chỉ một tiến trình được cấp tài nguyên, tiến trình kia sẽ phải chờ đợi, làm ảnh hưởng tới thời gian thực hiện, và như vậy đã bị ảnh hưởng gián tiếp bởi tiến trình cạnh tranh.
Đối với các tiến trình cạnh tranh tài nguyên cần phải giải quyết một số vấn đề sau: - Vấn đề đoạn nguy hiểm và đảm bảo loại trừ tương hỗ (mutual exclusion). Giả sử
hai hoặc nhiều tiến trình cùng yêu cầu một tài nguyên, chẳng hạn máy in, và tài nguyên đó chỉ có thể phục vụ một tiến trình tại mỗi thời điểm. Để tránh mâu thuẫn và đảm bảo kết quả đúng, ta cần đảm bảo loại trừ tương hỗ, tức là đảm bảo rằng nếu một tiến trình đang sử dụng tài ngun thì các tiến trình khác khơng được sử dụng tài nguyên đó. Tài nguyên như vậy được gọi là tài nguyên nguy hiểm (critical
resource). Đoạn mã tiến trình trong đó chứa thao tác truy cập tài nguyên nguy hiểm được gọi là đoạn nguy hiểm (critical section). u cầu đặt ra là hai tiến trình khơng được phép thực hiện đồng thời trong đoạn nguy hiểm của mình. Để giải quyết vấn đề này cần xây dựng cơ chế cho phép phối hợp hoạt động của hệ thống và các bản thân tiến trình.
- Không để xảy ra bế tắc (deadlock). Việc đảm bảo loại trừ tương hỗ có thể gây ra
tình trạng bế tắc, tức là tình trạng hai hoặc nhiều tiến trình khơng thể thực hiện tiếp do chờ đợi lẫn nhau. Giả sử có hai tiến trình P1 và P2, mỗi tiến trình cần được cấp đồng thời tài nguyên T1 và T2 để có thể thực hiện xong cơng việc của mình. Do kết quả cấp phát của hệ điều hành, P1 được cấp T1 và P2 được cấp T2. P1 sẽ chờ P2 giải phóng T2 trong khi P2 cũng chờ P1 giải phóng T1 trước khi có thể thực hiện tiếp. Kết quả P1 và P2 rơi vào bế tắc, không thể thực hiện tiếp.
- Khơng để đói tài ngun (starvation). Cũng do loại trừ tương hỗ, tiến trình có thể rơi vào tình trạng đói tài ngun, tức là chờ đợi quá lâu mà không đến lượt sử dụng tài ngun nào đó. Xét ví dụ ba tiến trình P1, P2, P3 cùng có yêu cầu lặp đi lặp lại một tài nguyên. Do kết quả loại trừ tương hỗ và cách cấp phát tài nguyên, P1 và P2 lần lượt được cấp tài nguyên nhiều lần trong khi P1 không bao giờ đến lượt và do vậy không thực hiện được tiếp mặc dù khơng hề có bế tắc.
b. Tiến trình hợp tác với nhau thơng qua tài ngun chung
Tiến trình có thể có quan hệ hợp tác với nhau. Một trong các phương pháp trao đổi thông tin giữa các tiến trình hợp tác là chia sẻ với nhau vùng bộ nhớ dùng chung (các biến toàn thể), hay các file. Việc các tiến trình đồng thời truy cập dữ liệu dùng chung làm nẩy sinh vấn đề đồng bộ hóa, địi hỏi thao tác truy cập phải tính tới tính nhất quản của dữ liệu.
Trước hết, việc cập nhật dữ liệu dùng chung đòi hỏi đảm bảo loại trừ tương hỗ. Ngoài ra cũng xuất hiện tình trạng bế tắc và đói tương tự như đã nhắc tới ở trên.
Bên cạnh đó, xuất hiện u cầu đảm bảo tính nhất quán của dữ liệu. Xét ví dụ sau: hai tiến trình P1 và P2 cùng cập nhất hai biến nguyên x và y như sau:
Khởi đầu: x = y =2 P1: x = x +1
y = y +1 P2: x = x * 2
y = y * 2
Theo lô gic thông thường, sau khi thực hiện các biến đổi trên, ta phải có x = y. Giả sử tình huống P1 và P2 được thực hiện đồng thời. Do kết quả điều độ, thứ tự thực hiện P1 và P2 diễn ra như sau:
P1: x = x + 1 P2: x = x * 2 y = y * 2 P1: y = y + 1
Kết quả ta có x = 6, y = 5 và như vậy x ≠ y. Tính nhất quán của dữ liệu bị phá vỡ.
Lý do chính gây ra tình trạng phá vỡ tính nhất quán ở đây là do hai biến đổi của P1 không được thực hiện cùng với nhau. Kết quả thực hiện trong những trường hợp như vậy phụ thuộc vào thứ tự thay đổi giá trị hai biến x và y và được gọi là điều kiện chạy đua.
Điều kiện chạy đua (race condition) là tình huống trong đó một số dịng hoặc tiến trình
đọc và ghi dữ liệu sử dụng chung và kết quả phụ thuộc vào thứ tự các thao tác đọc, ghi.
Vấn đề nẩy sinh khi có điều kiện chạy đua có thể giải quyết bằng cách đặt toàn bộ thao tác truy cập và cập nhật dữ liệu dùng chung của mỗi tiến trình vào đoạn nguy hiểm và sử dụng loại trừ tương hỗ để đảm bảo các thao tác này khơng bị tiến trình khác xen ngang.
c. Tiến trình có liên lạc nhờ gửi thơng điệp
Các tiến trình hợp tác có thể trao đổi thông tin trực tiếp với nhau bằng cách gửi thông điệp (message passing). Cơ chế liên lạc được hỗ trợ bởi thư viện của ngơn ngữ lập trình hoặc bản thân hệ điều hành.
Trong trường hợp trao đổi thơng điệp, tiến trình khơng chia sẻ hoặc cạnh tranh tài nguyên và vì vậy khơng có u cầu loại trừ tương hỗ. Tuy nhiên có thể xuất hiện bế tắc và đói. Bế tắc có thể xuất hiện, chẳng hạn khi hai tiến trình đều chờ thơng điệp từ tiến trình kia trước khi có thể thực hiện tiếp. Tình trạng đói có thể xuất hiện khi một tiến trình phải chờ đợi quá lâu những tiến trình khác trong khi những tiến trình kia bận trao đổi thơng điệp với nhau.