Vài note về OS - Đơn nhiệm vs đa nhiệm

Bài log hôm nay chủ yếu note lại vài ghi chú về cách hệ điều hành (OS - Operating System) xử lý chương trình. Hệ điều hành có nhiều khái niệm khá vui vẻ, tìm hiểu mới thấy hay hay.

OS - Hệ điều hành - Operating System

Ngày xưa, khi mà thiết bị điện tử còn giản đơn, lúc đó khái niệm về hệ điều hành chưa có phổ biến, nếu hỏi ai đó về hệ điều hành là gì thì chắc không mấy ai biết. Thế nhưng thời buổi hiện đại ngày nay, khi mà yêu cầu cuộc sống ngày càng cao, dần dần các thiết bị điện tử phức tạp xuất hiện, việc xuất hiện phổ biến của hệ điều hành như một điều tất yếu. Lúc này việc mọi người biết về hệ điều hành cũng nhiều hơn hẳn. Nói một cách đơn giản, hệ điều hành ra đời phục vụ cho nhu cầu của con người. Các thiết bị điện tử phức tạp cần một hệ điều hành để quản lý giúp cho chúng ta dễ dàng sử dụng. Nói đâu cho xa, hệ điều hành ngay trong túi chúng ta đây nè, Android đây nè.

Một số OS phổ biến ai cũng biết như: Windows, MacOS, Linux, Android, IOS, …

Nói tới Android và IOS thì mới nhớ, đây là hai OS phổ biến nhất trên điện thoại ngày nay. Và người trẻ chúng ta hay đem hai OS này ra mà so sánh, cái Android này đa nhiệm tốt hơn IOS nè, rồi IOS nó chạy 1 chương trình thôi, khi mà thu ẩn chương trình đang chạy xuống, chạy chương trình khác thì chương trình thu ẩn kia đứng yên à! Vậy tất cả điều này có đúng?

Vậy để làm rõ chúng ta cần tìm hiểu về khái niệm đa nhiệm là gì? Và cách hệ điều hành làm việc hoạt động như thế nào. Hiểu được những điều này rồi thì tự khắc sẽ hiểu các phán xét kia có đúng hay không!

Vậy đa nhiệm là chi, nếu bạn hỏi đứa nhóc ở nhà mình thì nó sẽ giải thích như sau: nó có thể nhắn tin zalo với crush trong lúc chơi game nè, mở app shopee rồi mở app fb rồi mở nhiều app khác mà khi quay lại nó vẫn lướt được tiếp (mà không phải chạy lại chương trình từ đầu) nè, đấy là đa nhiệm. Về cơ bản đây là cách hiểu đơn giản và giải thích cơ bản nhất. Nhưng cách giải thích của đứa nhỏ đấy liên quan đến khái niệm đa chương (multi-programming) nhiều hơn là đa nhiệm.

Vậy để mình giải thích đa nhiệm là gì nhá, à mà đi với đa nhiệm sẽ có khái niệm đơn nhiệm, nó là cặp bài trùng đi với nhau.

Đơn nhiệm (mono-tasking) và đa nhiệm (multi-tasking)

Đơn nhiệm (mono-tasking): là khái niệm mà hệ điều hành chỉ cho phép một tác vụ (task/process) chạy tại một thời điểm. Hệ thống không thể chạy hai hay nhiều tác vụ cùng lúc. Đây là đặc điểm của những hệ điều hành đời Tống như MS-DOS hoạt động.

Đa nhiệm (multi-tasking): là khả năng của hệ điều hành thực hiện nhiều tác vụ đồng thời (hoặc gần như đồng thời) bằng cách nhanh chóng chuyển đổi giữa các tác vụ với nhau. CPU thực hiện từng tác vụ trong một thời gian rất ngắn (thường tính bằng mili giây), tạo cảm giác khiến chúng ta “ảo giác” rằng nhiều tác vụ đang chạy đồng thời. Đây là cách mà các hệ điều hành hiện đại như Windows, macOS, Linux hoạt động.

Đơn chương (uni-programming) và đa chương (multi-programming)

“Chương” ở đây là “chương” trong cụm từ “chương trình” ấy nha.

Đơn chương (uni-programming): là khi hệ điều hành chỉ cho phép một chương trình chạy tại một thời điểm, không có việc chuyển đổi giữa các chương trình. Nó gần giống với đơn nhiệm, nhưng khái niệm này tập trung vào số lượng chương trình thay vì tác vụ. Đơn chương liên quan đến việc nạp chương trình vào RAM. Có thể hiểu là hệ thống không thể nạp nhiều chương trình lên bộ nhớ do đó muốn chạy chương trình khác, chỉ có thể tắt chương trình hiện tại đi.

Đa chương (Multiprogramming): là khả năng của hệ điều hành lưu trữ nhiều chương trình trong bộ nhớ RAM cùng lúc và cho phép CPU chuyển đổi giữa chúng khi một chương trình đang chờ tài nguyên (ví dụ, đang chờ dữ liệu từ đĩa cứng). Đa chương không phải là chạy song song nhiều chương trình, mà là tận dụng tối đa tài nguyên của CPU bằng cách luôn có một chương trình sẵn sàng để chạy. Ví dụ: khi chương trình A đang đợi dữ liệu từ ổ đĩa, CPU có thể chuyển sang chạy chương trình B.

Sao coi tới đây thì thấy đơn chương nó giống đơn nhiệm, mà đa nhiệm lại giống y đa chương vậy ta, thật ra nó khác nhau ở cấp độ.

Điểm khác nhau giữa đơn/đa nhiệm với đơn/đa chương

Đơn nhiệm và đa nhiệm tập trung vào số lượng tác vụ (tasks/processes) mà hệ điều hành có thể thực hiện tại cùng một thời điểm.
Đơn chương và đa chương nói về số lượng chương trình (programs) mà hệ điều hành có thể lưu trữ và quản lý trong bộ nhớ.

Đơn nhiệm và đơn chương khá tương tự nhau vì nếu chương trình đã đơn giản thì thường sẽ có một tác vụ và cả hai trường hợp này, hệ điều hành chỉ thực hiện một tác vụ hoặc nạp lên RAM một chương trình duy nhất. Sự khác biệt nhỏ là đơn nhiệm tập trung vào việc thực hiện tác vụ, còn đơn chương tập trung vào việc chỉ có một chương trình trong bộ nhớ.

Tương tự đa nhiệm và đa chương có điểm khác biệt lớn hơn. Đa nhiệm liên quan đến việc chuyển đổi nhanh giữa các tiến trình thực hiện tác vụ để tạo ra ảo giác chạy đồng thời, trong khi đa chương liên quan đến việc quản lý nhiều chương trình trong bộ nhớ để CPU không phải chờ đợi khi một chương trình dừng chờ tài nguyên.

Vậy câu hỏi đặt ra tiếp theo tác vụ và chương trình khác nhau cái gì?

Điểm khác nhau giữa tác vụ và chương trình

Chúng khác nhau ở cấp độ như mình đã nói phía trên: một chương trình có thể tạo ra nhiều tác vụ khác nhau.

Chương trình là một tập hợp mã nguồn hoặc tập tin thực thi, được viết bằng ngôn ngữ lập trình, và lưu trữ trên ổ cứng hoặc bộ nhớ. Nó là một tệp tĩnh và chưa hoạt động cho đến khi được thực thi. Ví dụ: chrome.exe hoặc Visual Code (đã cài đặt)

Khi một chương trình được thực thi, nó trở thành một tác vụ (hay còn gọi là process). Tác vụ là một phiên bản đang chạy của chương trình sử dụng tài nguyên như CPU, bộ nhớ, v.v. Ví dụ: khi bạn click vào file chrome.exe, chương trình đó sẽ trở thành một tác vụ đang chạy trên máy tính. Lúc này, chương trình không còn là một file tĩnh nữa, mà đang tương tác với hệ điều hành, bộ nhớ, và các tài nguyên phần cứng khác.

image

Hiện nay còn hệ điều hành nào đơn nhiệm nữa không?

Câu trả lời của mình là còn, các OS đấy thường ở trong các thiết bị đơn giản như máy tính tiền, máy POS ở mấy quán cà phê hoặc siêu thị ấy, máy quét tính tiền ở siêu thị, hoặc các thiết bị IOT, thiết bị nhúng.

Cốt lõi của OS đơn nhiệm là phục vụ những cái đơn giản không cần quá phức tạp.

Cách hoạt động đa nhiệm của CPU

Ở trên mình có nói: “CPU thực hiện từng tác vụ trong một thời gian rất ngắn (thường tính bằng mili giây), tạo cảm giác khiến chúng ta ảo giác rằng nhiều tác vụ đang chạy đồng thời”. Nghĩa là một CPU có thể chỉ thực sự xử lý một lệnh tại một thời điểm, nhưng nó chuyển đổi nhanh chóng giữa các tác vụ để tạo cảm giác như tất cả các tác vụ đang diễn ra cùng lúc.

Có nhiều cách để làm điều này trên các hệ điều hành, dưới đây là các cách đấy:

Đa nhiệm phân chia thời gian (Time-sharing)

Đây là phương pháp phổ biến mà hệ điều hành sử dụng để đạt được đa nhiệm. CPU phân chia thời gian xử lý thành các lượng thời gian ngắn (time slices) và chuyển đổi giữa các tiến trình khác nhau sau mỗi đoạn thời gian này.

Quá trình chuyển đổi (kỹ thuật người ta gọi là context switching - chuyển đổi ngữ cảnh) quá trình này diễn ra khi CPU chuyển từ tác vụ này sang tác vụ khác. Mỗi lần chuyển đổi, hệ điều hành phải lưu lại trạng thái hiện tại của tác vụ (ngữ cảnh) và tải ngữ cảnh của tác vụ mới.

Ví dụ bạn đang nấu ăn, ngữ cảnh là nấu ăn, sau đó bạn tạm gác lại (lưu lại trạng thái hiện tai) và mặc tạp dề vô và đi rửa chén, nghĩa là chuyển đổi sang ngữ cảnh rửa chén.

Hoặc ví dụ khi bạn mở trình duyệt web, nghe nhạc, và viết tài liệu cùng lúc, CPU sẽ chuyển đổi giữa ba tác vụ này liên tục, mỗi lần trong một khoảng thời gian rất ngắn, tạo ra ảo giác rằng chúng đang chạy song song.

Đa nhiệm ưu tiên (Priority-based)

Với đa nhiệm kiểu này, mỗi tác vụ có thể được gán một mức độ ưu tiên khác nhau. OS sẽ dành nhiều thời gian xử lý hơn cho các tác vụ có mức ưu tiên cao hơn. Điều này cho phép CPU tập trung vào các tác vụ quan trọng trong khi vẫn xử lý các tác vụ ít quan trọng hơn ở mức độ thấp hơn.

Ví dụ nếu bạn đang tải một file nào đó dung lượng khá lớn và lúc này bạn đang làm việc với trình soạn thảo văn bản, OS có thể dành ưu tiên xử lý cho việc soạn thảo, trong khi quá trình tải tệp có thể diễn ra chậm hơn mà không làm gián đoạn công việc của bạn.

Hoặc ví dụ trong Windows khi máy bị treo do CPU quá tải, nếu bạn cố mở Task manager, nó sẽ ưu tiên tác vụ mở Task manager này lên (trong task manager chúng ta có thể tắt chương trình khác).

Siêu phân luồng (Hyper-threading)

Một số CPU, như dòng Intel với Hyper-threading (công nghệ siêu phân luồng ta thường nghe), có khả năng tạo ra các luồng xử lý ảo. Điều này giúp một lõi vật lý của CPU có thể xử lý hai luồng xử lý cùng lúc. Mặc dù đây không phải là hai lõi vật lý thực sự, nhưng nó giúp cải thiện hiệu suất đa nhiệm bằng cách tối ưu hóa việc sử dụng CPU.

Ví dụ một CPU 4 lõi có công nghệ siêu phân luồng có thể hoạt động như thể có 8 lõi, vì mỗi lõi vật lý có thể xử lý hai luồng khác nhau cùng lúc. Đó là lý do chúng ta nghe cụm từ 4 nhân 8 lõi là vậy.

Đa lõi (Multi-core)

CPU đa lõi có nhiều lõi xử lý vật lý trên cùng một chip. Điều này giúp mỗi lõi có thể xử lý một tác vụ riêng biệt một cách thực sự đồng thời, cải thiện hiệu suất cho các ứng dụng đa luồng.

Ví dụ khi bạn chạy một trò chơi đòi hỏi xử lý đồ họa nặng và đồng thời chạy các ứng dụng khác, một CPU 8 lõi có thể dành 4 lõi cho trò chơi và 4 lõi còn lại cho các tác vụ khác, xử lý chúng một cách thực sự song song.

Tác vụ I/O và CPU

Đa nhiệm không chỉ phụ thuộc vào CPU. Khi một tác vụ cần truy cập thiết bị I/O (như ổ cứng, mạng, …), CPU có thể tạm dừng xử lý và chuyển sang một tác vụ khác trong khi chờ dữ liệu từ thiết bị I/O. Điều này giúp hệ thống sử dụng tài nguyên CPU một cách hiệu quả hơn.

Ví dụ khi bạn sao chép một tệp từ ổ cứng vào USB, CPU có thể chuyển sang xử lý các tác vụ khác trong khi quá trình sao chép dữ liệu đang diễn ra.

Các loại đa nhiệm của CPU

Đa nhiệm hợp tác (Cooperative multitasking)

Đây là dạng đa nhiệm mà các tác vụ phải tự nguyện nhường quyền điều khiển CPU cho tác vụ khác. Nếu một tác vụ không nhường CPU, nó có thể chiếm toàn bộ thời gian xử lý.

Thường thấy ở các OS đời Tống như mấy phiên bản Windows đời đầu, chúng nó sử dụng kiểu đa nhiệm này, nơi các ứng dụng tự quyết định khi nào sẽ dừng để ứng dụng khác được xử lý =)))

Đa nhiệm ưu tiên (Preemptive multitasking)

Trong dạng đa nhiệm này, OS quyết định khi nào CPU sẽ chuyển từ tác vụ này sang tác vụ khác. Điều này đảm bảo rằng không có tác vụ nào chiếm dụng CPU quá lâu.

Các OS hiện đại ngày nay như Windows, Linux, và macOS sử dụng đa nhiệm dạng này để đảm bảo rằng tất cả các tác vụ đều có cơ hội được xử lý, chứ chơi như ông đầu tiên thì gặp tác vụ mất dạy, nó chiếm luôn cái rồi =))))

Bonus

Cách đây khá lâu mình có viết bài Xử lý đồng thời và song song trong ngôn ngữ lập trình khác nhau như thế nào? hai tụi nó có liên quan lẫn nhau đấy.

 Comments
Comment plugin failed to load
Loading comment plugin