










Preview text:
  lOMoAR cPSD| 58933639  
Các tiến trình trong hệ điều hành máy tính 
Trong bài viết này, chúng ta sẽ tìm hiểu cách quản lý tiến trình trong hệ điều hành 
và các thuật toán liên quan đến nó. Trước khi đi sâu vào tìm hiểu cách quản lý tiến 
trình thì trước hết ta sẽ xem qua định nghĩa và các khía cạnh liên quan của nó. 
Hiểu đơn giản thì một chương trình đang thực thi được gọi là tiến trình, hay nói 
cách khác, tiến trình là một thực thể của chương trình đang chạy, thực thể này có 
thể được gán và thực thị bởi một trình xử lý. Hai phần tử cốt lõi của một tiến trình 
là code của chương trình và tập dữ liệu liên quan đến đoạn code đó. 
Bộ nhớ tiến trình (process memory) được chia làm bốn phần:  • 
Phần program lưu trữ code của chương trình, đọc từ bộ nhớ điện tĩnh (non-
volatile storage) khi chương trình được khởi động.  • 
Phần data lưu trữ biến toàn cục và biến tĩnh, được cấp phát và khởi tạo trước 
khi thực thi chương trình chính.  • 
Phần heap được dùng cho quản lý cấp phát bộ nhớ động trong chương trình. 
Nói cách khác, nó là một phần của bộ nhớ khi thực hiện cấp phát động ví dụ 
như cấp phát thông qua new hay malloc và giải phóng thông qua delete  hay free,...  • 
Phần stack lưu trữ biến cục bộ được đinh nghĩa bên trong hàm. Không gian 
trong stack được tạo cho biến cục bộ khi chúng được khai báo và phần không 
gian này được giải phóng khi ra khỏi phạm vi của nó.        lOMoAR cPSD| 58933639
Process Control Block (PCB) 
Một chương trình thực thi như một tiến trình được xác định duy nhất bởi các tham 
số khác nhau. Các tham số này được lưu trữ trong Process Control Block (PCB) cho 
mỗi tiến trình. Nó là một cấu trúc dữ liệu lưu trữ các thông tin như sau:  • 
Identifier/Process Id: một định danh duy nhất hay ID liên kết với tất cả tiến 
trình để phân biệt một tiến trình với các tiến trình khác.  • 
Process State: trạng thái tiến trình có thể là ready, running, halted,  completed,...  • 
CPU-Scheduling: độ ưu tiên so với các tiến trình khác và con trỏ đến hàng 
đợi định thời (scheduling queues).  • 
CPU register và Program Counter: cần cho lưu trữ và phục hồi khi hoán đổi 
các tiến trình trong và ngoài CPU.  • 
I/O status: bao gồm các yêu cầu I/O chưa giải quyết, I/O của thiết bị được 
gán cho tiến trình này, một danh sách các file được sử dụng bởi tiến trình.  • 
Memory-Management: bảng trang hoặc bảng phân đoạn.  • 
Accounting Information: dung lượng CPU sử dụng cho thực thi tiến trình,  giới hạn thời gian,...   
Trạng thái của tiến trình 
Bây giờ, ta sẽ tìm hiểu về tiến trình, khi ta định nghĩa một tham số của tiến trình 
được gọi là State. Các tiến trình có thể có một trong 5 trạng thái là: start, ready,  running, wait và terminated.      lOMoAR cPSD| 58933639  
Bây giờ ta sẽ tìm hiểu về cách chuyển đổi trạng thái của chúng:  • 
Null -> Start: khi một tiến trình được tạo, nó được bảo rằng tiến trình đã 
được khởi tạo hoặc một tiến trình từ trạng thái NULL trở thành một trạng  thái mới.  • 
Start -> Ready: hệ điều hành sau đó chuyển một tiến trình từ trạng thái Start 
sang trạng thái Ready, khi nó chuẩn bị được nhận. Ở giai đoạn này, tiến trình 
có tất cả tài nguyên khả dụng cần có để chạy với đang chờ đợi để CPU có thời  gian thực thi nó.  • 
Ready -> Running: ở chuyển đổi này, hệ điều hành chọn một trong các tiến 
trình ở trạng thái Ready bằng cách sử dụng bộ định thời tiến trình hoặc 
dispatcher. Sau đó CPU bắt đầu thực thi tiến trình đã chọn ở trạng thái  running.  • 
Running -> Terminated: tiến trình đang chạy hiện tại bị huỷ bởi hệ điều hành  nếu nó đã hoàn thành.  • 
Running -> Ready: tập định thời chỉ định thời gian giới hạn cho việc thực thi 
bất kỳ tiến trình đang chạy nào. Nhưng nếu tiến trình hiện tại nhiều hơn thời 
gian được chỉ định bởi bộ định thời, nó sẽ được chuyển lại trạng thái ready. 
Lý do chính cho chuyển đổi này là để đạt được khoảng thời gian tối đa cho 
việc thực thi không bị gián đoạn. Hầu hết các hệ điều hành đa chương trình 
đều bắt buộc ràng buộc thời gian này.  • 
Running -> Wait: nếu một tiến trình muốn bất cứ thứ gì mà nó phải đợi, nó 
sẽ được đặt ở trạng thái chờ đợi. Quá trình không thể chạy ngay bây giờ vì 
nó đang chờ một số tài nguyên sẵn có hoặc cho một số sự kiện xảy ra. Ví dụ:      lOMoAR cPSD| 58933639
quá trình có thể đang đợi nhập liệu bằng bàn phím, yêu cầu truy cập đĩa, 
thông báo giữa các tiến trình, bộ hẹn giờ hoạt động hoặc quá trình con kết  thúc.  • 
Wait -> Ready: Khi sự kiện mà nó đã chờ xảy ra, một quá trình ở trạng thái 
Waiting sẽ được chuyển sang trạng thái Ready. 
Lưu ý: Một số hệ thống có thể có các trạng thái khác ngoài những trạng thái được  liệt kê ở đây. 
Thực thi một tiến trình trong Hệ điều hành 
Hệ điều hành thực thi nhiều hoạt động khác nhau trong khi tạo một tiến trình, khi 
sử dụng PCB để theo dõi trạng thái thực thi của từng tiến trình.  • 
Để theo dõi tất cả tiến tình, nó gán một PID (ID của tiến trình) với từng tiến 
trình để định danh nó là duy nhất. Như đã thảo luận ở trên, nó còn lưu trữ 
nhiều chi tiết cốt lõi trong PCB.  • 
Hệ điều hành cập nhật thông tin trong PCB của tiến trình khi nó chuyển từ 
trạng thái này sang trạng thái khác.  • 
Để truy cập PCB thường xuyên, hệ điều hành giữ các con trỏ đến từng PCB 
của tiến trình trong một bảng tiến trình.      lOMoAR cPSD| 58933639  
Bộ định thời tiến trình trong Hệ điều hành 
Định thời tiến trình là rất quan trọng để chọn và loại bỏ tiến trình đang chạy dựa 
trên một chiến lược hoặc thuật toán cụ thể. Các mục tiêu chính của quá trình định 
thời tiến trình là giữ cho CPU luôn bận rộn và cung cấp thời gian phản hồi "có thể 
chấp nhận được" cho tất cả các chương trình. Hệ điều hành đa chương trình cho 
phép nhiều tiến trình được tải vào bộ nhớ thực thi tại một thời điểm và tiến trình 
được tải chia sẻ CPU bằng cách sử dụng ghép kênh thời gian. 
Hệ điều hành có ba loại bộ định thời để định thời tiến trình. 
Bộ định thời dài hạn (Job scheduler): bộ định thời này đưa tiến trình mới về trạng 
thái Ready. Nó xác định tiến trình nào được gán cho CPU để xử lý, chọn các tiến 
trình từ hàng đợi và tải chúng vào bộ nhớ để thực thi.  • 
Mục tiêu chính của bộ định thời dài hạn là cung cấp sự kết hợp cân bằng giữa 
các công việc (chẳng hạn như giới hạn I/O và ràng buộc trình xử lý) và kiểm 
soát mức độ đa chương trình. Đây là một hệ thống được tải nhiều, có thể 
dành thời gian để triển khai các thuật toán định thời thông minh và nâng cao.      lOMoAR cPSD| 58933639
Bộ định thời ngắn hạn (CPU scheduler): Nó chịu trách nhiệm chọn một tiến trình 
từ trạng thái Ready và lên lịch cho nó đến trạng thái Running. Nó còn được gọi là  Dispatchers.  • 
Bộ định thời CPU chịu trách nhiệm đảm bảo không bị chết đói do các tiến 
trình thời gian bùng nổ cao.  • 
Nó chạy rất thường xuyên và nhanh chóng hoán đổi một quá trình từ trạng 
thái Running sang trạng thái Ready. 
Bộ định thời trung hạn: Nó chịu trách nhiệm hoán đổi các tiến trình khi một quy 
trình cụ thể đang thực hiện thao tác I/O. Nếu một tiến trình đang chạy thực hiện 
một yêu cầu I/O, nó có thể bị tạm dừng. Tiến trình đã bị tạm ngừng sẽ không thể 
đạt được bất kỳ tiến độ nào để hoàn thành. Tiến trình bị treo được chuyển sang bộ 
nhớ thứ cấp trong tình huống này để xóa nó khỏi bộ nhớ và nhường chỗ cho các 
tiến trình khác. Điều này được gọi là chuyển mạch, và tiến trình này được gọi là 
chuyển đổi hoặc triển khai.   
Định thời CPU trong Hệ điều hành 
Bây giờ mục tiêu tiếp theo của chúng ta là hiểu khái niệm về định thời CPU và tại 
sao chúng ta cần nó. Thời gian cho I/O và CPU đều được sử dụng trong một tiến 
trình điển hình. Thời gian chờ đợi I/O trong một hệ điều hành cũ như MS-DOS bị 
lãng phí và CPU đang rảnh rỗi trong thời gian này. 
Một tiến trình có thể sử dụng CPU trong khi một tiến trình khác đợi I/O trong hệ 
điều hành đa chương trình. Chỉ định thời tiến trình mới cho phép điều này. Định      lOMoAR cPSD| 58933639
thời CPU là quá trình xác định quá trình nào sẽ có quyền sử dụng riêng đối với CPU 
trong khi một tiến trình khác bị tạm dừng. Mục tiêu cơ bản của định thời CPU là 
đảm bảo rằng bất cứ khi nào CPU rãnh, HĐH sẽ chọn ít nhất một trong các chương 
trình trong hàng đợi sẵn sàng để chạy. Bộ định thời CPU sẽ phụ trách quá trình lựa 
chọn. Nó chọn một trong số các tiến trình đang sẵn sàng chạy trong bộ nhớ. 
Các kiểu định thời CPU 
Có hai kiểu định thời CPU chính là:  1. 
Định thời preemptive: các tác vụ thường được giao với mức độ ưu tiên của 
chúng trong. Ngay cả khi hoạt động có mức độ ưu tiên thấp hơn vẫn đang chạy, đôi 
khi cần phải chạy một tác vụ có mức độ ưu tiên cao hơn trước một tác vụ có mức 
độ ưu tiên thấp hơn. Tác vụ có mức độ ưu tiên thấp hơn được tạm dừng trong một 
thời gian và sau đó tiếp tục khi tác vụ có mức độ ưu tiên cao hơn được hoàn thành.  2. 
Định thời non-preemptive: CPU đã được gán cho một tiến trình nhất định 
trong cơ chế định thời này. Quá trình giữ CPU bị chiếm đóng sẽ chuyển đổi ngữ 
cảnh hoặc kết thúc để giải phóng CPU. Đây là phương pháp duy nhất hoạt động 
trên nhiều nền tảng phần cứng. Đó là bởi vì, không giống như định thời preemptive, 
nó không yêu cầu bất kỳ phần cứng cụ thể nào như bộ hẹn giờ. 
Sự khác biệt giữa định thời Preemptive và Non-Preemptive 
1. Trong preemptive, bộ nhớ được cấp phát trong bộ nhớ chính của CPU với 
thời gian giới hạn, nó có thể được gán cho bất kỳ tiến trình nào khác phụ 
thuộc vào trạng thái của tiến trình hiện tại hoặc độ ưu tiên của tiến trình mới 
đến. Trong khi với Non-preemptive, bộ nhớ được cấp phát cho cùng một tiến 
trình đến khi nó hoàn thành. 
2. Trong preemptive, nếu các tiến trình có mức độ ưu tiên cao tiếp tục diễn ra 
thì tiến trình có mức độ ưu tiên thấp sẽ vẫn bị gián đoạn trong thời gian 
không xác định. Trong khi với định thời Non-preemptive, nếu bất kỳ tiến trình 
lớn nào đang xử lý, nó sẽ tiếp tục xử lý và sẽ không cho phép một tiến trình 
dù rất nhỏ xử lý trước khi thực thi hoàn chỉnh. 
3. Trong preemptive, nó phải lưu tất cả dữ liệu của tiến trình ở trạng thái tạm 
dừng để nó chỉ có thể tiếp tục từ thời điểm đó trong khi không có yêu cầu 
nào như vậy trong định thời Nonpreemptive. 
Các giải thuật định thời trong hệ điều hành 
Bây giờ, ta sẽ tìm hiểu một vài giải thuật định thời khác nhau về Quản lý tiến trình.      lOMoAR cPSD| 58933639
First Come First Serve (FCFS) 
Đây là giải thuật định thời CPU cơ bản và trực quan nhất. Tiến trình đầu tiên yêu 
cầu CPU sẽ được nhận phân bổ CPU đầu tiên trong phương thức này. Hàng đợi FIFO 
được sử dụng để quản lý chiến lược định thời này. PCB của tiến trình được liên kết 
với phần đuôi của hàng đợi khi nó đi vào. Do đó, bất cứ khi nào CPU trở nên khả 
dụng, nó sẽ được gán cho tiến trình ở đầu hàng đợi. 
Vài điểm quan trọng của phương thức này:  • 
Nó cung cấp giải thuật định thời preemptive và nonpreemptive.  • 
Công việc luôn được thực hiện theo thứ tự đến trước, phục vụ trước.  • 
Rất dễ triển khai và sử dụng.  • 
Hiệu suất tệ và thời gian đợi thường rất cao. 
Giả sử chúng ta có 5 tiến trình p1, p2, p3, p4, p5 và chúng được nhận bởi hàng đợi 
sẵn sàng tại thời điểm t1, t2, t3, t4, t5 sao cho t1 tiên trong hàng đợi sẵn sàng và do đó nó sẽ được thực thi đầu tiên, tiếp theo là p2,  p3, p4 và p5 tương ứng. 
Hiệu ứng Convoy 
Trong loại giải thuật FCFS (First Come First Serve), nếu một hiệu ứng nhất định với 
thời gian chiếm dụng CPU lớn đến trước bất kỳ tiến trình nhỏ nào thì tiến trình nhỏ 
sẽ bị chặn bởi tiến trình lớn đó và hiệu ứng này được gọi là Hiệu ứng Convoy. 
Shortest Job First (SJF) 
Đây là giải thuật non-preemptive. Nó là một chính sách định thời ưu tiên cái tiến 
trình đang đợi có thời gian thực thi ngắn. Trong tất cả các giải thuật định thời SJF 
có lợi thế là có thời gian chờ đợi trung bình ngắn nhất. Đầu tiên, nó sắp xếp tất cả 
các tiến trình theo thời gian đến. Sau đó chọn phương thức có thời gian đến ngắn 
nhất và thời gian thực thi ngắn nhất. Sau khi chọn, hãy tạo một nhóm các tiến trình 
sẽ chạy khi tiến trình trước đó hoàn tất, sau đó chọn tiến trình có thời gian thực thi  ngắn nhất từ nhóm. 
Vài điểm quan trọng của phương thức này:  • 
Các tiến trình ngắn được xử lý rất nhanh chóng.  • 
Hệ thống cũng có chi phí thấp vì nó chỉ đưa ra quyết định khi một tiến trình 
kết thúc hoặc một tiến trình mới được thêm vào.  • 
Khi một tiến trình mới được thêm vào, giải thuật chỉ phải so sánh tiến trình 
hiện đang chạy với quy trình mới, bỏ qua bất kỳ tiến trình nào khác đang chờ  chạy.      lOMoAR cPSD| 58933639 • 
Các tiến trình dài có thể bị hoãn vô thời hạn nếu các tiến trình ngắn được 
thêm vào một cách thường xuyên.  • 
Nó còn được phân loại thành hai loại: 
o Định thời ưu tiên preemptive nếu do tiến trình mới đến có thời gian 
sử dụng CPU nhỏ hơn, tiến trình hiện tại được chuyển sang trạng thái 
tạm dừng và tiến trình mới tiếp tục thực hiện. 
o Định thời ưu tiên non-preemptive nếu tiến trình đến có thời gian sử 
dụng CPU nhỏ hơn tiến trình hiện tại không bị xáo trộn. 
Ví dụ đơn giản về giải thuật này: 
Giả sử chúng ta có 5 tiến trình p1, p2, p3, p4, p5 và chúng được nhận bởi hàng đợi 
sẵn sàng tại thời điểm t1, t2, t3, t4, t5 sao cho t1 thể giả sử lần này hàng đợi sẵn sàng là hàng đợi ưu tiên sắp xếp lại tiến trình đến 
trên cơ sở thời gian sử dụng CPU. Do đó, tiến trình có thời gian sử dụng CPU ít nhất 
sẽ được phân phối trước, ... 
Longest Job First (LJF) 
Đây cũng là một giải thuật định thời non-preepmtive. Giải thuật này chủ yếu theo 
dõi thời gian thực thi của tất cả các tiến trình có thể truy cập tại thời điểm đến, sau 
đó chỉ định bộ xử lý cho tiến trình có thời gian thực thi dài nhất. Trong giải thuật 
này, khi một tiến trình bắt đầu chạy, nó không thể bị tạm dừng giữa chừng. Chỉ cho 
đến khi tiến trình được cấp phát hoàn tất tiến trình xử lý của nó và bị kết thúc thì 
bất kỳ tiến trình nào khác mới có thể được thực hiện. Nó sắp xếp các tiến trình theo 
thứ tự tăng dần của thời gian đến của chúng. Sau đó, trong số tất cả các tiến trình 
đã đến thời điểm đó, nó sẽ chọn tiến trình có thời gian thực thi lâu nhất. Sau đó, 
nó sẽ xử lý nó trong suốt thời gian thực thi. Cho đến khi tiến trình này hoàn tất quá 
trình thực thi, LJF sẽ giám sát xem có thêm tiến trình nào nữa hay không. 
Vài điểm quan trọng của phương thức này:  • 
Thuật toán này làm giảm tốc độ xử lý, dẫn đến giảm hiệu suất và sử dụng hệ  thống.  • 
Thời gian chờ trung bình và thời gian quay vòng trung bình cho một nhóm 
thủ tục cụ thể tăng lên do cách tiếp cận này.  • 
Với kỹ thuật này, có thể một tiến trình ngắn sẽ không bao giờ được thực thi, 
trong khi hệ thống tiếp tục chạy các tiến trình lớn. 
Một ví dụ đơn giản về Thuật toán này:      lOMoAR cPSD| 58933639
Tương tự như ví dụ trên nhưng bạn có thể giả sử ở đây rằng cùng một hàng đợi sẵn 
sàng ưu tiên dựa trên thời gian sử dụng CPU lớn hơn ở lần đầu tiên, tức là trong số 
năm tiến trình đó, tiến trình nào có thời gian sử dụng CPU lớn nhất sẽ được thực  thi trước tiên, ...  Round Robin (RR) 
Round Robin là một hệ thống định thời cho CPU, trong đó mỗi tiến trình được ấn 
định một khoảng thời gian đã định theo chu kỳ. Giải thuật Round Robin được tạo 
ra với các hệ thống chia sẻ thời gian. Nó này tương tự như định thời FCFS, ngoại trừ 
việc nó bao gồm quyền ưu tiên, cho phép hệ thống chuyển đổi giữa các tiến trình. 
Mỗi tiến trình có một khoảng thời gian nhất định được ấn định cho nó và khi khoảng 
thời gian đó trôi qua, tiến trình này đã được ưu tiên và một tiến trình khác sẽ diễn 
ra. Kết quả là, tất cả các tiến trình nhận được một lượng thời gian bằng nhau của 
CPU. Thuật toán này hoạt động tốt nhất về thời gian phản hồi trung bình. 
Một số điểm quan trọng của phương pháp này:  • 
Round robin là một giải thuật ưu tiên trước và tương tự như FCFS với một số  cải tiến  • 
CPU được chuyển sang tiến trình tiếp theo sau một khoảng thời gian cố định.  • 
Phương pháp định thời được sử dụng rộng rãi trong các hệ điều hành truyền  thống. 
Một ví dụ đơn giản với giải thuật này: 
Một lần nữa, giả sử chúng ta có 5 tiến trình p1, p2, p3, p4, p5 và để chúng có tổng 
thời gian thực hiện là t1, t2, t3, t4 và t5. Bây giờ, chúng ta có thêm một yếu tố t' 
(thời gian) sẽ đảm bảo việc chia sẻ thời gian CPU bằng nhau cho mỗi tiến trình. Giả 
sử trạng thái đầu tiên đến và sau thời gian t', tiến trình p1 này được thực hiện trong 
(t1 - t') thời gian. Bây giờ, nó chuyển sang trạng thái chờ, nơi nó có thể thực hiện 
hoạt động I/O của mình nhưng bây giờ bộ nhớ chính được giải phóng cho tiến trình 
tiếp theo p2. Sau khi hoàn thành hoạt động I / O của nó, tiến trình p1 lại được đẩy 
đến hàng đợi sẵn sàng cho chu kỳ xử lý tiếp theo của nó. Dữ liệu của tiến trình p1 
để thực hiện nó cho đến (t1 - t ') đã được CPU lưu để nó có thể tiếp tục từ trạng 
thái đó trong chu kỳ tiếp theo. Điều này cũng xảy ra với tất cả các tiến trình. 
Định thời dựa trên độ ưu tiên 
Định thời dựa trên độ ưu tiên là một trong những phương pháp định thời hàng loạt 
thường được sử dụng nhất. Một mức độ ưu tiên được chỉ định cho mỗi tiến trình. 
Tiến trình ưu tiên cao nhất được thực hiện trước. Mức độ ưu tiên có thể được xác      lOMoAR cPSD| 58933639
định bởi giới hạn bộ nhớ, giới hạn thời gian hoặc bất kỳ hạn chế tài nguyên nào 
khác. Định thời ưu tiên không phải lúc nào cũng đặt ưu tiên là nghịch đảo của thời 
gian thực thi CPU và bộ nhớ; thay vào đó, nó có thể được đặt bên trong hoặc bên 
ngoài, nhưng việc định thời được thực hiện trên cơ sở độ ưu tiên của tiến trình, với 
các tiến trình khẩn cấp nhất được xử lý trước, sau đó là các tiến trình có thứ tự ưu  tiên thấp hơn. 
Một số điểm quan trọng của phương pháp này:  • 
Trong giải thuật định thời ưu tiên, khả năng bị chặn vô thời hạn hoặc chết  đói.  • 
Chúng ta có thể tận dụng khái niệm lão hóa để ngăn chặn sự chết đói của bất 
kỳ tiến trình nào bằng cách tăng mức độ ưu tiên của các tiến trình có mức độ 
ưu tiên thấp dựa trên thời gian chờ đợi của chúng.  • 
Nó cũng được phân loại thành hai loại: 
o Định thời ưu tiên preemptive: nếu tiến trình mới có mức độ ưu tiên cao 
hơn, Định thời ưu tiên preemptive trình hiện tại được chuyển sang 
trạng thái tạm dừng và thực hiện tiến trình mới. 
Định thời ưu tiên non-preemptive nếu do tiến trình có mức độ ưu tiên 
cao hơn sắp đến, tiến trình hiện tại không bị xáo trộn. 
Một ví dụ đơn giản về giải thuật này: 
Tương tự như ví dụ về giải thuật FCFS, các tiến trình được chèn vào hàng đợi sẵn 
sàng nhưng ở đây trên cơ sở mức độ ưu tiên bây giờ có thể là thời gian thực thi 
CPU, giới hạn bộ nhớ, v.v. và sau đó việc thực thi của nó tương tự như thuật toán  FCFS.