Process là gì? Process là một đơn vị công việc của hệ thống. Nó chính là đại diện của một chương trình khi chương trình đó được thực thi. Một tiến trình cần sử dụng các tài nguyên hệ thống như: CPU Time, memory, files và I/O devices để có thể hoàn thành công việc. Bài viết này sẽ giới thiệu những nội dung chính của một tiến trình.

Một câu hỏi nảy sinh trong quá trình thảo luận đó là hệ điều hành cần gì để gọi đến các hoạt động của CPU. Đối với hệ thống batch, nó sẽ tiến hành thực thi các job, còn trong hệ thống time-sharing sử dụng các user programs hoặc các task. Kể cả hệ thống đơn người dùng như Microsoft Windows, một người dùng có thể chạy nhiều chương trình cùng một lúc: word processor, web browser, email. Nói chung, hầu hết các hoạt động này đều có nét tương đồng, vì vậy chúng ta sẽ gọi chúng là process.

Một process bao gồm các phần text section (program code), thông tin của hoạt động hiện tại được lưu trữ trong program counter và nội dung của các processor’s registers. Một process thông thường còn bao gồm ngăn xếp các process (process stack) – nơi chứa các dữ liệu tạm (như tham số của hàm, địa chỉ trả về, biến địa phương), và data section – lưu trữ các biến cục bộ. Một tiến trình cũng có thể bao gồm heap, nơi bộ nhớ được cấp phát động trong quá trình thực thi.

Tóm tắt: thành phần của process bao gồm: text section, data section, program counter, processor’s registers, process stack và heap. Cấu trúc của một tiến trình được diễn tả trong hình dưới:

alt

Ở đây, chúng ta cần nhấn mạnh một điều đó là một chương trình không phải là một tiến trình, một chương trình (program) chỉ tồn tại một cách bị động, nó chỉ là file chứa đựng danh sách các chỉ thị được lưu trữ trên đĩa cứng (thường được gọi là file thực thi – executable file), trong khi một tiến trình lại là một nội dung chủ động, trong đó program counter sẽ xác định chỉ thị tiếp theo để thực thi cùng với các tài nguyên cần sử dụng. Một chương trình trở thành tiến trình khi file thực thi của nó được load vào bộ nhớ. Hai kĩ thuật thông thường để load file thực thi đó là double-click lên icon của chương trình cần chạy hoặc nhập tên của file thực thi vào cửa sổ command line (ví dụ như prog.exe hoặc a.out)

Mặc dù hai tiến trình có thể liên quan đến cùng một chương trình, tuy nhiên chúng lại thực hiện hai công việc khác nhau. Ví dụ như nhiều người dùng có thể chạy nhiều chương trình quản lí email khác nhau, hoặc một người dùng có thể chạy cùng lúc nhiều trình duyệt. Mỗi chương trình này là một tiến trình, và mặc dù text sections (program code) của chúng giống nhau, nhưng phần data, heap và stack sẽ khác nhau. Thông thường, một tiến trình cũng có thể tự động gọi các tiến trình mới khác khi nó được thực thi. Chúng ta sẽ thảo luận vấn đề này ở phần sau.

2.  Process State

Khi một tiến trình thực thi, nó có thể thay đổi trạng thái (state) của nó. Trạng thái của một tiến trình được xác định theo hoạt động hiện tại của process đó. Mỗi process có thể có một trong các trạng thái sau:

  • New – tiến trình vừa được khởi tạo
  • Running – Các chỉ thị đang được thực thi
  • Waiting – tiến trình đang chờ một vài sự kiện khác xảy ra (ví dụ như I/O)
  • Ready – tiến trình đang chờ để được chuyển sang bộ xử lí để tiếp tục thực thi.
  • Terminated – kết thúc quá trình thực thi của tiến trình

Tên gọi của các trạng thái này không nhất thiết phải luôn như vậy, mỗi hệ điều hành khác nhau sẽ có cách đặt tên khác nhau. Các trạng thái mà chúng tôi giới thiệu ở đây được sử dụng ở hầu hết các hệ thống. Tất nhiên là hệ điều hành cần phải xác định rõ ràng trạng thái của một tiến trình. Biểu đồ trạng thái của các tiến trình được giới thiệu ở hình bên dưới.

alt

3.  Process Control Block

Mỗi tiến trình được miêu tả trong hệ điều hành bằng process control block (PCB) – còn gọi là task control block.

  • Process state: các trạng thái có thể gồm có new, ready, running, waiting, halted…
  • Program counter: bộ đếm chương trình sẽ chỉ ra địa chỉ của chỉ thị tiếp theo cần được thực thi của tiến trình.
  • CPU registers: các thanh ghi khác nhau ở số lượng và loại, phụ thuộc vào kiến trúc máy tính. Chúng bao gồm thanh ghi tích lũy, thanh ghi chỉ số, stack pointers và các thanh ghi mục đích chung (general-purpose registers). Cùng với program counter, thông tin trạng thái mày phải được lưu lại khi có một gián đoạn xảy ra, việc này giúp cho tiến trình có thể tiếp tục được thực thi sau khi kết thúc gián đoạn đó.
  • CPU-scheduling information: thông tin này bao gồm độ ưu tiên của tiến trình, con trỏ trỏ đến scheduling queues, và bất kì các tham số định thời nào khác.
  • Memor-management information
  • Accounting information: thông tin này chứa đựng thời gian thực sử dụng CPU, thời gian giới hạn, số lượng các account, số lượng job hoặc process…
  • I/O status information: thông tin này bao gồm danh sách các thiết bị I/O được cấp cho tiến trình, một danh sách chứa các file sử dụng…

Một cách ngắn gọn, PCB hoạt động như một nơi chứa lưu trữ các thông tin của process, mà dựa vào đó ta có thể phân biệt được các process với nhau.

alt

4. Threads

Những gì chúng ta vừa thảo luận trước đó cho ta biết rằng tiến trình là một chương trình khi thể hiện một luồng (thread) của quá trình thực thi chính nó. Ví dụ như, khi một tiến trình đang chạy chương trình soạn thảo văn bản, một đơn luồng (single thread) của các lệnh được thực thi. Sự điều khiển của thread này cho phép tiến trình có thể thực hiện duy nhất một công việc ở một thời điểm. Một người dùng không thể vừa cùng lúc gõ các kí tự, vừa kiểm tra lỗi chính tả trong cùng một process. Nhiều hệ điều hành hiện nay đã mở rộng nội dung của process để cho phép một tiến trình có thể có nhiều threads thực thi, nhờ đó có thể thực hiện được nhiều hơn một task vào một thời điểm. Sau này, chúng ta sẽ tìm hiểu thêm về multithreaded processes.

alt

Bài viết sau mình sẽ trình bày nội dung thứ 2 của process management – process scheduling. [To be continue…]