Hệ điều hành (Part 2): Some popular OS architectures

Ngày đăng: 2026-04-14

Lời nói đầu

Đây là phần tiếp theo trong chuỗi series về hệ điều hành. Ở phần trước chúng ta đã biết đến một số khái niệm cơ bản của OS.

OS là một program, được chia thành 2 phần:

Resident là phần thường trú trong RAM, nó chứa các chương trình hoặc cấu trúc dữ liệu cơ bản phục vụ hoạt động của OS như:

Resident còn được gọi là Kernel và như đã liệt kê trên thì Kernel chịu trách nhiệm vận hành và tương tác với các phần cứng. Ngoài ra nó còn quản lý các tài nguyên hệ thống như CPU, Memory, I/O devices,... Cung cấp các giao diện (Interface) để chương trình người dùng tương tác với phần cứng.

Phần còn lại của OS là Transient, gồm các chương trình tạm trú được cài đặt kèm theo hệ điều hành như các system diagnostic tools (ví dụ như deadlock detection). Các chương trình này được cài đặt kèm với OS nhưng chỉ được gọi khi cần thiết và rời khỏi RAM khi hoàn thành nhiệm vụ, không nhất thiết phải nằm trong RAM liên tục như Kernel.

Kernel sẽ nằm trong vùng nhớ thấp (0x0) còn Transient sẽ nằm ở vùng nhớ cao hơn so với Kernel nhưng sẽ thấp hơn các User-programs.

Kiến trúc Simple

Đúng như cái tên của mình thì kiến trúc đơn giản tập trung vào sự đơn giản trong thiết kế. Bắt đầu từ các yêu cầu cơ bản của người dùng máy tính ban đầu, họ cần một hệ thống đáp ứng nhiều công việc và xử lý chúng theo lô, tận dụng tối đa CPU và phải thân thiện với người sử dụng (bao gồm cả những người phát triển hệ điều hành).

Khi cần chức năng gì thì họ chỉ thêm vào OS và cho nó quyền tiếp cận trực tiếp tới các tài nguyên và chức năng cần thiết khác trong hệ thống hiện tại. Sự phát triển đơn giản này tỏ ra vô cùng hiệu quả với các nhu cầu của người dùng máy tính thời điểm đó.

Một ví dụ

Hệ điều hành MS-DOS dựa trên kiến trúc đơn giản

Trong đó:

Ngoài ra thì với việc thiết kế một cách thiếu định hướng ngay từ đầu cũng sẽ khiến cho hệ thống khó có thể mở rộng về sau. Việc cứ thêm các chức năng mà người dùng cần và cho nó quyền truy cập vào toàn bộ hệ thống sẽ khiến cho hệ thống phình to ra, ảnh hưởng rất lớn tới tính ổn định và an toàn hệ thống (một chức năng sụp đổ sẽ có thể dẫn đến sụp đổ hệ thống). Nhất là sau sự ra đời của loại máy tính đa chương/đa nhiệm. Thì kiến trúc này hoàn toàn không thể đáp ứng được

Kiến trúc Monolithic

Đây cũng là một kiến trúc đơn giản hơn và xây dựng theo mô hình God class, một mình cân tất. Kernel sẽ là một God class và làm tất cả mọi thứ để hệ thống vận hành ổn định và kết nối Application Programs với Hardware như hình minh họa:

Hình ảnh minh hoạ kiến trúc đơn

Và cũng giống như kiến trúc đơn giản thì nó cũng có hiệu năng mạnh mẽ và dễ phát triển do chỉ có 3 lớp. Đồng thời nhược điểm cũng tương tự luôn.

Sự khác biệt duy nhất với kiến trúc đơn giản đó là việc Application Programs không thể tương tác trực tiếp với phần cứng mà phải thông qua Kernel. Điều này cũng sẽ tránh được một chút vấn đề về bảo mật. Nhưng nhược điểm thì vẫn tương tự vì Kernel sẽ rất phức tạp trong các hệ điều hành loại đa chương hay chia sẻ thời gian.

Kiến trúc Micro-Kernel

Để khắc phục nhược điểm về sự phình to của Kernel của kiến trúc Monolith trong các hệ điều hành loại đa chương hay chia sẻ thời gian thì người ta sẽ tinh giản lại Kernel.

Kernel sẽ được tinh giản tới mức tối đa, chỉ giữ lại các thành phần thiết yếu đảm bảo nhiệm vụ vận hành hệ điều hành như: basic memory management, process scheduling, inner-process communication (IPC),... Các phần được lược bỏ khỏi Kernel sẽ tạo thành các nhóm chương trình khác nhau gọi là các services.

Các services sẽ hoạt động như User-programs trong User-space. Lúc này Kernel sẽ có thêm một nhiệm vụ chính đó là cung cấp sự giao tiếp giữa chương trình người dùng với các services cần thiết thông qua Inner-process communication (IPC).

Hình ảnh minh hoạ kiến trúc vi nhân

Kiến trúc này đã giảm thiểu các thiệt hại khi chương trình sập đến mức tối đa vì khi một service sập thì sẽ không ảnh hưởng đến các service khác và kernel vẫn hoạt động tốt. Tương ứng thì việc khắc phục service cũng sẽ dễ dàng hơn. Bảo mật tốt hơn. Các services không được dùng tới sẽ không nạp vào RAM dẫn đến tiết kiệm bộ nhớ hơn.

Nhưng đây là một kiến trúc phức tạp và khó để hiện thực cũng như nó sẽ không hoạt động hiệu quả bằng các kiến trúc đơn giản trên. Lý do là việc các service được tách ra và nằm ở không gian người dùng sẽ dẫn đến việc chuyển đổi giữa User-space và Kernel-space và gọi IPC trong Kernel mỗi khi một ứng dụng chạy.

Kiến trúc Layer

Một kiến trúc linh hoạt hơn so với các kiến trúc trên đó là kiến trúc phân lớp. Trong kiến trúc này thì hệ điều hành sẽ được chia thành các lớp khác nhau, mỗi lớp sẽ được xây dựng từ các lớp thấp hơn như hình minh họa. Lớp thấp nhất là lớp 0 - Hardware, cao nhất là lớp N - User Interface.

Hình ảnh minh hoạ kiến trúc phân lớp

Các lớp này sẽ được thiết kế theo triết lý lớp ở ngay dưới sẽ cung cấp dịch vụ cho lớp ở ngay trên và một lớp chỉ có thể giao tiếp được với lớp liền kề nó.

Kiến trúc này cung cấp khả năng tùy biến cao và người xây dựng có thể tạo ra các lớp tùy ý với số lượng và chức năng khác nhau. Với tính chặt chẽ trong thiết kế, tách biệt rõ ràng giữa các lớp thì việc bảo trì sẽ đơn giản và không làm ảnh hưởng đến các lớp thấp hơn.

Kiến trúc phân lớp được gợi ý

Bởi vì tính chặt chẽ trong nguyên tắc thiết kế mà việc thiết kế hệ điều hành theo kiến trúc phân lớp sẽ rất phức tạp bởi nếu ta thêm một lớp, ta sẽ phải tính toán xem cần phải thêm các chức năng gì để phục vụ cho lớp ngay phía trên nó và tận dụng lớp ngay phía dưới.

Ngoài ra hiệu năng của nó sẽ rất kém do nó sẽ làm việc tuần tự tương tự như cấu trúc dữ liệu Singly Linked List. Lớp trên cùng sẽ phải gọi lớp ngay dưới nó, lớp ngay dưới nó sẽ phải gọi lớp ngay dưới nó nữa,... Và cứ như thế cho đến khi gọi tới Hardware thì chức năng mới được thực thi.

Kiến trúc Modular

Kiến trúc Modular có nguyên tắc hoạt động tương đối giống kiến trúc Monolithic nhưng được thiết kế tốt hơn để khắc phục các nhược điểm của kiến trúc đơn giản Monolithic.

Kiến trúc Modular

Thay vì cứ mỗi khi có chức năng mới thì ta sẽ thêm vào và làm Kernel phình to ra thì người ta sẽ đóng gói các chức năng đó thành các Module và lưu trữ trong Disk. Sau đó thì mỗi khi cần chức năng nào thì sẽ gọi và nạp nó vào Kernel. Nghe có vẻ giống như kiến trúc Micro-Kernel nhưng có một sư khác biệt rất lớn nằm ở việc các Module sẽ được nạp trực tiếp vào Kernel và hoạt động ở Kernel-Space thay vì chạy ở User-space như các Services. Do đó nó không cần phải tốn công giao tiếp với Kernel gốc bằng Inner-Process Communication (IPC).

Ngoài ra kiến trúc này còn linh hoạt hơn kiến trúc Layer vì các Module có thể gọi nhau thoải mái (theo thuật ngữ IT thì gọi là Random Access). Và các Module có thể được tận dụng lại cho các tiến trình khác giúp tiết kiệm RAM.

Kernel chính thì vẫn giống như kiến trúc Micro-Kernel, phải chứa các chức năng cơ bản.

Mỗi lần nạp Module vào yêu cầu Kernel phải được biên dịch lại từ đầu. Điều này sẽ làm hệ thống kém hiệu quả hơn nhiều so với các kiến trúc khác.

Việc xây dựng hệ điều hành theo kiến trúc này cũng rất phức tạp và khó khăn.

Nhìn chung thì đây vẫn là kiến trúc tốt nhất để xây dựng các hệ điều hành với quá nhiều ưu điểm.

Kiến trúc Hybrid

Trong thực tế thì có rất ít hệ điều hành chỉ tuân theo chặt chẽ một kiến trúc nhất định trong các kiến trúc trên. Thay vào đó người ta sẽ kết hợp các kiến trúc lại với nhau để lấy ưu điểm của chúng và giảm thiểu tối đa các nhược điểm.

Do đó đây mới là kiến trúc tốt nhất và đảm bảo các nhu cầu của người dùng.

Hệ điều hành Windows NT kiến trúc lai giữa Micro-Kernel và Layer Arhcitecture

Tài liệu tham khảo


← Quay lại trang chủ