CHƯƠNG 1 : GIỚI THIỆU CHUNG
1.7. CẤU TRÚC HỆ ĐIỀU HÀNH 24
1.7.3. Một số kiểu cấu trúc hệ điều hành 30
Các thành phần đã nêu ở phần trên cần được tổ chức, kết hợp với nhau theo một cách
nào đó để tạo ra một hệ thống thống nhất là hệ điều hành. Trong phần này, ta sẽ xem xét một số kiểu cấu trúc hệ điều hành thường được sử dụng.
1.7.3.1. Cấu trúc nguyên khối
Cấu trúc nguyên khối (monolithic), hay cấu trúc đơn giản, là cấu trúc trong đó tồn bộ
các chương trình và dữ liệu của hệ điều hành có chung một khơng gian nhớ và do vậy có thể coi như một khối duy nhất. Hệ điều hành lúc đó trở thành một chương trình lớn, là tập hợp
các thủ tục hay các chương trình con. Mỗi chương trình con có thể tự do gọi chương trình con khác khi cần thiết.
Cách tổ chức hệ điều hành như vậy cho ta hình ảnh tương tự với chương trình được viết theo kiểu lập trình cấu trúc, trong đó tồn bộ chương trình tạo thành từ các chương trình con, ví dụ chương trình viết trên ngơn ngữ C hay Pascal. Các chương trình con được dịch, sau đó liên kết thành một chương trình lớn. Việc che dấu thơng tin hồn tồn khơng có, tức là bất cứ chương trình con nào cũng có thể gọi chương trình con khác hoặc truy cập vào các dữ liệu chung của chương trình.
{ . . printf(“Hello world.\n”); . . }
Thư viện C/C++ chuẩn Chế độ
người dùng
Chế độ nhân
Giao diện lời gọi hệ thống
Thực hiện lời gọi hệ thống Write() Write() trình ứng dụng trình ứng dụng Hệ điều hành Chế độ người dùng Chế độ đặc quyền
Khi chương trình ứng dụng cần dùng tới các dịch vụ của hệ điều hành, chương trình ứng dụng sẽ sử dụng lời gọi hệ thống do hệ điều hành cung cấp. Lời gọi hệ thống được chuyển cho chương trình con tương ứng của hệ điều hành thực hiện. Chương trình con này sẽ gọi
thêm các chương trình con khác để thực hiện nhiệm vụ nếu cần thiết.
Ưu điểm lớn nhất của cấu trúc nguyên khối là tốc độ thực hiện cao. Do có chung khơng
gian địa chỉ, việc truy cập dữ liệu hoặc gọi chương trình con cần thiết được thực hiện nhanh
chóng, khơng phải chịu những phí tổn về thời gian và bộ nhớ (ngăn xếp) như khi chuyển đổi giữa những mơ đun có khơng gian nhớ khác nhau (giữa các chương trình khác nhau).
Nhược điểm của cách tổ chức này là thiếu tính mềm dẻo và khó làm cho hệ thống có độ tin cậy cao. Do tồn bộ nhân là một chương trình lớn nên việc thay đổi bất cứ thành phần nào cũng ảnh hưởng tới toàn bộ nhân. Điều này làm cho hệ thống khơng mềm dẻo, khó thay đổi. Ngồi ra, do toàn bộ hệ điều hành là một khối, mỗi chương trình con trong khối lại có thể truy cập tới dữ liệu và chương trình con khác, việc xuất hiện lỗi sẽ làm cho cả hệ thống tê liệt. Việc liên kết các thành phần thành một khối lớn cịn khiến cho nhân ln có kích thước lớn. Kể cả các thành phần không cần đến cũng được tải vào bộ nhớ cùng với các thành phần khác.
Để khắc phục các nhược điểm nói trên, trong một số hệ điều hành cấu trúc khối, người
ta tổ chức các mơ đun có thể tải từ đĩa và gắn vào nhân khi cần thiết. Trong trường hợp không dùng tới có thể xố các mơ đun khỏi nhân. Tuy là các mô đun riêng nhưng khi đã được tải vào bộ nhớ, các mô đun này nhập vào với nhân thành một khối có cùng khơng gian địa chỉ. Điều này đảm bảo cho hệ điều hành giữ được cấu trúc nguyên khối mà vẫn khơng có các thành
phần thừa. Một ví dụ cho cách tổ chức kiểu này là hệ điều hành Linux.
Cấu trúc của Linux được thể hiện trên hình 1.15. Nhân của Linux có thể mở rộng nhờ
các mô đun. Các mô đun này được tải vào bộ nhớ khi cần và khỏi bộ nhớ khi không cần nữa. Chẳng hạn khi ta sử dụng đĩa CD-ROM, mô đun chịu trách nhiệm điều khiển vào ra với đĩa sẽ
được tải vào bộ nhớ. Q trình này khơng địi hỏi khởi động lại máy để có thể sử dụng thiết bị
mới thêm vào. Các mô đun được tải vào trong hai trường hợp: khi người dùng sử dụng các
lệnh insmod và rmmod hoặc khi nhân cần các mơ đun và tự tải vào cho mình. Sau khi được
tải vào bộ nhớ, chương trình và dữ liệu của mơ đun tải vào có cùng khơng gian nhớ với nhân. Các hàm chứa trong mô đun sẽ được các hàm khác của nhân “nhìn thấy” và gọi nếu cần. Nói cách khác mơ đun và các thành phần khác của nhân tạo thành một “khối” nhân mới lớn hơn.
các trình ứng dụng các trình tiện ích các trình quản lý hệ thống
các mơ đun tải được
nhân
thư viện hệ thống
Cách tổ chức này cho phép tận dụng ưu thế về tốc độ của cấu trúc khối đồng thời đảm bảo
cho nhân không chứa các phần thừa.
1.7.3.2. Cấu trúc phân lớp
Để việc xây dựng một hệ thống phần mềm lớn và phức tạp như hệ điều hành được đơn
giản hơn, nguyên tắc thường được sử dụng là nguyên tắc mơ đun hóa, theo đó tồn hệ thống
được phân thành các mơ đun sao cho từng mơ đun có thể được phát triển, thay đổi, kiểm tra
lỗi tương đối độc lập với các mô đun khác. Một trong các kiểu cấu trúc cho phép áp dụng
nguyên tắc này là cấu trúc phân lớp.
Cấu trúc phân lớp là cấu trúc trong đó các thành phần của hệ điều hành được phân thành các lớp nằm chồng lên nhau hay tiếp xúc với nhau theo một thứ tự nhất định (hình 1.16). Lớp trên cùng (hay ngoài cùng) là lớp các chương trình ứng dụng, lớp dưới cùng (hoặc trong cùng) tương ứng với phần cứng. Việc liên lạc giữa các lớp được quy định sao cho mỗi lớp chỉ có thể liên lạc với lớp nằm kề bên trên và kề bên dưới.
Điểm đặc biệt của cấu trúc phân lớp là mỗi lớp chỉ có thể sử dụng dịch vụ do lớp nằm
ngay bên dưới cung cấp. Dịch vụ này được cung cấp qua giao diện của lớp dưới, thường là
dưới dạng các hàm mà lớp trên có thể gọi. Các chi tiết cụ thể của lớp dưới như cấu trúc dữ liệu, mã chương trình được che dấu khỏi lớp trên. Lớp trên chỉ quan tâm tới dịch vụ được
cung cấp mà không cần quan tâm đến các chi tiết này. Như vậy, ta có thể thay đổi các lớp độc lập với nhau, chỉ cần đảm bảo giữ nguyên giao diện với lớp trên. Phần lớn các lớp chạy trong chế độ nhân hay chế độ đặc quyền.
Trình ứng dụng Hệ thống file Liên lạc giữa các tiến trình
Quản lý vào/ra Quản lý bộ nhớ Quản lý tiến trình
Phần cứng
Hình 1.16. Ví dụ cấu trúc phân lớp
Một ưu điểm rõ nét của cấu trúc phân lớp là cấu trúc này cho phép thực hiện dị lỗi và hồn thiện hệ điều hành một cách tương đối dễ dàng. Việc dị lỗi và hồn thiện được thực hiện từ dưới lên trên. Trước tiên lớp dưới được kiểm tra độc lập với lớp trên. Sau khi đã chắc chắn lớp dưới khơng có lỗi, ta có thể chuyển sang kiểm tra lớp trên. Do các dịch vụ lớp dưới cung cấp cho lớp trên đã được kiểm tra, nên nếu xuất hiện lỗi, có thể tập trung tìm lỗi trong lớp
trên. Quá trình tìm lỗi được thực hiện từ dưới lên trên như vậy cho tới khi tới lớp trên cùng của hệ thống.
Tuy nhiên, khó khăn thường gặp khi thiết kế hệ điều hành có cấu trúc phân lớp là việc xác định số lớp cũng như phân chia thành phần cụ thể của mỗi lớp là không dễ dàng. Do mỗi lớp chỉ có thể gọi lớp nằm ngay bên dưới, cần xác định và phân hoạch chính xác các lớp trên cơ sở chức năng và tương tác giữa các phần của hệ điều hành. Ví dụ, khối quản lý bộ nhớ ảo của hệ điều hành thường sao chép một phần không gian nhớ ảo lên đĩa. Như vậy, chương
trình quản lý sao chép ra đĩa phải nằm ở lớp thấp hơn lớp có chứa khối quản lý bộ nhớ ảo. Có như vậy, khối quản lý bộ nhớ mới có thể sử dụng được dịch vụ sao chép này.
Một nhược điểm nữa của cấu trúc phân lớp là tốc độ tương đối thấp so với các kiểu cấu trúc khác. Mỗi khi chương trình ứng dụng yêu cầu thực hiện các thao tác (chẳng hạn vào/ra) thông qua lới gọi hệ thống. Yêu cầu này được truyền từ lớp trên xuống phần cứng thơng qua các lớp trung gian. Trong q trình truyền, mỗi lớp sẽ có các xử lý riêng của mình như thêm
địa chỉ, tạo ra lời gọi lớp dưới thích hợp v.v. Kết quả là thời gian phục vụ của hệ thống sẽ tăng
lên so với trường hợp không phân lớp.
Do các nhược điểm nêu trên, cấu trúc phân lớp hồn tồn ít được sử dụng trong thời
gian gần đây. Trong một số trường hợp, cấu trúc phân lớp cũng được sử dụng nhưng với số
lượng lớp ít, mỗi lớp đảm nhiệm nhiều chức năng hơn (như hệ điều hành OS/2). Ngoài ra, cấu trúc phân lớp thường được sử dụng kết hợp với các kiểu cấu trúc khác (xem phần cấu trúc lai bên dưới). Cách tổ chức này cho phép tận dụng một phần ưu điểm của việc phân lớp đồng
thời giảm được khó khăn trong khâu thiết kế và tổ chức tương tác giữa các lớp.
1.7.3.3. Cấu trúc vi nhân
Một kiểu cấu trúc mới hơn và khá phổ biến khác là cấu trúc vi nhân (microkernel). Ở
các hệ điều hành có cấu trúc kiểu này, phần nhân chỉ chứa các chức năng quan trọng nhất như quản lý tiến trình, quản lý bộ nhớ, liên lạc giữa các tiến trình. Các chức năng cịn lại của hệ
điều hành được tổ chức thành các mô đun khác, mỗi mơ đun có thể là một chương trình riêng
biệt. Các mơ đun này có thể hoạt động trong chế độ đặc quyền như phần nhân hoặc như các
chương trình ứng dụng thơng thường.
Mỗi khi có yêu cầu cung cấp dịch vụ từ chương trình ứng dụng, chẳng hạn yêu cầu đọc hoặc ghi file, yêu cầu sẽ chuyển cho nhân. Nhân sẽ chuyển tiếp yêu cầu cho mô đun tương
ứng thực hiện, trong trường hợp này là mô đun quản lý hệ thống file. Như vậy, nhiệm vụ của
nhân khi đó chỉ là đảm bảo liên lạc giữa chương trình ứng dụng và mơ đun cung cấp dịch vụ. Hình 1.17 cho ta hình dung về cấu trúc vi nhân và liên lạc giữa trình ứng dụng với các mơ đun của hệ điều hành thông qua vi nhân.
Cách tổ chức này cho phép giảm tối thiểu kích thước nhân (từ đây sinh ra tên gọi vi nhân) cũng như kích thước các mơ đun. Ưu điểm chính của cách tổ chức này là việc thiết kế, cài đặt, quản lý các mô đun sẽ dễ dàng và mềm dẻo hơn so với cấu trúc khối. Các mơ đun có
thể được xây dựng riêng biệt, sau đó tải vào khi có nhu cầu. Một ưu điểm khác là do đa số các mô đun chạy trong chế độ người dùng như các chương trình ứng dụng thông thường, khi các
các mô đun này có lỗi sẽ khơng ảnh hưởng tới tồn bộ hệ điều hành. Lấy ví dụ mơ đun làm
nhiệm vụ quản lý đĩa và file. Việc xuất hiện sự cố trong mô đun này chỉ ảnh hưởng tới việc
Nhược điểm của cấu trúc vi nhân là việc chuyển đổi giữa các mơ đun địi hỏi thời gian
và tài ngun hệ thống. Các mơ đun chỉ có thể liên lạc với nhau theo những cơ chế liên lạc nhất định (thường là bằng cách chuyển thông điệp - message passing) chứ không thể trực tiếp gọi hàm và truy cập dữ liệu của mô đun khác. Cách liên lạc như vậy chậm hơn nhiều so với cách gọi hàm trực tiếp. Việc chuyển đổi giữa tiến trình khác nhau của các mơ đun cũng cần các chi phí về thời gian và tài nguyên khác (cất giữ trạng thái tiến trình của mơ đun này trước khi chuyển sang tiến trình của mơ đun khác).
1.7.3.4. Cấu trúc lai
Trên thực tế, các hệ điều hành thường được tổ chức bằng cách kết hợp các kiểu cấu trúc kể trên, thay vì hồn tồn dựa trên một kiểu cấu trúc duy nhất. Cách kết hợp như vậy được gọi là cấu trúc lai. Như đã nhắc tới ở trên, cấu trúc cơ bản của Linux là cấu trúc nguyên khối, tuy vậy nhiều chức năng được tổ chức dưới dạng các mô đun tải được, cho phép dễ dàng thêm,
bớt, bổ sung vào nhân. Như vậy, hệ thống có tốc độ nhanh của cấu trúc nguyên khối, trong
khi vẫn sử dụng được ngun tắc mơ đun hóa để tăng tính mềm dẻo. Tương tự như vậy, mặc dù Windows có cấu trúc cơ bản dưới dạng vi nhân, rất nhiều thành phần của Windows vẫn hoạt động trong chế độ nhân và có chung khơng gian nhớ để không ảnh hưởng tới tốc độ. Một cách kết hợp thường được sử dụng khác là kết hợp cấu trúc phân lớp với cấu trúc vi nhân, như trong các hệ điều hành iOS.