dòng và chi tiết dòng

Màu nền
Font chữ
Font size
Chiều cao dòng

2. Dòng thực hiện

Dòng thực hiện (thread), gọi tắt là dòng, là một khái niệm quan trọng trong các hệ điều hành hiện đại, có ảnh hưởng lớn tới việc tổ chức và quản lý tiến trình. Đây là thuật ngữ chưa có cách dịch thống nhất sang tiếng Việt. Tài liệu tiếng Việt hiện nay sử dụng một số thuật ngữ khác nhau cho dòng như: dòng, luồng, tiểu trình. Trong tài liệu này, chúng tôi sẽ thống nhất sử dụng "dòng" cho khái niệm "thread".

2.1. Dò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 toá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.

Ví dụ bằng chương trình:

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 dòng thực hiện. Hệ điều hành hiện nay thường hỗ trợ đa dò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 dòng được thực hiện, nhưng các dò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 dòng trong tiến trình được thể hiện trên Hình 2.3.

Hình 2.3: Tiến trình và dòng

Ví dụ bằng chương trình:

Việc sử dụng nhiều dò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 toà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ố dòng thực hiện song song với nhau. Trong khi một dòng đang tải dữ liệu thì dòng khác hiển thị dữ liệu đã nhận được.

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 dò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 dòng để giải quyết vấn đề loại này. Tiến trình của server duy trì một dò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 dòng mới và chuyển yêu cầu cho dòng này xử lý. Dò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 dòng là quá trình tạo ra dòng mới nhanh hơn nhiều so với tạo ra tiến trình mới. Ngoài ra còn một số ưu điểm khác sẽ được phân tích trong phần sau.

2.2. Tài nguyên của tiến trình và dòng

Trong hệ thống cho phép đa dòng, tiến trình vẫn là đơn vị được hệ điều hành sử dụng để phân phối tài nguyên. Mỗi tiến trình sẽ sở hữu chung một số số tài nguyên bao gồm:

- Không gian nhớ của tiến trình. Đây là không gian nhớ lôgic, có thể là không gian nhớ ảo, được sử dụng để chứa phần chương trình (các lệnh), phần dữ liệu của tiến trình.

- Các tài nguyên khác như file do tiến trình mở, thiết bị hoặc cổng vào/ra.

Đến đây có sự khác biệt giữa tiến trình đơn dòng và tiến trình đa dòng như thể hiện trên Hình 2.4.

Hình ???

Hình 2.4: Mô hình đơn dòng và đa dòng

Trong mô hình đơn dòng, tiến trình sẽ có khối quản lý tiến trình PCB chứa đầy đủ thông tin về trạng thái tiến trình, giá trị các thanh ghi. Tiến trình cũng có ngăn xếp của mình để chứa tham số và trạng thái hàm/thủ tục/chương trình con khi thực hiện chương trình con. Khi tiến trình thực hiện, tiến trình sẽ làm chủ nội dung các thanh ghi và con trỏ lệnh của mình. Khi chuyển đổi tiến trình, những thông tin này sẽ được lưu vào PCB như đã nói ở trên.

Đối với mô hình đa dòng, do mỗi dòng có chuỗi thực hiện riêng của mình, mỗi dòng cần có khả năng quản lý con trỏ lệnh, nội dung thanh ghi. Dòng cũng có trạng thái riêng như chạy, bị khóa, sẵn sàng. Những thông tin này được chứa trong khối quản lý dòng, thay vì chứa trong PCB chung cho cả tiến trình. Ngoài ra, mỗi dòng còn có ngăn xếp riêng của mình, dùng cho trường hợp thực hiện chương trình con.

Như vậy, trong mô hình đa dòng, tất cả dòng của một tiến trình chia sẻ không gian nhớ và tài nguyên của tiến trình đó. Các dòng có cùng không gian địa chỉ và có thể truy cập tới dữ liệu (các biến, các mảng) của tiến trình. Nếu một dòng thay đổi nội dung của biến nào đó, dòng khác sẽ nhận ra sự thay đổi này khi đọc biến đó. Nhờ cách tổ chức này, mô hình đa dòng có một số ưu điểm như sẽ phân tích trong phần sau.

2.3. Ưu điểm của mô hình đa dòng

So với cách tổ chức tiến trình chỉ chứa một dòng, mô hình nhiều dòng trong một tiến trình có những ưu điểm chính sau đây:

1) Tăng hiệu năng và tiết kiệm thời gian. Việc tạo, xóa tiến trình đòi hỏi cấp phát, giải phóng bộ nhớ và tài nguyên của tiến trình, do vậy tốn thời gian. Do dòng dùng chung tài nguyên với tiến trình nên tạo và xóa dòng không đòi hỏi những công đoạn này, nhờ vậy tốn ít thời gian hơn nhiều. Việc chuyển đổi dòng cũng nhanh hơn chuyển đổi dòng, do ngữ cảnh của dòng ít thông tin hơn. Trong một số hệ điều hành, thời gian tạo mới dòng ít hơn vài chục lần so với tạo mới tiến trình.

2) Dễ dàng chia sẻ tài nguyên và thông tin. Các dòng của một tiến trình dùng chung không gian địa chỉ và tài nguyên. Tài nguyên dùng chung cho phép dòng dễ dàng liên lạc với nhau, ví dụ bằng cách ghi và đọc vào những biến (vùng bộ nhớ) chung.

3) Tăng tính đáp ứng. Tính đáp ứng (responsiveness) là khả năng tiến trình phản ứng lại với yêu cầu của người dùng hoặc tiến trình khác. Nhờ mô hình đa dòng, tiến trình có thể sử dụng một dòng đề thực hiện những thao tác đòi hỏi nhiều thời gian như đọc file dài, và sử dụng một dòng khác để tiếp nhận và xử lý yêu cầu của người dùng, nhờ vậy, tăng khả năng đáp ứng. Việc tăng tính đáp ứng rất quan trọng đối với hệ thống tương tác trực tiếp, tránh cho người dùng cảm giác tiến trình bị treo.

4) Tận dụng được kiến trúc xử lý với nhiều CPU. Trong hệ thống nhiều CPU, các dòng có thể chạy song song trên những CPU khác nhau, nhờ vậy tăng được tốc độ xử lý chung của tiến trình.

5) Thuận lợi cho việc tổ chức chương trình. Một số chương trình có thể tổ chức dễ dàng dưới dạng nhiều dòng thực hiện đồng thời. Điển hình là những chương trình bao gồm nhiều thao tác khác nhau cần thực hiện đồng thời, hay chương trình đòi hỏi vào/ra từ nhiều nguồn và đích khác nhau. Ví dụ, một chương trình thể hiện một vật chuyển động và phát ra âm thanh có thể tổ chức thành hai dòng riêng, một dòng chịu trách nhiệm phần đồ họa, một dòng chịu trách nhiệm phần âm thanh.

2.4. Dòng mức người dùng và dòng mức nhân

Ở trên, ta đã xem xét khái niệm dòng và lợi ích của việc sử dụng mô hình tiến trình với nhiều dòng. Tiếp theo ta sẽ xem xét vấn đề triển khai, cụ thể là dòng được tạo ra và quản lý như thế nào?

Nhìn chung, có thể tạo ra và quản lý dòng ở hai mức: mức người dùng và mức nhân. Dòng mức người dùng được tạo ra và quản lý không có sự hỗ trợ của hệ điều hành. Trong khi đó, dòng mức nhân được tạo ra nhờ hệ điều hành và được hệ điều hành quản lý. Dòng mức nhân còn được gọi là các tiểu trình để nhấn mạnh sự hỗ trợ trực tiếp của hệ điều hành tương tự như đối với tiến trình.

a) Dòng mức người dùng.

Dòng mức người dùng do trình ứng dụng tự tạo ra và quản lý, hệ điều hành không biết về sự tồn tại của những dòng như vậy. Để tạo ra dòng mức người dùng, trình ứng dụng sử dụng thư viện do ngôn ngữ lập trình cung cấp, ví dụ như khi lập trình trên Java. Thư viện hỗ trợ dòng thường bao gồm các hàm tạo, xóa dòng, đồng bộ dòng, thiết lập mức ưu tiên và điều độ dòng, hàm tạo liên lạc với dòng khác và hàm cho phép lưu/khôi phục ngữ cảnh của dòng.

Do hệ điều hành không biết về sự tồn tại của dòng mức người dùng, hệ điều hành vẫn coi tiến trình như một đơn vị duy nhất với một trạng thái tiến trình duy nhất. Việc phân phối CPU được thực hiện cho cả tiến trình thay vì cho từng dòng cụ thể (xem hình ???.a).

Việc sử dụng dòng mức người dùng có một số ưu điểm sau:

- Thứ nhất, do dòng được tạo ra và quản lý trong không gian người dùng nên việc chuyển đổi dòng không đòi hỏi phải chuyển sang chế độ nhân và do vậy tiết kiệm thời gian hơn.

- Thứ hai, trình ứng dụng có thể điều độ dòng theo đặc điểm riêng của mình, không phụ thuộc vào phương thức điều độ của hệ điều hành.

- Thứ ba, có thể sử dụng dòng mức người dùng cả trên những hệ điều hành không hỗ trợ đa dòng bằng cách bổ sung thư viện dòng mà các ứng dụng có thể dùng chung.

Bên cạnh đó, sử dụng dòng mức người dùng bị ảnh hưởng bởi một số nhược điểm dưới đây:

- Khi một dòng của tiến trình gọi lời gọi hệ thống và bị phong tỏa (tức là phải đợi cho tới khi thực hiện xong lời gọi hệ thống), thì toàn bộ tiến trình sẽ bị phong tỏa và phải đợi cho tới khi lời gọi hệ thống thực hiện xong. Như vậy, dòng mức người dùng không cho phép tận dụng ưu điểm về tính đáp ứng của mô hình đa dòng.

- Cách tổ chức này không cho phép tận dụng kiến trúc nhiều CPU. Do hệ điều hành phân phối CPU cho cả tiến trình chứ không phải từng dòng cụ thể nên tất cả các dòng của tiến trình phải chung nhau một CPU thay vì thực hiện song song trên nhiều CPU khác nhau.

Có một số thư viện hỗ trợ dòng mức người dùng được sử dụng trên thực tế, trong đó có thể kể đến Green threads cho hệ điều hành Solaris và thư viện GNU Portable threads.

b) Dòng mức nhân

Dòng mức nhân được hệ điều hành tạo ra và quản lý. Hệ điều hành sẽ cung cấp giao diện lập trình bao gồm một số lời gọi hệ thống mà trình ứng dụng có thể gọi để yêu cầu tạo/xóa dòng và thay đổi tham số liên quan tới quản lý dòng. Hệ điều hành Windows và Linux là hai ví dụ trong việc hỗ trợ dòng mức nhân như vậy.

Ưu điểm chủ yếu của dòng mức nhân là khắc phục được các nhược điểm của dòng mức người dùng. Cụ thể là việc sử dụng dòng mức nhân cho phép tăng tính đáp ứng và khả năng thực hiện đồng thời của các dòng trong cùng một tiến trình. Trên hệ thống với nhiều CPU, dòng mức nhân có thể được cấp CPU khác nhau để thực hiện song song.

Nhược điểm chủ yếu của dòng mức nhân so với dòng mức người dùng là tốc độ. Việc tạo và chuyển dòng đòi hỏi thực hiện trong chế độ nhân và do vậy cần một số thao tác để chuyển từ chế độ người dùng sang chế độ nhân và ngược lại.

c) Kết hợp dòng mức người dùng và dòng mức nhân

Có thể kết hợp sử dụng dòng mức người dùng với dòng mức nhân. Theo cách tổ chức này, dòng mức người dùng được tạo ra trong chế độ người dùng nhờ thư viện. Sau đó, dòng mức người dùng được ánh xạ lên một số lượng tương ứng hoặc ít hơn dòng mức nhân. Số lượng dòng mức nhân phụ thuộc vào hệ thống cụ thể, chẳng hạn hệ thống nhiều CPU sẽ có nhiều dòng mức nhân hơn. Cũng có trường hợp hệ thống cho phép người lập trình điều chỉnh số lượng này.

Việc kết hợp dòng mức người dùng với dòng mức nhân cho phép kết hợp ưu điểm của hai phương pháp riêng lẻ. Trình ứng dụng có thể tạo ra rất nhiều dòng mức người dùng. Tùy thuộc vào số lượng CPU, một số dòng có thể chạy song song với nhau. Ngoài ra khi có dòng bị phong tỏa, hệ điều hành có thể phân phối CPU cho dòng khác thực hiện.

Hình ???: Mô hình sử dụng dòng mức người dùng và dòng mức nhân

Bạn đang đọc truyện trên: Truyen2U.Pro

#123456