CHƯƠNG 1 : GIỚI THIỆU CHUNG
1.7. CẤU TRÚC HỆ ĐIỀU HÀNH
1.7.3. Một số kiểu cấu trúc hệ điều hành
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.
{ . . 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()
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.
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 tồ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
trình ứng dụng trình ứng dụng Hệ điều hành Chế độ người dùng Chế độ đặc quyền
Hình 1.14 :Cấu trúc nguyên khối PTIT
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ớ. Quá 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á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à ngun 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 ngồ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.
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
Hình 1.15: Cấu trúc hệ điều hành Linux
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à hoà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 quá 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 hoàn toà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 đọc ghi các file chứ khơng phá hoại tồn bộ hệ thống.
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,
Vi nhân trình ứng dụng quản lý tệp quản lý mạng Hình 1.17 Cấu trúc vi nhân trình ứng dụng PTIT
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.