1.2.1. Định nghĩa Hệ điều hành
1.2.1.1. Định nghĩa theo các góc độ quan sát
Các đối tượng khác nhau có yêu cầu khác nhau về hệ điều hành. Việc có nhiều góc độ quan sát đánh giá, dẫn đến có nhiều định nghĩa.
- Người sử dụng định nghĩa hệ điều hành là hệ thống chương trình phục vụ khai thác hệ thống tính toán một cách thuận lợi.
- Người quản lý định nghĩa hệ điều hành là chương trình phục vụ quản lý chặt chẽ và sử dụng tối ưu các tài nguyên của hệ thống tính toán.
- Quan điểm kỹ thuật định nghĩa hệ điều hành là một hệ thống chương trình trang bị cho máy tính logic mới với tài nguyên mới và khả năng mới.
- Quan điểm hệ thống định nghĩa hệ điều hành là một hệ thống mô hình hoá, mô phỏng hoạt động của máy tính, của người sử dụng và của thao tác viên, hoạt động trong chế độ đối thoại nhằm tạo ra một môi trường khai thác thuận lợi hệ thống máy tính và quản lý tối ưu tài nguyên của hệ thống.
1.2.1.2. Định nghĩa theo quan điểm hệ thống
Theo như định nghĩa ở phần trước, hệ điều hành là một hệ thống mô hình hoá mô phỏng hoạt động của ba thành phần: máy, user, operator (thao tác viên). Vì vậy, hệ điều hành cần ba loại ngôn ngữ để đáp ứng nhu cầu của từng thành phần.
- Đáp ứng máy: Hệ điều hành giao tiếp thông ngôn ngữ máy. Ngôn ngữ máy là ngôn ngữ thực hiện duy nhất của hệ thống. Mọi ngôn ngữ khác đều phải dịch ra ngôn ngữ máy.
- Đáp ứng thao tác viên: Hệ điều hành cung cấp ngôn ngữ vận hành hệ thống - câu lệnh vận hành của hệ thống. Ví dụ, hệ điều hành DOS cung cấp một số lệnh như Dir, Del,... Hệ điều hành Unix cung cấp các lệnh như ls (list), rm (remove), ... Các câu lệnh này sẽ được dịch bởi Shell.
- Đáp ứng người sử dụng: Hệ điều hành có thể giao tiếp thông qua ngôn ngữ thuật toán gồm ngôn ngữ lập trình và chương trình dịch.
1.2.2. Phân loại Hệ điều hành
1.2.2.1. Hệ thống xử lý theo lô đơn chương trình
- Thực hiện các chương trình (Job) lần lượt theo những chỉ thị đã được xác định trước.
- Khi 1 Job kết thúc, hệ thống tự động thực hiện một Job tiếp theo mà không cần sự can thiệp từ bên ngoài.
- Phải tồn tại một bộ giám sát việc thực hiện dãy công việc và bộ giám sát phải thường trú ở trong hệ thống
- Đòi hỏi phải thực hiện một hàng đợi công việc (Job queue)
- Vấn đề lớn sẽ xảy ra khi một chương trình yêu cầu truy nhập vào thiết bị vào/ra, việc truy cập này đôi khi sẽ mất thời gian nhiều, dẫn đến bộ xử lý phải chờ đợi đến khi việc truy nhập thiết bị vào ra kết thúc mới có thể thực hiện tiếp các nhiệm vụ, gây ra lãng phí (trong khi thời gian chờ đợi đó có thể sử dụng để xử lý job khác).
1.2.2.2. Hệ thống xử lý theo lô đa chương trình
- Hệ thống cho phép thực hiện nhiều chương trình đồng thời.
- Nạp một phần mã và dữ liệu của các chương trình/tiến trình vào bộ nhớ (phần còn lại sẽ được nạp tại thời điểm thích hợp). Mỗi phần mã và dữ liệu đó sẽ được đánh dấu là sẵn sàng để thực thi.
- Thực thi chương trình tương tự như Hệ thống xử lý theo lô đơn chương trình (1.2.2.1).
- Nếu chương trình thực hiện vào ra, bộ xử lý được chuyển giao cho chương trình đang sẵn sàng khác.
- Hệ thống này tiết kiệm bộ nhớ, do không cần nạp toàn bộ chương trình vào bộ nhớ. Ngoài ra, còn hạn chế thời gian rảnh rỗi của bộ xử lý.
- Trong hệ thống này, hệ thống cần phải liên tục đánh giá xem nên cấp phát bộ xử lý cho chương trình/tiến trình nào. Dẫn đến kết quả là chi phí điều phối bộ xử lý cho hệ thống này cao. Ngoài ra hệ thống cần phải giải quyết vấn đề chia sẻ bộ nhớ giữa các chương trình. Có thể lấy một ví dụ, hệ thống đang nạp vào CT1, CT2, CT3, CT4. Trong đó, CT1 yêu cầu 100Mb bộ nhớ, CT2 yêu cầu 100Mb bộ nhớ, CT3 yêu cầu 100Mb bộ nhớ, CT4 yêu cầu 100Mb bộ nhớ, hệ thống có 300Mb bộ nhớ cung cấp cho các chương trình/tiến trình. CT1 được cấp 100Mb tuy nhiên sử dụng được 50Mb bộ nhớ thì thực hiện vào ra, chuyển bộ xử lý cho CT2, CT2 được cấp 100Mb tuy nhiên cũng sử dụng 50Mb thì thực hiện vào ra, chuyển bộ xử lý cho CT3, CT3 cũng được cấp 100Mb tuy nhiên cũng sử dụng 50Mb thì thực hiện vào ra. Bây giờ, chuyển bộ xử lý cho CT4. Khi này, hệ thống đã cung cấp toàn bộ bộ nhớ của mình cho các chương trình 1,2,3 và không đủ bộ nhớ cho CT4. Tuy nhiên, thực thế mỗi phần bộ nhớ cung cấp cho các chương trình trên vẫn chưa dùng hết. Nếu tổng các phần chưa dùng đến, chúng ta vẫn còn 150Mb và đủ để cấp cho CT4. Đó là vấn đề chia sẻ bộ nhớ giữa các chương trình/tiến trình. Hệ thống xử lý theo lô đa chương trình cần một cơ chế để xử lý vấn đề này.
1.2.2.3. Hệ thống phân chia thời gian
- Hệ thống này Chia sẻ thời gian của processor cho các CT/tiến trình đang sẵn sàng thực hiện
- Nguyên tắc giống như hệ thống xử lý theo lô đa CT (nạp một phần của các CT)
- Trong đó, processor được phân phối lại phụ thuộc chủ yếu vào sự điều phối của hệ điều hành. Sự phân phối của hệ điều hành diễn ra như thế nào chúng ta sẽ tìm hiểu ở chương 2.
- Ưu điểm của hệ thống này là thời gian hoán đổi giữa các tiến trình nhỏ, các CT cảm giác song song
- Hệ thống này thường được gọi là hệ điều hành đa nhiệm (ví dụ Windows, Linux)
1.2.2.4. Hệ thống xử lý thời gian thực
- Hệ thống này thường được xử dụng chủ yếu trong lĩnh vực điều khiển.
- Bài toán lớn mà hệ thống này giải quyết đó là giải quết vấn đề không muộn hơn một thời điểm nào đó. Mỗi bài toán trong lĩnh vực điều khiển đều có một hạn định (deadline). Hệ thống cần phải đưa ra kết quả chính xác trong thời gian xác định đó.
- Một đặc điểm khác của hệ thống này đó là cần sự phối hợp cao giữa phần cứng và phần mềm.
- Ví dụ như RTlinux, VxWorks
1.2.2.5. Hệ thống song song
- Được xây dựng cho các hệ thống có nhiều vi xử lý.
- Hệ thống nhiều vi xử lý sẽ giải quyết công việc nhanh hơn.
- Hệ thống có độ tin cậy cao do hỏng một vi xử lý không ảnh hưởng đến toàn bộ hệ thống
- Chúng ta có thể so sánh một chút về hệ thống song song với một hệ thống nhiều máy tính đơn vi xử lý. Có thể nói, hệ thống song song có ưu thế hơn so với một hệ thống nhiều máy tính đơn vi xử lý bởi vì các vi xử lý trong hệ thống song song có thể chia sẻ bộ nhớ, các thiết bị ngoại vi.
- Có hai mô hình đa xử lý
- Đa xử lý đối xứng (SMP - symetric multi process). Mô hình đa xử lý có một số đặc điểm nổi bật như
- Mỗi bộ xử lý chạy 1 tiến trình/tiểu trình
- Các VXL giao tiếp với nhau thông qua 1 bộ nhớ dùng chung
- Có nhiều VXL mà một VXL hỏng không ảnh hưởng đến hệ thống, do vậy khả năng chịu lỗi tốt. Trong hệ thống SMP, các nhiệm vụ có thể được di chuyển từ một VXL sang một VXL khác để cân bằng tải, do vậy khả năng cân bằng tải cũng tốt.
- Vấn đề cần giải quyết đối với mô hình đa xử lý đối xứng này là việc đồng bộ giữa các VXL. Các VXL sử dụng chung tài nguyên của hệ thống, vì vậy cần có cơ chế đảm bảo các vấn đề này.
- Ví dụ HĐH WinNT
- Đa xử lý không đối xứng (ASMP - asymmetric multi process). Mô hình đa xử lý có một số đặc điểm nổi bật như
- Có một bộ xử lý chính kiểm soát toàn bộ hệ thống
- Các bộ xử lý khác thực hiện theo lệnh của bộ xử lý chính hoặc theo những chỉ thị đã được định nghĩa trước
- Mô hình này theo dạng quan hệ chủ tớ, bộ xử lý chính sẽ lập lịch cho các bộ xử lý khác
- Ví dụ: IBM System/360
- Đa xử lý đối xứng (SMP - symetric multi process). Mô hình đa xử lý có một số đặc điểm nổi bật như
1.2.2.6. Hệ thống phân tán
Trong hệ thống phân tán:
- Mỗi bộ xử lý có bộ nhớ cục bộ riêng, và trao đổi với nhau thông qua các đường truyền thông
- Các VXL thường khác nhau về kích thước và chức năng (Máy cá nhân, máy trạm, máy mini,..)
- Hệ thống phân tán được sử dụng để
- Chia sẻ tài nguyên: cung cấp các cơ chế chia sẻ tập tin, in ấn tại một vị trí xa,...
- Tăng tốc độ tính toán: Một thao tác tính toán được chia làm nhiều phần nhỏ được thực hiện cùng lúc trên nhiều thiết bị khác nhau.
- An toàn: Một vị trí trong hệ thống hỏng, các vị trí khác vẫn tiếp tục làm việc
1.2.3. Các khái niệm trong Hệ điều hành
1.2.3.1. Tiến trình và luồng
Tiến trình (process)
Tiến trình là một chương trình đang thực hiện, cùng với:
- Mã lệnh thực thi của chương trình (code)
- Dữ liệu của chương trình (data)
- Ngăn xếp (stack), con trỏ ngăn xếp (stack pointer), thanh ghi (resgister)
- Các thông tin cần thiết cho việc thực thi chương trình
Tiến trình so sánh với chương trình?
- Chương trình là một thực thể thụ động, chứa đựng các chỉ thị điều khiển máy tính thực hiện 1 nhiệm vụ nào đó.
- Tiến trình là trạng thái động của chương trình.
Một tiến trình có thể có nhiều luồng (tiểu trình)
Luồng (thread)
- Là một chuỗi lệnh được thực hiện trong tiến trình. Luồng bao gồm mã thực thi, dữ liệu, con trỏ lệnh, ngăn xếp, tập thanh ghi riêng
- Tiến trình chỉ chứa một luồng được gọi là Heavyweight process
- Tiến trình gồm nhiều luồng (Lightweight process / Multi-threading process)
- Các luồng hoạt động song song, chia sẻ biến toàn cục của tiến trình
Chúng ta có thể xem mô tả hai mô hình tiến trình đơn luồng và đa luồng trong hình ảnh trên. Hãy chú ý phần code, data, file. Đó là những biến toàn cục của một tiến trình, chúng được dùng chung cho tất cả các luồng. Và mỗi luồng đều có một một số thanh ghi và stack riêng của mình.
1.2.3.2. Tài nguyên hệ thống
Định nghĩa
- Tài nguyên hệ thống là tất cả những gì cần thiết để cho một tiến trình có thể thực hiện được. Bao gồm
- Không gian: không gian lưu trữ của hệ thống
- Thời gian: Thời gian thực hiện lệnh/truy xuất dữ liệu
- Tài nguyên hệ thống nếu là
- Bộ nhớ, sẽ có đặc điểm:
- dung lượng và thời gian truy cập trực tiếp, tuần tự
- phân cấp: bộ nhớ thực hiện (hay còn gọi bộ nhớ trong); bộ nhớ ngoài; bộ nhớ mở rộng
- Chúng ta cần phân biệt hai khái niệm: bộ nhớ (vùng vật lý chứa dữ liệu), và truy cập tới bộ nhớ (quá trình tìm đến dữ liệu trên bộ nhớ)
- Vi xử lý (processor), sẽ có đặc điểm:
- là tài nguyên quan trọng nhất của hệ thống
- được phép truy cập bằng câu lệnh (hay ở mức câu lệnh)
- trong hệ thống nhiều VXL, thời gian của từng VXL được quản lý và phân phối một cách độc lập
- Thiết bị ngoại vi, sẽ có đặc điểm:
- tiếp nhận và kết xuất thông tin ( thiết bị vào ra )
- được gắn với hệ thống bởi các thiết bị điều khiển
- Bộ nhớ, sẽ có đặc điểm:
Phân loại tài nguyên
Phân loại theo kiểu tài nguyên:
- Tài nguyên vật lý: Các thiết bị vật lý
- Tài nguyên logic: biến nhớ, thiết bị ảo
Phân loại theo khả năng dùng chung:
- Tài nguyên dùng chung được: tại một thời điểm nó có thể cấp phát cho nhiều tiến trình khác nhau. Ví dụ: Bộ nhớ
- Tài nguyên không dùng chung được nhưng phân chia được: Các tiến trình sử dụng tài nguyên theo nguyên tắc lần lượt. Ví dụ: processor
- Tài nguyên không dùng chung được và không phân chia được: tại một thời điểm nó chỉ có thể cấp phát cho một tiến trình duy nhất. Ví dụ : máy in
Tài nguyên ảo
Một loại tài nguyên đặc biệt mà chúng ta cần nhắc tới ở đây là tài nguyên ảo. Đó là loại tài nguyên cung cấp cho chương trình người sử dụng dưới dạng đã được biến đổi. Chỉ xuất hiện khi hệ thống cần tới nó hoặc hệ thống tạo ra nó. Tự động mất đi khi hệ thống kết thúc hay chính xác hơn là khi tiến trình gắn với nó đã kết thúc.
1.2.3.3. Bộ xử lý lệnh Shell
- Là một tiến trình đặc biệt: nơi giao tiếp giữa người dùng và HĐH
- Nhiệm vụ của bộ xử lý lệnh Shell:
- Nhận lệnh của người sử dụng
- Phân tích lệnh
- Phát sinh tiến trình mới để thực hiện yêu cầu của lệnh
- Tiến trình nhận lệnh thông qua cơ chế dòng lệnh
- Trong môi trường đơn nhiệm (ví dụ MS-DOS), Shell sẽ chờ tới khi tiến trình này kết thúc mới có thể nhận lệnh mới.
- Trong môi trường đa nhiệm (ví dụ UNIX, WINXP,..), sau khi khởi tạo và đưa tiến trình mới vào hoạt động, Shell có thể nhận lệnh mới
1.2.3.4. Lời gọi hệ thống (System calls)
- Lời gọi hệ thống tạo ra môi trường giao tiếp giữa chương trình của người sử dụng và hệ điều hành
- Chương trình của người sử dụng dùng các lời gọi hệ thống để yêu cầu các dịch vụ được cung cấp bởi hệ điều hành. Ví dụ như tạo, xoá, sử dụng các đối tượng phần mềm khác nhau được vận hành bởi hệ thống
- Mỗi lời gọi hệ thống ứng với một thư viện các chương trình con
- Lời gọi hệ thống được thực hiện dưới dạng:
- Các câu lệnh trong các ngôn ngữ lập trình cấp thấp
- Lệnh gọi ngắt trong hợp ngữ
- Thủ tục gọi hàm API trong windows
- Tham số cho các dịch vụ và kết quả trả về của các lời gọi hệ thống được đặt tại các vùng nhớ đặc biệt
- Ví dụ khi lập trình với hợp ngữ, khi gọi ngắt, mã chức năng được đặt trong thanh ghi AH
- Chúng ta sẽ minh hoạt lời gọi hệ thống dưới dạng gọi hàm API trong windows:
- Windows cung cấp cho chúng ta một hàm API
int ExitWindowsEx(int uFlags, in dwReason)
trong đóuFlags : kiểu dịch vụ
; một sô tham số như:EWX_LOGOFF : kết thúc các tiến trình và thoát khỏi Windows
;EWX_POWEROFF : shutdown hệ thống và tắt máy
;EWX_REBOOT : shutdown và khởi động lại máy
;dwReason : nguyên nhân kết thúc hệ thống
. - Khi đó chúng ta có thể sử dụng API đó trong đoạn source code của chương trình như sau:
// log_off.c #include <windows.h> int main(int argc, char *argv[]) { ExitWindowsEx(EWX_LOGOFF, 0); return 0; }
- Windows cung cấp cho chúng ta một hàm API