Hệ điều hành
Hệ điều hành (Operating System, OS) là một loại phần mềm hệ thống quản lý tài nguyên phần cứng của máy tính, đồng thời cung cấp môi trường và các dịch vụ chung...
| Phân loại | Phần mềm hệ thống |
|---|---|
| Mục đích | Quản lý tài nguyên máy tính và cung cấp môi trường thực thi chương trình |
| Đối tượng quản lý | Bộ xử lý trung tâm, Bộ nhớ, Thiết bị lưu trữ thứ cấp, Thiết bị vào/ra, tài nguyên mạng |
| Thành phần cốt lõi | Nhân hệ điều hành, Lời gọi hệ thống, Hệ thống tệp, Trình điều khiển thiết bị, dịch vụ hệ thống |
| Chức năng chính | Quản lý tiến trình, Quản lý bộ nhớ, quản lý vào/ra, quản lý tệp, bảo mật và kiểm soát truy cập |
| Môi trường thực thi | Lớp trừu tượng giữa chương trình người dùng và phần cứng |
| Các loại chính | Hệ điều hành xử lý theo lô, Hệ điều hành chia sẻ thời gian, Hệ điều hành thời gian thực, Hệ điều hành phân tán, Hệ điều hành nhúng |
| Các họ chính | Họ UNIX, Họ Windows, hệ điều hành máy tính lớn, hệ điều hành di động |
| Lĩnh vực liên quan | Kiến trúc máy tính, Tính đồng thời, Ảo hóa, Bảo mật máy tính, Hệ thống phân tán |
Hệ điều hành (Operating System, OS) là một loại phần mềm hệ thống quản lý tài nguyên phần cứng của máy tính, đồng thời cung cấp môi trường và các dịch vụ chung để ứng dụng có thể thực thi. Hệ điều hành phân bổ cho nhiều chương trình các tài nguyên như thời gian thực thi của bộ xử lý trung tâm, bộ nhớ, thiết bị lưu trữ, thiết bị vào/ra, tệp và kết nối mạng. Nó cũng cung cấp các giao diện được trừu tượng hóa, cho phép ứng dụng đọc tệp, tạo tiến trình và sử dụng màn hình, mạng cùng các thiết bị ngoại vi mà không cần trực tiếp điều khiển hoạt động cụ thể của phần cứng. Nhân hệ điều hành, thành phần cốt lõi của hệ điều hành, thực thi với đặc quyền cao và chịu trách nhiệm lập lịch tiến trình và luồng, quản lý bộ nhớ ảo, trình điều khiển thiết bị, hoạt động vào/ra cùng các chức năng bảo vệ. Ứng dụng thường yêu cầu chức năng của nhân thông qua lời gọi hệ thống và thư viện hệ thống. Một vai trò quan trọng khác của hệ điều hành là giảm ảnh hưởng của lỗi hoặc hành vi truy cập trái phép từ một chương trình đối với các chương trình khác và toàn bộ hệ điều hành bằng cách thực thi ứng dụng trong chế độ người dùng bị giới hạn, đồng thời cấp cho mỗi tiến trình một không gian địa chỉ và quyền truy cập riêng biệt.
Hệ điều hành không chỉ bao gồm một nhân duy nhất. Môi trường vận hành thực tế được cấu thành từ sự kết hợp giữa nhân hệ điều hành với trình điều khiển thiết bị, thư viện hệ thống, dịch vụ nền, hệ thống khởi tạo, tài khoản người dùng và cơ chế bảo mật, trình thông dịch dòng lệnh hoặc giao diện người dùng đồ họa cùng các công cụ quản trị. Tuy nhiên, ranh giới giữa hệ điều hành và nhân hệ điều hành có thể được hiểu khác nhau tùy theo hệ thống và ngữ cảnh. Có những kiến trúc tách các chức năng của nhân thành các máy chủ riêng biệt hoạt động trong không gian người dùng, trong khi những kiến trúc khác tích hợp nhiều chức năng trực tiếp vào bên trong nhân. Hệ điều hành không chỉ được triển khai dưới dạng hệ thống đa dụng dành cho máy tính cá nhân và máy chủ, mà còn dưới dạng hệ thống chuyên dụng hoặc thời gian thực dành cho điện thoại thông minh, máy chơi trò chơi điện tử, thiết bị mạng, ô tô, bộ điều khiển công nghiệp và các thiết bị nhúng cỡ nhỏ. Tùy theo yêu cầu về thời gian phản hồi, độ an toàn, điện năng, bộ nhớ và giao diện người dùng, các hệ điều hành sử dụng những kiến trúc và chính sách khác nhau.
Lịch sử
Các máy tính điện tử thời kỳ đầu không có hệ điều hành theo nghĩa hiện đại. Máy tính được cung cấp dưới dạng phần cứng cùng với các tài liệu hướng dẫn vận hành cơ bản, còn lập trình viên phải trực tiếp nạp chương trình vào máy và tự cấu hình môi trường thực thi. Chương trình và dữ liệu được lưu trên thẻ đục lỗ, băng giấy, băng từ và các phương tiện tương tự. Sau khi một tác vụ hoàn tất, con người phải thiết lập lại thiết bị để chạy tác vụ tiếp theo. Trong giai đoạn này, khi máy tính đang chạy một chương trình, người dùng khác gần như không thể sử dụng hệ thống, đồng thời việc chuẩn bị chương trình và chuyển đổi thiết bị tiêu tốn nhiều thời gian.
Lịch sử của hệ điều hành bắt đầu từ nỗ lực sử dụng tài nguyên máy tính hiệu quả hơn và tự động hóa bằng phần mềm các thao tác phần cứng phức tạp. Những chương trình điều khiển đơn giản ban đầu chỉ quản lý việc nạp tác vụ và thứ tự thực thi, nhưng về sau chúng phát triển thành các hệ thống phức hợp có khả năng đồng thời quản lý bộ xử lý trung tâm, bộ nhớ, thiết bị lưu trữ, thiết bị vào/ra, người dùng và chương trình.
Máy tính thời kỳ đầu và vận hành thủ công
Trong các máy tính của thập niên 1940 và đầu thập niên 1950, việc chạy một chương trình tại một thời điểm là phương thức phổ biến. Người dùng phải đặt trước thời gian sử dụng, trực tiếp nhập chương trình và dữ liệu vào máy, và nếu xảy ra lỗi thực thi thì phải sửa chương trình rồi chuẩn bị lại từ đầu.
Máy tính thời kỳ đầu có giá rất cao, nhưng bộ xử lý trung tâm thường bị bỏ không trong thời gian chuẩn bị chương trình và chuyển đổi thiết bị. Khi một chương trình phải chờ thiết bị vào/ra chậm như đầu đọc thẻ hoặc máy in, hệ thống cũng không thể chạy tác vụ khác. Vì vậy, các bộ giám sát thường trú và chương trình điều khiển đã xuất hiện để máy tính tự đảm nhiệm thứ tự thực thi tác vụ và thao tác thiết bị.
GM-NAA I/O vào giữa thập niên 1950 thường được nhắc đến như một trong những ví dụ tiên phong của hệ điều hành thời kỳ đầu. Hệ thống này được một nhóm người dùng của General Motors và North American Aviation phát triển cho IBM 704, cung cấp khả năng tự động chạy liên tiếp nhiều tác vụ và dùng chung cơ chế xử lý vào/ra. Tư liệu bảo tồn hệ điều hành của Computer History Museum mô tả các hệ thống thuộc dòng GM-NAA là một trong những điểm khởi đầu của quá trình phát triển hệ điều hành máy tính lớn thời kỳ đầu.
Xử lý theo lô
Xử lý theo lô là phương thức chuẩn bị nhiều chương trình và dữ liệu thành một nhóm tác vụ, sau đó người vận hành đưa chúng vào máy tính theo thứ tự để hệ thống tự động thực thi. Sau khi gửi tác vụ, người dùng không thể nhận kết quả ngay mà phải chờ hệ thống xử lý xong toàn bộ các tác vụ trước đó rồi mới nhận được đầu ra.
Hệ thống xử lý theo lô giúp giảm thời gian con người phải thiết lập lại thiết bị sau mỗi tác vụ. Chúng sử dụng ngôn ngữ điều khiển tác vụ và bộ giám sát thường trú để tự động hóa việc nạp và chạy chương trình, xử lý lỗi và xuất kết quả. Các hệ điều hành ban đầu đảm nhiệm việc chạy tuần tự các tác vụ theo lô đồng thời quản lý bộ xử lý trung tâm và thiết bị vào/ra.
Tuy nhiên, trong xử lý theo lô đơn giản, bộ xử lý trung tâm vẫn bị nhàn rỗi khi chương trình đang chạy phải chờ vào/ra. Để giảm vấn đề này, các tác vụ vào/ra được xử lý trên thiết bị và kênh riêng, đồng thời kỹ thuật đa chương trình được phát triển để nạp nhiều chương trình vào bộ nhớ và chạy một chương trình khác trong khi chương trình hiện tại đang chờ.
Computer History Museum mô tả xử lý theo lô thời kỳ đầu là phương thức không tương tác, trong đó người dùng gửi tác vụ rồi chờ kết quả, còn chia sẻ thời gian sau đó đã biến việc sử dụng máy tính thành một hoạt động tương tác.
Đa chương trình
Đa chương trình là phương thức nạp nhiều chương trình vào bộ nhớ và cấp bộ xử lý trung tâm cho một chương trình khác khi một chương trình đang chờ vào/ra. Nhờ đó, hệ thống có thể sử dụng đồng thời bộ xử lý trung tâm và thiết bị vào/ra, đồng thời tăng thông lượng tổng thể.
Để triển khai đa chương trình, hệ điều hành phải cung cấp các chức năng sau.
- Đưa nhiều tác vụ vào bộ nhớ
- Bảo vệ bộ nhớ giữa các chương trình
- Lập lịch để lựa chọn tác vụ sẽ thực thi
- Xử lý ngắt để thông báo hoàn tất vào/ra
- Quản lý trạng thái tệp và thiết bị theo từng tác vụ
- Cơ chế bảo vệ để lỗi không lan sang tác vụ khác
Trong quá trình này, hệ điều hành phát triển từ một công cụ đơn giản dùng để chạy tác vụ thành một bộ phân bổ tài nguyên và quản lý bảo vệ. Những khái niệm cốt lõi của hệ điều hành hiện đại như lập lịch CPU, quản lý bộ nhớ, ngắt, trình điều khiển thiết bị và hệ thống tệp bắt đầu được hình thành rõ ràng trong giai đoạn này.
Hệ thống chia sẻ thời gian
Hệ thống chia sẻ thời gian là phương thức chia thời gian thực thi của bộ xử lý trung tâm thành các đơn vị ngắn và luân phiên phân bổ cho chương trình của nhiều người dùng. Mỗi người dùng tương tác với máy tính thông qua một thiết bị đầu cuối, và do hệ thống chuyển đổi nhanh giữa các người dùng nên họ có thể có trải nghiệm gần giống như đang độc quyền sử dụng máy tính.
Khác với xử lý theo lô, nơi người dùng gửi chương trình rồi phải chờ rất lâu mới nhận được kết quả, chia sẻ thời gian cho phép nhập lệnh, kiểm tra kết quả ngay lập tức và sửa đổi chương trình theo cách tương tác. Computer History Museum giải thích rằng chia sẻ thời gian được phát triển vào đầu thập niên 1960 nhằm cho phép nhiều người dùng chia sẻ tài nguyên máy tính lớn đắt tiền và khắc phục sự bất tiện của xử lý theo lô.
Compatible Time-Sharing System (CTSS), được phát triển tại MIT, là một trong những hệ thống chia sẻ thời gian quan trọng thời kỳ đầu. Quá trình phát triển CTSS bắt đầu vào năm 1961, và khoảng năm 1963 hệ thống đã được vận hành ổn định ở quy mô lớn, cho thấy tính khả thi của chia sẻ thời gian. Người dùng có thể chỉnh sửa và chạy chương trình thông qua thiết bị đầu cuối từ xa, đồng thời sử dụng tệp và tài khoản người dùng.
Hệ thống chia sẻ thời gian không chỉ yêu cầu việc chia sẻ CPU thông thường mà còn cần các chức năng như xác thực người dùng, bảo vệ tệp, trình thông dịch lệnh tương tác, tách biệt tiến trình và tính toán mức sử dụng tài nguyên. Trong quá trình này, cấu trúc của hệ điều hành đa người dùng hiện đại đã được hình thành.
Multics
Dựa trên kinh nghiệm từ CTSS, MIT, General Electric và Bell Labs bắt đầu phát triển Multics vào giữa thập niên 1960. Multics hướng đến việc biến tài nguyên điện toán thành một tiện ích máy tính mà nhiều người có thể sử dụng ổn định giống như điện hoặc điện thoại. Kế hoạch phát triển được cụ thể hóa từ năm 1964, và các mục tiêu thiết kế của hệ thống được công bố tại một hội nghị học thuật năm 1965.
Multics đưa vào nhiều tính năng rất tiên tiến đối với thời kỳ đó.
- Hệ thống tệp phân cấp
- Cấu trúc lưu trữ hợp nhất tệp và bộ nhớ ảo
- Liên kết động
- Quyền truy cập chi tiết
- Vòng bảo vệ
- Hỗ trợ đa bộ xử lý
- Tái cấu hình hệ thống khi đang trực tuyến
- Triển khai hệ điều hành bằng ngôn ngữ cấp cao
- Dịch vụ chia sẻ thời gian liên tục cho nhiều người dùng
Multics gặp khó khăn do độ phức tạp và sự chậm trễ trong phát triển, nhưng đã để lại ảnh hưởng lâu dài đối với bảo mật hệ điều hành, hệ thống tệp, bộ nhớ ảo, liên kết động và kiến trúc hệ thống. Multics được khởi động vào năm 1965, được sử dụng dưới dạng hệ thống thương mại, và hệ thống vận hành cuối cùng ngừng hoạt động vào năm 2000.
IBM System/360 và OS/360
Năm 1964, IBM công bố dòng sản phẩm IBM System/360, được thiết kế để các máy tính ở nhiều mức hiệu năng và giá thành khác nhau có thể dùng chung một kiến trúc tập lệnh và phần mềm tương thích. Trước đó, các dòng máy tính có mục đích và quy mô khác nhau thường sử dụng tập lệnh và phần mềm riêng, nhưng System/360 hướng đến việc áp dụng một kiến trúc tương thích cho nhiều mẫu máy.
OS/360, được phát triển cho System/360, là một dự án quy mô lớn nhằm hỗ trợ nhiều hệ thống có kích thước khác nhau cùng các tác vụ tính toán thương mại và khoa học trong một họ hệ điều hành thống nhất. OS/360 cung cấp xử lý theo lô, đa chương trình, quản lý thiết bị ngoại vi và môi trường phần mềm chung.
Việc phát triển OS/360 trở thành một dự án phức tạp và khó khăn hơn nhiều so với dự kiến, đồng thời trở thành một trường hợp quan trọng trong lịch sử công nghệ phần mềm. Do phải hỗ trợ đồng thời một khối lượng chức năng lớn và nhiều cấu hình phần cứng, dự án gặp khó khăn về lịch trình phát triển và quản lý chất lượng. Điều này thúc đẩy các cuộc thảo luận về tổ chức và phương pháp thiết kế của những dự án phần mềm quy mô lớn.
Chiến lược tương thích của System/360 và OS/360 đưa ra hướng tiếp cận cho phép người dùng tiếp tục sử dụng phần mềm và dữ liệu hiện có ngay cả khi chuyển sang máy tính có hiệu năng cao hơn. Điều này góp phần biến khả năng tương thích ngược thành một giá trị quan trọng trong các nền tảng phần cứng và hệ điều hành về sau.
Sự xuất hiện của máy ảo
Trong thập niên 1960, IBM nghiên cứu công nghệ ảo hóa cho phép sử dụng một máy tính vật lý như nhiều máy tính ảo độc lập. CP-40 và CP-67 phát triển cấu trúc tạo nhiều máy ảo trên dòng System/360 và chạy một môi trường vận hành riêng biệt trong mỗi máy ảo.
Nghiên cứu CP/CMS của IBM bắt đầu với CP-40 vào năm 1964, phát triển thành CP-67, và được công bố chính thức dưới tên VM/370 vào năm 1972. Mỗi người dùng có thể sử dụng một máy ảo độc lập và môi trường tương tác riêng, đồng thời hệ thống có thể được dùng để phát triển và thử nghiệm hệ điều hành cũng như cách ly người dùng.
Máy ảo tiếp tục được sử dụng lâu dài trong môi trường máy tính lớn, và đến thập niên 2000, khi hợp nhất máy chủ và điện toán đám mây mở rộng, công nghệ này một lần nữa trở thành công nghệ cốt lõi.
Sự ra đời của UNIX
Sau khi rút khỏi dự án Multics, Bell Labs bắt đầu phát triển một hệ điều hành nhỏ hơn và đơn giản hơn với sự tham gia chính của Ken Thompson, Dennis Ritchie và những người khác. UNIX thời kỳ đầu được phát triển vào khoảng năm 1969 trên máy tính PDP-7, sau đó được chuyển sang PDP-11.
UNIX ban đầu được viết bằng hợp ngữ, nhưng về sau được viết lại bằng C (ngôn ngữ lập trình) do Dennis Ritchie phát triển. Việc triển khai phần lớn hệ điều hành bằng ngôn ngữ cấp cao giúp hệ thống dễ chuyển sang phần cứng khác hơn, và C cùng UNIX đã được phổ biến rộng rãi cùng nhau.
Bài báo do Ritchie và Thompson công bố năm 1974 mô tả hệ thống tệp, tiến trình và giao diện lệnh của UNIX. UNIX cung cấp hệ thống tệp phân cấp, cơ chế tạo tiến trình, đường ống, trừu tượng hóa thiết bị dưới dạng tệp và môi trường lệnh kết hợp các chương trình nhỏ.
Các đặc điểm thiết kế chính của UNIX bao gồm:
- Giao diện đơn giản lấy tệp làm trung tâm
- Tách biệt việc tạo tiến trình và thực thi chương trình
- Kết nối các công cụ nhỏ bằng đường ống
- Cấu hình và xử lý dữ liệu dựa trên văn bản
- Hỗ trợ đa người dùng và chia sẻ thời gian
- Khả năng di chuyển cao nhờ C
- Sự phân tách tương đối rõ ràng giữa hệ điều hành và công cụ người dùng
Sổ tay lập trình viên UNIX đầu tiên được viết vào năm 1971. Trong thập niên 1970, UNIX được phân phối cho các trường đại học và viện nghiên cứu kèm theo mã nguồn, dẫn đến sự phát triển của nhiều biến thể.
BSD và UNIX thương mại
Tại Đại học California, Berkeley, BSD được phát triển dựa trên UNIX. BSD phát triển các công nghệ như bộ nhớ ảo, điều khiển tác vụ, Fast File System, triển khai mạng TCP/IP và API socket. Công nghệ mạng của BSD đã ảnh hưởng đến Internet và nhiều hệ điều hành.
Đồng thời, nhiều hệ thống UNIX thương mại như UNIX thuộc dòng AT&T, SunOS, HP-UX và AIX cũng xuất hiện. Mỗi hệ thống cung cấp phần cứng và tính năng khác nhau, nhưng khi các phần mở rộng và công cụ không tương thích ngày càng tăng, hệ sinh thái UNIX bị phân chia thành nhiều nhánh.
Để giảm những khác biệt này, các nỗ lực tiêu chuẩn hóa như POSIX và Single UNIX Specification được thúc đẩy. Các tiêu chuẩn này xác định giao diện chung cho tiến trình, tệp, shell và API hệ thống, nhằm nâng cao khả năng di chuyển mã nguồn giữa các hệ thống thuộc họ UNIX.
Hệ điều hành thời gian thực
Trong khi hệ điều hành máy tính lớn và hệ thống chia sẻ thời gian thông thường phát triển chủ yếu xoay quanh thông lượng và khả năng phản hồi với người dùng, các hệ điều hành thời gian thực được phát triển trong lĩnh vực điều khiển công nghiệp, quân sự và hàng không, nơi tác vụ phải hoàn thành trong thời hạn xác định.
Đối với hệ điều hành thời gian thực, khả năng dự đoán thời gian phản hồi ngay cả trong trường hợp xấu nhất quan trọng hơn việc chỉ đạt tốc độ trung bình cao. Các chức năng như lập lịch dựa trên mức ưu tiên, xử lý ngắt nhanh, cấp phát bộ nhớ có giới hạn và ngăn chặn đảo ngược ưu tiên được chú trọng.
Về sau, hệ điều hành thời gian thực được sử dụng rộng rãi trong tự động hóa nhà máy, ô tô, máy bay, thiết bị viễn thông, thiết bị y tế, robot và các thiết bị nhúng nhỏ.
Hệ điều hành máy tính cá nhân
Khi bộ vi xử lý và máy tính cá nhân xuất hiện trong thập niên 1970, hệ điều hành được mở rộng từ môi trường đa người dùng trên máy tính lớn sang các máy tính nhỏ dành cho cá nhân.
CP/M, do Gary Kildall phát triển, là một hệ điều hành tiêu biểu đạt thành công thương mại trên các máy vi tính thời kỳ đầu. CP/M được phát triển vào khoảng năm 1974 và cung cấp một môi trường chung cho phép cùng một ứng dụng chạy trên các máy tính 8 bit của nhiều nhà sản xuất. Computer History Museum đánh giá CP/M là hệ điều hành máy tính cá nhân đầu tiên đạt thành công thương mại.
CP/M tách phần vào/ra phụ thuộc phần cứng thành BIOS, nhờ đó có thể tương đối dễ dàng chuyển hệ thống sang máy tính khác. CP/M 1.3 năm 1976 bao gồm cấu trúc BIOS cho phép dễ sửa đổi mã vào/ra theo từng máy, góp phần giúp máy tính của nhiều nhà sản xuất cùng chia sẻ một hệ sinh thái phần mềm chung.
Khi IBM PC xuất hiện vào năm 1981, PC DOS và MS-DOS do Microsoft cung cấp nhanh chóng được phổ biến. Ban đầu, MS-DOS là một hệ điều hành dòng lệnh tương đối đơn giản, chủ yếu dành cho một người dùng và một tác vụ, nhưng cùng với sự phát triển của máy tính tương thích IBM PC, nó trở thành môi trường tiêu chuẩn trên thực tế. IBM PC sử dụng bộ xử lý Intel 8088 và DOS của Microsoft, góp phần đáng kể vào việc phổ biến máy tính cá nhân trong doanh nghiệp và gia đình.
Giao diện người dùng đồ họa
Các hệ điều hành máy tính cá nhân thời kỳ đầu chủ yếu sử dụng dòng lệnh, nhưng giao diện người dùng đồ họa sử dụng cửa sổ, biểu tượng, menu và con trỏ được phổ biến rộng rãi thông qua nghiên cứu tại Xerox PARC trong thập niên 1970 và các sản phẩm thương mại trong thập niên 1980.
Apple Lisa và Macintosh là những máy tính thương mại thời kỳ đầu cung cấp giao diện đồ họa và chuột cho người dùng phổ thông. Macintosh đã phổ biến môi trường thao tác tệp và chương trình bằng biểu tượng và cửa sổ.
Microsoft công bố Windows vào năm 1983 dưới dạng môi trường đồ họa chạy trên MS-DOS, và sản phẩm đầu tiên được phát hành vào năm 1985. Windows thời kỳ đầu phụ thuộc vào DOS, nhưng về sau chuyển sang kiến trúc hệ điều hành độc lập dựa trên dòng Windows NT.
Sự phổ biến của giao diện đồ họa mở rộng vai trò của hệ điều hành. Hệ điều hành không chỉ quản lý tiến trình và tệp mà còn cung cấp quản lý cửa sổ, đồ họa, phông chữ, in ấn, đa phương tiện, thiết bị nhập, khả năng tiếp cận và giao diện ứng dụng nhất quán.
Hệ điều hành mạng
Khi máy tính cá nhân và máy trạm được kết nối qua mạng, hệ điều hành bắt đầu cung cấp các chức năng như chia sẻ tệp và máy in từ xa, xác thực người dùng, thư điện tử, đăng nhập từ xa và truy cập tài nguyên phân tán.
UNIX và BSD hỗ trợ rộng rãi TCP/IP, trở thành nền tảng chính cho máy chủ Internet và máy trạm. Novell NetWare và dòng Windows Server cung cấp dịch vụ tệp, in ấn và tài khoản trong mạng nội bộ doanh nghiệp, còn nhiều hệ điều hành được kết nối với nhau thông qua giao thức mạng và dịch vụ thư mục.
Khi mạng chuyển từ một tính năng tùy chọn thành chức năng cơ bản của hệ điều hành, mô hình bảo mật cũng thay đổi. Trước đây, trọng tâm chủ yếu là tách biệt người dùng và tiến trình trên cùng một máy tính, nhưng về sau các vấn đề như tấn công từ xa, xác thực mạng, mã hóa, tường lửa và cập nhật bảo mật tự động trở thành chức năng cốt lõi của hệ điều hành.
Nghiên cứu vi nhân
Trong thập niên 1980, cấu trúc vi nhân, trong đó chức năng hệ điều hành được chia giữa một nhân nhỏ và các máy chủ trong không gian người dùng, được nghiên cứu tích cực. Vi nhân chỉ giữ lại bên trong nhân những chức năng tối thiểu như không gian địa chỉ, luồng và giao tiếp liên tiến trình, còn các dịch vụ như hệ thống tệp, trình điều khiển thiết bị và mạng được chạy dưới dạng các tiến trình riêng biệt.
Mach, MINIX và QNX là những ví dụ tiêu biểu. Cấu trúc vi nhân có ưu điểm về khả năng cô lập và thay thế dịch vụ cũng như tính mô-đun của hệ thống, nhưng chi phí giao tiếp liên tiến trình và chuyển đổi ngữ cảnh có thể dẫn đến vấn đề hiệu năng.
Về sau, khái niệm vi nhân không chỉ được áp dụng ở dạng thuần túy mà còn ảnh hưởng đến nhiều hệ điều hành dưới dạng nhân hỗn hợp và kiến trúc lai. Windows NT và XNU của Apple phát triển theo hướng kết hợp các yếu tố của nhân nguyên khối truyền thống và vi nhân.
Linux và phát triển mở
Năm 1991, Linus Torvalds phát triển và công bố một nhân mới dành cho máy tính Intel 80386. Tài liệu phát hành Linux 0.01 giải thích rằng nhân này tận dụng các tính năng của bộ xử lý 386 và được phát triển trong một môi trường tương tự MINIX.
Linux kết hợp với trình biên dịch, shell, thư viện và công cụ của dự án GNU để tạo thành một môi trường hệ điều hành UNIX hoàn chỉnh. Mã nguồn được công khai và nhiều nhà phát triển tham gia thông qua Internet, khiến Linux trở thành một ví dụ tiêu biểu cho mô hình phát triển mở và phân tán.
Ban đầu, Linux là một nhân thử nghiệm dành cho máy tính cá nhân 386, nhưng về sau được chuyển sang nhiều kiến trúc CPU, máy chủ, siêu máy tính, thiết bị mạng, thiết bị nhúng và điện thoại thông minh. Quá trình phát triển Linux bắt đầu từ năm 1991 và tiếp tục thông qua danh sách thư công khai cùng hệ thống quản lý phiên bản.
Sự phát triển của Linux đã thay đổi quan niệm trước đây rằng hệ điều hành nhất thiết phải được phát triển hoàn toàn trong nội bộ một công ty. Một hệ sinh thái được hình thành trong đó nhiều doanh nghiệp, cá nhân và viện nghiên cứu cùng đóng góp vào một nhân chung, trong khi mỗi tổ chức vẫn có thể xây dựng bản phân phối và sản phẩm riêng.
Windows NT
Microsoft phát triển Windows NT tách biệt với dòng MS-DOS, với mục tiêu hỗ trợ bảo mật, khả năng di chuyển, đa người dùng và đa nhiệm ưu tiên trước. Windows NT 3.1 được phát hành vào năm 1993 và về sau trở thành nền tảng của Windows 2000, Windows XP và dòng Windows hiện đại.
Windows NT cung cấp cấu trúc phân tách chế độ người dùng và chế độ nhân, bộ nhớ ảo, mã định danh bảo mật và danh sách kiểm soát truy cập, lớp trừu tượng hóa phần cứng và nhiều môi trường thực thi. Khi Windows dành cho người tiêu dùng cũng được hợp nhất vào dòng NT, dòng Windows dựa trên DOS chấm dứt.
Windows được sử dụng không chỉ trên máy tính cá nhân mà còn trong máy chủ doanh nghiệp, máy trạm, trò chơi và nhiều thiết bị công nghiệp. Hệ thống tiếp tục phát triển xoay quanh giao diện người dùng đồ họa, khả năng tương thích ngược và hệ sinh thái phần cứng cùng ứng dụng rộng lớn.
NeXTSTEP và macOS
Vào cuối thập niên 1980, NeXT phát triển NeXTSTEP, kết hợp nền tảng thuộc họ UNIX, môi trường phát triển hướng đối tượng và hệ thống đồ họa Display PostScript. NeXTSTEP dựa trên công nghệ Mach và BSD, và sau khi Apple mua lại NeXT, nó trở thành nền tảng của thế hệ hệ điều hành Mac tiếp theo.
Apple sử dụng công nghệ thuộc dòng NeXTSTEP để phát triển Mac OS X nhằm thay thế Classic Mac OS. Mac OS X cung cấp nhân XNU kết hợp nhân dựa trên Mach và môi trường người dùng BSD, cùng các framework đồ họa và ứng dụng mới. Về sau, tên gọi được đổi từ OS X thành macOS.
Công nghệ hệ điều hành thuộc dòng này được mở rộng không chỉ sang macOS mà còn trở thành nền tảng chung của iOS, iPadOS, watchOS, tvOS và visionOS. Các hệ điều hành hiện đại của Apple cung cấp giao diện người dùng phù hợp với từng loại thiết bị, đồng thời chia sẻ nhân, cơ chế bảo mật, công cụ phát triển và nhiều công nghệ hệ thống.
Hệ điều hành di động
Khi điện thoại di động phát triển từ thiết bị tập trung vào cuộc gọi thành máy tính đa dụng, hệ điều hành di động trở thành một lĩnh vực quan trọng riêng biệt. Trên các điện thoại thông minh và PDA thời kỳ đầu, Palm OS, Symbian, Windows Mobile và BlackBerry OS được sử dụng rộng rãi.
Năm 2007, Apple công bố iPhone, và hệ điều hành của thiết bị này về sau phát triển dưới tên iOS. iOS áp dụng nhân và kiến trúc bảo mật của dòng hệ điều hành máy tính để bàn vào môi trường di động, đồng thời được thiết kế xoay quanh giao diện cảm ứng, quản lý năng lượng, cảm biến, mạng di động, phân phối ứng dụng và kiểm soát quyền.
Android, do Google dẫn dắt, kết hợp nhân Linux với framework và môi trường thực thi ứng dụng dành cho thiết bị di động. Android được nhiều nhà sản xuất, công ty bán dẫn và nhà mạng áp dụng, rồi mở rộng sang nhiều loại điện thoại thông minh, máy tính bảng, TV, ô tô và thiết bị nhúng.
Hệ điều hành di động có xu hướng áp dụng mạnh hơn hệ điều hành máy tính để bàn các cơ chế cách ly ứng dụng, ký mã, yêu cầu quyền, phân phối ứng dụng tập trung, tiết kiệm năng lượng và hạn chế thực thi nền. Các mô hình bảo mật và phân phối này về sau cũng ảnh hưởng đến hệ điều hành máy tính để bàn.
Sự phổ biến của ảo hóa
Ảo hóa đã tồn tại từ thời máy tính lớn, nhưng được mở rộng mạnh trở lại trên máy chủ x86 vào cuối thập niên 1990 và trong thập niên 2000. Nhờ ảo hóa dựa trên phần mềm và sau đó là hỗ trợ ảo hóa phần cứng của CPU, nhiều hệ điều hành có thể chạy đồng thời trên một máy chủ vật lý.
Ảo hóa mang lại các thay đổi sau.
- Hợp nhất máy chủ
- Cách ly hệ điều hành và ứng dụng
- Sao chép và di chuyển máy ảo
- Tự động hóa môi trường phát triển và kiểm thử
- Khôi phục sự cố và ảnh chụp nhanh
- Phân chia tài nguyên trong điện toán đám mây
Khi trình giám sát máy ảo hoặc hypervisor phân bổ tài nguyên phần cứng cho nhiều hệ điều hành khách, hệ điều hành trở thành một lớp có thể chạy không chỉ trên phần cứng thật mà còn trên phần cứng ảo.
Container và ảo hóa cấp hệ điều hành
Khác với máy ảo, trong đó mỗi máy chạy một nhân riêng, container chia sẻ một nhân hệ điều hành chung nhưng vẫn cô lập tiến trình, hệ thống tệp, mạng, người dùng và mức sử dụng tài nguyên.
Sau các công nghệ như chroot của UNIX, BSD jail và Solaris Zones, môi trường container hiện đại được phát triển khi namespace và cgroup của Linux được kết hợp. Docker đơn giản hóa trải nghiệm tạo và phân phối ảnh container, còn Kubernetes cung cấp nền tảng để bố trí và quản lý container trên nhiều máy chủ.
Sự phổ biến của container mở rộng vai trò của hệ điều hành vượt ra ngoài việc quản lý một máy tính vật lý duy nhất, hướng đến hỗ trợ số lượng lớn môi trường ứng dụng được cách ly, giới hạn tài nguyên, không gian tên mạng và thực thi ảnh hệ thống.
Đám mây và trung tâm dữ liệu quy mô lớn
Trong điện toán đám mây, hệ điều hành trở thành nền tảng kết hợp máy chủ vật lý, máy ảo, container, mạng và lưu trữ. Linux và Windows Server được sử dụng trong các trung tâm dữ liệu quy mô lớn, kết hợp với hypervisor, runtime container và hệ thống điều phối.
Môi trường đám mây làm tăng yêu cầu đối với hệ điều hành ở các khía cạnh sau.
- Hỗ trợ số lượng lớn lõi xử lý
- Hiệu năng ảo hóa
- Thông lượng mạng và lưu trữ
- Giao diện quản trị có thể tự động hóa
- Khả năng quan sát và chẩn đoán từ xa
- Cập nhật bảo mật theo thời gian thực
- Cách ly tài nguyên và đo mức sử dụng
- Tự động khôi phục khi xảy ra sự cố
Ranh giới giữa hệ điều hành và hệ thống phân tán cũng ngày càng trở nên mờ nhạt. Trong khi hệ điều hành của một máy chủ quản lý tài nguyên cục bộ, hệ thống quản lý cụm phân bổ CPU, bộ nhớ và lưu trữ của nhiều máy chủ như một nhóm tài nguyên thống nhất.
Phát triển tập trung vào bảo mật
Bảo mật của các hệ điều hành thời kỳ đầu chủ yếu tập trung vào việc tách biệt tệp và tiến trình của nhiều người dùng. Khi máy tính được kết nối với Internet và xử lý dữ liệu cá nhân, tài chính cùng cơ sở hạ tầng công nghiệp, phạm vi bảo mật hệ điều hành được mở rộng đáng kể.
Hệ điều hành hiện đại đã phát triển các chức năng bảo mật sau.
- Phân tách chế độ người dùng và chế độ nhân
- Không gian địa chỉ ảo
- Danh sách kiểm soát truy cập
- Kiểm soát truy cập dựa trên quyền và vai trò
- Ngăn thực thi và ngẫu nhiên hóa bố trí không gian địa chỉ
- Ký mã và khởi động an toàn
- Sandbox
- Quyền ứng dụng
- Mã hóa đĩa và tệp
- Kiểm tra tính toàn vẹn
- Cập nhật bảo mật tự động
- Mô-đun bảo mật phần cứng và môi trường thực thi tin cậy
Do một lỗ hổng bảo mật có thể liên quan trực tiếp đến toàn bộ đặc quyền của hệ điều hành, các nghiên cứu nhằm giảm kích thước mã nhân và trình điều khiển thiết bị, tăng an toàn bộ nhớ và thu hẹp bề mặt tấn công vẫn tiếp tục được thực hiện.
Hệ điều hành hiện đại
Hệ điều hành hiện đại là kết quả của sự kết hợp giữa nhiều dòng phát triển và thiết kế trong quá khứ. Hệ điều hành máy tính lớn vẫn xử lý các giao dịch quy mô lớn và dữ liệu doanh nghiệp, trong khi các khái niệm từ UNIX và BSD tiếp tục tồn tại trong Linux, macOS cùng nhiều hệ điều hành máy chủ và di động. Dòng Windows NT hỗ trợ rộng rãi máy tính cá nhân và môi trường doanh nghiệp, còn Linux được sử dụng làm nền tảng cho máy chủ, đám mây, siêu máy tính, thiết bị nhúng và thiết bị Android.
Ngày nay, hệ điều hành được sử dụng dưới nhiều hình thức khác nhau trong các môi trường sau.
- Máy tính cá nhân
- Điện thoại thông minh và máy tính bảng
- Máy chủ và đám mây
- Máy tính lớn
- Siêu máy tính
- Máy chơi trò chơi điện tử
- Ô tô và robot
- Thiết bị mạng
- Thiết bị gia dụng thông minh
- Bộ điều khiển công nghiệp
- Cảm biến và vi điều khiển
- Máy ảo và container
Lịch sử hệ điều hành không đơn thuần là quá trình một sản phẩm mới thay thế sản phẩm cũ. Quản lý tác vụ được phát triển từ các hệ thống xử lý theo lô thời kỳ đầu, đa người dùng và thực thi tương tác từ hệ thống chia sẻ thời gian, bảo vệ và bộ nhớ ảo từ Multics, giao diện đơn giản và khả năng di chuyển từ UNIX, môi trường đồ họa từ máy tính cá nhân, ảo hóa từ máy tính lớn, cùng sandbox và quản lý năng lượng từ thiết bị di động đều vẫn tồn tại trong hệ điều hành hiện đại.
Hệ điều hành liên tục thay đổi cùng với sự phát triển của phần cứng. Khi hiệu năng của bộ xử lý trung tâm, bộ nhớ và thiết bị lưu trữ tăng lên, hệ điều hành cung cấp nhiều lớp trừu tượng và chức năng bảo vệ hơn. Khi máy tính được kết nối sâu hơn với mạng và đời sống hằng ngày, tầm quan trọng của bảo mật, cách ly, quản lý năng lượng và cập nhật tự động cũng tăng lên. Trong tương lai, cấu trúc và vai trò của hệ điều hành sẽ tiếp tục thay đổi để đáp ứng các kiến trúc phần cứng mới, ảo hóa, điện toán phân tán, bảo mật và yêu cầu thời gian thực.
Cấu trúc
Hệ điều hành là tập hợp nhiều thành phần quản lý tài nguyên và cung cấp môi trường thực thi chung giữa phần cứng và ứng dụng. Ở trung tâm của hệ điều hành là nhân hệ điều hành, xung quanh là các thư viện hệ thống, dịch vụ nền, hệ thống tệp, trình điều khiển thiết bị, shell dòng lệnh, giao diện người dùng đồ họa và công cụ quản trị. Cấu trúc cụ thể của hệ điều hành và mức đặc quyền mà từng thành phần sử dụng phụ thuộc vào thiết kế của từng hệ điều hành.
Các hệ điều hành đa dụng hiện đại thường phân chia môi trường thực thi thành chế độ người dùng và chế độ nhân. Ứng dụng chạy trong chế độ người dùng với quyền hạn bị giới hạn, còn nhân và các trình điều khiển thiết bị quan trọng chạy trong chế độ nhân, nơi có thể truy cập phần cứng và toàn bộ bộ nhớ. Trong Windows, ứng dụng cũng chạy ở chế độ người dùng, còn các thành phần cốt lõi của hệ điều hành chạy ở chế độ nhân; một số trình điều khiển cũng có thể chạy trong chế độ người dùng. [1]
Ứng dụng
↓
Thư viện hệ thống và runtime
↓
Giao diện lời gọi hệ thống
↓
Nhân hệ điều hành
├── Quản lý tiến trình và luồng
├── Lập lịch CPU
├── Quản lý bộ nhớ
├── Hệ thống tệp
├── Mạng
├── Bảo mật và kiểm soát truy cập
└── Trình điều khiển thiết bị
↓
Phần cứng máy tính
Việc phân tách chế độ người dùng và chế độ nhân ngăn ứng dụng tùy ý sửa đổi bộ nhớ vật lý hoặc trực tiếp điều khiển thiết bị phần cứng. Khi ứng dụng muốn mở tệp, cấp phát bộ nhớ, tạo tiến trình hoặc gửi dữ liệu qua mạng, nó phải gửi yêu cầu đến nhân thông qua giao diện do hệ điều hành cung cấp. Nhân kiểm tra tính hợp lệ của yêu cầu và quyền truy cập trước khi thực hiện thao tác cần thiết.
Không phải mọi chức năng của hệ điều hành đều nhất thiết chạy bên trong nhân. Những chức năng như lập chỉ mục tệp, cấu hình mạng, quản lý đăng nhập, in ấn và phiên đồ họa có thể được đảm nhiệm bởi các dịch vụ hệ thống chạy trong không gian người dùng. Một số hệ điều hành còn chạy một phần trình điều khiển thiết bị và hệ thống tệp trong không gian người dùng để giảm ảnh hưởng của lỗi đối với toàn bộ nhân.
Các thành phần của hệ điều hành
Hệ điều hành thường bao gồm các thành phần sau.
- Nhân hệ điều hành quản lý bộ xử lý, bộ nhớ, ngắt và tài nguyên phần cứng.
- Giao diện lời gọi hệ thống cung cấp con đường để chương trình người dùng yêu cầu chức năng của nhân.
- Hệ thống quản lý tiến trình và luồng tạo và kết thúc các đơn vị thực thi, đồng thời phân bổ thời gian CPU.
- Hệ thống quản lý bộ nhớ quản lý bộ nhớ vật lý và không gian địa chỉ ảo.
- Hệ thống tệp tổ chức dữ liệu của tệp, thư mục và thiết bị lưu trữ, đồng thời quản lý quyền truy cập.
- Hệ thống vào/ra đệm, lập lịch và chuyển kết quả hoàn tất của các yêu cầu thiết bị.
- Trình điều khiển thiết bị chuyển đổi các yêu cầu vào/ra chung của hệ điều hành thành lệnh dành riêng cho từng thiết bị.
- Ngăn xếp mạng quản lý giao diện mạng, giao thức truyền thông và socket.
- Hệ thống bảo mật kiểm soát quyền của người dùng và tiến trình, xác thực và việc truy cập tài nguyên.
- Dịch vụ hệ thống cung cấp các chức năng vận hành bên ngoài nhân như đăng nhập, cấu hình mạng và phát hiện thiết bị.
- Giao diện người dùng cho phép người dùng điều khiển hệ thống thông qua dòng lệnh hoặc môi trường đồ họa.
Ranh giới giữa các thành phần này khác nhau tùy theo từng hệ điều hành. Trong chế độ nhân của Windows, ngoài phần nhân đảm nhiệm lập lịch cấp thấp và xử lý ngắt, còn có lớp Executive quản lý đối tượng, bộ nhớ, tiến trình và luồng, vào/ra cũng như cấu hình. [2]
Trong các hệ điều hành dựa trên XNU của Apple, Mach, BSD, I/O Kit, hệ thống tệp và các thành phần mạng cùng tạo thành môi trường nhân. Vì vậy, thuật ngữ nhân ở đây không chỉ nói đến phần cốt lõi Mach mà chỉ toàn bộ sự kết hợp của nhiều thành phần nhân. [3]
Các loại cấu trúc nhân
Hệ điều hành có thể được phân loại thành nhiều cấu trúc tùy theo cách phân bố chức năng giữa bên trong nhân và không gian người dùng. Trên thực tế, nhiều hệ điều hành kết hợp đặc điểm của nhiều cấu trúc thay vì tuân theo hoàn toàn một kiểu duy nhất.
Nhân nguyên khối
Nhân nguyên khối là cấu trúc trong đó quản lý tiến trình, quản lý bộ nhớ, hệ thống tệp, mạng và nhiều trình điều khiển thiết bị chạy trong cùng một không gian địa chỉ nhân.
Do các thành phần có thể trực tiếp gọi hàm của nhau trong cùng mức đặc quyền và không gian địa chỉ, chi phí giao tiếp giữa chúng tương đối thấp. Tuy nhiên, lỗi bộ nhớ trong một trình điều khiển hoặc một thành phần nhân có thể ảnh hưởng đến các thành phần khác và toàn bộ hệ điều hành.
Linux thường được phân loại là nhân nguyên khối, nhưng cũng cung cấp cấu trúc mô-đun cho phép thêm hoặc gỡ mô-đun nhân trong khi hệ thống đang chạy. Nhờ mô-đun nhân, không cần đưa toàn bộ trình điều khiển và chức năng vào ảnh nhân cơ bản mà có thể nạp chúng khi cần.
Vi nhân
Vi nhân là cấu trúc chỉ giữ các chức năng tối thiểu như lập lịch, không gian địa chỉ, ngắt và giao tiếp liên tiến trình bên trong nhân, còn các dịch vụ như hệ thống tệp, mạng và trình điều khiển thiết bị được tách thành các tiến trình trong không gian người dùng.
Do các dịch vụ chạy trong những không gian địa chỉ khác nhau, việc một dịch vụ gặp lỗi có thể ít ảnh hưởng hơn đến nhân và các dịch vụ khác. Cấu trúc này cũng thuận lợi cho việc thay thế, khởi động lại dịch vụ và phân tách quyền. Tuy nhiên, việc gọi dịch vụ đòi hỏi truyền thông điệp liên tiến trình và chuyển đổi không gian địa chỉ, nên tùy theo thiết kế và cách triển khai có thể phát sinh chi phí bổ sung.
MINIX 3 và QNX thường được phân loại là những ví dụ tiêu biểu của dòng vi nhân.
Nhân lai
Nhân lai là cấu trúc sử dụng một phần kiến trúc phân lớp của vi nhân, nhưng vẫn chạy nhiều dịch vụ hệ điều hành trong không gian nhân để đạt hiệu năng hoặc khả năng tương thích.
Dòng Windows NT và XNU của Apple thường được phân loại là nhân lai. XNU kết hợp chức năng của Mach với các thành phần BSD, I/O Kit, hệ thống tệp và chức năng mạng trong cùng một môi trường nhân. [4]
Tên gọi nhân lai không chỉ một phương thức triển khai nghiêm ngặt duy nhất. Việc chức năng nào nằm trong nhân và chức năng nào nằm trong không gian người dùng khác nhau giữa các hệ điều hành.
Nhân mô-đun
Nhân mô-đun là cấu trúc tách chức năng cốt lõi của nhân khỏi các chức năng bổ sung, đồng thời cung cấp những chức năng như trình điều khiển thiết bị và hệ thống tệp dưới dạng mô-đun có thể nạp trong khi hệ thống đang chạy.
Mô-đun chỉ cần được nạp vào bộ nhớ khi cần, và không phải xây dựng lại toàn bộ nhân để hỗ trợ phần cứng hoặc hệ thống tệp mới. Tuy nhiên, các mô-đun chế độ nhân thường chạy với cùng đặc quyền như nhân, nên một mô-đun bị lỗi có thể ảnh hưởng đến toàn bộ hệ thống.
Exokernel
Exokernel là cấu trúc mang tính nghiên cứu, trong đó nhân chỉ đảm nhiệm việc bảo vệ và phân bổ tài nguyên phần cứng, còn các trừu tượng cấp cao như hệ thống tệp hoặc mạng được giao cho ứng dụng hoặc hệ điều hành thư viện.
Ứng dụng có thể lựa chọn phương thức quản lý tài nguyên phù hợp với mục đích của mình, nhưng để cung cấp môi trường chung cho ứng dụng thông thường thì cần có thư viện và hệ thống thực thi riêng. Exokernel có ý nghĩa quan trọng trong nghiên cứu về trừu tượng hóa hệ điều hành và quản lý tài nguyên hơn là một cấu trúc chủ đạo của hệ điều hành thương mại đa dụng.
Nhân hệ điều hành
Nhân hệ điều hành là thành phần chạy với đặc quyền cao nhất trong hệ điều hành và quản lý các tài nguyên cốt lõi của hệ thống. Nó kiểm soát chế độ hoạt động của bộ xử lý, bộ nhớ, ngắt, tiến trình và luồng, thiết bị vào/ra cùng quyền truy cập.
Tài liệu Windows giải thích rằng nhân cung cấp các thao tác cơ bản cấp thấp như lập lịch luồng và chuyển tiếp ngắt phần cứng, đồng thời đóng vai trò là chức năng trung tâm mà các phần khác của hệ điều hành phụ thuộc vào. [5]
Các vai trò chính của nhân bao gồm:
- Tạo và kết thúc tiến trình cùng luồng.
- Chọn luồng được phép sử dụng CPU trong số các luồng có thể thực thi.
- Thiết lập không gian địa chỉ ảo cho từng tiến trình.
- Quản lý bộ nhớ vật lý và hoán đổi trang.
- Xử lý ngắt và ngoại lệ phần cứng.
- Quản lý các đối tượng nhân như tệp, socket và thiết bị.
- Kiểm tra quyền truy cập của người dùng và tiến trình.
- Cung cấp giao tiếp liên tiến trình và chức năng đồng bộ hóa.
- Chạy hệ thống tệp và ngăn xếp mạng.
- Cung cấp nền tảng vào/ra chung cho trình điều khiển thiết bị.
Trong quá trình khởi động, nhân khởi tạo hệ thống quản lý bộ nhớ, ngắt, bộ xử lý và thiết bị, sau đó khởi chạy tiến trình không gian người dùng đầu tiên. Về sau, phần lớn mã ứng dụng chạy trong chế độ người dùng và quyền điều khiển chỉ chuyển sang nhân khi cần thông qua lời gọi hệ thống, ngắt và các cơ chế tương tự.
Lỗi bên trong nhân có ảnh hưởng lớn hơn lỗi của ứng dụng thông thường. Vì nhân có thể truy cập toàn bộ không gian địa chỉ và thiết bị, con trỏ sai, lỗi đồng bộ hóa và lỗi trình điều khiển có thể dẫn đến hệ thống ngừng hoạt động, hỏng dữ liệu hoặc lỗ hổng bảo mật. Do đó, mã nhân cần môi trường thực thi được kiểm soát, cơ chế đồng bộ hóa nghiêm ngặt và xác thực đầu vào.
Lời gọi hệ thống
Lời gọi hệ thống là điểm vào chính thức để chương trình trong không gian người dùng yêu cầu chức năng do nhân cung cấp. Tài liệu hướng dẫn Linux định nghĩa lời gọi hệ thống là điểm vào nhân Linux và giải thích rằng ứng dụng thường không trực tiếp thực thi lời gọi hệ thống mà gọi thông qua hàm bao bọc của thư viện như thư viện chuẩn C. [6]
Các lời gọi hệ thống tiêu biểu cung cấp những chức năng sau.
- Mở và đóng tệp
- Đọc và ghi dữ liệu
- Tạo tiến trình và luồng
- Thay thế ảnh chương trình
- Ánh xạ bộ nhớ ảo
- Tạo socket và giao tiếp mạng
- Truy vấn thời gian và thông tin hệ thống
- Giao tiếp liên tiến trình
- Thay đổi quyền và thông tin người dùng
- Gửi yêu cầu điều khiển dành riêng cho thiết bị
Luồng lời gọi hệ thống thông thường diễn ra như sau.
Ứng dụng
↓
Hàm thư viện hệ thống
↓
Chuẩn bị số hiệu lời gọi hệ thống và đối số
↓
Vào chế độ nhân bằng lệnh đặc biệt
↓
Trình xử lý lời gọi hệ thống của nhân
↓
Kiểm tra quyền và đối số
↓
Thực thi hệ thống con của nhân
↓
Trả về kết quả hoặc lỗi
↓
Quay lại chế độ người dùng
Mỗi lời gọi hệ thống có một số hiệu hoặc mã định danh nội bộ để phân biệt, còn đối số được truyền qua thanh ghi CPU hoặc bộ nhớ. Quy ước gọi chính xác phụ thuộc vào kiến trúc CPU và ABI của hệ điều hành. Hàm syscall() trong Linux có thể thực thi lời gọi nhân tương ứng bằng số hiệu lời gọi hệ thống và đối số, nhưng chương trình thông thường sử dụng các hàm thư viện tương ứng với từng lời gọi hệ thống. [7]
Lời gọi hệ thống và lời gọi hàm thông thường có vai trò khác nhau. Lời gọi hàm thông thường có thể thực thi trong cùng mức đặc quyền và cùng không gian địa chỉ, còn lời gọi hệ thống vượt qua ranh giới bảo vệ giữa không gian người dùng và không gian nhân. Quá trình này cần chuyển đổi chế độ thực thi, kiểm tra đối số và xác minh truy cập bộ nhớ người dùng.
Tài liệu nhân của Apple cũng mô tả các phương thức vượt qua ranh giới giữa không gian người dùng và nhân như lời gọi hệ thống BSD, ioctl, thông điệp Mach và ánh xạ bộ nhớ. Khi đi qua ranh giới này, ngoài chi phí hiệu năng còn phát sinh vấn đề bảo mật liên quan đến việc xác thực dữ liệu được truyền từ không gian người dùng. [8]
Lời gọi hệ thống tạo thành giao diện không gian người dùng ổn định của hệ điều hành. Để ứng dụng hiện có tiếp tục chạy ngay cả khi cách triển khai nội bộ của nhân thay đổi, ABI như số hiệu lời gọi, đối số, kết quả và quy tắc lỗi phải được duy trì.
Hệ thống tệp
Hệ thống tệp là cơ chế tổ chức dữ liệu trên thiết bị lưu trữ, trong bộ nhớ hoặc trên mạng dưới dạng tệp và thư mục, đồng thời quản lý tên, vị trí, kích thước, chủ sở hữu, quyền truy cập và thông tin thời gian.
Ứng dụng thường không trực tiếp chỉ định vị trí sector vật lý của thiết bị lưu trữ. Thay vào đó, nó mở tệp bằng đường dẫn và tên tệp, sau đó đọc hoặc ghi dữ liệu tại vị trí logic bên trong tệp. Hệ điều hành và hệ thống tệp chuyển đổi các yêu cầu này thành khối lưu trữ và lệnh vào/ra.
Các chức năng chính của hệ thống tệp bao gồm:
- Tạo và xóa tệp cùng thư mục
- Phân giải tên tệp và đường dẫn
- Đọc và ghi dữ liệu tệp
- Quản lý kích thước và vị trí tệp
- Quản lý quyền truy cập theo người dùng và nhóm
- Cấp phát và thu hồi không gian lưu trữ
- Quản lý siêu dữ liệu của tệp và thư mục
- Kết nối và gắn thiết bị lưu trữ
- Quản lý bộ nhớ đệm và bộ đệm
- Phục hồi hệ thống tệp sau sự cố
- Xử lý liên kết tượng trưng và liên kết cứng
- Hỗ trợ ánh xạ bộ nhớ và khóa tệp
Hệ điều hành có thể cung cấp nhiều loại hệ thống tệp thông qua một giao diện chung. Hệ thống tệp ảo của Linux cung cấp giao diện hệ thống tệp cho chương trình người dùng và hình thành lớp trừu tượng cho phép nhiều triển khai hệ thống tệp khác nhau cùng được sử dụng trong nhân. Các lời gọi hệ thống như open, read, write và stat đi qua VFS trước khi được chuyển đến triển khai hệ thống tệp thực tế. [9]
Ứng dụng
↓
Các lời gọi hệ thống như open / read / write
↓
Hệ thống tệp ảo
↓
Hệ thống tệp thực tế
├── ext4
├── XFS
├── Btrfs
├── FAT
├── NTFS
├── APFS
└── Hệ thống tệp mạng
↓
Trình điều khiển thiết bị khối
↓
Thiết bị lưu trữ
Lớp hệ thống tệp ảo biểu diễn tệp, thư mục, điểm gắn kết và tệp đang mở dưới dạng các đối tượng chung. Hệ thống tệp thực tế triển khai các thao tác phù hợp với giao diện chung, nhờ đó hệ thống tệp trên đĩa, hệ thống tệp trong bộ nhớ và hệ thống tệp mạng có thể được sử dụng thông qua cùng một API tệp.
Hệ thống tệp không chỉ dành cho thiết bị lưu trữ lâu dài. Hệ điều hành cũng có thể cung cấp hệ thống tệp tạm thời chỉ tồn tại trong bộ nhớ và hệ thống tệp ảo hiển thị thông tin tiến trình hoặc thiết bị dưới dạng tệp. Trong các hệ điều hành thuộc họ UNIX, thiết bị, pipe và một số loại socket cũng có thể được xử lý thông qua giao diện bộ mô tả tệp.
Hệ thống tệp sử dụng nhiều chính sách để cân bằng giữa hiệu năng và độ an toàn dữ liệu. Lưu dữ liệu ghi trong bộ nhớ đệm thay vì ngay lập tức ghi xuống thiết bị có thể cải thiện hiệu năng, nhưng dữ liệu chưa được ghi có thể bị mất nếu nguồn điện bị ngắt. Các kỹ thuật như journaling, kiểm soát thứ tự ghi và copy-on-write được sử dụng để nâng cao tính nhất quán và khả năng khôi phục của hệ thống tệp sau khi hệ thống dừng bất thường.
Trình điều khiển thiết bị
Trình điều khiển thiết bị là phần mềm phụ trách giao tiếp giữa hệ điều hành và một thiết bị phần cứng cụ thể. Nó chuyển đổi các yêu cầu vào/ra chung của hệ điều hành thành thao tác truy cập thanh ghi, lệnh và truyền bộ nhớ mà thiết bị có thể hiểu, đồng thời chuyển ngắt và trạng thái hoàn tất từ thiết bị về hệ điều hành.
Các thiết bị được trình điều khiển quản lý có thể bao gồm:
- Thiết bị lưu trữ
- Bàn phím và chuột
- Bộ xử lý đồ họa
- Giao diện mạng
- Thiết bị âm thanh
- Thiết bị USB
- Camera và cảm biến
- Máy in
- Thiết bị ảo
- Bus hệ thống và thiết bị quản lý nguồn điện
Luồng vào/ra thiết bị thông thường diễn ra như sau.
Ứng dụng
↓
API tệp, socket hoặc đồ họa
↓
Lời gọi hệ thống
↓
Trình quản lý vào/ra của hệ điều hành
↓
Trình điều khiển thiết bị
↓
Bộ điều khiển thiết bị và phần cứng
↓
Ngắt hoặc tín hiệu hoàn tất
↓
Trình điều khiển thiết bị
↓
Trả kết quả cho tiến trình đã yêu cầu
Trình điều khiển có thể xử lý việc khởi tạo và tắt thiết bị, hàng đợi yêu cầu vào/ra, xử lý ngắt, truy cập bộ nhớ trực tiếp, quản lý nguồn điện, khôi phục lỗi cũng như kết nối và tháo thiết bị.
Hệ điều hành có thể cung cấp giao diện trình điều khiển chung cho từng loại thiết bị. Ví dụ, trình điều khiển lưu trữ triển khai các thao tác chung mà hệ thống tệp và lớp vào/ra khối yêu cầu, còn trình điều khiển mạng triển khai giao diện chung để trao đổi gói tin với ngăn xếp mạng. Nhờ đó, các thành phần cấp cao của hệ điều hành không cần biết toàn bộ chi tiết phần cứng của từng thiết bị.
Trình điều khiển chế độ nhân trong Windows có thể sử dụng các dịch vụ Executive bao gồm quản lý đối tượng, bộ nhớ, tiến trình và luồng, vào/ra cùng cấu hình. Windows sử dụng cấu trúc kết nối thiết bị và trình điều khiển theo tầng, đồng thời chuyển yêu cầu vào/ra qua ngăn xếp trình điều khiển. [10]
Trình điều khiển không nhất thiết phải chạy trong chế độ nhân. Trình điều khiển chế độ người dùng chạy với quyền hạn bị giới hạn, vì vậy khi xảy ra lỗi, khả năng toàn bộ hệ điều hành bị dừng có thể giảm xuống. Windows cho phép một số trình điều khiển thiết bị chạy trong chế độ người dùng, còn Apple cung cấp DriverKit để viết trình điều khiển thiết bị không gian người dùng trên macOS và iPadOS. [11] [12]
Tuy nhiên, những thiết bị cần xử lý ngắt hoặc độ trễ rất thấp, thiết bị cần thiết trong giai đoạn khởi động sớm và thiết bị được kết nối trực tiếp với chức năng nội bộ của nhân vẫn có thể cần trình điều khiển chế độ nhân.
Do trình điều khiển thiết bị chạy ở vị trí gần nhân và phần cứng, chúng có ảnh hưởng lớn đến độ ổn định và bảo mật của hệ điều hành. Truy cập bộ nhớ sai và lỗi đồng bộ hóa trong trình điều khiển chế độ nhân có thể làm dừng toàn bộ hệ thống. Vì vậy, hệ điều hành tăng cường ranh giới tin cậy của trình điều khiển thông qua chữ ký trình điều khiển, giới hạn quyền, trình điều khiển chế độ người dùng và thiết bị quản lý bộ nhớ vào/ra.
Mối quan hệ giữa các cấu trúc
Nhân, lời gọi hệ thống, hệ thống tệp và trình điều khiển thiết bị không phải là những chức năng độc lập mà hoạt động liên tiếp để xử lý một yêu cầu chung.
Quá trình ứng dụng đọc dữ liệu từ tệp có thể diễn ra như sau.
1. Ứng dụng gọi hàm read.
2. Thư viện hệ thống thực thi lời gọi hệ thống.
3. CPU chuyển từ chế độ người dùng sang chế độ nhân.
4. Nhân kiểm tra bộ mô tả tệp và quyền truy cập.
5. Hệ thống tệp ảo tìm tệp đang mở và hệ thống tệp thực tế.
6. Hệ thống tệp thực tế tính toán khối chứa dữ liệu.
7. Nếu dữ liệu không có trong bộ nhớ đệm, hệ thống tạo yêu cầu vào/ra khối.
8. Trình điều khiển thiết bị lưu trữ chuyển yêu cầu thành lệnh thiết bị.
9. Thiết bị truyền dữ liệu và phát sinh ngắt hoàn tất.
10. Nhân hoàn tất yêu cầu và trả dữ liệu về ứng dụng.
11. CPU quay lại chế độ người dùng.
Trong Linux, read() là lời gọi hệ thống đọc dữ liệu từ tệp được đại diện bởi một bộ mô tả tệp đang mở và trả kết quả truyền thực tế cho bên gọi. [13]
Như vậy, cấu trúc của hệ điều hành là một hệ thống phân tầng kết nối nhiều hệ thống con thông qua ranh giới bảo vệ và giao diện chung. Lời gọi hệ thống tạo thành ranh giới giữa chương trình người dùng và nhân, hệ thống tệp cung cấp dữ liệu dưới dạng trừu tượng chung là tệp, còn trình điều khiển thiết bị chuyển đổi yêu cầu logic của hệ điều hành thành hoạt động phần cứng thực tế.
Mặc dù các tầng nội bộ và tên gọi khác nhau giữa các hệ điều hành, mục tiêu cơ bản vẫn giống nhau: trừu tượng hóa phần cứng phức tạp thành giao diện chung và cho phép nhiều chương trình chia sẻ tài nguyên một cách an toàn.
Thực thi và quản lý tài nguyên
Thay vì trực tiếp trao các tài nguyên như bộ xử lý trung tâm và bộ nhớ cho chương trình đang chạy, hệ điều hành cung cấp các lớp trừu tượng như tiến trình, luồng và bộ nhớ ảo. Mỗi chương trình hoạt động như thể nó đang độc quyền sử dụng bộ xử lý và bộ nhớ, nhưng trên thực tế hệ điều hành phân phối và bảo vệ lượng tài nguyên vật lý có giới hạn giữa nhiều đơn vị thực thi. Thông qua việc ảo hóa tài nguyên này, hệ điều hành có thể chạy đồng thời nhiều chương trình và giới hạn ảnh hưởng của lỗi hoặc việc sử dụng tài nguyên quá mức của một chương trình đối với các chương trình khác và toàn bộ hệ thống. Trong lý thuyết hệ điều hành, ảo hóa CPU và bộ nhớ cũng được xem là những lĩnh vực cấu thành cốt lõi cùng với tính đồng thời và lưu trữ bền vững.
Tệp chương trình là mã và dữ liệu tĩnh được lưu trên thiết bị lưu trữ, còn tiến trình biểu thị trạng thái động khi chương trình đó thực sự đang được thực thi. Hệ điều hành nạp chương trình vào bộ nhớ, thiết lập ngữ cảnh thực thi, không gian địa chỉ, tệp đang mở, quyền truy cập và các thông tin khác để tạo tiến trình. Từ một tệp chương trình có thể tạo ra nhiều tiến trình, và mỗi tiến trình thường có trạng thái thực thi cùng tài nguyên riêng biệt với các tiến trình khác.
Chương trình
↓ thực thi
Tiến trình
├── Không gian địa chỉ ảo
├── Một hoặc nhiều luồng
├── Tệp đang mở và trạng thái vào/ra
├── Người dùng và quyền truy cập
├── Trạng thái tín hiệu và ngoại lệ
└── Các tài nguyên khác do hệ điều hành quản lý
Tiến trình và luồng
Tiến trình là đơn vị cách ly cơ bản mà hệ điều hành sử dụng để quản lý một chương trình đang chạy và các tài nguyên của nó. Tiến trình có thể bao gồm không chỉ mã cần thực thi mà còn dữ liệu toàn cục, heap, stack, ánh xạ bộ nhớ, tệp đang mở, thư mục làm việc hiện tại, quyền người dùng và tham chiếu đến nhiều đối tượng nhân khác nhau.
Hệ điều hành quản lý số định danh và thông tin trạng thái để nhận diện từng tiến trình. Cấu trúc dữ liệu nội bộ cụ thể đại diện cho tiến trình khác nhau giữa các hệ điều hành, nhưng thường cần những thông tin sau.
- Mã định danh tiến trình
- Quan hệ giữa tiến trình cha và tiến trình con
- Trạng thái thực thi của tiến trình
- Thông tin không gian địa chỉ ảo
- Các luồng thuộc tiến trình
- Tệp đang mở và tài nguyên vào/ra
- Người dùng và thông tin xác thực bảo mật
- Thời gian CPU và lượng bộ nhớ đã sử dụng
- Trạng thái xử lý tín hiệu và ngoại lệ
- Thông tin lập lịch và giới hạn tài nguyên
Một tiến trình chứa một hoặc nhiều luồng. Luồng thực sự thực thi các lệnh bên trong tiến trình và là đơn vị được bộ lập lịch của hệ điều hành phân bổ thời gian CPU. Các luồng thuộc cùng một tiến trình thường chia sẻ mã, dữ liệu toàn cục, heap, tệp đang mở và không gian địa chỉ ảo, nhưng mỗi luồng có ngữ cảnh thực thi, stack và trạng thái thanh ghi riêng. Windows cũng định nghĩa luồng là đơn vị thực thi có thể được lập lịch trong một tiến trình và giải thích rằng các luồng thuộc cùng một tiến trình chia sẻ không gian địa chỉ ảo cùng tài nguyên hệ thống.
Tiến trình
├── Mã dùng chung
├── Dữ liệu toàn cục dùng chung
├── Heap dùng chung
├── Tệp đang mở dùng chung
├── Không gian địa chỉ ảo dùng chung
│
├── Luồng 1
│ ├── Vị trí lệnh
│ ├── Thanh ghi CPU
│ └── Stack
│
├── Luồng 2
│ ├── Vị trí lệnh
│ ├── Thanh ghi CPU
│ └── Stack
│
└── Luồng 3
├── Vị trí lệnh
├── Thanh ghi CPU
└── Stack
Việc sử dụng nhiều luồng trong cùng một tiến trình cho phép tiến hành đồng thời nhiều công việc trong khi vẫn chia sẻ cùng dữ liệu và tài nguyên. Có thể tách luồng xử lý giao diện người dùng, luồng đọc tệp và luồng xử lý yêu cầu mạng, còn trên bộ xử lý đa lõi, nhiều luồng có thể thực sự chạy song song.
Do luồng chia sẻ nhiều tài nguyên hơn tiến trình, chi phí tạo và chuyển đổi luồng thường có thể thấp hơn việc tạo một tiến trình mới. Tuy nhiên, vì nhiều luồng có thể đồng thời truy cập bộ nhớ dùng chung nên có thể xảy ra điều kiện tranh chấp, hỏng dữ liệu và bế tắc. Các cơ chế như mutex, semaphore, biến điều kiện và phép toán nguyên tử dùng để kiểm soát những vấn đề này được trình bày trong ## Tính đồng thời và giao tiếp.
Phương thức hệ điều hành triển khai luồng không cố định theo một mô hình duy nhất. Runtime trong không gian người dùng có thể ánh xạ nhiều luồng người dùng vào một số ít đơn vị thực thi của nhân, hoặc mỗi luồng người dùng có thể được ánh xạ vào một luồng nhân. NPTL, cách triển khai luồng POSIX phổ biến trên Linux hiện đại, ánh xạ mỗi luồng theo tỷ lệ một-một với một đơn vị thực thi mà nhân có thể lập lịch và sử dụng các chức năng thuộc họ clone của Linux để tạo luồng.
Ranh giới chính xác giữa tiến trình và luồng cũng có thể khác nhau giữa các hệ điều hành. Một số nhân quản lý tiến trình và luồng như hai loại đối tượng hoàn toàn khác nhau, còn các nhân khác cấu hình cùng một cấu trúc đơn vị thực thi theo mức độ chia sẻ tài nguyên như không gian địa chỉ và tệp. Vì vậy, cách giải thích tiến trình là đơn vị tài nguyên và bảo vệ, còn luồng là đơn vị thực thi và lập lịch nên được hiểu như một sự phân biệt khái niệm mang tính phổ quát.
Tạo và kết thúc tiến trình
Tiến trình mới được tạo theo yêu cầu của một tiến trình hiện có hoặc trong quá trình khởi tạo hệ thống. Khi tạo tiến trình, hệ điều hành chuẩn bị mã định danh mới, không gian địa chỉ, luồng ban đầu, thông tin bảo mật và các cấu trúc quản lý của nhân.
Trong các hệ điều hành thuộc họ UNIX, theo truyền thống người ta kết hợp fork, dùng để sao chép một tiến trình hiện có, với họ hàm exec, dùng để thay thế chương trình mà tiến trình hiện tại sẽ thực thi.
Tiến trình hiện có
↓ fork
Tiến trình cha + tiến trình con
↓ exec
Thực thi chương trình mới
Khi fork được gọi, tiến trình con kế thừa về mặt logic không gian địa chỉ và nhiều thuộc tính thực thi của tiến trình cha. Việc sao chép ngay toàn bộ bộ nhớ sẽ tốn nhiều chi phí, vì vậy các hệ điều hành hiện đại thường có thể sử dụng sao chép khi ghi, trong đó cha và con ban đầu chia sẻ các trang vật lý hiện có, và chỉ sao chép trang tương ứng khi một bên sửa đổi dữ liệu. Nếu một tiến trình đa luồng gọi fork, tiến trình mới chỉ sao chép luồng đã thực hiện lời gọi. Do nó kế thừa trạng thái của không gian địa chỉ và các đối tượng đồng bộ hóa hiện có, cần chú ý đến các hàm có thể sử dụng và thứ tự thực thi sau đó.
Trong các hệ điều hành thuộc dòng Windows, phương thức phổ biến là đồng thời thiết lập chương trình sẽ thực thi, không gian địa chỉ ban đầu, đối tượng tiến trình và luồng đầu tiên trong một yêu cầu tạo tiến trình. Dù có khác biệt ở cấp API, vai trò cốt lõi của hệ điều hành trong việc thiết lập không gian địa chỉ mới, ngữ cảnh thực thi và thông tin tài nguyên vẫn giống nhau.
Khi tiến trình hoàn thành công việc bình thường hoặc kết thúc do lỗi, hệ điều hành ghi lại trạng thái kết thúc và giải phóng các tài nguyên như bộ nhớ, tệp đang mở và đối tượng nhân. Hệ thống cũng có thể cung cấp cơ chế để tiến trình cha kiểm tra kết quả kết thúc của tiến trình con.
Trong một số hệ điều hành, ngay cả sau khi tiến trình đã kết thúc, một lượng thông tin quản lý tối thiểu vẫn được giữ lại cho đến khi tiến trình cha thu hồi trạng thái kết thúc. Trong các hệ điều hành thuộc họ UNIX, tiến trình đã ngừng thực thi nhưng tiến trình cha chưa kiểm tra trạng thái kết thúc được gọi là tiến trình zombie. Ngược lại, nếu tiến trình cha kết thúc trước, quan hệ quản lý của tiến trình con có thể được một tiến trình hệ thống khác tiếp nhận.
Trạng thái của tiến trình và luồng
Hệ điều hành theo dõi xem tiến trình và luồng hiện có thể thực thi hay đang chờ tài nguyên hoặc sự kiện nào. Trạng thái chi tiết và tên gọi khác nhau giữa các hệ điều hành, nhưng thường có thể phân loại như sau.
| Trạng thái | Ý nghĩa |
|---|---|
| Đang tạo | Đang chuẩn bị cấu trúc dữ liệu và tài nguyên cần thiết để thực thi |
| Sẵn sàng | Có thể thực thi nhưng đang chờ được cấp CPU |
| Đang chạy | Hiện đang thực thi lệnh trên CPU |
| Đang chờ | Đang chờ sự kiện như vào/ra, khóa hoặc hết thời gian |
| Bị dừng | Việc thực thi bị dừng do gỡ lỗi, điều khiển tác vụ hoặc nguyên nhân khác |
| Kết thúc | Đã hoàn tất thực thi và đang chờ dọn dẹp tài nguyên hoặc thu hồi trạng thái kết thúc |
Một luồng đang chạy có thể không tiếp tục sử dụng CPU do lời gọi hệ thống, lỗi trang, yêu cầu vào/ra hoặc chờ một đối tượng đồng bộ hóa. Khi đó, hệ điều hành chuyển luồng sang trạng thái chờ và cấp CPU cho một luồng sẵn sàng khác. Khi sự kiện đang chờ hoàn tất, luồng quay lại trạng thái sẵn sàng.
Đang tạo
↓
Sẵn sàng ───────────────┐
↓ lập lịch │ bị chiếm quyền
Đang chạy ───────────────┘
│
├── kết thúc → trạng thái kết thúc
│
└── chờ vào/ra hoặc sự kiện
↓
Đang chờ
↓ sự kiện hoàn tất
Sẵn sàng
Đôi khi toàn bộ tiến trình được mô tả là đang chạy hoặc đang chờ, nhưng trong tiến trình đa luồng, trạng thái của từng luồng có thể khác nhau. Một luồng có thể đang chạy trên CPU, một luồng khác đang chờ dữ liệu mạng, còn một luồng khác đang chờ khóa.
Phân phối tài nguyên CPU
Một lõi CPU vật lý chỉ có thể thực thi một số lượng hữu hạn luồng lệnh tại một thời điểm. Khi số luồng có thể chạy nhiều hơn số lõi CPU, hệ điều hành sử dụng lập lịch CPU để quyết định luồng nào sẽ chạy vào thời điểm nào và trên lõi nào.
Bằng cách luân phiên chạy nhiều luồng trong các khoảng thời gian ngắn, hệ điều hành tạo cảm giác rằng mỗi chương trình đều liên tục tiến triển. Trong môi trường đa lõi, một số luồng có thể thực sự chạy đồng thời trên các lõi khác nhau.
Lập lịch có thể xem xét các mục tiêu sau.
- Giảm thời gian CPU ở trạng thái nhàn rỗi.
- Tăng số tác vụ hoàn thành trong một đơn vị thời gian.
- Giảm thời gian phản hồi của chương trình tương tác.
- Phân bổ thời gian CPU công bằng giữa người dùng và tác vụ.
- Xử lý trước các tác vụ có mức ưu tiên cao.
- Đáp ứng giới hạn thời gian của tác vụ thời gian thực.
- Duy trì tính cục bộ của bộ nhớ đệm CPU và truy cập bộ nhớ.
- Điều chỉnh mức tiêu thụ điện năng và nhiệt lượng.
- Phân phối tải cân bằng giữa nhiều lõi CPU.
Các mục tiêu này có thể xung đột với nhau. Nếu tiếp tục chạy một tác vụ tính toán dài, chi phí chuyển đổi ngữ cảnh sẽ giảm nhưng phản hồi của chương trình tương tác có thể chậm. Ngược lại, nếu chia thời gian thực thi thành những khoảng quá ngắn, khả năng phản hồi có thể tốt hơn nhưng chuyển đổi ngữ cảnh xảy ra thường xuyên, làm giảm thời gian CPU dành cho công việc thực tế.
Lập lịch chiếm quyền
Trong lập lịch chiếm quyền, hệ điều hành có thể ngắt luồng đang chạy và chuyển sang luồng khác ngay cả khi luồng hiện tại không tự trả lại CPU. Việc chiếm quyền thường xảy ra dựa trên ngắt bộ định thời phần cứng, mức ưu tiên hoặc khi một tác vụ quan trọng hơn chuyển sang trạng thái sẵn sàng.
Cấu trúc chiếm quyền cho phép các chương trình khác vẫn sử dụng CPU ngay cả khi một chương trình rơi vào vòng lặp vô hạn hoặc thực hiện phép tính trong thời gian dài. Các hệ điều hành máy tính để bàn và máy chủ đa dụng hiện đại thường sử dụng lập lịch chiếm quyền.
Trong lập lịch không chiếm quyền, tác vụ hiện tại có thể tiếp tục chạy cho đến khi kết thúc, chuyển sang trạng thái chờ hoặc chủ động nhường CPU. Cách triển khai này tương đối đơn giản, nhưng một tác vụ bị lỗi có thể trì hoãn việc thực thi của các tác vụ khác trong thời gian dài. Phương thức này có thể được sử dụng trong một số môi trường nhúng giới hạn và runtime hợp tác.
Lượng tử thời gian và mức ưu tiên
Hệ điều hành có thể cấp cho mỗi luồng một lượng tử thời gian nhất định và chuyển sang luồng khác khi lượng tử kết thúc. Không phải mọi luồng đều nhận cùng một lượng thời gian CPU; thứ tự chạy và thời gian được cấp có thể thay đổi tùy theo mức ưu tiên, lịch sử sử dụng, thời gian chờ và chính sách hệ thống.
Mức ưu tiên cao giúp thực thi nhanh các tác vụ quan trọng, nhưng nếu những tác vụ có mức ưu tiên cao liên tục ở trạng thái sẵn sàng, các tác vụ có mức ưu tiên thấp có thể gần như không được chạy, gây ra tình trạng đói tài nguyên. Hệ điều hành có thể giảm vấn đề này bằng cách tăng mức ưu tiên cho các tác vụ đã chờ lâu hoặc điều chỉnh mức ưu tiên động dựa trên mức sử dụng CPU.
Trong lập lịch thời gian thực, thời hạn của tác vụ quan trọng hơn sự công bằng đơn thuần. Chính sách SCHED_DEADLINE của Linux sử dụng các tham số về thời gian thực thi, chu kỳ và thời hạn để cung cấp băng thông CPU cho tác vụ.
Chuyển đổi ngữ cảnh
Quá trình hệ điều hành dừng một luồng đang chạy và bắt đầu chạy luồng khác được gọi là chuyển đổi ngữ cảnh. Hệ điều hành lưu trạng thái thực thi của luồng hiện tại, bao gồm vị trí lệnh, con trỏ stack và các thanh ghi CPU, rồi khôi phục trạng thái của luồng tiếp theo.
Luồng A đang chạy
↓ lưu trạng thái
Bộ lập lịch hoạt động
↓ chọn luồng tiếp theo
Khôi phục trạng thái luồng B
↓
Luồng B chạy
Khi chuyển đổi giữa các tiến trình khác nhau, không gian địa chỉ ảo và thông tin chuyển đổi bộ nhớ cũng có thể thay đổi. CPU hiện đại lưu kết quả dịch địa chỉ và dữ liệu bộ nhớ đệm bên trong, vì vậy chi phí chuyển đổi có thể lớn hơn nhiều so với việc chỉ thay đổi một vài thanh ghi.
Bản thân chuyển đổi ngữ cảnh không thực hiện phép tính thực tế của chương trình. Do đó, chuyển đổi quá thường xuyên có thể làm giảm thông lượng tổng thể. Tuy vậy, đây cũng là chi phí cần thiết để duy trì khả năng phản hồi và tính công bằng giữa nhiều chương trình.
Đa lõi và ái lực bộ xử lý
Trong hệ thống đa lõi, bộ lập lịch không chỉ quyết định luồng nào sẽ chạy mà còn phải quyết định nó sẽ chạy trên lõi nào. Nếu tiếp tục đặt một luồng trên lõi mà nó đã chạy trước đó, khả năng tái sử dụng mã và dữ liệu còn lại trong bộ nhớ đệm của lõi đó sẽ tăng lên. Điều này được gọi là ái lực bộ xử lý.
Tuy nhiên, nếu công việc tập trung vào một số lõi nhất định, hệ thống không thể sử dụng đều toàn bộ CPU, nên bộ lập lịch có thể di chuyển tải sang các lõi khác. Trong hệ thống NUMA, chi phí truy cập bộ nhớ khác nhau tùy theo vị trí vật lý của CPU và bộ nhớ, vì vậy hệ điều hành có thể cố gắng đặt luồng trên bộ xử lý gần với vùng bộ nhớ mà luồng sử dụng. Windows cũng sử dụng chính sách cố gắng đặt luồng trên bộ xử lý thuộc cùng một nút với vùng bộ nhớ đang được sử dụng để cải thiện hiệu năng trong môi trường NUMA.
Ngữ cảnh thực thi và không gian địa chỉ
Địa chỉ mà chương trình sử dụng thường không biểu thị trực tiếp vị trí thực tế trong RAM vật lý. Hệ điều hành cung cấp cho mỗi tiến trình một không gian địa chỉ ảo độc lập và sử dụng bộ quản lý bộ nhớ của CPU cùng bảng trang để chuyển đổi địa chỉ ảo thành địa chỉ vật lý.
Địa chỉ ảo của tiến trình
↓
Bảng trang
↓
Vị trí thực tế trong bộ nhớ vật lý
Mỗi tiến trình có thể hoạt động như thể nó sở hữu một không gian địa chỉ liên tục riêng, nhưng trong bộ nhớ vật lý, dữ liệu có thể được phân tán ở nhiều vị trí khác nhau. Bảng trang của Linux cũng được mô tả là một cấu trúc phân cấp ánh xạ địa chỉ ảo mà CPU nhìn thấy sang địa chỉ vật lý được sử dụng trên bus bộ nhớ.
Không gian địa chỉ ảo thường bao gồm các vùng sau.
- Mã máy sẽ được thực thi
- Hằng số chỉ đọc
- Dữ liệu toàn cục đã khởi tạo
- Dữ liệu toàn cục chưa khởi tạo
- Heap được cấp phát động
- Thư viện dùng chung và vùng ánh xạ bộ nhớ
- Stack của từng luồng
- Vùng dành riêng cho hệ điều hành và kiến trúc
Địa chỉ cao
┌──────────────────────┐
│ Stack │
│ ↓ │
├──────────────────────┤
│ Vùng ánh xạ bộ nhớ │
│ Thư viện dùng chung │
├──────────────────────┤
│ ↑ │
│ Heap │
├──────────────────────┤
│ Dữ liệu toàn cục·tĩnh│
├──────────────────────┤
│ Mã chương trình │
└──────────────────────┘
Địa chỉ thấp
Hình trên đơn giản hóa một khái niệm chung. Hướng bố trí thực tế, phạm vi địa chỉ và vị trí của từng vùng khác nhau tùy theo hệ điều hành, định dạng tệp thực thi, kiến trúc và chính sách bảo mật.
Một mục đích quan trọng của không gian địa chỉ ảo là cách ly tiến trình. Ngay cả khi địa chỉ ảo mà một tiến trình sử dụng có cùng giá trị số với địa chỉ của tiến trình khác, chúng vẫn có thể được ánh xạ đến các trang vật lý khác nhau. Tiến trình thường không thể trực tiếp truy cập bộ nhớ của tiến trình khác nếu không có quyền.
Ngoài cách ly, địa chỉ ảo còn hỗ trợ các chức năng sau.
- Cung cấp không gian địa chỉ logic lớn hơn bộ nhớ vật lý thực tế
- Sử dụng các vùng bộ nhớ vật lý rời rạc như một vùng liên tục
- Ánh xạ tệp trực tiếp vào không gian địa chỉ
- Cho phép nhiều tiến trình chia sẻ cùng mã và dữ liệu
- Thiết lập quyền đọc, ghi và thực thi cho từng vùng bộ nhớ
- Sao chép khi ghi
- Cấp phát trì hoãn, chỉ cấp bộ nhớ vật lý khi cần
- Tăng cường bảo mật thông qua ngẫu nhiên hóa bố trí không gian địa chỉ
Trong Windows, mỗi tiến trình cũng có một không gian địa chỉ ảo độc lập và mọi luồng thuộc cùng tiến trình đều có thể truy cập không gian địa chỉ đó.
Bộ nhớ ảo và phân trang
Bộ nhớ ảo là hệ thống quản lý tách biệt địa chỉ ảo mà tiến trình sử dụng khỏi bộ nhớ vật lý thực tế. Hệ điều hành quản lý bộ nhớ theo các đơn vị có kích thước cố định gọi là trang và ánh xạ trang ảo vào khung trang vật lý.
Khi tiến trình đọc hoặc ghi một địa chỉ ảo, CPU sử dụng bảng trang để tìm trang vật lý được ánh xạ với địa chỉ đó. Để tăng tốc quá trình dịch địa chỉ, CPU có thể lưu các kết quả dịch gần đây trong bộ đệm tra cứu chuyển đổi.
Địa chỉ ảo
↓
Số trang ảo + vị trí bên trong trang
↓
Tra cứu bảng trang
↓
Khung trang vật lý + vị trí bên trong trang
↓
Địa chỉ vật lý
Ngoài vị trí trang vật lý, mục bảng trang có thể chứa các trạng thái như quyền đọc, ghi và thực thi, khả năng truy cập từ chế độ người dùng và việc trang hiện có nằm trong bộ nhớ vật lý hay không.
Hệ điều hành có thể không cấp ngay bộ nhớ vật lý cho toàn bộ vùng bộ nhớ ảo mà tiến trình yêu cầu. Phương thức chỉ chuẩn bị bộ nhớ vật lý khi trang được truy cập lần đầu được gọi là phân trang theo yêu cầu. Hệ thống con quản lý bộ nhớ của Linux cũng đảm nhiệm bộ nhớ ảo, phân trang theo yêu cầu, cấp phát bộ nhớ trong không gian người dùng và bên trong nhân, cùng ánh xạ tệp.
Lỗi trang
Nếu trang ảo mà tiến trình truy cập hiện không có ánh xạ vật lý hợp lệ hoặc quyền truy cập không phù hợp, CPU phát sinh lỗi trang. Lỗi trang không phải lúc nào cũng có nghĩa là chương trình bị lỗi.
Các ví dụ về lỗi trang bình thường bao gồm:
- Cấp một trang vật lý cho vùng bộ nhớ ẩn danh được truy cập lần đầu
- Nạp phần cần thiết của tệp thực thi hoặc thư viện dùng chung
- Đọc trang ánh xạ tệp chưa có trong bộ nhớ
- Tạo trang riêng khi cố sửa đổi một trang sao chép khi ghi
- Nạp lại vào bộ nhớ một trang đã được chuyển sang thiết bị lưu trữ
Nếu hệ điều hành có thể giải quyết yêu cầu, nó cập nhật bảng trang rồi thực thi lại lệnh bị gián đoạn. Nếu không thể giải quyết, chẳng hạn khi truy cập địa chỉ không tồn tại hoặc cố ghi vào trang chỉ đọc không có quyền ghi, hệ điều hành có thể gửi tín hiệu lỗi hoặc ngoại lệ đến tiến trình và kết thúc chương trình.
Bộ nhớ vật lý và tập làm việc
Không phải mọi trang trong không gian địa chỉ ảo đều luôn tồn tại trong bộ nhớ vật lý. Tập hợp các trang mà tiến trình gần đây thực sự sử dụng và hiện đang nằm trong bộ nhớ vật lý có thể được gọi là tập làm việc. Trong Windows, tập làm việc cũng là tập hợp những trang được tham chiếu gần đây trong không gian địa chỉ ảo của tiến trình và có thể bao gồm cả dữ liệu dùng chung lẫn dữ liệu không dùng chung.
Nếu bộ nhớ vật lý đủ lớn, các trang thường xuyên sử dụng có thể được giữ trong RAM để truy cập nhanh. Khi áp lực bộ nhớ tăng, hệ điều hành có thể thu hồi các trang ít được sử dụng, loại bỏ những trang có thể đọc lại từ tệp và nếu cần thì chuyển một phần bộ nhớ ẩn danh sang không gian hoán đổi trên thiết bị lưu trữ.
Thiết bị lưu trữ chậm hơn RAM rất nhiều, vì vậy nếu các trang cần thiết liên tục di chuyển giữa bộ nhớ vật lý và thiết bị lưu trữ, hiệu năng hệ thống có thể giảm mạnh. Hiện tượng thay thế trang lặp đi lặp lại do tập hợp trang cần cho công việc lớn hơn bộ nhớ vật lý được gọi là thrashing.
Thay thế trang
Khi thiếu bộ nhớ vật lý, hệ điều hành phải quyết định trang nào sẽ được thu hồi. Các thuật toán thay thế trang về mặt lý thuyết bao gồm:
- FIFO, thay thế trang được đưa vào trước
- LRU, chọn trang lâu nhất không được sử dụng
- Các phương thức thuộc họ Clock, sử dụng thông tin truy cập gần đây
- Thuật toán tối ưu, chọn trang sẽ được sử dụng muộn nhất trong tương lai
Do không thể biết chính xác các lần truy cập bộ nhớ trong tương lai, thuật toán tối ưu chủ yếu được sử dụng làm tiêu chuẩn so sánh. Hệ điều hành thực tế sử dụng các chính sách phức tạp kết hợp thời điểm truy cập gần đây, trạng thái đã sửa đổi, việc trang dựa trên tệp hay bộ nhớ ẩn danh, mức ưu tiên theo tiến trình và áp lực bộ nhớ.
Một trang chưa bị sửa đổi và có thể đọc lại từ tệp có thể được loại bỏ mà không cần ghi riêng xuống thiết bị lưu trữ. Ngược lại, trang ẩn danh đã bị chương trình sửa đổi có thể phải được ghi vào không gian hoán đổi trước khi thu hồi.
Cấp phát bộ nhớ
Quản lý bộ nhớ của hệ điều hành có thể được chia thành việc cung cấp không gian địa chỉ ảo cho tiến trình và việc cấp phát các trang vật lý thực tế. Các bộ cấp phát như malloc, new hoặc bộ cấp phát của runtime ngôn ngữ có thể nhận một vùng bộ nhớ lớn từ hệ điều hành rồi chia nhỏ vùng đó thành các đối tượng nhỏ hơn.
Yêu cầu cấp phát đối tượng của ứng dụng
↓
Runtime ngôn ngữ hoặc bộ cấp phát bộ nhớ
↓ khi cần
Yêu cầu bộ nhớ ảo từ hệ điều hành
↓
Dành trước vùng địa chỉ ảo
↓ khi truy cập
Cấp phát trang vật lý
Vì vậy, không nhất thiết có một lời gọi hệ thống cho mỗi đối tượng mà chương trình tạo ra. Bộ cấp phát bộ nhớ thông thường tái sử dụng vùng đã nhận từ hệ điều hành và chỉ yêu cầu thêm không gian khi có phép cấp phát lớn hoặc khi thiếu bộ nhớ.
Có thể phân biệt trạng thái chỉ dành trước phạm vi địa chỉ của một vùng địa chỉ ảo với trạng thái đã liên kết vùng đó với không gian lưu trữ vật lý thực tế. Ý nghĩa cụ thể của việc dành trước và cam kết khác nhau tùy theo hệ điều hành và nền tảng, nhưng sự phân biệt này cho phép 확보 một không gian địa chỉ liên tục lớn trong khi chỉ phân bổ tài nguyên vật lý cho phần thực sự được sử dụng.
Vùng bộ nhớ có thể được liên kết không chỉ với bộ nhớ ẩn danh mà còn với tệp và thiết bị. mmap của Linux tạo một ánh xạ mới trong không gian địa chỉ ảo của tiến trình gọi. Khi ánh xạ một tệp, chương trình có thể đọc và ghi dữ liệu tệp thông qua lệnh truy cập bộ nhớ thông thường, còn hệ điều hành xử lý vào/ra thực tế bằng bộ nhớ đệm trang và lỗi trang.
Bộ nhớ dùng chung
Không gian địa chỉ của các tiến trình mặc định được tách biệt, nhưng hệ điều hành có thể chủ động ánh xạ cùng một trang vật lý vào không gian địa chỉ ảo của nhiều tiến trình. Điều này được gọi là bộ nhớ dùng chung.
Địa chỉ ảo tiến trình A ─┐
├── Cùng bộ nhớ vật lý
Địa chỉ ảo tiến trình B ─┘
Bộ nhớ dùng chung cho phép nhiều tiến trình truy cập dữ liệu mà không cần sao chép riêng, nên hiệu quả khi trao đổi lượng dữ liệu lớn. Bộ nhớ dùng chung POSIX cũng ánh xạ một đối tượng bộ nhớ dùng chung vào không gian địa chỉ ảo của tiến trình để các tiến trình trao đổi thông tin qua cùng một vùng bộ nhớ.
Tuy nhiên, nếu nhiều tiến trình đồng thời sửa đổi cùng dữ liệu, điều kiện tranh chấp có thể xảy ra tương tự như với bộ nhớ dùng chung giữa các luồng. Vì vậy, cần sử dụng cơ chế đồng bộ hóa như mutex, semaphore, phép toán nguyên tử hoặc kiến trúc một bên ghi duy nhất được xác định rõ ràng.
Các trang chỉ đọc chứa mã chương trình và thư viện dùng chung cũng có thể được nhiều tiến trình chia sẻ về mặt vật lý. Dù mỗi tiến trình nhìn thấy chúng tại các địa chỉ ảo độc lập, việc ánh xạ đến cùng một trang vật lý có thể giảm mức sử dụng bộ nhớ.
Giới hạn tài nguyên và quản lý mức sử dụng
Hệ điều hành không chỉ cấp phát CPU và bộ nhớ mà còn có thể giới hạn và đo lường lượng tài nguyên mà một người dùng hoặc tiến trình cụ thể được phép sử dụng.
Các tài nguyên có thể được quản lý bao gồm:
- Thời gian CPU và tỷ lệ sử dụng CPU
- Bộ nhớ vật lý và bộ nhớ ảo
- Số tiến trình và luồng có thể tạo
- Số tệp có thể mở
- Dung lượng đĩa sử dụng
- Băng thông vào/ra
- Băng thông mạng
- Quyền truy cập vào CPU và nút NUMA cụ thể
- Quyền lập lịch thời gian thực
Giới hạn tài nguyên giúp giảm tình trạng một chương trình độc chiếm bộ nhớ hoặc CPU và cản trở các chương trình khác. Trong máy chủ đa người dùng và môi trường container, chúng có vai trò quan trọng trong việc phân tách tài nguyên có thể sử dụng theo từng người dùng hoặc dịch vụ và đo lường mức sử dụng.
Nhóm điều khiển của Linux là một chức năng của nhân cho phép tổ chức tiến trình thành các nhóm phân cấp, đồng thời giới hạn và đo lường mức sử dụng tài nguyên như CPU, bộ nhớ và vào/ra.
Hành vi khi vượt quá giới hạn phụ thuộc vào loại tài nguyên và chính sách. Việc cấp phát thêm bộ nhớ có thể thất bại, tỷ lệ thời gian CPU của tác vụ có thể bị giảm, và trong tình trạng thiếu bộ nhớ nghiêm trọng, hệ điều hành có thể kết thúc một số tiến trình.
Mối quan hệ giữa thực thi và quản lý tài nguyên
Tiến trình, luồng, lập lịch CPU và quản lý bộ nhớ không phải là các chức năng tách biệt. Để chạy một luồng, hệ điều hành phải chuẩn bị ngữ cảnh CPU của luồng và không gian địa chỉ của tiến trình; nếu trang bộ nhớ được truy cập trong quá trình thực thi không hiện diện, hệ điều hành phải xử lý lỗi trang. Khi luồng chờ vào/ra hoặc bộ nhớ, CPU được cấp cho một luồng khác.
Yêu cầu thực thi chương trình
↓
Tạo tiến trình và không gian địa chỉ ảo
↓
Tạo luồng ban đầu
↓
Đăng ký vào hàng đợi sẵn sàng của bộ lập lịch
↓
Cấp CPU
↓
Thực thi lệnh và dịch địa chỉ ảo
↓
Có thể phát sinh lỗi trang, vào/ra hoặc lời gọi hệ thống
↓
Chuyển luồng sang trạng thái chờ nếu cần
↓
Cấp CPU cho luồng khác
↓
Quay lại trạng thái sẵn sàng khi sự kiện hoàn tất
Hệ điều hành lặp lại quá trình này để nhiều chương trình có thể chia sẻ số lượng lõi CPU và bộ nhớ vật lý có giới hạn. Tiến trình cung cấp môi trường thực thi độc lập cho từng chương trình, luồng biểu thị luồng thực thi thực tế, còn bộ lập lịch phân phối thời gian CPU. Bộ nhớ ảo tách biệt không gian địa chỉ giữa các tiến trình, đồng thời cho phép bố trí và chia sẻ bộ nhớ vật lý linh hoạt.
Những lớp trừu tượng này cho phép chương trình hoạt động mà không cần trực tiếp điều khiển số lõi CPU, vị trí trang vật lý thực tế hay trạng thái thực thi của các chương trình khác. Trong khi đó, hệ điều hành phải liên tục đưa ra quyết định chính sách giữa tính công bằng, khả năng phản hồi, thông lượng, mức sử dụng bộ nhớ và khả năng cách ly.
Thuật toán lập lịch CPU và chính sách thay thế trang không có một lời giải tối ưu duy nhất cho mọi môi trường. Máy tính cá nhân tương tác, máy chủ quy mô lớn, thiết bị di động chạy bằng pin và hệ thống điều khiển thời gian thực có các mục tiêu khác nhau. Vì vậy, hệ điều hành thực tế kết hợp nhiều chính sách để quản lý thực thi và tài nguyên dựa trên mức ưu tiên, đặc tính thực thi của tác vụ, cấu trúc phần cứng và tải hệ thống.
Tính đồng thời và giao tiếp
Hệ điều hành cung cấp môi trường cho phép nhiều tiến trình và luồng có thể thực thi trong cùng một khoảng thời gian. Ngay cả trên một lõi CPU duy nhất, nếu hệ điều hành nhanh chóng chuyển đổi giữa các đối tượng thực thi thì nhiều tác vụ có thể luân phiên tiến triển. Trong hệ thống đa lõi, nhiều luồng thực thi có thể thật sự đồng thời thực hiện lệnh. Mối quan hệ thực thi như vậy được gọi là tính đồng thời, còn trường hợp nhiều phép tính được thực hiện vật lý tại cùng một thời điểm có thể được phân biệt là tính song song.
Tính đồng thời cần thiết để sử dụng hiệu quả CPU và thiết bị vào/ra cũng như cải thiện khả năng phản hồi của chương trình. Máy chủ web có thể đồng thời xử lý yêu cầu từ nhiều máy khách, còn chương trình đồ họa có thể tách riêng việc xử lý đầu vào màn hình, kết xuất và vào/ra tệp. Bên trong hệ điều hành, nhiều CPU, thiết bị và trình xử lý ngắt cũng có thể đồng thời truy cập cấu trúc dữ liệu của nhân.
Tuy nhiên, khi nhiều luồng thực thi chia sẻ dữ liệu và thiết bị, kết quả có thể thay đổi tùy theo thứ tự thực thi. Hệ điều hành và chương trình sử dụng các phương tiện như mutex, semaphore, biến điều kiện, phép toán nguyên tử và truyền thông điệp để điều phối thứ tự truy cập tài nguyên dùng chung. Khi các tiến trình nằm trong những không gian địa chỉ khác nhau, chúng trao đổi dữ liệu và thông báo trạng thái thực thi thông qua giao tiếp liên tiến trình. POSIX cũng yêu cầu sử dụng các phép toán đồng bộ hóa để xác định quan hệ giữa đọc và ghi khi nhiều luồng thực thi truy cập cùng một vị trí bộ nhớ.
Các tác vụ thực thi đồng thời
↓
Truy cập tài nguyên dùng chung
↓
Điều phối thứ tự thực thi và khả năng quan sát
├── Khóa và biến điều kiện
├── Semaphore và sự kiện
├── Phép toán nguyên tử
└── Truyền thông điệp
↓
Chia sẻ dữ liệu và giao tiếp an toàn
Tính đồng thời và tính song song
Tính đồng thời là cấu trúc trong đó hai hoặc nhiều tác vụ cùng tiến triển trong những khoảng thời gian chồng lấn. Các tác vụ không nhất thiết phải thực thi đúng cùng một thời điểm. Ngay cả trên một lõi duy nhất, nếu hệ điều hành luân phiên chạy các tác vụ thì một tác vụ có thể thực hiện tính toán trong khi tác vụ khác đang chờ vào/ra.
Tính song song là trạng thái hai hoặc nhiều tác vụ thực sự được thực thi cùng một lúc trên nhiều lõi CPU hoặc đơn vị tính toán.
Tính đồng thời
CPU 1: Tác vụ A → Tác vụ B → Tác vụ A → Tác vụ C
Tính song song
CPU 1: Tác vụ A ───────────────
CPU 2: Tác vụ B ───────────────
CPU 3: Tác vụ C ───────────────
Có tính đồng thời không đồng nghĩa với việc luôn thực thi song song, còn chương trình song song thường dựa trên tính đồng thời của nhiều tác vụ. Hệ điều hành dùng bộ lập lịch để bố trí các luồng có thể chạy lên CPU, nhưng chương trình và runtime quyết định cách chia tác vụ thành các đơn vị và dữ liệu nào được dùng chung.
Trong lĩnh vực hệ điều hành, tính đồng thời được xem là một chủ đề cốt lõi cùng với ảo hóa CPU và lưu trữ bền vững. Những lỗi phát sinh khi nhiều luồng thực thi truy cập trạng thái dùng chung không chỉ là vấn đề lập lịch đơn giản mà còn liên quan đến tính đúng đắn của chương trình, mô hình bộ nhớ và quy tắc đồng bộ hóa.
Trạng thái dùng chung
Các luồng thuộc cùng một tiến trình thường chia sẻ không gian địa chỉ ảo, biến toàn cục, đối tượng heap và tệp đang mở. Nhiều tiến trình cũng có thể truy cập cùng một trạng thái thông qua bộ nhớ dùng chung, tệp, đối tượng nhân, thiết bị và kết nối mạng.
Bản thân trạng thái dùng chung không phải là điều sai. Vấn đề nằm ở chỗ trong khi một luồng thực thi đang đọc hoặc thay đổi một giá trị, luồng khác cũng có thể truy cập cùng giá trị đó.
Có thể giả sử phép tăng sau đây.
counter = counter + 1
Trong mã nguồn, nó trông như một phép toán duy nhất, nhưng quá trình thực thi thực tế có thể được chia thành nhiều bước.
1. Đọc giá trị của counter.
2. Cộng 1 vào giá trị đã đọc.
3. Ghi kết quả trở lại counter.
Nếu hai luồng đồng thời thực hiện phép toán này khi giá trị của counter là 10, thứ tự sau có thể xảy ra.
Luồng A: đọc 10 từ counter
Luồng B: đọc 10 từ counter
Luồng A: ghi 11
Luồng B: ghi 11
Mặc dù phép tăng được thực hiện hai lần, kết quả cuối cùng là 11 thay vì 12. Các thao tác riêng lẻ của từng luồng đều được thực thi bình thường, nhưng khi chúng xen kẽ với nhau, kết quả tổng thể trở nên sai.
Điều kiện tranh chấp
Điều kiện tranh chấp là tình trạng trong đó nhiều luồng thực thi truy cập trạng thái dùng chung và kết quả của chương trình thay đổi tùy theo thứ tự hoặc thời điểm thực thi cụ thể.
Điều kiện tranh chấp có thể xảy ra với các tài nguyên sau.
- Biến và cấu trúc dữ liệu dùng chung
- Vị trí hiện tại và nội dung của tệp
- Bộ cấp phát bộ nhớ
- Danh sách quản lý tiến trình và luồng
- Hàng đợi lệnh của thiết bị
- Trạng thái kết nối mạng
- Cơ sở dữ liệu và giao dịch
- Siêu dữ liệu của hệ thống tệp
- Cấu trúc dữ liệu lập lịch của nhân
Điều kiện tranh chấp không phải lúc nào cũng lập tức gây ra lỗi dễ nhìn thấy. Trong phần lớn lần chạy, chương trình có thể hoạt động như mong đợi nhưng chỉ xuất hiện lỗi trong một thời điểm cụ thể, dưới tải hệ thống nhất định, với số lượng CPU khác hoặc khi trình biên dịch tối ưu hóa. Vì vậy, lỗi đồng thời thường khó tái hiện và chẩn đoán.
Việc bảo vệ mọi mã thay đổi trạng thái dùng chung bằng một khóa toàn cục duy nhất có thể ngăn một số điều kiện tranh chấp, nhưng đồng thời làm mất lợi ích của thực thi đồng thời và tăng nguy cơ tranh chấp khóa cùng bế tắc. Vì vậy, trước tiên cần thiết kế trạng thái nào thực sự phải được chia sẻ và phạm vi nào phải được xử lý như một thao tác nguyên tử.
Vùng tới hạn
Vùng tới hạn là vùng mã cần được bảo vệ để chỉ một số lượng giới hạn luồng thực thi có thể truy cập tại cùng một thời điểm nhằm duy trì tính nhất quán của tài nguyên dùng chung.
Giành khóa
↓
Đọc và sửa đổi dữ liệu dùng chung
↓
Nhả khóa
Tính chất chỉ cho phép một luồng đi vào vùng tới hạn tại một thời điểm được gọi là loại trừ tương hỗ. Mục tiêu là làm cho nhiều lệnh trong vùng tới hạn xuất hiện như một thao tác duy nhất không có trạng thái trung gian khi được quan sát từ luồng thực thi khác.
Thuật toán loại trừ tương hỗ và phương tiện đồng bộ hóa thường xem xét các điều kiện sau.
- Không được có nhiều hơn một luồng thực thi cùng vào vùng được bảo vệ.
- Khi không có ai sử dụng vùng tới hạn, tác vụ có khả năng đi vào không được chờ vô hạn một cách không cần thiết.
- Cần hạn chế tối đa tình trạng đói tài nguyên khiến một luồng thực thi liên tục không được chọn.
- Cần giảm thời gian chờ làm lãng phí CPU.
- Phải hoạt động đúng trong môi trường có ngắt và đa lõi.
Nếu vùng tới hạn được đặt quá lớn, việc bảo vệ tài nguyên dùng chung trở nên đơn giản hơn nhưng các tác vụ khác phải chờ lâu. Ngược lại, nếu chia quá nhỏ, số lượng khóa tăng lên và có thể khó duy trì tính đúng đắn của các thao tác cần thay đổi nhiều trạng thái cùng lúc.
Tính nguyên tử
Tính nguyên tử là tính chất khiến một thao tác khi quan sát từ bên ngoài trông như được thực hiện hoàn toàn hoặc hoàn toàn không được thực hiện, thay vì bị chia thành các bước trung gian nhỏ hơn.
Một số thao tác đọc và ghi đơn giản có thể được phần cứng thực hiện nguyên tử, nhưng không phải mọi truy cập biến đều tự động nguyên tử. Điều này có thể phụ thuộc vào kích thước và căn chỉnh của giá trị, kiến trúc bộ xử lý và mô hình bộ nhớ của ngôn ngữ. Ngoài ra, ngay cả khi một phép đọc và một phép ghi riêng lẻ đều nguyên tử, toàn bộ thao tác kết hợp nhiều bước vẫn có thể không nguyên tử.
CPU có thể cung cấp các phép toán nguyên tử sau.
- Phép trao đổi giá trị
- Phép so sánh rồi thay đổi giá trị theo điều kiện
- Phép tăng hoặc giảm giá trị một cách nguyên tử
- Phép đặt hoặc xóa một bit cụ thể
Hệ điều hành và runtime có thể sử dụng các phép toán phần cứng này để triển khai khóa, semaphore, bộ đếm tham chiếu và cấu trúc dữ liệu không khóa.
Việc sử dụng phép toán nguyên tử không giải quyết được mọi vấn đề đồng bộ hóa. Để duy trì tính nhất quán giữa nhiều biến liên quan hoặc thay đổi cấu trúc dữ liệu phức tạp, có thể vẫn cần vùng tới hạn lớn hơn và quy tắc thứ tự bộ nhớ.
Khả năng quan sát và thứ tự bộ nhớ
Trong bộ xử lý đa lõi, mỗi lõi sử dụng bộ nhớ đệm và bộ đệm ghi, còn trình biên dịch và CPU có thể thay đổi thứ tự thực thi của các lệnh được xem là độc lập nhằm tăng hiệu năng. Vì vậy, không thể đơn giản giả định rằng ngay sau khi một luồng ghi giá trị vào bộ nhớ, luồng khác chắc chắn sẽ quan sát giá trị đó theo cùng thứ tự.
Mô hình bộ nhớ xác định những vấn đề sau.
- Phép đọc và ghi nào là nguyên tử
- Khi nào thao tác ghi của một luồng thực thi trở nên có thể quan sát được đối với luồng khác
- Trình biên dịch và CPU có thể sắp xếp lại thao tác trong phạm vi nào
- Khóa và phép toán nguyên tử hình thành quan hệ thứ tự nào
- Chương trình có ý nghĩa gì khi xảy ra tranh chấp dữ liệu
Nội dung được một luồng thay đổi trước khi nhả khóa phải có thể được quan sát bởi luồng tiếp theo giành cùng khóa. Quan hệ này không chỉ cung cấp loại trừ tương hỗ mà còn bảo đảm khả năng quan sát bộ nhớ. Quy tắc đồng bộ hóa POSIX cũng tạo ra thứ tự giữa thao tác ghi bộ nhớ của một luồng thực thi và thao tác đọc của luồng khác thông qua các thao tác đồng bộ hóa như mutex.
Không thể bảo đảm rằng chỉ cần lặp lại việc đọc một biến là có thể an toàn quan sát thay đổi của luồng khác. Trạng thái dùng chung phải sử dụng phép toán nguyên tử hoặc đối tượng đồng bộ hóa do ngôn ngữ và hệ điều hành cung cấp.
Mutex
Mutex là đối tượng đồng bộ hóa loại trừ tương hỗ chỉ có thể được một luồng sở hữu tại một thời điểm.
Luồng A: giành khóa → sử dụng tài nguyên dùng chung → nhả khóa
Luồng B: chờ → giành khóa
Nếu một luồng cố giành mutex trong khi nó đã thuộc sở hữu của luồng khác, luồng gọi có thể phải chờ đến khi khóa được nhả. Tùy theo cách triển khai, luồng có thể kiểm tra lặp lại trong thời gian ngắn rồi chuyển sang ngủ, hoặc ngay lập tức đi vào trạng thái chờ của hệ điều hành.
Mutex thường tuân theo các quy tắc sau.
- Luồng giành khóa trở thành chủ sở hữu.
- Luồng khác không truy cập tài nguyên được bảo vệ cho đến khi khóa được nhả.
- Khi hoàn thành công việc, chủ sở hữu nhả khóa.
- Mọi đường truy cập đều phải tuân theo cùng một quy tắc khóa.
Mutex của Windows cũng chỉ có thể thuộc sở hữu của một luồng tại một thời điểm và cung cấp loại trừ tương hỗ cho tài nguyên dùng chung. Nếu nhiều tiến trình mở cùng một đối tượng đồng bộ hóa có tên, mutex cũng có thể được dùng để đồng bộ hóa giữa các tiến trình.
Mutex POSIX chủ yếu được sử dụng để đồng bộ hóa các luồng chia sẻ bộ nhớ trong cùng một tiến trình. Tuy nhiên, nếu chỉ định thuộc tính chia sẻ giữa tiến trình và đặt mutex trong bộ nhớ dùng chung, các luồng thuộc nhiều tiến trình cũng có thể sử dụng nó.
Nếu xảy ra lỗi hoặc trả về sớm trong khi đang giữ khóa, khóa có thể không bao giờ được nhả. Để ngăn điều này, ngôn ngữ và thư viện có thể cung cấp cấu trúc tự động nhả khóa khi phạm vi kết thúc.
Spinlock
Spinlock là phương tiện đồng bộ hóa trong đó luồng thực thi lặp lại việc kiểm tra trạng thái khóa cho đến khi có thể giành được nó.
while không giành được khóa:
tiếp tục kiểm tra
Do vẫn sử dụng CPU trong khi chờ, spinlock không hiệu quả đối với khóa được giữ trong thời gian dài. Tuy nhiên, nó có thể hữu ích khi thời gian giữ khóa rất ngắn và chi phí đưa luồng vào trạng thái ngủ rồi đánh thức lại lớn hơn.
Spinlock có thể được sử dụng trong nhân hệ điều hành và các vùng tới hạn rất ngắn trên hệ thống đa lõi. Nguyên nhân là trong ngữ cảnh ngắt hoặc tình huống không thể lập lịch, mutex kiểu ngủ thông thường không thể được sử dụng.
Trên hệ thống một lõi, nếu luồng hiện tại tiếp tục quay trong khi chờ một khóa do luồng khác giữ, chủ sở hữu khóa có thể không có cơ hội thực thi. Vì vậy, khả năng sử dụng spinlock phải được đánh giá cùng với tính chiếm quyền, ngắt, số lượng CPU và ngữ cảnh thực thi của nhân.
Khóa đọc-ghi
Khóa đọc-ghi là đối tượng đồng bộ hóa cho phép nhiều thao tác đọc cùng lúc nhưng yêu cầu thao tác ghi được thực hiện độc quyền.
Khóa đọc
- Nhiều luồng có thể cùng giành
Khóa ghi
- Chỉ một luồng có thể giành
- Không thể cùng tồn tại với khóa đọc
Khi phần lớn thao tác chỉ đọc dữ liệu và việc thay đổi hiếm xảy ra, khóa đọc-ghi có thể tăng tính đồng thời so với mutex thông thường. Tuy nhiên, quản lý khóa phức tạp hơn và nếu thao tác đọc liên tục xuất hiện, thao tác ghi có thể phải chờ rất lâu, gây ra tình trạng đói tài nguyên. Ngược lại, chính sách ưu tiên ghi có thể làm tăng độ trễ của thao tác đọc.
Nếu thao tác đọc rất ngắn hoặc tỷ lệ ghi cao, chi phí quản lý bổ sung của khóa đọc-ghi có thể khiến nó kém hiệu quả hơn mutex thông thường.
Semaphore
Semaphore là phương tiện đồng bộ hóa sử dụng một giá trị nguyên để biểu diễn số lượng tài nguyên có sẵn hoặc số sự kiện đã xảy ra.
Các thao tác cơ bản của semaphore có thể được mô tả như sau.
Thao tác chờ
Nếu giá trị lớn hơn 0, giảm 1 rồi tiếp tục
Nếu giá trị bằng 0, chờ đến khi có thể tiếp tục
Thao tác báo hiệu
Tăng giá trị lên 1
Đánh thức luồng đang chờ nếu cần
Semaphore có giá trị ban đầu là 1 có thể điều phối quyền truy cập vào một tài nguyên, nhưng không hoàn toàn đồng nghĩa với mutex. Mutex có khái niệm chủ sở hữu, trong khi với semaphore, luồng chờ và luồng gửi tín hiệu thường có thể khác nhau.
Semaphore đếm có giá trị ban đầu lớn hơn một có thể giới hạn số lượng tài nguyên giống nhau được sử dụng đồng thời.
Có 4 kết nối khả dụng
↓
Giá trị ban đầu của semaphore là 4
Tác vụ sử dụng kết nối
↓
Giảm giá trị
Tác vụ trả lại kết nối
↓
Tăng giá trị
POSIX định nghĩa semaphore để sử dụng cho đồng bộ hóa giữa tiến trình hoặc luồng. Semaphore không tên có thể được đặt trong bộ nhớ dùng chung, còn semaphore có tên là đối tượng hệ điều hành có tên độc lập mà nhiều tiến trình có thể mở.
Semaphore của Windows cũng duy trì một bộ đếm từ 0 đến giá trị tối đa đã xác định và giới hạn số luồng có thể đồng thời truy cập tài nguyên dùng chung.
Biến điều kiện
Biến điều kiện là đối tượng đồng bộ hóa khiến luồng chờ cho đến khi một điều kiện trạng thái cụ thể trở thành đúng. Biến điều kiện thường được sử dụng cùng mutex bảo vệ trạng thái dùng chung.
Giành mutex
while điều kiện là sai:
Chờ trên biến điều kiện
└── Nhả mutex trong khi chờ
└── Giành lại mutex sau khi thức dậy
Sử dụng trạng thái dùng chung
Nhả mutex
Khi chờ trên biến điều kiện, việc kiểm tra trạng thái và chuyển sang trạng thái chờ phải diễn ra nguyên tử để không bỏ lỡ tín hiệu. Hàm chờ nhả mutex trong lúc đưa luồng vào trạng thái ngủ và giành lại mutex khi luồng được đánh thức.
Tín hiệu của biến điều kiện không phải là trạng thái. Sau khi thức dậy, luồng phải kiểm tra lại điều kiện được bảo vệ. Nguyên nhân là luồng khác có thể đã tiêu thụ trạng thái trước hoặc luồng có thể thức dậy mà không liên quan trực tiếp đến điều kiện. POSIX cũng định nghĩa biến điều kiện là đối tượng đồng bộ hóa cho phép luồng lặp lại việc tạm dừng thực thi cho đến khi điều kiện liên quan trở thành đúng.
Trong thiết kế POSIX, mutex được dùng cho loại trừ tương hỗ ngắn, còn biến điều kiện tương ứng với việc chờ điều kiện tương đối dài hoặc không xác định. Việc sử dụng hai yếu tố cùng nhau được xem là cấu trúc đồng bộ hóa luồng cơ bản.
Sự kiện và đối tượng tín hiệu
Sự kiện là đối tượng đồng bộ hóa thông báo cho một hoặc nhiều luồng đang chờ rằng một sự việc cụ thể đã xảy ra.
Sự kiện có thể ở một trong hai trạng thái sau.
Trạng thái không tín hiệu
- Luồng đang chờ tiếp tục chờ
Trạng thái có tín hiệu
- Luồng đang chờ có thể thực thi
Windows cung cấp sự kiện đặt lại thủ công và sự kiện đặt lại tự động. Sự kiện đặt lại thủ công có thể đánh thức nhiều luồng đang chờ cho đến khi được chuyển lại rõ ràng sang trạng thái không tín hiệu. Sự kiện đặt lại tự động thường đánh thức một luồng rồi tự động quay lại trạng thái không tín hiệu.
Sự kiện có thể được sử dụng trong các tình huống sau.
- Thông báo hoàn tất vào/ra bất đồng bộ
- Thông báo bắt đầu và kết thúc tác vụ
- Chờ nhiều tác vụ hoàn tất khởi tạo
- Truyền yêu cầu kết thúc
- Thông báo thay đổi trạng thái giữa bên sản xuất và bên tiêu thụ
Sự kiện không tự truyền dữ liệu. Dữ liệu thực tế có thể được lưu trong bộ nhớ dùng chung hoặc hàng đợi, còn sự kiện chỉ thông báo rằng dữ liệu đó đã sẵn sàng.
Hàng rào và khởi tạo một lần
Hàng rào là phương tiện đồng bộ hóa khiến nhiều luồng thực thi chờ tại một điểm nhất định cho đến khi tất cả cùng đến.
Luồng A ─── đến hàng rào ─── chờ
Luồng B ───────── đến hàng rào ─── chờ
Luồng C ───────────── đến hàng rào
↓
Tất cả tiếp tục sang giai đoạn sau
Cơ chế này có thể được sử dụng khi chia phép tính song song thành nhiều giai đoạn và chỉ bắt đầu giai đoạn tiếp theo sau khi mọi tác vụ của giai đoạn trước hoàn tất.
Khởi tạo một lần bảo đảm rằng việc khởi tạo đối tượng dùng chung hoặc trạng thái toàn cục chỉ được thực hiện chính xác một lần trong toàn bộ chương trình. Ngay cả khi nhiều luồng đồng thời gọi hàm khởi tạo, chỉ một luồng thực hiện việc khởi tạo và các luồng còn lại chờ đến khi hoàn tất.
Nếu chỉ kiểm tra một giá trị logic biểu thị việc khởi tạo đã hoàn tất, điều kiện tranh chấp có thể xảy ra giữa thao tác kiểm tra và khởi tạo. Vì vậy, cần sử dụng chức năng khởi tạo một lần do hệ điều hành hoặc runtime cung cấp.
Bên sản xuất và bên tiêu thụ
Bài toán sản xuất-tiêu thụ là một bài toán đồng bộ hóa tiêu biểu trong đó một hoặc nhiều bên sản xuất tạo dữ liệu và một hoặc nhiều bên tiêu thụ xử lý dữ liệu đó.
Bên sản xuất
↓ thêm dữ liệu
Bộ đệm dùng chung
↓ lấy dữ liệu
Bên tiêu thụ
Nếu bộ đệm có kích thước giới hạn, cần điều phối các điều kiện sau.
- Khi bộ đệm đầy, bên sản xuất phải chờ.
- Khi bộ đệm rỗng, bên tiêu thụ phải chờ.
- Nhiều bên sản xuất và tiêu thụ không được đồng thời làm hỏng cấu trúc bộ đệm.
Thông thường, mutex bảo vệ chính bộ đệm, còn hai điều kiện không rỗng và chưa đầy có thể được chờ bằng biến điều kiện. Một phương thức khác là sử dụng hai semaphore biểu diễn số ô trống và số phần tử dữ liệu. Semaphore đếm của POSIX cũng được mô tả là phương tiện đồng bộ hóa phù hợp với bài toán quản lý số lượng tài nguyên như sản xuất-tiêu thụ.
Cấu trúc tương tự được sử dụng trong hàng đợi vào/ra, hàng đợi gói mạng, bộ lập lịch tác vụ và hệ thống ghi nhật ký của hệ điều hành.
Bế tắc
Bế tắc là trạng thái trong đó hai hoặc nhiều luồng thực thi chờ tài nguyên do nhau giữ và không luồng nào có thể tiếp tục.
Có thể lấy ví dụ sau.
Luồng A
giành khóa 1
chờ khóa 2
Luồng B
giành khóa 2
chờ khóa 1
Hai luồng chờ đối phương nhả khóa, nhưng không bên nào có thể tiến đến vị trí nhả khóa đang giữ.
Các điều kiện hình thành bế tắc thường được mô tả như sau.
- Loại trừ tương hỗ: tài nguyên chỉ được một luồng thực thi sử dụng tại một thời điểm.
- Giữ và chờ: luồng giữ một tài nguyên trong khi chờ tài nguyên khác.
- Không thể chiếm đoạt: không thể cưỡng chế lấy tài nguyên khỏi luồng thực thi đang giữ.
- Chờ vòng: nhiều luồng thực thi chờ tài nguyên của nhau theo một vòng khép kín.
Nếu loại bỏ ít nhất một trong bốn điều kiện này, bế tắc có thể được ngăn chặn.
Các phương pháp phòng tránh tiêu biểu bao gồm:
- Giành mọi khóa theo một thứ tự toàn cục đã xác định.
- Yêu cầu nhiều tài nguyên cùng một lúc.
- Nếu không giành được khóa, nhả các khóa đã có rồi thử lại.
- Đặt giới hạn thời gian cho việc chờ khóa.
- Giảm trạng thái dùng chung và sử dụng truyền thông điệp.
- Gom các trạng thái liên quan dưới cùng một khóa.
- Sử dụng cấu trúc dữ liệu không khóa hoặc giao dịch.
Thống nhất thứ tự giành khóa là một phương pháp thực tế để loại bỏ chờ vòng. Phân tích lỗi đồng thời trong OSTEP cũng mô tả việc giành nhiều khóa theo thứ tự khác nhau là một nguyên nhân tiêu biểu của bế tắc.
Hệ điều hành không tự động giải quyết mọi bế tắc trong chương trình người dùng. Cơ sở dữ liệu và một số hệ thống quản lý tài nguyên có thể phân tích quan hệ chờ để phát hiện bế tắc và hủy một tác vụ, nhưng với khóa luồng thông thường, chương trình phải tự thiết kế chính sách phòng tránh và phục hồi.
Đói tài nguyên và livelock
Tình trạng đói tài nguyên là trạng thái trong đó một tác vụ có thể thực thi nhưng thực tế không nhận được tài nguyên hoặc thời gian CPU cần thiết vì các tác vụ khác liên tục được ưu tiên.
Điều này có thể xảy ra khi các tác vụ ưu tiên cao liên tục xuất hiện hoặc khi khóa đọc liên tục được giành khiến thao tác ghi không thể tiến triển. Có thể giảm vấn đề này bằng thứ tự chờ công bằng, điều chỉnh mức ưu tiên và tăng mức ưu tiên cho tác vụ đã chờ lâu.
Livelock là trạng thái trong đó nhiều luồng thực thi không bị dừng nhưng liên tục thay đổi trạng thái để phản ứng với nhau mà không hoàn thành công việc thực tế.
Luồng A: nhường tài nguyên để tránh xung đột
Luồng B: đồng thời nhường tài nguyên
Luồng A và B: thử lại
Lặp lại cùng quá trình
Có thể thêm độ trễ ngẫu nhiên vào thời gian thử lại hoặc cấp quyền ưu tiên cho một bên để giảm xung đột lặp lại.
Trong bế tắc, các luồng thực thi dừng lại trong trạng thái chờ, còn trong livelock chúng vẫn tiếp tục thực thi nhưng không đạt được tiến triển.
Đảo ngược ưu tiên
Đảo ngược ưu tiên là tình trạng một tác vụ ưu tiên cao phải chờ tài nguyên do tác vụ ưu tiên thấp giữ, trong khi tác vụ ưu tiên trung bình liên tục ngăn tác vụ ưu tiên thấp thực thi, khiến tác vụ ưu tiên cao bị trì hoãn lâu.
Tác vụ ưu tiên thấp
đang giữ khóa
Tác vụ ưu tiên cao
chờ cùng khóa
Tác vụ ưu tiên trung bình
liên tục được chạy trước tác vụ ưu tiên thấp
Để giảm vấn đề này, có thể sử dụng kế thừa ưu tiên, trong đó chủ sở hữu khóa ưu tiên thấp tạm thời được nâng lên mức ưu tiên cao, hoặc cơ chế trần ưu tiên, trong đó mức ưu tiên được nâng lên giá trị đã định khi giành khóa. Thuộc tính mutex POSIX cũng có thể bao gồm đặc tính đồng bộ hóa dành cho kế thừa ưu tiên và trần ưu tiên.
Trong hệ điều hành thời gian thực, đảo ngược ưu tiên đặc biệt quan trọng vì nó có thể khiến tác vụ vi phạm thời hạn.
Tranh chấp khóa và khả năng mở rộng
Khi nhiều luồng thực thi thường xuyên cố giành cùng một khóa, tranh chấp khóa xảy ra. Do chỉ một luồng có thể sử dụng vùng tới hạn tại một thời điểm, việc tăng số lõi CPU có thể không còn cải thiện hiệu năng hoặc thậm chí làm hiệu năng giảm.
Các phương pháp giảm tranh chấp bao gồm:
- Chia trạng thái dùng chung thành nhiều phần và sử dụng khóa riêng cho từng phần.
- Sử dụng dữ liệu chỉ đọc và đối tượng bất biến.
- Sử dụng dữ liệu riêng theo luồng hoặc theo CPU rồi kết hợp sau.
- Không thực hiện vào/ra hoặc tính toán dài bên trong vùng tới hạn.
- Chỉ định một chủ sở hữu cho cấu trúc dữ liệu và yêu cầu công việc bằng thông điệp.
- Sử dụng phép toán nguyên tử hoặc thuật toán không khóa.
- Sử dụng sao chép khi ghi và thao tác đọc dựa trên phiên bản.
Tăng số lượng khóa có thể giảm tranh chấp nhưng làm phức tạp việc quản lý thứ tự khóa và tính nhất quán dữ liệu. Vì vậy, độ chi tiết của khóa là một lựa chọn thiết kế giữa hiệu năng và tính đúng đắn.
Cấu trúc không khóa
Thuật toán không khóa cho phép nhiều luồng thực thi thay đổi cấu trúc dữ liệu bằng phép toán nguyên tử mà không tuần tự hóa mọi truy cập bằng mutex truyền thống.
Cấu trúc không khóa có thể hướng đến tính chất cho phép tác vụ khác tiếp tục tiến triển ngay cả khi một tác vụ bị dừng. Một bảo đảm mạnh hơn là cấu trúc không chờ, trong đó mọi tác vụ hoàn tất trong số bước hữu hạn.
Phương thức không khóa có thể mang lại những ưu điểm sau.
- Giảm tình trạng toàn hệ thống dừng vì chủ sở hữu khóa bị dừng.
- Có thể tăng khả năng mở rộng trong một số môi trường tranh chấp cao.
- Có thể tránh đảo ngược ưu tiên và bế tắc truyền thống.
Ngược lại, việc triển khai và kiểm chứng rất khó, đồng thời phải xem xét các vấn đề sau.
- Thứ tự bộ nhớ
- Thu hồi an toàn đối tượng đã bị loại bỏ
- Vấn đề ABA, trong đó một giá trị thay đổi rồi quay lại giá trị cũ
- Đói tài nguyên do thử lại
- Khác biệt giữa các lệnh nguyên tử theo kiến trúc
Vì vậy, trong chương trình thông thường, nên sử dụng cấu trúc dữ liệu đồng thời đã được kiểm chứng và thư viện của hệ điều hành hoặc runtime.
Giao tiếp liên tiến trình
Tiến trình có không gian địa chỉ tách biệt nên một tiến trình không thể trực tiếp đọc hoặc ghi bộ nhớ thông thường của tiến trình khác. Để trao đổi dữ liệu hoặc thông báo việc bắt đầu và hoàn tất công việc, tiến trình phải sử dụng phương tiện giao tiếp liên tiến trình do hệ điều hành cung cấp. Cơ chế này còn được gọi là IPC.
Giao tiếp liên tiến trình cung cấp một hoặc nhiều chức năng sau.
- Truyền luồng byte
- Truyền theo đơn vị thông điệp
- Chia sẻ vùng bộ nhớ
- Thông báo sự kiện và trạng thái
- Đồng bộ hóa quyền truy cập tài nguyên
- Truyền quyền và danh tính giữa các tiến trình
- Giao tiếp với hệ thống từ xa trên cùng máy hoặc qua mạng
Các phương tiện giao tiếp tiêu biểu bao gồm:
| Phương thức | Đặc điểm chính |
|---|---|
| Pipe | Thường là luồng byte một chiều |
| Pipe có tên | Cho phép các tiến trình không có quan hệ trực tiếp kết nối qua tên |
| Hàng đợi thông điệp | Giữ ranh giới thông điệp và lưu trong hàng đợi của nhân |
| Bộ nhớ dùng chung | Ánh xạ cùng bộ nhớ vật lý vào nhiều tiến trình |
| Socket | Giao tiếp cục bộ hoặc qua mạng |
| Tín hiệu | Thông báo sự kiện với lượng thông tin hạn chế |
| Tệp | Bền vững và đơn giản nhưng cần xem xét đồng bộ hóa và hiệu năng |
| Ánh xạ bộ nhớ | Liên kết tệp hoặc đối tượng dùng chung vào không gian địa chỉ |
| Đối tượng riêng của hệ điều hành | Chức năng nền tảng như cổng, sự kiện và mailslot |
Việc lựa chọn phương thức phụ thuộc vào kích thước và cấu trúc dữ liệu cần truyền, độ trễ, tính hai chiều, bảo mật, vòng đời tiến trình và khả năng mở rộng qua mạng.
Pipe
Pipe là đối tượng giao tiếp của nhân cho phép một tiến trình ghi byte và tiến trình khác đọc chúng theo thứ tự.
Tiến trình A
↓ ghi
Bộ đệm pipe
↓ đọc
Tiến trình B
Pipe ẩn danh truyền thống thường được sử dụng giữa các tiến trình có quan hệ có thể kế thừa hoặc truyền bộ mô tả tệp, chẳng hạn tiến trình cha và con. Pipeline của shell cũng kết nối đầu ra chuẩn của một chương trình với đầu vào chuẩn của chương trình tiếp theo.
Chương trình A | Chương trình B | Chương trình C
Pipe thường là luồng byte nên không được giả định rằng ranh giới của nhiều lần ghi sẽ được giữ nguyên khi đọc. Nếu cần giao thức giao tiếp, chương trình phải tự bao gồm thông tin độ dài hoặc ký tự phân cách.
Nếu bộ đệm pipe đầy, thao tác ghi có thể phải chờ, còn nếu không có dữ liệu, thao tác đọc có thể phải chờ. Khi mọi đầu ghi đã đóng, bên đọc có thể nhận trạng thái kết thúc tệp. Nếu cố ghi vào pipe không còn tiến trình đọc, có thể phát sinh lỗi hoặc tín hiệu.
Pipe có tên
Pipe có tên có một tên trong đường dẫn hệ thống tệp hoặc không gian tên của hệ điều hành, nên các tiến trình không có quan hệ cha-con cũng có thể kết nối thông qua cùng tên. Trong các hệ điều hành thuộc họ UNIX, cơ chế này còn được gọi là FIFO.
Tên chỉ cung cấp điểm kết nối, còn dữ liệu thực tế không được lưu bền vững như tệp thông thường mà được truyền qua bộ đệm pipe của nhân.
Pipe có tên của Windows có thể được dùng không chỉ cho tiến trình cục bộ mà còn cho giao tiếp máy khách-máy chủ qua mạng tùy theo cấu hình, đồng thời có thể hỗ trợ giao tiếp hai chiều theo thông điệp hoặc byte. Hệ thống IPC của Windows cung cấp nhiều phương tiện như pipe, ánh xạ tệp và mailslot.
Hàng đợi thông điệp
Hàng đợi thông điệp là phương thức trong đó dữ liệu do bên gửi gửi được lưu theo từng thông điệp trong hàng đợi của hệ điều hành và bên nhận lấy chúng ra.
Tiến trình gửi
↓ thông điệp
┌───────────────────────┐
│ Thông điệp 1 │
│ Thông điệp 2 │
│ Thông điệp 3 │
└───────────────────────┘
↓
Tiến trình nhận
Khác với luồng byte của pipe, ranh giới của từng thông điệp có thể được giữ nguyên. Một số cách triển khai hỗ trợ mức ưu tiên thông điệp, thông báo bất đồng bộ và giới hạn thời gian.
Ưu điểm là bên gửi và bên nhận không cần thực thi tại cùng một thời điểm, nhưng dung lượng hàng đợi bị giới hạn và việc truyền dữ liệu lớn có thể phát sinh chi phí sao chép giữa không gian người dùng và không gian nhân.
Linux cung cấp các hệ thống IPC như hàng đợi thông điệp POSIX và hàng đợi thông điệp System V. Bộ mô tả hàng đợi thông điệp POSIX có thể có đặc điểm triển khai cho phép kết hợp với cơ chế giám sát dựa trên bộ mô tả tệp.
Bộ nhớ dùng chung
Bộ nhớ dùng chung là phương thức giao tiếp ánh xạ cùng một vùng bộ nhớ vật lý vào không gian địa chỉ ảo của nhiều tiến trình.
Không gian địa chỉ tiến trình A ─┐
├── Trang vật lý dùng chung
Không gian địa chỉ tiến trình B ─┘
Do không cần lặp lại việc sao chép dữ liệu qua pipe hoặc hàng đợi thông điệp, phương thức này phù hợp với dữ liệu lớn và giao tiếp độ trễ thấp.
Tuy nhiên, hệ điều hành chỉ liên kết vùng bộ nhớ để chia sẻ; cấu trúc dữ liệu bên trong không tự động trở nên an toàn. Nếu nhiều tiến trình thay đổi cùng dữ liệu, cần sử dụng mutex dùng chung giữa tiến trình, semaphore hoặc phép toán nguyên tử.
Ánh xạ tệp của Windows cũng có thể liên kết cùng một tệp hoặc vùng dựa trên page file vào không gian địa chỉ của nhiều tiến trình để sử dụng như bộ nhớ dùng chung. Tài liệu Microsoft giải thích rằng ánh xạ tệp là phương thức IPC cục bộ hiệu quả nhưng cần đồng bộ hóa bằng semaphore hoặc cơ chế tương tự để tránh hỏng dữ liệu.
Trong giao tiếp bằng bộ nhớ dùng chung, cần xác định riêng các vấn đề sau.
- Cấu trúc dữ liệu của vùng bộ nhớ
- Tiến trình chịu trách nhiệm khởi tạo
- Quyền sở hữu dữ liệu
- Thứ tự đọc và ghi
- Phục hồi khi tiến trình kết thúc bất thường
- Tương thích phiên bản và kích thước cấu trúc
- Quyền truy cập
- Bộ nhớ đệm và thứ tự bộ nhớ
Nếu một tiến trình kết thúc trong khi giữ khóa dùng chung, tiến trình khác có thể phải chờ vô hạn. Một số hệ điều hành và API đồng bộ hóa cung cấp chức năng như mutex bền vững có thể phát hiện chủ sở hữu đã kết thúc, nhưng trách nhiệm khôi phục tính nhất quán của chính cấu trúc dữ liệu dùng chung vẫn thuộc về chương trình. POSIX cũng xử lý riêng trường hợp luồng sở hữu mutex kết thúc tùy theo loại mutex và chính sách phục hồi.
Socket
Socket là giao diện dùng để trao đổi dữ liệu giữa hai đầu cuối giao tiếp. Nó có thể kết nối không chỉ các tiến trình trên cùng một máy tính mà còn các tiến trình trên những máy khác thông qua mạng.
Các loại socket chính bao gồm:
- Luồng byte hướng kết nối
- Datagram không kết nối
- Socket miền cục bộ
- Socket miền mạng
Giao tiếp cục bộ
Tiến trình A
↓
Socket cục bộ
↓
Tiến trình B
Giao tiếp mạng
Máy khách
↓ mạng
Socket máy chủ
↓
Tiến trình máy chủ
Trên một số nền tảng, socket cục bộ có thể truyền thông tin xác thực của tiến trình hoặc tài nguyên hệ điều hành như bộ mô tả tệp trong khi giao tiếp trên cùng hệ thống. Socket mạng cung cấp giao tiếp từ xa thông qua các giao thức như TCP và UDP.
Socket có tính tổng quát cao nhưng ứng dụng phải xử lý định dạng thông điệp, tuần tự hóa, đọc và ghi từng phần, đóng kết nối, lỗi và tái kết nối.
Tín hiệu
Tín hiệu là phương tiện để hệ điều hành hoặc tiến trình khác thông báo một sự kiện bất đồng bộ cho tiến trình.
Tín hiệu có thể biểu thị các tình huống sau.
- Yêu cầu ngắt của người dùng
- Truy cập bộ nhớ không hợp lệ
- Tiến trình con kết thúc
- Bộ định thời hết hạn
- Trạng thái kết nối terminal thay đổi
- Yêu cầu kết thúc tiến trình
Tín hiệu chỉ có thể truyền lượng thông tin hạn chế, còn trình xử lý tín hiệu có thể chạy tại một điểm bất kỳ trong chương trình nên không thể tự do sử dụng mọi hàm và cấu trúc dữ liệu thông thường. Nó phù hợp với thông báo sự kiện và điều khiển hơn là truyền dữ liệu phức tạp.
Trong cấu trúc an toàn, trình xử lý tín hiệu có thể chỉ thay đổi trạng thái tối thiểu hoặc chuyển sự kiện đến vòng lặp dựa trên bộ mô tả tệp, còn việc xử lý thực tế được thực hiện trong ngữ cảnh thực thi thông thường.
Tệp và ánh xạ bộ nhớ
Tệp thông thường cũng có thể được sử dụng làm phương tiện giao tiếp giữa các tiến trình. Việc một tiến trình ghi dữ liệu và tiến trình khác đọc lại có ưu điểm là đơn giản và dữ liệu vẫn tồn tại sau khi chương trình kết thúc.
Tuy nhiên, nếu nhiều tiến trình thay đổi cùng một tệp, cần xem xét các vấn đề sau.
- Khóa tệp
- Đổi tên nguyên tử
- Thứ tự ghi và flush bộ đệm
- Dữ liệu chỉ được ghi một phần
- Phiên bản định dạng tệp
- Phục hồi sau sự cố
Ánh xạ bộ nhớ cho phép liên kết nội dung tệp với không gian địa chỉ của tiến trình và đọc hoặc ghi bằng thao tác truy cập bộ nhớ thông thường. Nếu nhiều tiến trình ánh xạ dùng chung cùng một vùng tệp, chúng có thể giao tiếp theo cách tương tự bộ nhớ dùng chung.
Phương thức dựa trên tệp phù hợp khi cần tính bền vững hoặc các tiến trình không cần chạy đồng thời, nhưng có thể phức tạp hơn pipe và socket khi trao đổi các thông điệp nhỏ theo thời gian thực.
Gọi thủ tục từ xa
Gọi thủ tục từ xa là phương thức trừu tượng hóa giao tiếp để một hàm chạy trong tiến trình hoặc máy tính khác có thể được gọi như một hàm cục bộ.
Máy khách gọi hàm
↓
Tuần tự hóa đối số
↓
Truyền qua tiến trình hoặc mạng
↓
Thực thi hàm phía máy chủ
↓
Tuần tự hóa kết quả
↓
Trả về máy khách
Trong thực tế, độ trễ mạng, mất kết nối, máy chủ kết thúc, thông điệp trùng lặp và hết thời gian có thể xảy ra, nên RPC không thể có ý nghĩa hoàn toàn giống lời gọi hàm cục bộ thông thường.
Hệ điều hành và dịch vụ hệ thống có thể sử dụng giao diện dựa trên thông điệp tương tự RPC để giao tiếp giữa các thành phần nội bộ. Trong kiến trúc vi nhân, hệ thống tệp và dịch vụ thiết bị chạy dưới dạng tiến trình riêng biệt, nên IPC hiệu quả có ảnh hưởng lớn đến hiệu năng hệ điều hành.
Mối quan hệ giữa giao tiếp và đồng bộ hóa
Giao tiếp và đồng bộ hóa có vẻ là hai chức năng riêng biệt nhưng trên thực tế liên hệ chặt chẽ với nhau.
Bộ nhớ dùng chung có thể trao đổi dữ liệu nhanh nhưng cần đối tượng đồng bộ hóa để điều phối truy cập dữ liệu. Ngược lại, pipe và hàng đợi thông điệp tự thân đã có một mức hiệu ứng đồng bộ hóa nhất định. Bên nhận có thể chờ đến khi dữ liệu đến, còn bên gửi có thể chờ đến khi hàng đợi có chỗ trống.
Phương thức bộ nhớ dùng chung
Chia sẻ dữ liệu
+
Mutex, semaphore và sự kiện
Phương thức truyền thông điệp
Truyền thông điệp
=
Di chuyển dữ liệu + thông báo sự kiện
Bộ nhớ dùng chung cung cấp hiệu năng và tính linh hoạt cao nhưng phải trực tiếp quản lý bí danh, vòng đời và đồng bộ hóa. Truyền thông điệp có thể phân tách trạng thái của từng tác vụ rõ ràng hơn, nhưng phát sinh chi phí sao chép dữ liệu, tuần tự hóa và quản lý hàng đợi.
Một số hệ thống sử dụng cấu trúc lai, trong đó dữ liệu thực tế nằm trong bộ nhớ dùng chung, còn pipe, sự kiện hoặc socket chỉ truyền vị trí và trạng thái sẵn sàng của dữ liệu mới.
Blocking và non-blocking
Thao tác đồng bộ hóa và giao tiếp có thể khiến luồng gọi phải chờ nếu công việc không thể hoàn tất ngay. Đây được gọi là phương thức blocking.
Không có dữ liệu để đọc
↓
Chuyển luồng sang trạng thái chờ
↓
Dữ liệu đến
↓
Luồng tiếp tục thực thi
Thao tác non-blocking không chờ nếu không thể xử lý ngay mà trả về lỗi hoặc trạng thái hiện tại. Chương trình có thể thử lại sau hoặc đồng thời giám sát trạng thái sẵn sàng của nhiều đối tượng giao tiếp.
Phương thức non-blocking hữu ích cho chương trình hướng sự kiện quản lý nhiều kết nối bằng một luồng, nhưng máy trạng thái, hoàn tất từng phần và xử lý lỗi có thể trở nên phức tạp. Cú pháp bất đồng bộ như async và await giúp biểu diễn chuyển đổi trạng thái của vào/ra non-blocking theo hình thức gần giống mã tuần tự.
Blocking không có nghĩa là luôn tiếp tục tiêu thụ CPU. Khi chờ theo cơ chế thông thường của hệ điều hành, luồng được loại khỏi đối tượng lập lịch và được đánh thức khi sự kiện xảy ra. Ngược lại, spin wait tiếp tục dùng CPU để kiểm tra trạng thái.
Tính đồng thời hướng sự kiện
Trong lập trình hướng sự kiện, một hoặc một số ít luồng chờ sự kiện từ nhiều đối tượng vào/ra và thực thi trình xử lý tương ứng với sự kiện đã sẵn sàng.
Vòng lặp sự kiện
↓
Chờ trạng thái sẵn sàng của vào/ra
↓
Kiểm tra kết nối đã sẵn sàng
↓
Thực thi trình xử lý tương ứng
↓
Quay lại chờ
Khi có nhiều kết nối mạng phần lớn ở trạng thái chờ, mô hình này có thể giảm chi phí tạo một luồng cho mỗi kết nối. Tuy nhiên, nếu một trình xử lý sử dụng CPU quá lâu, việc xử lý các sự kiện khác sẽ bị trì hoãn, nên phép tính dài phải được chuyển cho worker riêng.
Cấu trúc hướng sự kiện có thể giảm trạng thái dùng chung và vấn đề khóa trong đa luồng, nhưng khó quản lý trạng thái tác vụ trải dài qua nhiều callback và sự kiện. OSTEP cũng trình bày tính đồng thời hướng sự kiện như một phương án thay thế để tránh một phần điều kiện tranh chấp và bế tắc phát sinh trong mô hình dựa trên luồng và khóa.
Tính đồng thời bên trong hệ điều hành
Vấn đề đồng thời không chỉ tồn tại trong chương trình người dùng. Nhân hệ điều hành có thể đồng thời thực thi trong các ngữ cảnh sau.
- Lời gọi hệ thống chạy trên các CPU khác nhau
- Luồng nhân
- Trình xử lý ngắt phần cứng
- Tác vụ xử lý trì hoãn
- Callback hoàn tất thiết bị
- Kết thúc tiến trình và dọn dẹp tài nguyên
- Bộ định thời và bộ lập lịch
Nhân phải bảo vệ các cấu trúc dữ liệu dùng chung như danh sách tiến trình, bảng trang, bộ nhớ đệm hệ thống tệp, hàng đợi mạng và trạng thái thiết bị. Phương tiện đồng bộ hóa có thể sử dụng phụ thuộc vào việc ngữ cảnh nhân hiện tại có được phép ngủ, có cho phép ngắt và có thể bị chiếm quyền trên CPU hiện tại hay không.
Nếu dữ liệu được trình xử lý ngắt truy cập được bảo vệ bằng mutex thông thường của luồng, có thể phát sinh vấn đề vì ngữ cảnh ngắt không thể ngủ. Vì vậy, nhân sử dụng các phương thức riêng như spinlock ngắn, vô hiệu hóa ngắt, phép toán nguyên tử và xử lý công việc trì hoãn.
Nếu chờ dữ liệu từ không gian người dùng hoặc phản hồi chậm từ thiết bị trong khi giữ khóa, các tác vụ nhân khác có thể bị chặn lâu. Vì vậy, phạm vi khóa và ngữ cảnh thực thi đặc biệt quan trọng trong đồng bộ hóa nhân.
Bảo vệ giao tiếp liên tiến trình
Đối tượng IPC cũng là tài nguyên do hệ điều hành quản lý nên không phải tiến trình nào cũng được phép truy cập. Hệ điều hành có thể giới hạn quyền truy cập vào đối tượng IPC thông qua người dùng, nhóm, danh sách kiểm soát truy cập, không gian tên và mã định danh bảo mật.
Các đối tượng kiểm tra có thể bao gồm:
- Tiến trình được phép mở bộ nhớ dùng chung
- Người dùng được phép kết nối với pipe có tên
- Tiến trình được phép truy cập địa chỉ socket
- Quyền ghi hoặc đọc hàng đợi thông điệp
- Quyền mở hoặc thay đổi trạng thái đối tượng đồng bộ hóa
- Kiểm tra thông tin xác thực của tiến trình khác
Đối tượng đồng bộ hóa có tên và đối tượng ánh xạ tệp của Windows cũng sử dụng bộ mô tả bảo mật cùng danh sách kiểm soát truy cập để giới hạn quyền của tiến trình khác. Khi nhiều tiến trình chia sẻ đối tượng cùng tên, không chỉ tên đối tượng mà cả cấu hình quyền cũng phải được thiết lập chính xác.
Đối tượng System V IPC và POSIX IPC của Linux cũng có thể sử dụng người dùng, nhóm, bit quyền hoặc không gian tên của hệ thống tệp để kiểm soát truy cập.
Dữ liệu nhận qua IPC phải được xem là đầu vào không đáng tin cậy ngay cả khi đến từ tiến trình khác trên cùng máy tính. Nếu không kiểm tra kích thước, định dạng, quyền và chuyển đổi trạng thái của thông điệp, lỗ hổng bảo mật có thể phát sinh qua ranh giới tiến trình.
Lựa chọn phương tiện đồng bộ hóa
Có thể lựa chọn phương tiện đồng bộ hóa và giao tiếp dựa trên các tiêu chí sau.
| Yêu cầu | Phương thức có thể phù hợp |
|---|---|
| Sửa đổi ngắn dữ liệu dùng chung | Mutex hoặc phép toán nguyên tử |
| Chờ đến khi đạt trạng thái cụ thể | Mutex và biến điều kiện |
| Quản lý số lượng giới hạn tài nguyên giống nhau | Semaphore |
| Thông báo hoàn tất tác vụ | Sự kiện |
| Hợp nhất nhiều tác vụ song song theo giai đoạn | Hàng rào |
| Chia sẻ lượng lớn dữ liệu cục bộ | Bộ nhớ dùng chung và đối tượng đồng bộ hóa |
| Luồng byte đơn giản | Pipe |
| Giữ ranh giới thông điệp | Hàng đợi thông điệp hoặc socket datagram |
| Giao tiếp chung cục bộ và từ xa | Socket |
| Thông báo sự kiện bất đồng bộ | Sự kiện, tín hiệu hoặc thông báo dựa trên bộ mô tả tệp |
| Giữ dữ liệu sau khi tiến trình kết thúc | Tệp hoặc cơ sở dữ liệu |
Không có một phương thức tốt nhất cho mọi tình huống. Bộ nhớ dùng chung nhanh nhưng phức tạp, còn truyền thông điệp tăng khả năng phân tách nhưng phát sinh chi phí sao chép và hàng đợi. Spinlock có thể phù hợp với vùng tới hạn rất ngắn trong nhân nhưng không phù hợp với việc chờ dài trong chương trình người dùng. Khóa đọc-ghi chỉ có thể có lợi khi số thao tác đọc chiếm phần lớn.
Nguyên tắc thiết kế tính đồng thời
Để giảm lỗi đồng thời, điều quan trọng là thiết kế quyền sở hữu dữ liệu và cấu trúc giao tiếp trước thay vì thêm đối tượng đồng bộ hóa về sau.
Các nguyên tắc chính bao gồm:
- Giảm trạng thái biến đổi dùng chung khi có thể.
- Tận dụng dữ liệu bất biến và sao chép giá trị.
- Xác định rõ khóa bảo vệ từng tài nguyên dùng chung.
- Duy trì thứ tự giành khóa nhất quán.
- Tránh tính toán dài và vào/ra trong khi giữ khóa.
- Sử dụng biến điều kiện theo cấu trúc lặp lại việc kiểm tra điều kiện.
- Sử dụng nguyên thủy đồng bộ hóa đã được hệ điều hành kiểm chứng.
- Xem xét việc tiến trình và luồng kết thúc bất thường.
- Xử lý timeout, hủy bỏ và lỗi từng phần.
- Xác định rõ định dạng và phiên bản của thông điệp IPC.
- Kiểm tra dữ liệu nhận được và quyền của đối tượng.
- Xác minh không có điều kiện tranh chấp trước khi tối ưu hiệu năng.
Một cấu trúc loại bỏ nhu cầu đồng thời có thể tốt hơn đồng bộ hóa phức tạp. Nếu một dữ liệu chỉ được một luồng hoặc tiến trình sửa đổi, còn tác vụ khác gửi yêu cầu bằng thông điệp, nhu cầu khóa bộ nhớ dùng chung có thể giảm.
Tuy nhiên, hàng đợi thông điệp và vòng lặp sự kiện cũng phụ thuộc vào đồng bộ hóa và quản lý bộ nhớ của hệ điều hành ở bên trong. Chúng không loại bỏ hoàn toàn vấn đề đồng thời mà chuyển vấn đề sang ranh giới và quy tắc giao tiếp rõ ràng hơn.
Tổng hợp
Tính đồng thời là khả năng cơ bản cho phép hệ điều hành tiến hành chồng lấn nhiều luồng thực thi và khai thác hệ thống đa lõi. Tiến trình và luồng giúp sử dụng hiệu quả CPU và thiết bị vào/ra, nhưng nếu thứ tự truy cập trạng thái dùng chung thay đổi, có thể xảy ra điều kiện tranh chấp, hỏng dữ liệu và bế tắc.
Hệ điều hành cung cấp các chức năng đồng bộ hóa như mutex, semaphore, biến điều kiện, sự kiện và phép toán nguyên tử để điều phối quyền truy cập tài nguyên dùng chung và việc chờ sự kiện. Các tiến trình trao đổi thông tin giữa những không gian địa chỉ tách biệt thông qua pipe, hàng đợi thông điệp, bộ nhớ dùng chung, socket, tín hiệu và ánh xạ tệp.
Đồng bộ hóa không chỉ là chức năng ngăn không cho nhiều luồng cùng chạy một lúc. Nó xác định thứ tự thực thi và khả năng quan sát bộ nhớ, biểu diễn số lượng tài nguyên và thay đổi trạng thái, đồng thời cho phép nhiều tác vụ hợp tác an toàn. Giao tiếp liên tiến trình cũng không chỉ truyền dữ liệu mà còn cấu thành quan hệ bắt đầu và hoàn tất công việc, lỗi và vòng đời.
Hệ điều hành cung cấp các phương tiện cơ bản này, nhưng chương trình và thiết kế hệ thống phải quyết định dữ liệu nào được chia sẻ, khóa được giành theo thứ tự nào và lỗi được phục hồi ra sao. Vì vậy, trọng tâm của tính đồng thời và giao tiếp là kiểm soát những thứ tự thực thi có thể xảy ra trong khi giảm tuần tự hóa không cần thiết, để các tác vụ độc lập có thể tiến triển an toàn.
Bảo mật và cách ly
Hệ điều hành phải bảo vệ để nhiều người dùng và chương trình có thể chia sẻ cùng một phần cứng mà không tùy ý thay đổi dữ liệu hoặc trạng thái thực thi của nhau. Để làm điều này, hệ điều hành kết hợp các chức năng như mức đặc quyền của bộ xử lý, không gian địa chỉ ảo, tài khoản người dùng, quyền truy cập, lời gọi hệ thống, sandbox và ảo hóa để hình thành các ranh giới tin cậy.
Mục tiêu cơ bản của bảo mật hệ điều hành là ngăn các chủ thể không được cấp phép đọc, thay đổi hoặc sử dụng dữ liệu và tài nguyên hệ thống. NIST định nghĩa hệ điều hành đáng tin cậy là hệ điều hành quản lý để chỉ những chủ thể có quyền phù hợp mới có thể truy cập, thay đổi hoặc di chuyển dữ liệu.
Các tài nguyên được hệ điều hành bảo vệ bao gồm:
- Tiến trình và luồng
- Bộ nhớ ảo và bộ nhớ vật lý
- Tệp và thư mục
- Thiết bị và trình điều khiển thiết bị
- Kết nối mạng và cổng
- Tài khoản người dùng và thông tin xác thực
- Đối tượng giao tiếp liên tiến trình
- Nhân và dịch vụ hệ thống
- Khóa mã hóa và thông tin xác thực bảo mật
- Máy ảo và container
Hệ điều hành không đặt mức độ tin cậy giống nhau cho mọi chương trình. Ứng dụng thông thường chạy với quyền hạn bị giới hạn, còn chỉ nhân và một số thành phần hệ thống mới được phép truy cập phần cứng cùng toàn bộ tài nguyên hệ thống. Nếu chương trình cần quyền bổ sung, nó phải đi qua lời gọi hệ thống và quy trình kiểm tra quyền do hệ điều hành cung cấp.
Người dùng và ứng dụng
↓ xác thực và quyền
Không gian người dùng
↓ lời gọi hệ thống
Kiểm tra quyền của nhân
↓
Tệp, bộ nhớ, thiết bị và mạng
Bảo vệ và bảo mật
Bảo vệ là hệ thống kiểm soát một chủ thể trong hệ điều hành có thể truy cập tài nguyên nào và theo cách nào. Bảo mật là khái niệm rộng hơn, bao gồm chức năng bảo vệ cùng với xác thực, mã hóa, kiểm tra tính toàn vẹn, kiểm toán, cập nhật và ứng phó với tấn công.
Trong bảo vệ hệ điều hành, đối tượng thực hiện hành động có thể được gọi là chủ thể, còn đối tượng bị truy cập được gọi là tài nguyên hoặc đối tượng.
| Phân loại | Ví dụ |
|---|---|
| Chủ thể | Người dùng, tiến trình, luồng, dịch vụ hệ thống |
| Đối tượng | Tệp, bộ nhớ, thiết bị, socket, tiến trình, đối tượng IPC |
| Quyền | Đọc, ghi, thực thi, tạo, xóa, điều khiển |
| Chính sách | Chủ thể nào có thể truy cập đối tượng nào với quyền nào |
Tiến trình vừa có thể là chủ thể hoạt động thay mặt người dùng, vừa có thể trở thành đối tượng mà tiến trình khác truy cập. Nghiên cứu bảo vệ hệ điều hành thời kỳ đầu cũng phân biệt chủ thể chủ động như người dùng và tiến trình với các đối tượng được bảo vệ như tệp, thiết bị và tiến trình khác, đồng thời nghiên cứu cấu trúc ngăn truy cập trái phép.
Việc có chức năng bảo vệ không có nghĩa hệ điều hành tự động trở nên an toàn. Cấu hình quyền sai, dịch vụ hệ thống có lỗ hổng, lỗi nhân, trình điều khiển thiết bị không an toàn và phán đoán sai của người dùng đều có thể gây ra vấn đề bảo mật. Để giảm những rủi ro này, hệ điều hành kết hợp nhiều lớp thay vì phụ thuộc vào một biện pháp phòng vệ duy nhất.
Chế độ người dùng và chế độ nhân
Bộ xử lý hiện đại có thể thực thi mã ở nhiều mức đặc quyền khác nhau. Hệ điều hành sử dụng khả năng này để phân tách chương trình thông thường khỏi nhân.
- Trong chế độ người dùng, ứng dụng chỉ sử dụng các lệnh bị giới hạn và không gian địa chỉ của chính nó.
- Trong chế độ nhân, mã cốt lõi của hệ điều hành có thể truy cập toàn bộ bộ nhớ, thiết bị và chức năng điều khiển bộ xử lý.
Trong Windows, ứng dụng cũng chạy ở chế độ người dùng, còn các thành phần cốt lõi của hệ điều hành chạy ở chế độ nhân. Nhiều trình điều khiển hoạt động trong chế độ nhân, nhưng một số trình điều khiển có thể chạy trong chế độ người dùng.
Chế độ người dùng
- Ứng dụng thông thường
- Không gian địa chỉ bị giới hạn
- Hạn chế truy cập trực tiếp phần cứng
- Không thể sử dụng lệnh đặc quyền
↓ lời gọi hệ thống
Chế độ nhân
- Nhân
- Trình quản lý bộ nhớ
- Bộ lập lịch
- Hệ thống tệp
- Ngăn xếp mạng
- Một số trình điều khiển thiết bị
Nếu chương trình chế độ người dùng có thể trực tiếp thay đổi bảng trang, vô hiệu hóa ngắt hoặc tùy ý điều khiển thanh ghi thiết bị, một chương trình duy nhất có thể làm hỏng toàn bộ hệ thống. Vì vậy, những thao tác này được giới hạn thành lệnh đặc quyền và được nhân thực hiện thay.
Khi lời gọi hệ thống xảy ra, bộ xử lý chuyển sang chế độ nhân thông qua một điểm vào được kiểm soát. Nhân kiểm tra số hiệu lời gọi, đối số, địa chỉ bộ nhớ người dùng và quyền truy cập, sau đó xử lý yêu cầu rồi quay lại chế độ người dùng.
Lỗi trong chế độ nhân có ảnh hưởng lớn hơn lỗi trong chế độ người dùng. Vì mã nhân và trình điều khiển có thể truy cập bộ nhớ của tiến trình khác cùng toàn bộ tài nguyên hệ thống, truy cập bộ nhớ sai có thể dẫn đến hệ thống ngừng hoạt động hoặc leo thang đặc quyền.
Cách ly không gian địa chỉ
Hệ điều hành cung cấp cho mỗi tiến trình người dùng một không gian địa chỉ ảo độc lập. Ngay cả khi hai tiến trình khác nhau sử dụng cùng một giá trị địa chỉ ảo, chúng vẫn có thể được ánh xạ đến những vùng bộ nhớ vật lý khác nhau.
Trong Windows, mỗi tiến trình chế độ người dùng cũng có một không gian địa chỉ ảo riêng, còn mã chế độ nhân sử dụng một không gian địa chỉ hệ thống chung riêng biệt.
Tiến trình A
Địa chỉ ảo 0x1000
↓
Trang vật lý A
Tiến trình B
Địa chỉ ảo 0x1000
↓
Trang vật lý B
Mục bảng trang có thể chứa các thuộc tính bảo vệ sau.
- Có cho phép truy cập từ chế độ người dùng hay không
- Quyền đọc
- Quyền ghi
- Quyền thực thi
- Trang hiện có hợp lệ hay không
- Có phải trang dùng chung hay không
- Trang đã bị thay đổi hay chưa
Vùng mã có thể được đặt thành chỉ đọc và cho phép thực thi, còn vùng dữ liệu thông thường có thể cho phép ghi nhưng không cho phép thực thi. Điều này làm cho các cuộc tấn công chèn dữ liệu rồi thực thi dữ liệu đó như mã máy trở nên khó hơn.
Nếu tiến trình truy cập địa chỉ không được phép hoặc cố sửa đổi vùng chỉ đọc, bộ xử lý sẽ phát sinh ngoại lệ. Nhân xác định xem truy cập đó có thể được giải quyết hợp lệ bằng phân trang theo yêu cầu hoặc sao chép khi ghi hay không. Nếu không thể giải quyết, hệ điều hành gửi lỗi đến tiến trình hoặc kết thúc nó.
Cách ly không gian địa chỉ ngăn sự xâm phạm vô ý giữa các chương trình và một số hình thức tấn công, nhưng không phải là ranh giới bảo mật tuyệt đối. Nếu nhân hoặc trình điều khiển thiết bị có lỗi, chúng có thể truy cập bộ nhớ của tiến trình khác. Khi tiến trình chủ động kết nối bộ nhớ dùng chung, vùng đó cũng được nhiều bên cùng truy cập.
Người dùng và tài khoản
Tài khoản người dùng là chủ thể logic mà hệ điều hành sử dụng để phân biệt danh tính của con người, dịch vụ và tác vụ hệ thống. Tiến trình thường kế thừa thông tin xác thực bảo mật của người dùng đã khởi chạy nó.
Hệ điều hành có thể quản lý các thông tin sau cho từng người dùng.
- Mã định danh người dùng
- Nhóm thành viên
- Thông tin đăng nhập
- Thư mục mặc định
- Quyền được cấp
- Giới hạn tài nguyên
- Chính sách bảo mật
- Thông tin kiểm toán
Một người có thể sử dụng nhiều tài khoản, và cũng có những tài khoản dịch vụ không được con người đăng nhập trực tiếp. Việc cấp tài khoản riêng cho từng dịch vụ giúp giới hạn để ngay cả khi dịch vụ bị xâm nhập, nó chỉ có thể truy cập tài nguyên được phép cho tài khoản đó.
Nhóm là đơn vị dùng để cấp quyền chung cho nhiều người dùng. Thay vì lặp lại cùng một quyền cho từng người, có thể phân bổ quyền cho nhóm dựa trên vai trò hoặc tổ chức.
Hệ điều hành phân biệt xác thực, tức xác định người dùng đang đăng nhập là ai, với ủy quyền, tức xác định người dùng đã được xác thực có được phép thực hiện một hành động cụ thể hay không.
Xác thực
Ai đã gửi yêu cầu
Ủy quyền
Chủ thể đó có được phép thực hiện công việc đã yêu cầu hay không
Mật khẩu, khóa bảo mật, thông tin sinh trắc học, thẻ thông minh và xác thực đa yếu tố có thể được dùng để xác thực người dùng. Ngay cả khi xác thực thành công, người dùng không tự động có quyền truy cập mọi tài nguyên mà vẫn phải trải qua kiểm tra quyền theo chính sách của từng đối tượng.
Kiểm soát truy cập
Kiểm soát truy cập xác định những thao tác mà chủ thể có thể thực hiện đối với đối tượng. Khi mở tệp, điều khiển tiến trình hoặc truy cập thiết bị, hệ điều hành so sánh thông tin xác thực của tiến trình hiện tại với thông tin bảo mật của đối tượng.
Các quyền truy cập tiêu biểu bao gồm:
- Đọc
- Ghi
- Thực thi
- Tạo
- Xóa
- Thay đổi quyền sở hữu
- Thay đổi quyền
- Điều khiển tiến trình khác
- Sử dụng thiết bị
- Sử dụng cổng mạng
Kiểm soát truy cập tùy ý
Trong kiểm soát truy cập tùy ý, chủ sở hữu đối tượng có thể quyết định trong một phạm vi nhất định những quyền nào được cấp cho người dùng và nhóm khác. Quyền chủ sở hữu, nhóm và người dùng khác trong hệ UNIX cùng danh sách kiểm soát truy cập của Windows là những ví dụ tiêu biểu.
Quyền tệp truyền thống của hệ UNIX được phân loại như sau.
Quyền của chủ sở hữu
Quyền của nhóm
Quyền của người dùng khác
Mỗi nhóm quyền
- Đọc
- Ghi
- Thực thi
Quyền đọc, ghi và thực thi trên thư mục có thể mang ý nghĩa khác so với tệp thông thường. Quyền thực thi trên thư mục có thể biểu thị quyền đi qua đường dẫn bên trong thư mục đó.
Danh sách kiểm soát truy cập
Danh sách kiểm soát truy cập là phương thức ghi lại các quyền cho phép hoặc từ chối cụ thể của nhiều người dùng và nhóm đối với một đối tượng.
Tệp tài liệu
Người dùng A: đọc, ghi
Người dùng B: đọc
Nhóm C: đọc
Người dùng D: từ chối truy cập
Phương thức này có thể biểu diễn chính sách chi tiết hơn cách phân loại đơn giản thành chủ sở hữu, nhóm và người dùng khác. Tuy nhiên, khi quy tắc kế thừa và thứ tự cho phép hoặc từ chối trở nên phức tạp, quyền hiệu lực thực tế có thể khó hiểu.
Kiểm soát truy cập bắt buộc
Trong kiểm soát truy cập bắt buộc, chính sách bảo mật toàn hệ thống được ưu tiên hơn quyền tự do thay đổi quyền đối tượng của người dùng. Hệ thống có thể gán cấp bảo mật, vai trò hoặc loại cho tiến trình và đối tượng, sau đó chỉ cho phép những quan hệ đã được chính sách chấp thuận.
Trong Linux, cấu trúc Linux Security Modules cho phép kết nối các triển khai chính sách bảo mật như SELinux và AppArmor với nhân. Hệ điều hành Apple cũng sử dụng các chức năng dựa trên kiểm soát truy cập bắt buộc ở cấp nhân để xây dựng sandbox ứng dụng. Tài liệu kiến trúc hệ điều hành trước đây của Apple cũng giải thích rằng MAC được dùng để giới hạn khả năng của tiến trình và cung cấp sandbox ứng dụng.
Kiểm soát truy cập bắt buộc có thể áp dụng các giới hạn bổ sung ngay cả với tiến trình có quyền quản trị. Tuy nhiên, nếu chính sách phức tạp, hoạt động bình thường của chương trình có thể bị chặn, nên thiết kế chính sách và công cụ chẩn đoán có vai trò quan trọng.
Nguyên tắc đặc quyền tối thiểu
Nguyên tắc đặc quyền tối thiểu là nguyên tắc chỉ cấp cho chương trình và người dùng lượng quyền tối thiểu cần thiết để thực hiện công việc.
Ví dụ, một máy chủ web đơn giản không cần có tất cả các quyền sau.
- Đọc mọi tệp của người dùng
- Truy cập tùy ý thiết bị
- Nạp mô-đun nhân
- Tạo tài khoản người dùng
- Thay đổi thiết lập hệ thống
Nếu chỉ cho phép đọc thư mục nội dung web và sử dụng một cổng mạng giới hạn, phạm vi tài nguyên mà kẻ tấn công có thể sử dụng cũng giảm xuống ngay cả khi máy chủ bị xâm nhập.
Đặc quyền tối thiểu có thể được áp dụng bằng các phương pháp sau.
- Chạy chương trình bằng tài khoản người dùng thông thường
- Sử dụng tài khoản riêng cho từng dịch vụ
- Chỉ cho phép tệp và thiết bị cần thiết
- Chỉ sử dụng quyền quản trị tạm thời
- Tách quyền theo từng chức năng
- Sử dụng sandbox và container
- Loại bỏ quyền không cần thiết khỏi tiến trình con
- Tách chức năng đặc quyền thành một dịch vụ nhỏ riêng biệt
Thay vì giữ quyền đã được cấp trong suốt thời gian chạy của chương trình, chương trình có thể loại bỏ quyền sau khi hoàn thành công việc cần thiết. Ví dụ, chương trình có thể mở cổng mạng rồi hạ quyền quản trị hoặc giao công việc cần đặc quyền cho một tiến trình hỗ trợ nhỏ.
Quản trị viên và leo thang đặc quyền
Hệ điều hành có tài khoản hoặc chủ thể bảo mật đặc quyền cao có thể quản lý thiết lập toàn hệ thống, người dùng, thiết bị và chính sách bảo mật. Trong hệ UNIX, chủ thể này theo truyền thống là root, còn trong Windows là tài khoản quản trị viên và tiến trình có mức toàn vẹn cao.
Nếu người dùng thông thường luôn chạy chương trình với quyền quản trị, lỗi ứng dụng và mã độc có thể ảnh hưởng đến toàn bộ hệ thống. Hệ điều hành hiện đại thực hiện công việc thông thường với quyền hạn bị giới hạn và chỉ yêu cầu xác thực cùng phê duyệt riêng khi cần thay đổi thiết lập hệ thống.
Leo thang đặc quyền là quá trình tiến trình nhận được quyền cao hơn. Thuật ngữ này được dùng cho cả công việc quản trị hợp pháp lẫn cuộc tấn công khai thác lỗ hổng để giành quyền không được phép.
Cấu trúc leo thang đặc quyền an toàn cần các yếu tố sau.
- Xác thực người dùng đã gửi yêu cầu
- Hiển thị rõ công việc sẽ được thực hiện
- Quyền bị giới hạn trong phạm vi cần thiết
- Kiểm tra đầu vào của người dùng
- Ghi lại và kiểm toán hoạt động
- Thu hồi quyền sau khi hoàn tất
Thành phần đặc quyền cao nên được giữ nhỏ nhất có thể. Thay vì chạy toàn bộ giao diện người dùng với quyền quản trị, có thể tách để chỉ một dịch vụ đặc quyền nhỏ thực hiện thay đổi hệ thống thực tế.
Ranh giới bảo mật
Ranh giới bảo mật là điểm cách ly ngăn chủ thể trong một khu vực trực tiếp truy cập tài nguyên của khu vực khác.
Các ranh giới bảo mật tiêu biểu của hệ điều hành bao gồm:
- Chế độ người dùng và chế độ nhân
- Không gian địa chỉ của các tiến trình khác nhau
- Người dùng thông thường và quản trị viên
- Ứng dụng và bên ngoài sandbox
- Hệ điều hành khách và hypervisor
- Máy ảo và máy chủ
- Các vùng bảo mật khác nhau
- Môi trường thực thi tin cậy và hệ điều hành thông thường
Không phải mọi sự phân tách logic đều có cùng độ mạnh như một ranh giới bảo mật. Việc chỉ tách tên tiến trình hoặc cấu trúc thư mục không tạo ra cách ly bộ nhớ và quyền. Để được gọi là ranh giới bảo mật, việc truy cập vượt qua ranh giới phải được một thành phần đáng tin cậy cưỡng chế.
Chế độ bảo mật ảo của Windows sử dụng hypervisor để tạo nhiều Virtual Trust Level và hình thành ranh giới bảo mật riêng, ngăn tiến trình ở một mức tin cậy truy cập bộ nhớ của mức khác. Nhờ đó, các tài sản như mật khẩu và khóa Kerberos có thể được tách khỏi vùng nhân thông thường.
Sandbox
Sandbox là môi trường cách ly giới hạn tệp, thiết bị, mạng, tiến trình và chức năng hệ thống mà chương trình có thể truy cập, nhằm giảm phạm vi thiệt hại khi chương trình bị xâm nhập.
Sandbox bắt đầu từ giả định rằng chương trình không đáng tin cậy. Chính sách được áp dụng để chương trình vẫn thực hiện được công việc cần thiết nhưng không thể truy cập các tài nguyên khác.
Ứng dụng
↓
Chính sách sandbox
├── Chỉ truy cập tệp đã chỉ định
├── Chỉ sử dụng mạng được phép
├── Chỉ sử dụng thiết bị bị giới hạn
├── Hạn chế truy cập tiến trình khác
└── Giới hạn chức năng nhân
App Sandbox của Apple giới hạn quyền truy cập vào tài nguyên hệ thống và dữ liệu người dùng dựa trên entitlement mà ứng dụng khai báo, với mục tiêu hạn chế thiệt hại khi ứng dụng bị xâm nhập.
Chính sách sandbox có thể giới hạn các yếu tố sau.
- Đường dẫn hệ thống tệp
- Camera và micrô
- Vị trí và danh bạ
- Kết nối mạng
- Giao tiếp với tiến trình khác
- Tạo tiến trình con
- Lời gọi hệ thống
- Truy cập thiết bị
- Điều khiển giao diện người dùng
- Gỡ lỗi và kiểm tra tiến trình
Ứng dụng có thể truy cập tài nguyên giới hạn bằng cách để người dùng chọn tệp hoặc thông qua dịch vụ trung gian do hệ điều hành cung cấp. macOS App Sandbox cũng mặc định giới hạn quyền truy cập tài nguyên được bảo vệ và mở rộng phạm vi truy cập qua những con đường rõ ràng như tài liệu do người dùng chọn và nhóm ứng dụng.
Không giống máy ảo riêng biệt, sandbox thường chia sẻ cùng một nhân. Vì vậy, nếu nhân có lỗ hổng, có khả năng vượt khỏi ranh giới sandbox, và bản thân sandbox cũng cần được cấu hình chính sách chính xác.
Bảo mật dựa trên capability
Trong khi kiểm soát truy cập truyền thống quản lý quyền xoay quanh người dùng và đối tượng, bảo mật dựa trên capability sử dụng một tham chiếu hoặc token khó giả mạo, cho phép thực hiện một thao tác cụ thể trên một đối tượng cụ thể, như chính quyền hạn.
Bộ mô tả tệp mà tiến trình nhận được khi mở tệp hoặc socket cũng có thể được xem là một tham chiếu capability giới hạn. Khi chuyển một bộ mô tả tệp đã mở cho tiến trình con hoặc tiến trình khác, có thể ủy quyền truy cập một tệp cụ thể mà không cần cấp quyền truy cập toàn bộ hệ thống tệp.
Cấu trúc dựa trên capability có các ưu điểm sau.
- Có thể giới hạn quyền vào một đối tượng cụ thể.
- Có thể sử dụng đối tượng đã được phê duyệt mà không cần tra cứu lại bằng tên.
- Chỉ có thể ủy quyền quyền cần thiết cho tiến trình khác.
- Có thể giảm nhu cầu về quyền quản trị toàn cục.
Tuy nhiên, cần quản lý việc truyền và kế thừa để tham chiếu capability không bị rò rỉ sang tiến trình ngoài ý muốn.
Giới hạn lời gọi hệ thống
Chương trình chế độ người dùng sử dụng chức năng nhân thông qua lời gọi hệ thống. Việc chặn các lời gọi hệ thống mà chương trình không cần có thể giảm những hành động mà kẻ tấn công thực hiện được khi khai thác lỗ hổng.
Chính sách giới hạn lời gọi hệ thống có thể được cấu thành theo các cách sau.
- Chỉ cho phép những lời gọi hệ thống được xác định
- Chỉ cho phép đối số và hành động cụ thể
- Giới hạn tạo tiến trình và gỡ lỗi
- Giới hạn không gian tên hệ thống tệp
- Giới hạn họ địa chỉ mạng
- Giới hạn lời gọi điều khiển thiết bị
Chức năng như seccomp của Linux có thể được dùng làm thành phần sandbox để giới hạn lời gọi hệ thống mà tiến trình có thể sử dụng. Tuy nhiên, nếu danh sách lời gọi cần thiết không được cấu hình chính xác, chương trình có thể không hoạt động bình thường, còn nếu cho phép quá rộng thì hiệu quả bảo vệ giảm xuống.
Giới hạn lời gọi hệ thống không thay thế quyền tệp, cách ly không gian địa chỉ hoặc chính sách mạng. Thông thường, nhiều lớp được kết hợp để một thao tác được cho phép ở một lớp vẫn có thể bị giới hạn lại ở lớp bảo vệ khác.
Ký mã và độ tin cậy khi thực thi
Ký mã là kỹ thuật xác nhận rằng tệp thực thi, thư viện và trình điều khiển được phân phối bởi một chủ thể ký cụ thể và không bị thay đổi sau khi ký.
Apple giải thích ký mã là công nghệ bảo mật macOS cho phép xác thực nhà phát triển ứng dụng và kiểm tra chương trình có bị thay đổi vô ý hoặc ác ý sau khi ký hay không.
Ký mã có thể được dùng để xác minh:
- Tính toàn vẹn của mã
- Chủ thể phân phối
- Quyền và entitlement được phép
- Trình điều khiển có đáng tin cậy hay không
- Bản cập nhật có đến từ nhà phân phối hợp lệ hay không
- Mã có vượt qua chính sách thực thi hay không
Việc có chữ ký không có nghĩa bản thân chương trình an toàn. Chương trình đã ký vẫn có thể chứa lỗ hổng hoặc hành vi độc hại. Ký mã chủ yếu xác minh nguồn gốc và việc mã có bị thay đổi hay không, còn độ an toàn của hành vi thực tế phải được đánh giá riêng.
Nhân Linux cũng cung cấp chức năng ký mô-đun nhân bằng mật mã và kiểm tra chữ ký khi nạp. Nhờ đó, tùy theo chính sách, hệ thống có thể giới hạn việc nạp mô-đun không có chữ ký hoặc không đáng tin cậy.
Khởi động an toàn
Khởi động an toàn là hệ thống xác minh từng bước tính toàn vẹn và độ tin cậy của firmware, bootloader, nhân và các thành phần hệ thống ban đầu khi máy tính khởi động.
Gốc tin cậy phần cứng
↓ xác minh firmware
Bootloader
↓ xác minh nhân
Nhân hệ điều hành
↓ xác minh thành phần hệ thống
Khởi động không gian người dùng
Nếu mã đầu tiên trong quá trình khởi động bị kẻ tấn công thay đổi, các kiểm tra bảo mật do hệ điều hành thực hiện sau đó cũng có thể bị vượt qua. Khởi động an toàn tạo chuỗi tin cậy trong đó mỗi giai đoạn kiểm tra chữ ký hoặc giá trị băm của giai đoạn tiếp theo.
Tài liệu bảo mật nền tảng của Apple cũng giải thích rằng chuỗi khởi động an toàn, bảo mật hệ thống và bảo mật ứng dụng cùng được dùng để xác minh rằng chỉ mã và ứng dụng đáng tin cậy được thực thi.
Khởi động an toàn có thể giới hạn hệ thống chỉ chạy mã được phê duyệt. Tuy nhiên, trên thiết bị nơi người sở hữu tự quản lý hệ điều hành và khóa, cần có cấu trúc cho phép chủ sở hữu thay đổi tiêu chuẩn tin cậy.
Tính toàn vẹn và bảo vệ thực thi
Hệ điều hành có thể sử dụng nhiều chức năng phần cứng và phần mềm để bảo vệ mã đang chạy và luồng điều khiển.
Các chức năng tiêu biểu bao gồm:
- Hạn chế thực thi trên bộ nhớ có thể ghi
- Ngẫu nhiên hóa bố trí không gian địa chỉ
- Giá trị bảo vệ stack
- Bảo vệ luồng điều khiển
- Vùng nhân chỉ đọc
- Ký mô-đun nhân
- Kiểm tra tính toàn vẹn của tệp hệ thống
- Bảo vệ stack dựa trên phần cứng
- Cách ly bảng trang nhân
Ngẫu nhiên hóa bố trí không gian địa chỉ thay đổi vị trí của chương trình, thư viện, stack và heap trong mỗi lần thực thi để làm cho kẻ tấn công khó dự đoán địa chỉ của mã và dữ liệu.
Chức năng ngăn thực thi giới hạn việc chạy mã trên trang dữ liệu thông thường. Tuy nhiên, chương trình như trình biên dịch JIT cần tạo mã trong lúc chạy phải chuyển đổi nghiêm ngặt giữa trạng thái có thể ghi và trạng thái có thể thực thi.
Windows có thể sử dụng các chức năng như bảo vệ stack chế độ nhân được phần cứng hỗ trợ để phát hiện hoặc chặn sự phá hỏng địa chỉ trả về.
Các kỹ thuật giảm nhẹ này không loại bỏ bản thân lỗ hổng nhưng làm cho việc biến lỗ hổng thành thực thi mã hoặc leo thang đặc quyền trở nên khó hơn.
Bảo vệ tệp và dữ liệu
Hệ điều hành có thể cung cấp các chức năng bảo vệ sau cho tệp và thiết bị lưu trữ.
- Chủ sở hữu và quyền truy cập tệp
- Danh sách kiểm soát truy cập
- Mã hóa tệp
- Mã hóa toàn bộ đĩa
- Xóa an toàn
- Kiểm tra tính toàn vẹn
- Nhật ký thay đổi
- Sao lưu và phục hồi
- Hệ thống tệp chỉ đọc
- Ảnh chụp nhanh
Mã hóa làm cho người dùng không được phép khó đọc nội dung dữ liệu khi thiết bị lưu trữ bị tháo rời hoặc thiết bị bị thất lạc. Tuy nhiên, khi người dùng đã đăng nhập và khóa mã hóa đang hoạt động, quản lý quyền của hệ điều hành và ứng dụng vẫn rất quan trọng.
Mã hóa tệp và kiểm soát truy cập giải quyết những vấn đề khác nhau.
Kiểm soát truy cập
Trên hệ thống đang chạy
Ai có thể sử dụng tệp
Mã hóa
Khi thiết bị lưu trữ hoặc dữ liệu bị rò rỉ
Ai có thể đọc nội dung
Nếu mã độc đã chạy với quyền của người dùng, nó có thể đọc những tệp mã hóa mà người dùng đó được phép đọc. Vì vậy, mã hóa không thể tự thay thế cách ly ứng dụng.
Kiểm toán và ghi nhật ký
Kiểm toán bảo mật là hệ thống ghi lại và phân tích các hành động liên quan đến bảo mật do người dùng và chương trình thực hiện.
Nhật ký kiểm toán có thể bao gồm:
- Đăng nhập và đăng xuất
- Xác thực thất bại
- Sử dụng quyền quản trị
- Truy cập tệp và thay đổi quyền
- Thay đổi thiết lập hệ thống
- Khởi động và dừng dịch vụ
- Vi phạm chính sách bảo mật
- Kết nối thiết bị
- Thực thi chương trình
- Kết nối mạng
Nhật ký kiểm toán được dùng để điều tra nguyên nhân sau sự cố, xác minh tuân thủ quy định và phát hiện cuộc tấn công đang diễn ra.
Tuy nhiên, nếu mật khẩu, khóa mã hóa và dữ liệu cá nhân bị ghi nguyên vẹn vào nhật ký, chính nhật ký có thể trở thành rủi ro bảo mật. Quyền truy cập, thời gian lưu giữ, tính toàn vẹn và việc truyền nhật ký đến hệ thống từ xa phải được quản lý cùng nhau.
Nếu kẻ tấn công giành được quyền quản trị, chúng có thể thay đổi nhật ký cục bộ. Vì vậy, hệ thống quan trọng có thể gửi nhật ký đến máy chủ riêng hoặc kho lưu trữ khó sửa đổi.
Cập nhật và ứng phó lỗ hổng
Hệ điều hành xử lý nhiều loại phần cứng, đầu vào mạng, định dạng tệp phức tạp và ứng dụng, nên theo thời gian có thể phát hiện lỗ hổng bảo mật. Vì vậy, một hệ điều hành an toàn không phải là hệ thống hoàn toàn không có lỗ hổng, mà là hệ thống có khả năng phát hiện, sửa chữa và phân phối bản cập nhật một cách an toàn.
Hệ thống cập nhật phải đáp ứng các điều kiện sau.
- Xác minh chữ ký của nhà phân phối
- Ngăn sửa đổi trong quá trình truyền
- Khôi phục khi cập nhật thất bại
- Ngăn hệ thống rơi vào trạng thái không thể khởi động
- Quản lý phiên bản và phụ thuộc
- Phân phối nhanh bản sửa lỗi bảo mật
- Ngăn cố ý hạ xuống phiên bản cũ
Nhân, trình điều khiển thiết bị và thư viện hệ thống chạy với quyền cao nên cập nhật bảo mật đặc biệt quan trọng. Hệ điều hành đã hết thời hạn hỗ trợ có thể không nhận được bản sửa cho lỗ hổng mới được phát hiện.
Cập nhật tự động có thể nhanh chóng bảo vệ nhiều thiết bị, nhưng trong hệ thống công nghiệp và máy chủ quan trọng cần có kiểm thử tương thích, triển khai theo giai đoạn và kế hoạch khôi phục.
Ảo hóa
Ảo hóa là công nghệ chia tài nguyên của một máy tính vật lý thành nhiều môi trường thực thi logic hoặc cung cấp môi trường phần cứng trừu tượng khác với phần cứng thực tế.
Trong ảo hóa hệ điều hành, hypervisor phân bổ CPU, bộ nhớ, ngắt và thiết bị cho máy ảo. Mỗi máy ảo hoạt động như thể có một máy tính độc lập và có thể chạy một hệ điều hành khách riêng.
Phần cứng vật lý
↓
Hypervisor
├── Máy ảo A
│ └── Hệ điều hành khách A
├── Máy ảo B
│ └── Hệ điều hành khách B
└── Máy ảo C
└── Hệ điều hành khách C
Máy ảo có thể ảo hóa các tài nguyên sau.
- CPU ảo
- Bộ nhớ ảo
- Đĩa ảo
- Thiết bị mạng ảo
- Ngắt ảo
- Firmware ảo
- Đồ họa và thiết bị ngoại vi ảo
Nhân khách của máy ảo có không gian địa chỉ và trạng thái nhân tách biệt với các máy ảo khác. Ngay cả khi một hệ điều hành khách bị hỏng, nếu cách ly của hypervisor hoạt động đúng, nó không thể trực tiếp truy cập khách khác hoặc máy chủ.
Tuy nhiên, máy ảo không bảo đảm cách ly tuyệt đối. Nếu hypervisor hoặc triển khai thiết bị ảo có lỗ hổng, hoặc quyền của giao diện quản lý được cấu hình sai, ranh giới có thể bị phá vỡ.
Hypervisor
Hypervisor thường được phân loại thành hai hình thức sau.
Hypervisor bare-metal
Chạy trực tiếp trên phần cứng và quản lý máy ảo.
Phần cứng
↓
Hypervisor
↓
Nhiều hệ điều hành khách
Loại này chủ yếu được sử dụng trong trung tâm dữ liệu và ảo hóa máy chủ, đồng thời có thể giảm sự phụ thuộc vào hệ điều hành chủ đa dụng.
Hypervisor dạng lưu trú
Chạy như một ứng dụng hoặc thành phần nhân của một hệ điều hành thông thường.
Phần cứng
↓
Hệ điều hành chủ
↓
Chương trình ảo hóa
↓
Hệ điều hành khách
Loại này dễ sử dụng cho phát triển, thử nghiệm và môi trường máy tính để bàn nhưng phụ thuộc nhiều hơn vào trình điều khiển, bảo mật và quản lý tài nguyên của hệ điều hành chủ.
Sản phẩm thực tế có thể có cấu trúc lai không hoàn toàn phù hợp với sự phân loại này. Điểm khác biệt quan trọng là lớp nào cưỡng chế cách ly giữa các máy ảo và nơi thiết bị cùng dịch vụ quản lý được thực thi.
Ảo hóa được phần cứng hỗ trợ
CPU hiện đại cung cấp các lệnh ảo hóa và chế độ thực thi riêng để hypervisor có thể cách ly hệ điều hành khách hiệu quả.
Các chức năng hỗ trợ phần cứng có thể bao gồm:
- Phân tách chế độ thực thi khách và hypervisor
- Dịch địa chỉ hai giai đoạn
- Ngắt ảo
- Gán trực tiếp thiết bị
- Thiết bị quản lý bộ nhớ vào/ra
- Mức tin cậy ảo
- Mã hóa bộ nhớ
Trong dịch địa chỉ hai giai đoạn, địa chỉ ảo của hệ điều hành khách trước tiên được chuyển thành địa chỉ vật lý khách, sau đó hypervisor chuyển tiếp thành địa chỉ vật lý thực của máy chủ.
Địa chỉ ảo khách
↓ bảng trang khách
Địa chỉ vật lý khách
↓ dịch địa chỉ của hypervisor
Địa chỉ vật lý máy chủ
Trong ảo hóa thời kỳ đầu không có hỗ trợ phần cứng, hệ thống phải chặn lệnh đặc quyền hoặc chuyển đổi mã động. CPU hiện đại trực tiếp hỗ trợ nhiều thao tác, nhờ đó giảm chi phí ảo hóa.
Cách ly máy ảo
Ưu điểm bảo mật chính của máy ảo là mỗi khách sử dụng một nhân riêng. Sandbox và container dựa trên tiến trình chia sẻ nhân của máy chủ, còn máy ảo thường có nhân và trạng thái hệ thống độc lập cho từng khách.
Cách ly máy ảo có thể cung cấp các ranh giới sau.
- Nhân riêng
- Bảng trang riêng
- Thiết bị ảo
- Quá trình khởi động riêng
- Người dùng và hệ thống tệp riêng
- Ranh giới mạng ảo
Cách ly dựa trên hypervisor cũng có thể được dùng để tách tài sản nhạy cảm khỏi cả nhân hệ điều hành thông thường. VSM của Windows cũng sử dụng hypervisor và mức tin cậy ảo để hình thành ranh giới bảo vệ bộ nhớ.
Giao diện quản lý máy ảo có quyền rất cao. Vì nó có thể đọc đĩa ảo, ảnh chụp bộ nhớ và mạng ảo, không nên tùy tiện cấp quyền quản lý cho người dùng thông thường.
Container
Container là phương thức ảo hóa cấp hệ điều hành chia sẻ nhân của hệ điều hành chủ nhưng cung cấp góc nhìn được cách ly cho tiến trình và tài nguyên, thay vì chạy một nhân khách hoàn chỉnh riêng biệt.
Phần cứng vật lý
↓
Nhân hệ điều hành chủ
├── Container A
│ ├── Tiến trình
│ └── Môi trường hệ thống tệp
├── Container B
│ ├── Tiến trình
│ └── Môi trường hệ thống tệp
└── Container C
├── Tiến trình
└── Môi trường hệ thống tệp
Container thường kết hợp các chức năng sau.
- Phân tách góc nhìn tài nguyên bằng namespace
- Giới hạn và đo tài nguyên bằng nhóm điều khiển
- Hệ thống tệp gốc riêng
- Giới hạn capability và quyền
- Bộ lọc lời gọi hệ thống
- Kiểm soát truy cập bắt buộc
- Giao diện mạng ảo
Namespace của Linux trừu tượng hóa tài nguyên hệ thống toàn cục để tiến trình bên trong nhìn thấy như đang có tài nguyên độc lập, đồng thời có thể khiến thay đổi trong một namespace không hiển thị với tiến trình ở namespace khác. Container là một trường hợp sử dụng tiêu biểu của namespace.
Namespace Linux
Namespace của Linux có thể phân tách các tài nguyên sau.
- Mã định danh tiến trình
- Điểm gắn kết
- Thiết bị và địa chỉ mạng
- Tên máy chủ
- Mã định danh người dùng và nhóm
- Đối tượng giao tiếp liên tiến trình
- Góc nhìn nhóm điều khiển
- Một phần thông tin thời gian
Máy chủ
├── PID namespace A
│ └── Bên trong bắt đầu từ tiến trình số 1
├── Network namespace A
│ └── Giao diện và định tuyến độc lập
└── Mount namespace A
└── Góc nhìn gắn hệ thống tệp độc lập
User namespace có thể ánh xạ người dùng quản trị bên trong container sang mã định danh người dùng thông thường trên máy chủ. Nhờ đó, ngay cả khi trông như có quyền cao trong container, tiến trình vẫn chỉ có quyền giới hạn trên máy chủ.
Namespace ẩn tài nguyên hoặc cung cấp một góc nhìn riêng nhưng không tự giới hạn lượng tài nguyên sử dụng. Mức sử dụng CPU, bộ nhớ và vào/ra phải được quản lý cùng với nhóm điều khiển.
Nhóm điều khiển
Nhóm điều khiển là chức năng nhân Linux gom nhiều tiến trình thành nhóm và giới hạn cũng như đo lường mức sử dụng các tài nguyên như CPU, bộ nhớ và vào/ra.
Nhóm điều khiển
├── Giới hạn sử dụng CPU
├── Giới hạn bộ nhớ
├── Mức ưu tiên vào/ra
├── Giới hạn số tiến trình
└── Thống kê sử dụng tài nguyên
Tài liệu nhân Linux mô tả cgroup là cấu trúc liên kết một tập hợp tác vụ với các tham số tài nguyên của nhiều hệ thống con.
cgroup v2 tổ chức kiểm soát và ủy quyền tài nguyên xoay quanh một hệ thống phân cấp thống nhất. Tài liệu nhân cũng giải thích rằng cgroup namespace có thể được sử dụng làm ranh giới ủy quyền.
Nhóm điều khiển giảm sự can thiệp giữa các dịch vụ do thiếu tài nguyên, nhưng không phân tách hoàn toàn mọi tài nguyên phần cứng như thời gian CPU, băng thông bộ nhớ, bộ nhớ đệm và đĩa. Các tác vụ chạy trên cùng máy chủ vẫn có thể ảnh hưởng đến hiệu năng của nhau.
Khác biệt giữa container và máy ảo
| Phân loại | Container | Máy ảo |
|---|---|---|
| Nhân | Chia sẻ nhân máy chủ | Mỗi khách có nhân riêng |
| Khởi động | Thường nhanh | Cần khởi động hệ điều hành khách |
| Sử dụng tài nguyên | Tương đối thấp | Cần tài nguyên cho toàn bộ hệ điều hành |
| Loại hệ điều hành | Phải tương thích với nhân máy chủ | Có thể chạy hệ điều hành khách khác nhau |
| Ranh giới cách ly | Dựa trên tiến trình và chức năng nhân | Dựa trên hypervisor và phần cứng |
| Mục đích chính | Đóng gói và triển khai ứng dụng | Cách ly và thử nghiệm toàn bộ hệ điều hành |
| Ảnh hưởng của lỗ hổng | Chia sẻ lỗ hổng nhân máy chủ | Lỗ hổng hypervisor là ranh giới chính |
Container không chạy nhân riêng nên nhẹ và có thể khởi động nhanh. Tuy nhiên, vì mọi container dùng chung nhân máy chủ, lỗ hổng nhân hoặc cấu hình quyền quá rộng có thể ảnh hưởng đến nhiều container và cả máy chủ.
Máy ảo sử dụng nhân riêng cho từng khách nên có thể cung cấp cách ly mạnh hơn, nhưng chi phí tài nguyên và khởi động cao hơn.
Windows cũng phân biệt container cách ly tiến trình với container cách ly hypervisor. Microsoft giải thích rằng container cách ly hypervisor được bao bọc trong một máy ảo siêu nhẹ và cung cấp ranh giới bảo mật cấp phần cứng mạnh hơn container cách ly tiến trình.
Bảo mật container
Việc sử dụng container không tự động làm chương trình trở nên an toàn. Để chạy container an toàn cần các thiết lập sau.
- Chạy bằng người dùng không có quyền quản trị
- Loại bỏ capability Linux không cần thiết
- Giới hạn truy cập thiết bị của máy chủ
- Sử dụng hệ thống tệp gốc chỉ đọc
- Giảm tối đa việc gắn đường dẫn của máy chủ
- Giới hạn lời gọi hệ thống
- Áp dụng chính sách mạng
- Đặt giới hạn tài nguyên
- Kiểm tra chữ ký và nguồn gốc ảnh
- Duy trì nhân và runtime mới nhất
- Không đưa thông tin bí mật vào ảnh
Nếu container được cấp toàn bộ hệ thống tệp, thiết bị hoặc socket runtime container của máy chủ, ý nghĩa của cách ly sẽ bị suy yếu đáng kể.
root bên trong container không phải lúc nào cũng có cùng quyền trên máy chủ. Tuy nhiên, container không sử dụng user namespace và được cấp nhiều capability có thể làm tăng rủi ro tấn công máy chủ.
Cách ly tiến trình và cách ly tài nguyên
Cách ly bảo mật và cách ly tài nguyên có liên quan nhưng không phải là cùng một khái niệm.
Cách ly bảo mật
Ngăn truy cập dữ liệu và chức năng không được phép
Cách ly tài nguyên
Ngăn sử dụng quá mức CPU, bộ nhớ và vào/ra
Ngay cả tiến trình bị chặn hoàn toàn quyền truy cập tệp vẫn có thể cản trở chương trình khác nếu sử dụng CPU vô hạn. Ngược lại, tiến trình bị giới hạn mức sử dụng CPU vẫn có thể đọc tệp quan trọng nếu quyền bị cấu hình sai.
Vì vậy, sandbox và container cần áp dụng cả giới hạn quyền truy cập lẫn giới hạn CPU, bộ nhớ, số tiến trình và vào/ra.
Device cgroup của Linux có thể giới hạn việc mở hoặc tạo tệp thiết bị theo danh sách cho phép của từng nhóm.
Cách ly thiết bị
Thiết bị có thể thực hiện truy cập bộ nhớ trực tiếp độc lập với CPU, nên cần giới hạn để thiết bị hoặc trình điều khiển bị lỗi không tùy ý đọc và ghi bộ nhớ.
Thiết bị quản lý bộ nhớ vào/ra có thể giới hạn phạm vi bộ nhớ vật lý mà thiết bị được phép truy cập bằng một bảng chuyển đổi địa chỉ riêng.
Địa chỉ DMA của thiết bị
↓
Chuyển đổi IOMMU
↓
Vùng bộ nhớ vật lý được phép
Khi gán trực tiếp thiết bị vật lý cho máy ảo, IOMMU cũng có thể được dùng để ngăn thiết bị truy cập bộ nhớ của máy ảo khác và hypervisor.
Trình điều khiển thiết bị thường hoạt động với quyền cao giữa nhân và thiết bị nên có thể trở thành bề mặt tấn công. Các phương pháp được sử dụng bao gồm chuyển những trình điều khiển có thể sang chế độ người dùng, giới hạn truy cập bộ nhớ của trình điều khiển và chỉ cho phép trình điều khiển đã ký.
Cách ly mạng
Hệ điều hành có thể cung cấp góc nhìn mạng riêng cho tiến trình, container và máy ảo.
Cách ly mạng có thể bao gồm:
- Giao diện mạng ảo
- Địa chỉ IP và bảng định tuyến riêng
- Chính sách tường lửa
- Network namespace
- Giới hạn truy cập cổng
- Switch ảo
- Dịch địa chỉ mạng
- Chính sách giao tiếp giữa dịch vụ
Nếu container sử dụng network namespace riêng, nó có thể có giao diện, địa chỉ và thông tin định tuyến khác với máy chủ và container khác. Tuy nhiên, nếu mạng ảo được kết nối, vẫn cần tường lửa và xác thực dịch vụ.
Không nên tin tưởng yêu cầu mạng của tiến trình hoặc container khác chỉ vì chúng chạy trên cùng một máy chủ. IPC cục bộ và giao tiếp mạng cũng có thể cần xác thực và kiểm tra đầu vào.
Môi trường thực thi tin cậy
Môi trường thực thi tin cậy là cấu trúc xử lý khóa mã hóa, thông tin xác thực và tác vụ bảo mật trong một vùng thực thi tách biệt với hệ điều hành thông thường.
Vùng này có thể cung cấp các chức năng sau.
- Bộ nhớ được cách ly
- Mức đặc quyền riêng
- Khởi động an toàn và đo lường
- Bảo vệ khóa mã hóa
- Giới hạn truy cập từ nhân thông thường
- Thực thi phép toán bảo mật
Mô-đun bảo mật phần cứng, TPM, secure enclave và vùng bảo mật dựa trên hypervisor có thể được sử dụng cho mục đích này.
Tuy nhiên, môi trường thực thi tin cậy nên được giữ nhỏ nhất có thể. Quy mô mã yêu cầu mức độ tin cậy cao càng lớn thì bề mặt tấn công cần kiểm chứng càng lớn.
Giới hạn của cách ly
Cách ly hệ điều hành cho phép nhiều chương trình chia sẻ cùng hệ thống một cách an toàn, nhưng không bảo đảm phân tách hoàn toàn.
Các yếu tố có thể làm suy yếu ranh giới cách ly bao gồm:
- Lỗ hổng nhân và hypervisor
- Quyền truy cập được cấu hình sai
- Quyền quản trị quá mức
- Trình điều khiển thiết bị không an toàn
- Bộ nhớ và tệp dùng chung
- Kênh kề như bộ nhớ đệm CPU và thời gian thực thi
- Kiểm tra đầu vào IPC không đúng
- Capability container quá rộng
- Kết nối trực tiếp đường dẫn và thiết bị máy chủ
- Giao diện quản lý bị lộ
- Hệ điều hành và thư viện cũ
Tấn công kênh kề suy luận thông tin bằng cách quan sát thời gian thực thi, bộ nhớ đệm, mức tiêu thụ điện năng và trạng thái phần cứng dùng chung mà không trực tiếp đọc bộ nhớ được bảo vệ. Vì vậy, chỉ cách ly logic bằng không gian địa chỉ hoặc máy ảo không thể chặn mọi luồng thông tin.
Máy ảo và container chia sẻ cùng CPU vật lý, bộ nhớ đệm và băng thông bộ nhớ vẫn có thể gây nhiễu hiệu năng cho nhau và để lại một số khả năng kênh kề. Công việc yêu cầu mức bảo mật cao có thể sử dụng phần cứng chuyên dụng và chính sách cách ly bổ sung.
Phòng thủ nhiều lớp
Bảo mật hệ điều hành chồng nhiều biện pháp phòng vệ để nếu một chức năng thất bại, lớp khác vẫn giới hạn thiệt hại. Cách tiếp cận này được gọi là phòng thủ nhiều lớp.
Khởi động an toàn
↓
Nhân và trình điều khiển đã ký
↓
Phân tách chế độ người dùng và chế độ nhân
↓
Cách ly không gian địa chỉ tiến trình
↓
Người dùng và quyền truy cập
↓
Sandbox và giới hạn lời gọi hệ thống
↓
Ảo hóa và container
↓
Mã hóa và kiểm toán
↓
Cập nhật và ứng phó lỗ hổng
Ví dụ, ngay cả khi ứng dụng có lỗ hổng, sandbox có thể giới hạn quyền truy cập tệp, quyền người dùng có thể chặn thay đổi thiết lập hệ thống, còn cách ly không gian địa chỉ có thể ngăn truy cập bộ nhớ của tiến trình khác. Ngay cả khi kẻ tấn công thoát khỏi sandbox, có thể cấu trúc để chúng cần thêm một lỗ hổng khác mới giành được quyền nhân.
Phòng thủ nhiều lớp không có nghĩa chỉ đơn giản thêm càng nhiều lớp càng tốt. Cấu hình bảo mật phức tạp cũng làm tăng khả năng cấu hình sai, nên cần xác định rõ mục đích và đối tượng tin cậy của từng ranh giới.
Cơ sở điện toán tin cậy
Cơ sở điện toán tin cậy là tập hợp phần cứng và phần mềm bắt buộc phải được tin cậy để cưỡng chế chính sách bảo mật của hệ thống.
Cơ sở điện toán tin cậy có thể bao gồm:
- Chức năng bảo vệ CPU và bộ nhớ
- Firmware và bootloader
- Hypervisor
- Nhân hệ điều hành
- Trình quản lý chính sách bảo mật
- Dịch vụ xác thực
- Dịch vụ hệ thống đặc quyền
- Thành phần quản lý khóa mã hóa
Thông thường, cơ sở điện toán tin cậy càng nhỏ và đơn giản thì càng dễ kiểm chứng. Cấu trúc vi nhân tách hệ thống tệp, dịch vụ mạng và trình điều khiển thiết bị sang không gian người dùng cũng có thể nhằm giảm phạm vi tin cậy của nhân.
Tuy nhiên, nếu dịch vụ không gian người dùng có quyền cao hoặc đóng vai trò thiết yếu trong chính sách bảo mật, dịch vụ đó cũng thuộc cơ sở tin cậy thực tế. Không thể đánh giá toàn bộ phạm vi tin cậy chỉ dựa trên kích thước mã nhân.
Tổng hợp
Bảo mật và cách ly của hệ điều hành là điều kiện cơ bản để nhiều người dùng và chương trình có thể chia sẻ một máy tính. Chế độ người dùng và chế độ nhân phân tách chương trình thông thường khỏi phần cốt lõi của hệ điều hành, còn không gian địa chỉ ảo cách ly bộ nhớ giữa các tiến trình. Tài khoản người dùng và kiểm soát truy cập giới hạn chủ thể được phép sử dụng tệp, thiết bị, tiến trình và chức năng hệ thống.
Sandbox chỉ cho phép những chức năng cần thiết đối với ứng dụng để giảm phạm vi thiệt hại khi bị xâm nhập. Ký mã và khởi động an toàn xác minh nguồn gốc cùng tính toàn vẹn của mã được thực thi. Mã hóa, kiểm toán và hệ thống cập nhật cung cấp nền tảng để ứng phó với rò rỉ dữ liệu, điều tra sự cố và lỗ hổng mới được phát hiện.
Máy ảo phân tách các nhân khách khác nhau thông qua hypervisor, còn container chia sẻ cùng nhân máy chủ nhưng cách ly tiến trình và tài nguyên bằng namespace, nhóm điều khiển và giới hạn quyền. Máy ảo thường cung cấp ranh giới nhân mạnh hơn, còn container sử dụng ít tài nguyên hơn và triển khai nhanh hơn.
Không phương thức cách ly nào tự nó bảo đảm bảo mật hoàn toàn. Lỗ hổng trong nhân, hypervisor, trình điều khiển và dịch vụ quản lý, cùng với quyền được cấu hình sai và tài nguyên dùng chung, có thể làm suy yếu ranh giới bảo vệ. Vì vậy, hệ điều hành kết hợp đặc quyền tối thiểu, kiểm soát truy cập, bảo vệ bộ nhớ, sandbox, ảo hóa, kiểm tra tính toàn vẹn và cập nhật liên tục để xây dựng nhiều tầng ranh giới tin cậy.
Các loại và họ hệ điều hành
Hệ điều hành có thể được phân loại thành nhiều loại tùy theo mục đích, môi trường thực thi, thời gian phản hồi, số lượng người dùng, tài nguyên phần cứng và cấu trúc hệ thống. Một hệ điều hành cũng có thể đồng thời mang đặc điểm của nhiều loại. Ví dụ, hệ điều hành dựa trên Linux có thể được sử dụng trên máy tính cá nhân, máy chủ, điện thoại thông minh, thiết bị mạng và hệ thống nhúng, còn QNX vừa là hệ điều hành nhúng vừa là hệ điều hành thời gian thực.
Loại của hệ điều hành chủ yếu được phân chia theo mục đích sử dụng và đặc tính hoạt động, còn họ hệ điều hành được phân biệt dựa trên nhân, giao diện, mã nguồn và nguồn gốc lịch sử chung. Các hệ điều hành thuộc cùng một họ vẫn có thể được sử dụng cho những mục đích khác nhau, còn những hệ điều hành thuộc các họ khác nhau có thể cạnh tranh trong cùng thị trường và môi trường.
Các loại theo mục đích và môi trường
| Loại | Đặc điểm chính | Ví dụ tiêu biểu |
|---|---|---|
| Hệ điều hành đa dụng | Hỗ trợ nhiều loại ứng dụng và thiết bị, đồng thời xử lý nhiều mục đích sử dụng | Windows, macOS, Linux, FreeBSD |
| Hệ điều hành máy chủ | Chú trọng dịch vụ mạng, đa người dùng, quản trị từ xa, tính sẵn sàng cao và tài nguyên quy mô lớn | Linux, Windows Server, FreeBSD |
| Hệ điều hành di động | Tập trung vào đầu vào cảm ứng, mạng di động, cảm biến, quản lý năng lượng, quyền ứng dụng và sandbox | Android, iOS, iPadOS |
| Hệ điều hành nhúng | Hướng đến thiết bị chuyên dụng và tài nguyên phần cứng giới hạn, chú trọng kích thước nhỏ và điều khiển thiết bị | Zephyr, FreeRTOS, Linux nhúng |
| Hệ điều hành thời gian thực | Chú trọng khả năng dự đoán để hoàn thành tác vụ trong thời gian xác định, thay vì chỉ xử lý nhanh | QNX, FreeRTOS, Zephyr, VxWorks |
| Hệ điều hành máy tính lớn | Chú trọng số lượng rất lớn tác vụ và vào/ra đồng thời, giao dịch quy mô lớn, ảo hóa và tính sẵn sàng liên tục | z/OS, z/VM, z/VSE |
| Hệ điều hành phân tán | Cố gắng quản lý tài nguyên của nhiều máy tính như một hệ thống thống nhất | Plan 9, Amoeba, hệ điều hành phân tán phục vụ nghiên cứu |
Hệ điều hành đa dụng chạy nhiều loại ứng dụng khác nhau trong cùng một môi trường, chẳng hạn như soạn thảo tài liệu, duyệt web, phát triển phần mềm, trò chơi, đa phương tiện và chương trình nghiệp vụ. Chúng thường cung cấp giao diện người dùng đồ họa, hệ thống tệp, mạng, tài khoản người dùng, đa nhiệm và khả năng hỗ trợ nhiều loại thiết bị.
Hệ điều hành máy chủ tập trung vào việc xử lý ổn định yêu cầu của nhiều người dùng và các dịch vụ mạng hơn là sử dụng cá nhân theo kiểu tương tác. Chúng chạy máy chủ web, cơ sở dữ liệu, máy chủ tệp, dịch vụ thư mục, máy ảo và container trong thời gian dài, đồng thời coi trọng quản trị từ xa, tự động hóa, giới hạn tài nguyên và phục hồi sau sự cố. Microsoft mô tả Windows Server là nền tảng máy chủ doanh nghiệp dùng để chạy ứng dụng, dịch vụ và khối lượng công việc trong môi trường tại chỗ, lai và đám mây.
Hệ điều hành di động quản lý pin giới hạn của điện thoại thông minh và máy tính bảng, mạng di động và kết nối không dây, camera và cảm biến vị trí, cùng giao diện người dùng dựa trên cảm ứng. Cấu trúc phổ biến là cách ly ứng dụng trong các tiến trình và sandbox khác nhau, đồng thời chỉ cung cấp những tài nguyên nhạy cảm như camera, micrô, danh bạ và vị trí cho ứng dụng đã được cấp quyền. Android dựa trên nhân Linux LTS kết hợp với các thay đổi dành riêng cho Android, đồng thời sử dụng bảo mật của nhân Linux, giao tiếp liên tiến trình và sandbox ứng dụng ở cấp hệ điều hành.
Hệ điều hành nhúng được tích hợp trong các thiết bị có mục đích cụ thể như bộ điều khiển ô tô, cảm biến, đồ gia dụng, thiết bị mạng, thiết bị đeo và bộ điều khiển công nghiệp. Chúng có thể phải hoạt động với lượng bộ nhớ và không gian lưu trữ nhỏ hơn hệ điều hành đa dụng, đồng thời có thể không cung cấp một số chức năng như màn hình, hệ thống tệp hoặc tạo tiến trình động. Zephyr cung cấp một nhân nhỏ dành cho cảm biến, bộ điều khiển, đồng hồ thông minh và thiết bị IoT có tài nguyên giới hạn.
Hệ điều hành thời gian thực chú trọng tính xác định và khả năng dự đoán để tác vụ có thể bắt đầu hoặc hoàn tất trong thời gian quy định ngay cả trong điều kiện xấu nhất, thay vì chỉ chú trọng tốc độ xử lý trung bình. Nó có thể cung cấp khả năng chiếm quyền nhanh cho tác vụ ưu tiên cao, bộ định thời chính xác, ngăn đảo ngược ưu tiên, độ trễ giới hạn và quản lý bộ nhớ có thể dự đoán. FreeRTOS là một nhân thời gian thực nhỏ dành cho vi điều khiển và bộ xử lý nhỏ, còn QNX cung cấp môi trường hệ điều hành thời gian thực dựa trên POSIX dùng trong hệ thống nhúng.
Một hệ thống thời gian thực không có nghĩa mọi tác vụ luôn chạy nhanh. Tác vụ không quan trọng có thể được thực thi chậm, nhưng tác vụ có giới hạn thời gian phải được xử lý trong thời gian yêu cầu theo mức ưu tiên và quy tắc lập lịch đã xác định. Hệ điều hành thời gian thực có thể được sử dụng trong ô tô, robot, thiết bị hàng không và đường sắt, điều khiển công nghiệp, thiết bị y tế và thiết bị viễn thông.
Hệ điều hành máy tính lớn hướng đến môi trường phải liên tục xử lý số lượng rất lớn người dùng đồng thời, tác vụ theo lô, giao dịch và hoạt động vào/ra. IBM mô tả z/OS là môi trường ứng dụng máy tính lớn cần độ ổn định, bảo mật và tính sẵn sàng liên tục, đồng thời cho biết hệ thống đã được phát triển để xử lý đồng thời hàng nghìn chương trình và người dùng.
Hệ điều hành xử lý theo lô và hệ điều hành chia sẻ thời gian là những cách phân loại quan trọng trong lịch sử hệ điều hành, nhưng trong hệ điều hành hiện đại, chúng tồn tại như các phương thức thực thi được cung cấp đồng thời hơn là những loại sản phẩm hoàn toàn tách biệt. Một hệ điều hành máy chủ hiện đại có thể đồng thời xử lý người dùng tương tác, dịch vụ mạng và các tác vụ theo lô được lập lịch.
Hệ điều hành mạng trước đây cũng được dùng như một loại riêng để chỉ hệ điều hành máy chủ tập trung vào quản lý tệp và máy in mạng cùng tài khoản người dùng. Hiện nay, phần lớn hệ điều hành đa dụng mặc định cung cấp TCP/IP, quản trị từ xa, chia sẻ tệp và xác thực, nên ranh giới của loại này đã trở nên mờ hơn.
Hệ điều hành phân tán cố gắng cung cấp bộ xử lý, bộ nhớ, tệp và thiết bị của nhiều máy tính kết nối qua mạng như một môi trường hệ điều hành duy nhất. Các dịch vụ phân tán quy mô lớn hiện đại thường xây dựng trình quản lý cụm, kho lưu trữ phân tán và hệ thống điều phối container trên các hệ điều hành riêng lẻ như Linux hoặc Windows Server, thay vì sử dụng một hệ điều hành phân tán duy nhất.
Các họ hệ điều hành chính
UNIX và họ Unix
UNIX không phải là tên gọi dành cho mọi hệ điều hành chỉ vì chúng có dòng lệnh và cấu trúc tệp tương tự. Nhãn hiệu UNIX do The Open Group quản lý, và chỉ những hệ thống đáp ứng yêu cầu của Single UNIX Specification và được chứng nhận mới có thể chính thức sử dụng nhãn hiệu UNIX. Đặc tả này xác định giao diện hệ điều hành, shell và các tiện ích chung, còn phần cốt lõi được liên kết với tiêu chuẩn POSIX.
Hệ điều hành thuộc họ Unix, hay hệ điều hành Unix-like, là tên gọi rộng dành cho các hệ điều hành chịu ảnh hưởng từ mô hình tiến trình, tệp, quyền, shell và giao diện hệ thống của UNIX, bất kể có được chứng nhận UNIX chính thức hay không. Linux và các hệ điều hành BSD thường được xếp vào họ Unix, nhưng không phải mọi bản phân phối và hệ thống riêng lẻ đều đã nhận chứng nhận UNIX.
Các đặc điểm chung của họ UNIX bao gồm hệ thống tệp phân cấp, đa người dùng, thực thi dựa trên tiến trình, bộ mô tả tệp, shell cùng các công cụ dòng lệnh nhỏ và việc kết hợp chương trình thông qua pipe. POSIX định nghĩa giao diện chung của môi trường này để tăng khả năng di chuyển mã nguồn giữa các hệ điều hành khác nhau.
Họ BSD
BSD là họ hệ điều hành và phần mềm được phát triển từ UNIX tại Đại học California, Berkeley. Những hệ điều hành BSD hiện đại tiêu biểu gồm FreeBSD, OpenBSD và NetBSD.
FreeBSD phát triển nhân, không gian người dùng cơ bản, công cụ hệ thống và tài liệu trong cùng một dự án hệ điều hành. Khác với bản phân phối Linux kết hợp nhân Linux với không gian người dùng từ nhiều dự án độc lập, FreeBSD quản lý hệ thống cơ sở như một dự án tích hợp duy nhất. Tài liệu chính thức của FreeBSD trình bày riêng về lịch sử, mối quan hệ với các hệ điều hành khác và mô hình phát triển của dự án.
Công nghệ mạng, hệ thống tệp và giao diện hệ thống được phát triển trong BSD đã ảnh hưởng đến nhiều hệ điều hành khác. Darwin và XNU của Apple cũng chứa công nghệ thuộc họ BSD, bao gồm các thành phần từ FreeBSD. Apple mô tả XNU là một nhân lai kết hợp nhân Mach, các thành phần FreeBSD và I/O Kit.
Họ Linux
Linux không hẳn là tên của một sản phẩm hệ điều hành hoàn chỉnh duy nhất mà chủ yếu chỉ nhân, tức phần cốt lõi của hệ điều hành. Môi trường người dùng thực tế được cấu thành bằng cách kết hợp nhân Linux với thư viện hệ thống, shell, hệ thống khởi tạo, trình quản lý gói, môi trường đồ họa và ứng dụng. Hệ thống hoàn chỉnh như vậy được gọi là bản phân phối Linux.
Các bản phân phối Linux tiêu biểu gồm Debian, Ubuntu, Fedora, Red Hat Enterprise Linux, SUSE Linux Enterprise và Arch Linux. Dù sử dụng cùng họ nhân Linux, các bản phân phối khác nhau về định dạng gói, chính sách cập nhật, công cụ mặc định, thời hạn hỗ trợ, đối tượng người dùng và cấu hình hệ thống.
Nhân Linux không chỉ được sử dụng trên máy chủ và máy tính cá nhân mà còn làm nền tảng cho siêu máy tính, thiết bị mạng, thiết bị nhúng và điện thoại thông minh. Tài liệu chính thức của nhân Linux cung cấp thông tin về API không gian người dùng, hệ thống tệp, quản lý bộ nhớ, trình điều khiển, quản trị và nhiều kiến trúc.
Android sử dụng nhân Linux nhưng không cung cấp cùng không gian người dùng và môi trường ứng dụng như một bản phân phối Linux máy tính để bàn thông thường. Android là một nền tảng hệ điều hành riêng kết hợp Android Common Kernel, lớp trừu tượng hóa phần cứng, thư viện native, Android Runtime, dịch vụ hệ thống và framework ứng dụng.
Họ Windows NT
Windows NT là họ hệ điều hành do Microsoft phát triển và trở thành nền tảng kiến trúc cho các sản phẩm Windows dành cho máy khách và Windows Server hiện đại. Hệ điều hành Windows phân tách các thành phần chế độ người dùng và chế độ nhân, đồng thời cung cấp tiến trình, bộ nhớ ảo, trình quản lý đối tượng, trình quản lý vào/ra, bộ giám sát tham chiếu bảo mật và hệ thống trình điều khiển thiết bị.
Windows 95, Windows 98 và Windows Me trước đây tiếp nối nền tảng của dòng MS-DOS, nhưng Windows dành cho người tiêu dùng kể từ Windows XP đã được hợp nhất vào dòng NT. Windows và Windows Server hiện nay khác nhau về mục đích, chức năng được cung cấp và chính sách hỗ trợ, nhưng dựa trên cùng cấu trúc nhân Windows và các thành phần hệ thống chung.
Windows dành cho máy khách hướng đến máy tính cá nhân và máy trạm, còn Windows Server hướng đến dịch vụ tệp và web, thư mục, ảo hóa, máy tính từ xa và cơ sở hạ tầng doanh nghiệp. Windows Server có thể cung cấp cả kiểu cài đặt bao gồm môi trường đồ họa và kiểu Server Core chỉ cài một tập hợp thành phần nhỏ hơn.
Darwin và họ hệ điều hành Apple
Darwin là hệ thống nền tảng mở cấu thành phần cốt lõi của các hệ điều hành Apple. Nhân XNU của Darwin kết hợp Mach, các thành phần thuộc họ BSD và I/O Kit, đồng thời được sử dụng trong macOS và iOS.
Họ hệ điều hành Apple gồm macOS, iOS, iPadOS, watchOS, tvOS và visionOS. Chúng khác nhau về thiết bị, giao diện người dùng và chính sách thực thi ứng dụng, nhưng chia sẻ nhân, hệ thống tệp, khởi động an toàn, ký mã và nhiều công nghệ hệ thống. Apple cung cấp một phần mã nguồn mở của hệ điều hành và công cụ phát triển theo từng bản phát hành macOS, iOS và các hệ thống khác.
macOS là hệ điều hành máy tính để bàn đa dụng, cung cấp đồng thời môi trường UNIX và hệ sinh thái ứng dụng đồ họa. iOS, iPadOS và các hệ thống tương tự hướng đến môi trường di động hoặc thiết bị chuyên dụng, đồng thời sử dụng cơ chế cách ly ứng dụng mạnh hơn cùng hệ thống phân phối và quyền bị giới hạn hơn.
Họ máy tính lớn
Môi trường máy tính lớn của IBM có nhiều hệ điều hành khác nhau như z/OS, z/VM và z/VSE.
- z/OS hướng đến môi trường cần giao dịch quy mô lớn, xử lý theo lô, nhiều người dùng đồng thời và tính sẵn sàng cao.
- z/VM là chương trình điều khiển đồng thời đóng vai trò hypervisor, tạo nhiều máy ảo và chạy các hệ điều hành khác.
- z/VSE hỗ trợ các tác vụ xử lý theo lô và giao dịch truyền thống trong một cấu hình tương đối nhỏ.
IBM mô tả z/OS là hệ điều hành máy tính lớn chủ lực dành cho tính sẵn sàng liên tục và xử lý tác vụ quy mô lớn, còn z/VM là môi trường vận hành ảo hóa dùng để chạy các hệ điều hành khác trong máy ảo.
Bên cạnh các tác vụ máy tính lớn truyền thống, z/OS còn bao gồm môi trường z/OS UNIX System Services cung cấp API POSIX và shell. Nhờ đó, chương trình máy tính lớn hiện có và ứng dụng thuộc họ UNIX có thể được sử dụng cùng nhau trong một hệ điều hành.
Họ hệ điều hành thời gian thực
Hệ điều hành thời gian thực không phải là một họ duy nhất có chung tổ tiên mà là cách phân loại tập hợp nhiều hệ điều hành và nhân độc lập được phát triển để giải quyết các ràng buộc thời gian thực.
QNX là hệ điều hành thời gian thực thuộc họ POSIX, tập trung vào vi nhân và truyền thông điệp. Nó cung cấp tiến trình, luồng, bộ định thời, ngắt và trình quản lý tài nguyên để có thể mở rộng từ thiết bị nhúng nhỏ đến hệ thống điều khiển và phân tán phức tạp.
FreeRTOS là nhân thời gian thực dành cho vi điều khiển và bộ xử lý nhỏ, chủ yếu cung cấp lập lịch tác vụ, hàng đợi, bộ định thời và chức năng đồng bộ hóa. Nó gần với một nhân nhỏ được nhúng vào ứng dụng hơn là một hệ điều hành máy tính để bàn hoàn chỉnh.
Zephyr là dự án hệ điều hành mở kết hợp một nhân thời gian thực nhỏ với trình điều khiển thiết bị, mạng, hệ thống tệp, bảo mật và nhiều dịch vụ nhúng. Nó hỗ trợ nhiều kiến trúc bộ xử lý và thiết bị nhúng có tài nguyên giới hạn.
Lĩnh vực ứng dụng
Hệ điều hành được sử dụng trong gần như mọi máy tính đa dụng và thiết bị điện tử có khả năng chạy chương trình. Tuy nhiên, giao diện người dùng, khả năng hỗ trợ thiết bị, thời gian phản hồi, chính sách bảo mật và quản lý tài nguyên cần được cung cấp sẽ khác nhau tùy theo mục đích của hệ thống.
Máy tính cá nhân và môi trường làm việc
Hệ điều hành máy tính cá nhân cung cấp môi trường để đồng thời chạy giao diện người dùng đồ họa, quản lý tệp, trình duyệt web, nội dung đa phương tiện, trò chơi, công cụ soạn thảo tài liệu và công cụ phát triển. Các ví dụ tiêu biểu gồm Windows, macOS và bản phân phối Linux dành cho máy tính để bàn.
Trong môi trường này, các yếu tố sau có vai trò quan trọng.
- Hỗ trợ rộng rãi phần cứng và thiết bị ngoại vi
- Giao diện người dùng đồ họa
- Tài khoản người dùng và bảo vệ tệp
- Cài đặt và cập nhật ứng dụng
- Tiết kiệm năng lượng và quản lý pin
- Âm thanh, video và tăng tốc đồ họa
- Khả năng tiếp cận và quốc tế hóa
- Khả năng tương thích với ứng dụng hiện có
Máy tính cá nhân thường tập trung vào một người dùng chính, nhưng bên trong hệ điều hành vẫn có nhiều tài khoản người dùng, dịch vụ hệ thống và tiến trình nền chạy đồng thời.
Máy chủ và đám mây
Hệ điều hành máy chủ chạy trong thời gian dài các dịch vụ web, cơ sở dữ liệu, chia sẻ tệp, xác thực, thư điện tử, máy ảo và container. Quản trị từ xa, tự động hóa, hỗ trợ nhiều người dùng, thông lượng mạng cao và phục hồi sau sự cố có vai trò quan trọng.
Trong môi trường đám mây, hệ điều hành chủ và hypervisor trên máy chủ vật lý, hệ điều hành khách bên trong máy ảo và nhân chủ của container được kết hợp thành nhiều lớp.
Máy chủ vật lý
↓
Hệ điều hành chủ hoặc hypervisor
↓
Máy ảo
↓
Hệ điều hành khách
↓
Container và ứng dụng
Các nền tảng đám mây lớn cung cấp nhiều ảnh hệ điều hành, bao gồm Linux và Windows Server. Google Compute Engine cung cấp các ảnh được cấu hình sẵn của hệ điều hành Linux và Windows, còn AWS Systems Manager cũng hỗ trợ Linux và Windows Server như những hệ điều hành có thể được quản lý.
Máy chủ có thể không cần màn hình và thiết bị nhập cục bộ, vì vậy có thể chỉ cài đặt dòng lệnh và dịch vụ quản trị từ xa mà không cài môi trường đồ họa. Việc giảm các thành phần không cần thiết có thể giảm dung lượng lưu trữ, mức sử dụng bộ nhớ, số thành phần cần cập nhật và bề mặt tấn công.
Điện thoại thông minh và thiết bị cá nhân
Hệ điều hành điện thoại thông minh và máy tính bảng quản lý cuộc gọi, tin nhắn, camera, thông tin vị trí và mạng di động, đồng thời yêu cầu quyền từ người dùng khi ứng dụng sử dụng các chức năng nhạy cảm của thiết bị.
Trong môi trường di động, các yếu tố sau có vai trò quan trọng.
- Quản lý pin và nhiệt độ
- Đầu vào cảm ứng và cử chỉ
- Mạng di động và mạng không dây
- Camera, micrô và cảm biến vị trí
- Sandbox ứng dụng
- Giới hạn thực thi nền
- Ký và phân phối ứng dụng
- Mã hóa thiết bị
- Chuyển nhanh sang chế độ ngủ và khôi phục
Android là nền tảng có cơ sở mở có thể được sử dụng trên phần cứng của nhiều nhà sản xuất, còn iOS và iPadOS cung cấp môi trường kết hợp phần cứng và phần mềm của Apple. Cả hai họ đều phân tách chặt chẽ tiến trình ứng dụng, dữ liệu người dùng và quyền truy cập thiết bị. Tài liệu chính thức của Android giải thích rằng bảo mật nhân Linux và sandbox ứng dụng giới hạn hoạt động của ứng dụng, bao gồm cả ứng dụng chứa mã native.
Thiết bị nhúng và Internet vạn vật
Hệ điều hành nhúng thực hiện các chức năng cụ thể bên trong cảm biến, thiết bị gia dụng, bộ định tuyến, camera, thiết bị đeo, máy bay không người lái và thiết bị công nghiệp.
Trong môi trường này, các điều kiện sau có thể đóng vai trò quan trọng.
- Bộ nhớ và không gian lưu trữ rất nhỏ
- Mức tiêu thụ điện năng thấp
- Khởi động nhanh
- Hoạt động liên tục trong thời gian dài
- Điều khiển thanh ghi phần cứng và ngắt
- Cập nhật từ xa
- Kết nối mạng bị giới hạn
- Bảo mật trước khả năng truy cập vật lý
- Phục hồi an toàn khi xảy ra lỗi
Những vi điều khiển nhỏ có thể sử dụng hệ điều hành thời gian thực nhỏ như FreeRTOS hoặc Zephyr, còn thiết bị mạnh hơn có thể sử dụng Linux nhúng hoặc hệ thống dựa trên Android. FreeRTOS hướng đến vi điều khiển và bộ xử lý nhỏ, còn Zephyr hướng đến các thiết bị từ cảm biến đến bộ điều khiển nhúng phức tạp và thiết bị IoT.
Ô tô và điều khiển công nghiệp
Trong ô tô, thiết bị nhà máy, robot và thiết bị y tế, chương trình trực tiếp điều khiển thiết bị vật lý. Lệnh sai hoặc độ trễ kéo dài có thể dẫn đến hư hỏng thiết bị và vấn đề an toàn, vì vậy tính thời gian thực, độ tin cậy và cách ly lỗi có vai trò quan trọng.
Hệ điều hành trong môi trường này có thể cung cấp các chức năng sau.
- Lập lịch chiếm quyền dựa trên mức ưu tiên
- Độ trễ ngắt có thể dự đoán
- Bảo vệ bộ nhớ giữa các tác vụ
- Khởi động lại dịch vụ bị lỗi
- Bộ định thời giám sát
- Giao tiếp an toàn
- Dự phòng và phát hiện sự cố
- Hỗ trợ phát triển để đáp ứng tiêu chuẩn chứng nhận và an toàn
QNX cung cấp hệ điều hành thời gian thực và hypervisor dành cho môi trường nhúng, bao gồm ô tô cùng hệ thống công nghiệp và điều khiển. FreeRTOS và Zephyr cũng có thể được sử dụng trong nhiều thiết bị điều khiển nhỏ.
Thiết bị mạng và viễn thông
Bộ định tuyến, bộ chuyển mạch, tường lửa, trạm gốc không dây và thiết bị lưu trữ phải xử lý số lượng lớn gói tin và yêu cầu vào/ra với độ trễ thấp.
Hệ điều hành thiết bị mạng chú trọng các yếu tố sau.
- Thông lượng gói tin cao
- Hỗ trợ giao diện mạng và bộ tăng tốc
- Cấu hình và quản trị từ xa
- Cập nhật không làm gián đoạn hoạt động
- Phân tách người dùng và vùng quản trị
- Chính sách định tuyến và tường lửa
- Cách ly nhiều tiến trình điều khiển
- Dự phòng phần cứng
Họ Linux và BSD có thể được sử dụng trong thiết bị mạng dựa trên ngăn xếp mạng TCP/IP trưởng thành và hệ thống trình điều khiển thiết bị. QNX và hệ điều hành chuyên dụng có thể được sử dụng trong thiết bị viễn thông có ràng buộc thời gian thực.
Máy tính lớn và giao dịch quy mô lớn
Hệ điều hành máy tính lớn xử lý các giao dịch cốt lõi và tác vụ theo lô của ngân hàng, bảo hiểm, đặt chỗ hàng không, cơ quan chính phủ và doanh nghiệp lớn. Việc hỗ trợ số lượng rất lớn hoạt động vào/ra và người dùng đồng thời cũng như duy trì dịch vụ trong thời gian dài mà không gián đoạn có vai trò quan trọng.
z/OS quản lý không gian lưu trữ ảo và vật lý quy mô lớn cùng các tác vụ vào/ra, đồng thời cung cấp môi trường có thể xử lý hàng nghìn chương trình và người dùng.
Trong môi trường máy tính lớn, có thể cấu hình nhiều phân vùng logic và máy ảo trong cùng một hệ thống vật lý để cách ly các hệ điều hành và khối lượng công việc khác nhau. Xử lý theo lô, giao dịch trực tuyến, cơ sở dữ liệu và ứng dụng UNIX cũng có thể cùng chạy trong một hệ thống.
Điện toán hiệu năng cao và nghiên cứu
Siêu máy tính và cụm tính toán sử dụng hàng nghìn hoặc nhiều hơn nữa bộ xử lý và bộ tăng tốc, mạng tốc độ cao và kho lưu trữ phân tán để thực hiện tính toán khoa học, dự báo thời tiết, mô phỏng vật lý và huấn luyện trí tuệ nhân tạo.
Trong môi trường này, các yếu tố sau có vai trò quan trọng.
- Hỗ trợ số lượng lớn bộ xử lý song song
- Quản lý bộ nhớ NUMA
- GPU và bộ tăng tốc tính toán
- Mạng tốc độ cao và truy cập bộ nhớ trực tiếp từ xa
- Hệ thống tệp quy mô lớn
- Bộ lập lịch tác vụ theo lô
- Phục hồi nút bị lỗi
- Đo hiệu năng và phân bổ tài nguyên
TOP500 ghi nhận hệ điều hành và họ hệ điều hành của máy tính hiệu năng cao như một hạng mục phân loại riêng. Nhiều hệ thống trong danh sách hiện nay sử dụng hệ điều hành thuộc họ Linux như Ubuntu và Red Hat Enterprise Linux.
Hệ điều hành không tự mình quản lý toàn bộ cụm. Bên trên hệ điều hành còn có bộ lập lịch tác vụ, thư viện truyền thông điệp, hệ thống tệp phân tán và công cụ quản lý cụm.
Máy chơi trò chơi điện tử và thiết bị chuyên dụng
Máy chơi trò chơi điện tử, hộp giải mã tín hiệu, TV thông minh, thiết bị thực tế ảo và kiosk sử dụng phần cứng tương tự máy tính đa dụng nhưng cung cấp trải nghiệm người dùng, cơ chế bảo mật và hệ thống phân phối dành cho một mục đích cụ thể.
Hệ điều hành trong môi trường này có thể chú trọng các yếu tố sau.
- Độ trễ thấp của đồ họa và âm thanh
- Tối ưu hóa cho một cấu hình phần cứng giới hạn
- Cách ly ứng dụng và trò chơi
- Ký mã và xác minh tính toàn vẹn
- Tiết kiệm năng lượng và khôi phục nhanh từ chế độ chờ
- Bộ điều khiển và cảm biến
- Bảo vệ nội dung
- Cập nhật tập trung
Một số thiết bị chuyên dụng dựa trên các họ hệ điều hành hiện có như BSD, Linux hoặc Windows, nhưng điều chỉnh giao diện người dùng, chính sách bảo mật và API phát triển cho phù hợp với mục đích của thiết bị.
Phát triển và kiểm thử phần mềm
Hệ điều hành vừa là nền tảng thực thi ứng dụng, vừa là nền tảng cho các công cụ phát triển phần mềm. Trình biên dịch, trình gỡ lỗi, hệ thống xây dựng, trình giả lập và trình phân tích hiệu năng sử dụng các giao diện tiến trình, tệp, bộ nhớ và gỡ lỗi của hệ điều hành.
Nhà phát triển có thể sử dụng các chức năng sau để kiểm thử nhiều hệ điều hành và phiên bản khác nhau.
- Máy ảo
- Container
- Trình giả lập hệ điều hành
- Lớp tương thích
- Biên dịch chéo
- Gỡ lỗi thiết bị từ xa
- Theo dõi lời gọi hệ thống
- Phân tích hiệu năng nhân và hệ thống
Máy ảo phù hợp để kiểm thử nhân khác và toàn bộ môi trường hệ điều hành, còn container phù hợp để cách ly không gian người dùng và các phần phụ thuộc của ứng dụng trên cùng một nhân.
Thị phần
Thị phần hệ điều hành cho ra những kết quả khác nhau tùy theo đối tượng được đo lường. Nếu lấy lưu lượng sử dụng web trên máy tính cá nhân làm tiêu chuẩn, Windows được sử dụng rộng rãi nhất. Nếu tính toàn bộ lưu lượng web bao gồm cả điện thoại thông minh, Android chiếm tỷ lệ cao nhất. Trên máy chủ web và siêu máy tính, Linux cùng các hệ điều hành thuộc họ UNIX giữ vị trí áp đảo. Nếu tính cả bộ xử lý quản lý và bộ xử lý bảo mật bên trong máy tính như những hệ điều hành độc lập, MINIX 3 cùng nhiều Secure OS nhúng khác cũng được bổ sung vào thống kê.
Vì vậy, thị phần hệ điều hành không phải là một con số duy nhất dùng để chia toàn bộ thị trường thế giới. Ngay trong cùng một máy tính, hệ điều hành chủ mà người dùng trực tiếp sử dụng, hệ điều hành quản lý phần cứng và hệ điều hành thời gian thực trong firmware thiết bị có thể cùng chạy đồng thời.
Một máy tính cá nhân
Khu vực người dùng
└── Windows, Linux hoặc macOS
Khu vực quản lý Intel
└── Hệ điều hành thuộc dòng MINIX 3 của Intel ME
Khu vực quản lý AMD
└── Secure OS của AMD Secure Processor
Thiết bị ngoại vi
├── Firmware bộ điều khiển thiết bị lưu trữ
├── Firmware thiết bị mạng
└── Môi trường vận hành nhúng dùng cho quản lý nguồn và hệ thống
Tiêu chuẩn thống kê thị phần
Thị phần hệ điều hành thường được công bố không phải là kết quả điều tra toàn bộ số hệ điều hành được cài đặt trên tất cả máy tính. Các số liệu thường được tính bằng cách phân tích user agent và số lượt xem trang của thiết bị truy cập website, hoặc tổng hợp số thiết bị được nhà sản xuất xuất xưởng và số người dùng đang hoạt động.
StatCounter Global Stats phân tích hơn 3 tỷ lượt xem trang mỗi tháng từ hơn một triệu website trên toàn thế giới. Trong mỗi lượt xem trang, hệ thống xác định trình duyệt, hệ điều hành, độ phân giải màn hình và loại thiết bị để tính tỷ lệ sử dụng hệ điều hành.[14]
Phương thức này phản ánh môi trường sử dụng web thực tế, nhưng những thiết bị sau gần như không xuất hiện trong thống kê.
- Máy chủ không chạy trình duyệt web
- Thiết bị công nghiệp không trực tiếp kết nối Internet
- Hệ điều hành nhúng trong ô tô và đồ gia dụng
- Bộ xử lý điều khiển của thiết bị lưu trữ và thiết bị mạng
- Hệ điều hành bên trong máy ảo và container không truy cập web
- Môi trường vận hành bên trong phần cứng như Intel ME và AMD Secure Processor
Thị phần sử dụng web hữu ích để đo lường ảnh hưởng của hệ điều hành mà người dùng trực tiếp sử dụng, nhưng không biểu thị tổng số bản cài đặt của mọi hệ điều hành đang chạy trên thế giới.
Hệ điều hành máy tính để bàn
Trong thống kê lưu lượng web máy tính để bàn toàn cầu của StatCounter vào tháng 6 năm 2026, Windows chiếm tỷ lệ cao nhất với 56,61%. OS X chiếm 11,89%, macOS 4,48%, Linux 4,36%, Chrome OS 1,21%, còn các lượt truy cập không xác định được hệ điều hành chiếm 21,45%.[15]
| Hệ điều hành máy tính để bàn | Tỷ lệ sử dụng web toàn cầu tháng 6 năm 2026 |
|---|---|
| Windows | 56,61% |
| Không xác định | 21,45% |
| OS X | 11,89% |
| macOS | 4,48% |
| Linux | 4,36% |
| Chrome OS | 1,21% |
StatCounter thống kê hệ điều hành Apple thành hai mục riêng là OS X và macOS. Nếu gộp hai mục này thành một họ macOS, tỷ lệ đạt 16,37%. Nếu loại bỏ các hệ điều hành không xác định và tính lại chỉ trên những hệ điều hành đã biết, Windows chiếm khoảng 72,1%.
Tỷ lệ của Windows trong số hệ điều hành đã xác định
56,61
──────────── × 100
100 - 21,45
= khoảng 72,1%
Vì vậy, nhận định phổ biến rằng Windows đứng đầu thế giới trong thị trường hệ điều hành máy tính để bàn là hợp lý. Tuy nhiên, 56,61% không phải là tỷ lệ số máy tính cá nhân đang được sở hữu trên toàn thế giới, mà là tỷ lệ lượt xem trang web trên máy tính để bàn được quan sát trong tháng 6 năm 2026.
Linux không phải là một sản phẩm hoàn chỉnh duy nhất mà là nhân chung của nhiều bản phân phối Linux và môi trường vận hành chuyên dụng. Vì vậy, trong thống kê máy tính để bàn, mức sử dụng của Ubuntu, Fedora, Arch Linux và các hệ thống khác được cộng chung vào mục Linux. Ngược lại, hệ Apple được hiển thị tách thành OS X và macOS tùy theo cách nhận diện của hệ thống thống kê.
Hệ điều hành di động
Trong lưu lượng web di động toàn cầu tháng 6 năm 2026, Android chiếm 69,14% và iOS chiếm 30,79%. Hai hệ điều hành này tạo thành hơn 99,9% toàn bộ lưu lượng web di động, khiến thị trường hệ điều hành điện thoại thông minh hiện đại trên thực tế trở thành hệ thống hai cực Android và iOS.[16]
| Hệ điều hành di động | Tỷ lệ sử dụng web toàn cầu tháng 6 năm 2026 |
|---|---|
| Android | 69,14% |
| iOS | 30,79% |
| Không xác định | 0,03% |
| Linux | 0,01% |
| KaiOS | 0,01% |
| Windows | 0,01% |
Android sử dụng nhân Linux nhưng được phân loại như một hệ điều hành Android độc lập trong các thống kê thị phần thông thường. Vì vậy, tỷ lệ Android không được cộng trực tiếp vào thị phần Linux trên máy tính để bàn. Khi phân tích theo họ nhân, Android, Chrome OS và nhiều hệ thống nhúng có thể được xếp vào họ Linux, nhưng nếu phân loại theo sản phẩm hệ điều hành dành cho người dùng thì chúng là các nền tảng riêng biệt.
Hệ điều hành trên toàn bộ thiết bị người dùng
Trong lưu lượng web toàn cầu tháng 6 năm 2026 bao gồm máy tính để bàn, điện thoại di động và máy tính bảng, Android đứng đầu với 36,21%, tiếp theo là Windows với 26,67% và iOS với 16,62%. OS X chiếm 5,60%, macOS 2,11%, còn hệ điều hành không xác định chiếm 10,12%.[17]
| Hệ điều hành | Tỷ lệ sử dụng web tổng thể tháng 6 năm 2026 |
|---|---|
| Android | 36,21% |
| Windows | 26,67% |
| iOS | 16,62% |
| Không xác định | 10,12% |
| OS X | 5,60% |
| macOS | 2,11% |
Trong thống kê này, Android là hệ điều hành dành cho người dùng được sử dụng nhiều nhất thế giới. Windows đứng đầu trên máy tính để bàn, nhưng khi cộng tất cả thiết bị truy cập web bao gồm điện thoại thông minh, tỷ lệ của Windows thấp hơn Android.
Vì vậy, cách diễn đạt “hệ điều hành được sử dụng nhiều nhất thế giới” cần đi kèm phạm vi cụ thể như sau.
- Windows đứng đầu lưu lượng web máy tính để bàn toàn cầu.
- Android đứng đầu lưu lượng web di động toàn cầu.
- Android cũng đứng đầu tổng lưu lượng web khi kết hợp máy tính để bàn và di động.
- Nếu tính cả hệ điều hành tích hợp trong phần cứng máy tính x86, MINIX 3 có cơ sở cài đặt tích lũy lớn nhất.
Hệ điều hành máy chủ
Thị phần hệ điều hành máy chủ toàn cầu khó thống kê chính xác hơn so với máy tính để bàn và di động. Nhiều máy chủ chạy trong mạng riêng, nội bộ doanh nghiệp và trung tâm dữ liệu đám mây mà không công khai thông tin hệ điều hành ra bên ngoài. Do nhiều máy ảo và container có thể chạy trên cùng một máy chủ vật lý, số lượng thiết bị vật lý và số phiên bản hệ điều hành đang chạy cũng không trùng khớp.
Theo thống kê W3Techs phân tích hệ điều hành máy chủ của các website công khai, vào tháng 6 năm 2026, 91,7% số website có thể xác định hệ điều hành sử dụng hệ điều hành thuộc họ UNIX. Con số này dựa trên các website có cấu hình công nghệ có thể nhận diện từ bên ngoài, không phải toàn bộ máy chủ trên thế giới.[18]
Tỷ lệ cao của họ UNIX trên máy chủ xuất phát từ việc Linux, BSD và các hệ UNIX thương mại được sử dụng rộng rãi trong máy chủ web, cơ sở dữ liệu và hạ tầng đám mây. Windows Server cũng giữ vị trí quan trọng trong thư mục doanh nghiệp, máy chủ tệp, ứng dụng nghiệp vụ và hệ sinh thái Microsoft.
Thị phần máy chủ có thể khác nhau tùy theo các tiêu chuẩn sau.
- Số máy chủ vật lý được xuất xưởng
- Số phiên bản máy ảo
- Số ảnh hệ điều hành đang chạy trên đám mây
- Số website công khai
- Lưu lượng yêu cầu web được xử lý
- Số máy chủ nội bộ doanh nghiệp
- Số máy chủ chạy container
Vì vậy, không nên diễn giải thị phần hệ điều hành của website công khai thành toàn bộ số bản cài đặt máy chủ.
Siêu máy tính
Trong điện toán hiệu năng cao, hệ điều hành thuộc họ Linux được sử dụng như tiêu chuẩn trên thực tế. Các siêu máy tính hiện đại được liệt kê trong TOP500 chủ yếu sử dụng Red Hat Enterprise Linux, Ubuntu, các hệ SUSE và môi trường Linux được từng nhà sản xuất sửa đổi. Danh sách TOP500 tháng 6 năm 2026 cũng bao gồm các hệ thống được ghi là RHEL, Ubuntu hoặc Linux nói chung.[19]
Những lý do Linux được sử dụng rộng rãi trên siêu máy tính bao gồm:
- Có thể sửa đổi nhân và không gian người dùng theo mục đích của hệ thống
- Hỗ trợ nhiều kiến trúc CPU và bộ tăng tốc
- Hỗ trợ NUMA quy mô lớn và xử lý song song
- Hỗ trợ mạng tốc độ cao và hệ thống tệp phân tán
- Có thể loại bỏ các thành phần đồ họa và máy tính để bàn không cần thiết
- Có cấu trúc mở để viện nghiên cứu và nhà sản xuất cùng phát triển
Thị phần này không liên quan đến số lượng người dùng phổ thông mà cho biết những hệ thống tính toán có hiệu năng cao nhất thế giới sử dụng họ hệ điều hành nào.
Thị phần theo họ nhân
Nếu nhóm theo nhân và nguồn gốc lịch sử thay vì sản phẩm hệ điều hành, hình ảnh thị phần sẽ thay đổi.
Android và Chrome OS sử dụng nhân Linux, đồng thời nhiều máy chủ, siêu máy tính, thiết bị mạng và hệ thống nhúng cũng dựa trên Linux. Vì vậy, họ nhân Linux được triển khai trong phạm vi rộng hơn rất nhiều so với thị phần máy tính để bàn của Linux.
macOS, iOS, iPadOS, watchOS, tvOS và visionOS dùng chung nhân XNU và nền tảng Darwin. Nếu gộp chúng thành một họ hệ điều hành Apple, macOS trên máy tính để bàn và iOS trên thiết bị di động sẽ thuộc cùng một dòng công nghệ.
Họ UNIX bao gồm Linux, BSD, macOS, iOS, nhiều UNIX thương mại và một số hệ điều hành thời gian thực. Bất kể có chứng nhận UNIX chính thức hay không, các hệ điều hành chịu ảnh hưởng từ mô hình tiến trình, tệp, quyền, shell và giao diện POSIX của UNIX chiếm một phần lớn trong môi trường máy chủ, di động, máy tính để bàn và hệ thống nhúng hiện đại.
| Tiêu chuẩn phân loại | Ví dụ được thống kê khác nhau |
|---|---|
| Sản phẩm hệ điều hành | Android, Ubuntu và macOS được tính riêng |
| Nhân | Android và Ubuntu được gộp vào họ Linux |
| Hệ sinh thái nền tảng | macOS và iOS được gộp thành hệ điều hành Apple |
| Dòng lịch sử | Linux, BSD và macOS được phân loại là họ Unix |
| Giao diện người dùng | Chỉ tính hệ điều hành chủ mà người dùng trực tiếp điều khiển |
| Phiên bản thực thi | Tính riêng hệ điều hành chủ và hệ điều hành nhúng |
Vì vậy, việc Linux có thị phần máy tính để bàn thấp không mâu thuẫn với việc nhân Linux được sử dụng trên nhiều loại máy tính nhất thế giới.
Hệ điều hành bên trong phần cứng
Hệ điều hành không chỉ giới hạn ở phần mềm dành cho người dùng có màn hình, cửa sổ và trình khởi chạy ứng dụng. Nếu áp dụng định nghĩa hệ điều hành là phần mềm quản lý tài nguyên phần cứng và cung cấp dịch vụ chung cho chương trình khác, môi trường vận hành của bộ xử lý quản lý và bộ xử lý bảo mật nằm trong CPU hoặc chipset cũng có thể được xem là hệ điều hành.
Intel đã sử dụng một phiên bản MINIX 3 được sửa đổi trong Intel Management Engine 11, được giới thiệu cùng thế hệ Skylake. Intel ME chạy trên một bộ xử lý quản lý tách biệt với bộ xử lý x86 chính và khởi động các dịch vụ cần thiết cho việc khởi tạo, quản lý và bảo mật hệ thống trước cả hệ điều hành chủ.
Andrew Tanenbaum, người tạo ra MINIX, giải thích rằng Intel đã sử dụng MINIX trong ME 11 và ME 11 khi đó được tích hợp trong gần như mọi máy tính để bàn và máy tính xách tay hiện đại trên thế giới. Theo đó, MINIX 3 trở thành hệ điều hành được cài đặt trên nhiều máy tính x86 hơn Windows, Linux và macOS.[20]
Điều này không có nghĩa người dùng lựa chọn giữa Windows và MINIX. Trên máy tính Intel, Windows, Linux hoặc macOS chạy trên bộ xử lý chính, còn MINIX 3 đồng thời chạy trên bộ xử lý quản lý của Intel ME.
Máy tính cá nhân dựa trên Intel
Bộ xử lý x86 chính
└── Windows, Linux hoặc macOS
Intel Management Engine
└── Hệ điều hành quản lý dựa trên MINIX 3
Vì vậy, hai hệ điều hành không cạnh tranh để chia cùng một thị trường mà được cài đặt đồng thời ở các tầng hệ thống khác nhau. Thống kê máy tính để bàn thông thường chỉ ghi nhận hệ điều hành chủ nơi người dùng chạy trình duyệt web, nên không bao gồm MINIX 3 bên trong Intel ME.
Cơ sở cài đặt của MINIX 3
MINIX 3 là hệ điều hành đơn lẻ được triển khai rộng nhất trong cơ sở cài đặt tích lũy của máy tính cá nhân x86 nếu tính cả hệ điều hành tích hợp trong phần cứng. Những hệ thống Intel có ME 11 đều bao gồm môi trường quản lý dựa trên MINIX 3 bất kể hệ điều hành chủ do người dùng cài đặt là gì.
Thị phần Windows biểu thị hệ điều hành máy tính để bàn mà người dùng dùng để truy cập web tại cùng một thời điểm. Cơ sở cài đặt của MINIX 3 biểu thị số lượng phần cứng chứa Intel ME 11 đã được phân phối.
| Tiêu chuẩn | Windows | MINIX 3 |
|---|---|---|
| Vị trí thực thi | Bộ xử lý x86 chính | Bộ xử lý quản lý Intel |
| Giao diện người dùng | Có cung cấp | Không cung cấp cho người dùng thông thường |
| Thống kê web thông thường | Có tính | Không được tính |
| Phương thức cài đặt | Nhà sản xuất hoặc người dùng cài đặt | Tích hợp trong firmware nền tảng Intel |
| Vai trò chính | Chạy ứng dụng người dùng | Quản lý phần cứng và dịch vụ bảo mật |
| Tiêu chuẩn thống kê | Lưu lượng web và thiết bị hoạt động | Cơ sở phần cứng có ME 11 |
Do đó, Windows đứng đầu thị phần người dùng máy tính để bàn, còn MINIX 3 đứng đầu cơ sở cài đặt máy tính cá nhân x86 nếu tính cả hệ điều hành bên trong phần cứng. Hai thống kê này đều đúng trong những tầng và tiêu chuẩn khác nhau.
AMD Secure Processor
Bộ xử lý AMD tích hợp AMD Secure Processor, hoạt động tách biệt với các lõi x86 chính. AMD Secure Processor thực hiện các chức năng như xác minh khởi động, hệ thống tin cậy firmware, mã hóa và fTPM trên một bộ xử lý bảo mật chuyên dụng. AMD mô tả AMD Secure Processor 2.0 trên nền tảng AMD PRO hiện đại là bộ xử lý bảo mật chuyên dụng kiểm tra mã trước khi thực thi và thiết lập gốc tin cậy phần cứng.[21]
Trong cấu trúc firmware AMD PSP, PSP SecureOS firmware được bao gồm như một thành phần riêng biệt. SecureOS khởi tạo cấu trúc hệ điều hành nội bộ, chạy fTPM như một ứng dụng tin cậy, thiết lập giao diện giữa CPU và BIOS, rồi chuyển sang trạng thái chạy thường trực để chờ lệnh.[22]
Máy tính cá nhân dựa trên AMD
Bộ xử lý x86 chính
└── Windows hoặc Linux
AMD Secure Processor
└── PSP SecureOS
├── Khởi động an toàn
├── Xác minh firmware
├── fTPM
└── Ứng dụng bảo mật
AMD SecureOS cũng không xuất hiện trong thống kê lưu lượng web máy tính để bàn và di động. Một máy tính dựa trên AMD chạy đồng thời hệ điều hành dành cho người dùng và hệ điều hành dành cho bảo mật phần cứng.
Quy mô của hệ điều hành nhúng
Máy tính và thiết bị điện tử hiện đại chứa nhiều môi trường vận hành mà người dùng không trực tiếp nhận biết.
- Bộ điều khiển thiết bị lưu trữ SSD và HDD
- Giao diện mạng và chip truyền thông không dây
- Bàn phím, chuột và thiết bị nhập
- Màn hình và thiết bị đồ họa
- Bộ điều khiển quản lý nguồn
- Bộ điều khiển quản lý bo mạch chủ của máy chủ
- Bộ điều khiển điện tử trong ô tô
- Camera và cảm biến
- Đồ gia dụng thông minh và thiết bị Internet vạn vật
Các thiết bị này chạy firmware bare-metal, bộ lập lịch nhỏ, RTOS hoặc một hệ điều hành nhúng hoàn chỉnh. Ngay cả một máy tính xách tay cũng có thể chứa nhiều môi trường firmware độc lập ngoài hệ điều hành do người dùng lựa chọn.
Vì vậy, không thể tính tổng số hệ điều hành đang chạy trên thế giới bằng đúng số lượng thiết bị. Một điện thoại thông minh hoặc máy tính cá nhân không chỉ chạy một hệ điều hành, mà còn có nhiều bộ xử lý phụ và bộ điều khiển chạy các môi trường vận hành độc lập bên dưới hệ điều hành chính.
Thị phần người dùng và tổng cơ sở cài đặt
Thị phần hệ điều hành có thể được chia thành hai góc nhìn lớn.
Thị phần người dùng
Đối tượng là hệ điều hành chủ nơi người dùng trực tiếp chạy ứng dụng và thao tác với tệp cùng màn hình.
Máy tính để bàn
Windows đứng đầu
Di động
Android đứng đầu
Toàn bộ thiết bị người dùng
Android đứng đầu
Tổng cơ sở cài đặt
Đối tượng bao gồm hệ điều hành chủ, bộ xử lý quản lý, bộ xử lý bảo mật, thiết bị nhúng và các phiên bản hệ điều hành trong máy ảo.
Một máy tính
├── Hệ điều hành chủ
├── Hệ điều hành của công cụ quản lý
├── Hệ điều hành của bộ xử lý bảo mật
├── Firmware thiết bị lưu trữ
└── Môi trường quản lý mạng và nguồn điện
Thị phần người dùng phù hợp để phân tích hệ sinh thái hệ điều hành, thị trường ứng dụng và trải nghiệm người dùng. Tổng cơ sở cài đặt cho thấy một máy tính hiện đại trên thực tế được cấu thành từ bao nhiêu tầng hệ điều hành.
Hai loại thống kê này không thể thay thế nhau. Windows có thể thống trị thị trường người dùng máy tính để bàn trong khi MINIX 3 cùng chạy bên trong máy tính Intel. Android có thể thống trị lưu lượng sử dụng di động trong khi bên trong nó đồng thời tồn tại nhân Linux cùng nhiều firmware thiết bị.
Diễn giải thống kê
Khi giải thích thị phần hệ điều hành, cần trình bày cùng các yếu tố sau.
- Loại thiết bị được đo lường
- Là hệ điều hành dành cho người dùng hay hệ điều hành nhúng
- Là lưu lượng web hay số lượng cài đặt
- Là thiết bị đang hoạt động hay tổng số đã xuất xưởng
- Là sản phẩm hệ điều hành hay họ nhân
- Là thiết bị vật lý hay phiên bản ảo
- Thời điểm và khu vực khảo sát
Nhận định “Windows là hệ điều hành số một thế giới” đúng trong thị trường người dùng máy tính để bàn, nhưng không bao gồm di động, máy chủ, siêu máy tính và hệ thống nhúng. Nhận định “Android là hệ điều hành số một thế giới” đúng khi xét lưu lượng web kết hợp máy tính để bàn và di động, nhưng không bao gồm máy chủ và thiết bị nhúng không truy cập web.
Nếu áp dụng định nghĩa kỹ thuật của hệ điều hành cho toàn bộ tầng máy tính, phạm vi của hệ điều hành người dùng nhìn thấy sẽ khác với phạm vi hệ điều hành thực sự chạy trên phần cứng. Windows thống trị thị trường người dùng máy tính để bàn, Android thống trị tổng lưu lượng web của thiết bị người dùng, Linux và họ UNIX giữ vị trí trung tâm trên máy chủ và siêu máy tính, còn nếu tính cả hệ điều hành nhúng trong phần cứng máy tính cá nhân x86 thì MINIX 3 tạo thành cơ sở cài đặt rộng nhất.
Vì vậy, thị phần hệ điều hành nên được hiểu không phải như một bảng xếp hạng duy nhất mà là thống kê biểu thị sự phân bố của nhiều tầng cấu thành hệ thống điện toán hiện đại.
Tài liệu liên quan
- Nhân hệ điều hành
- Lời gọi hệ thống
- Tiến trình
- Luồng
- Lập lịch CPU
- Bộ nhớ ảo
- Hệ thống tệp
- Trình điều khiển thiết bị
- Vào/ra
- Ngắt
- Giao tiếp liên tiến trình
- Đồng bộ hóa
- Kiểm soát truy cập
- Chế độ người dùng
- Chế độ nhân
- Sandbox
- Ảo hóa
- Hypervisor
- Máy ảo
- Container
- Hệ điều hành thời gian thực
- Hệ điều hành nhúng
- Hệ điều hành máy chủ
- Hệ điều hành di động
- Hệ điều hành phân tán
- UNIX
- POSIX
- BSD
- Linux
- Bản phân phối Linux
- Windows NT
- Darwin
- Android
- iOS
- FreeBSD
- QNX
- FreeRTOS
- Zephyr
- z/OS
- learn.microsoft.com ↩
- learn.microsoft.com ↩
- developer.apple.com ↩
- developer.apple.com ↩
- learn.microsoft.com ↩
- man7.org ↩
- man7.org ↩
- developer.apple.com ↩
- docs.kernel.org ↩
- learn.microsoft.com ↩
- learn.microsoft.com ↩
- developer.apple.com ↩
- man7.org ↩
- StatCounter Global Stats FAQ ↩
- Desktop Operating System Market Share Worldwide ↩
- Mobile Operating System Market Share Worldwide ↩
- Operating System Market Share Worldwide ↩
- Usage Statistics and Market Share of Operating Systems for Websites ↩
- TOP500 List – June 2026 ↩
- An Open Letter to Intel ↩
- AMD PRO Technologies Security White Paper ↩
- AMD Platform Security Processor Firmware Integration Guide ↩