CHƯƠNG 2 : QUẢN LÝ TIẾN TRÌNH
2.2. LUỒNG
2.2.1. Luồng thực hiện là gì
Trong phần trước, ta đã thấy tiến trình có thể được xem xét từ hai khía cạnh: thứ nhất, tiến trình là một đơn vị sở hữu tài nguyên, và thứ hai: tiến trình là một đơn vị thực hiện cơng việc tính tốn xử lý.
Với vai trị sở hữu tài nguyên, tiến trình được cấp một sốtài nguyên như bộ nhớ, các file mở, thiết bị vào/ra, mà tiến trình có thểdùng để phục vụ nhu cầu của mình.
Với vai trị đơn vị xử lý, tiến trình được cấp CPU để thực hiện các lệnh của mình. Khi cấp phát CPU, hệđiều hành sẽ quan tâm tới vai trị đơn vị xử lý của tiến trình, có thểđộc lập với vai trò sở hữu tài nguyên.
Trong các hệ điều hành trước đây, mỗi tiến trình chỉ tương ứng với một đơn vị xử lý
duy nhất. Các lệnh của tiến trình được thực hiện theo một thứ tự nào đó phụ thuộc vào
chương trình, dữ liệu, và tình huống rẽ nhánh cụ thể trong khi thực hiện, nhưng mỗi thời điểm
vòng đời của tiến trình chỉ có thể tương ứng với một điểm nhất định trong chuỗi lệnh được thực hiện. Điều này có nghĩa là tiến trình khơng thể thực hiện nhiều hơn một cơng việc cùng một lúc.
Hệđiều hành hiện đại thường cho phép tách riêng vai trị thực hiện lệnh của tiến trình. Mỗi đơn vị thực hiện của tiến trình, tức là một chuỗi lệnh được cấp phát CPU để thực hiện
độc lập được gọi là một luồng thực hiện. Hệ điều hành hiện nay thường hỗ trợ đa luồng
(multithreading), tức là cho phép nhiều chuỗi lệnh được thực hiện cùng lúc trong phạm vi một tiến trình (cần lưu ý, đối với máy tính với một CPU, tại mỗi thời điểm chỉ có một luồng được thực hiện, nhưng các luồng sẽ lần lượt được phân phối CPU tương tự cách chia sẻ thời gian giữa các tiến trình). Minh họa khái niệm luồng trong tiến trình được thể hiện trên hình 2.4.
Việc sử dụng nhiều luồng có thể minh họa qua một sốtrường hợp sau. Trình duyệt web thơng dụng như IE hay Firefox đều cho phép vừa tải dữ liệu trang web về vừa hiển thị nội dung trang và phần ảnh để tránh cho người dùng không phải chờ đợi cho đến khi tải được tồn bộ dữ liệu. Đểlàm được điều này, trình duyệt được tổ chức thành một số luồng thực hiện
song song với nhau. Trong khi một luồng đang tải dữ liệu thì luồng khác hiển thị dữ liệu đã
nhận được.
Hình 2.4: Tiến trình và luồng
Một minh họa khác là những ứng dụng phải thực hiện đồng thời một số công việc tương
tự nhau, chẳng hạn những hệ thống client-server trong đó một server phải phục vụ nhiều client. Lấy ví dụ hệ thống bán vé máy bay. Phần cài trên các đại lý (client) sẽ liên lạc với phần
trung tâm (server) để nhận dữ liệu và gửi các yêu cầu đặt, giữ vé. Cùng một thời điểm có thể
có rất nhiều client cùng liên lạc với server. Để phục vụ nhiều client cùng một lúc, trong các hệ
thống không sử dụng đa luồng, server sẽ phải sinh ra rất nhiều tiến trình, mỗi tiến trình phục vụ một client. Đấy chính là cách những hệ thống trước đây sử dụng. Hiện nay, các hệ thống xây dựng trên hệ điều hành hiện đại sử dụng mơ hình đa luồng để giải quyết vấn đề loại này. Tiến trình của server duy trì một luồng làm nhiệm vụ nhận yêu cầu từ phía client. Khi nhận
được yêu cầu, server sẽ tạo ra một luồng mới và chuyển yêu cầu cho luồng này xử lý. Luồng nhận yêu cầu sau đó lại được giải phóng đề chờ nhận yêu cầu khác. Ưu điểm chính của cách tiếp cận nhiều luồng là quá trình tạo ra luồng mới nhanh hơn nhiều so với tạo ra tiến trình mới. Ngồi ra cịn một sốưu điểm khác sẽđược phân tích trong phần sau.