CHƯƠNG 1.
1.0.
MỞ ĐẦU
Những quan niệm về hệ điều hành (operating system)
Một hệ điều hành là phần mềm chứa đựng tất cả các chương trình cần thiết để
điều hành máy tính thực hiện các ứng dụng khác nhau. Nếu một người sử dụng
máy tính chỉ để xử lý text, anh ta sẽ mong rằng, máy tính chứa đựng tất cả các
chức năng của ứng dụng xử lý text.
Các phần mềm của hệ điều hành được dùng trên thị trường là những phần mềm
đã được chuẩn hoá. Tất cả đều có chung những chức năng là kết nối giữa phần
cứng của máy tính ( như bộ vi xử lý, bộ nhớ và thiết bị xuất nhập) và các phần
mềm ứng dụng ( như các files, các chương trình của người sử dụng…).
Ta định nghĩa cô động: Hệ điều hành là tổng hợp các chương trình được sử
dụng là phương tiện điều hành để quản lý và điều khiển. Định nghiax này không
đòi hỏi sự đa năng và hoàn mỹ mà nó thực nghiệm một cách uyển chuyển để mô
phỏng trạng thái tức thời của một khái niệm có thể thay đổi. Sự khác nhau của
định nghĩa thứ nhất là ở chỗ, những chương trình dịch vụ ( như biên dịch và kết
nối) được gắn vào hệ điều hành, nhưng nó lại được tách rời trong định nghĩa thứ
hai. Sau đây, chúng ta sẽ chấp nhận một quan điểm trung hoà:
Hệ điều hành là phần mềm có ứng dụng độc lập và cần thiết để điều hành một
máy tính.
Tuy nhiên, sự cắt nghĩa khái niệm ứng dụng độc lập và cần thiết là chủ quan và
do đó điều tất nhiên là phải dẫn tới những lý thuyết mới
1.1
Các lớp của hệ điều hành
Không có một hệ điều hành nào mà không cần tới một sự trợ giúp phù hợp với
các yêu cầu của những chương trình ứng dụng. Sự trợ giúp này phụ thuộc vào cấu
hình được người sử dụng (NSD) định nghĩa và biến đổi trong quá trình công tác.
Nếu trước đây việc quản lý bộ vi xử lý, bộ nhớ và việc xuất nhập thuộc hệ điều
hành, thì ngày nay một giao diện người sử dụng được đòi hỏi với các thành phần
và độ lớn lớp khác nhau cũng như các chức năng của mạng máy tính. Đặc trưng
của một hệ thống máy tính hoạt động độc lập với các phần mềm hiện hữu là cần
tới một sự trợ giúp hữu hiệu tương ứng của hệ điều hành (HĐH). Hình 1.1 mô tả
những quan hệ của các phần mềm và máy tính.
NSD
Chương trình NSD
HĐH
Phần cứng máy tính
Hình 1.1.Những quan hệ tương đối của các thành phần.
Điều đó được chỉ ra một cách chặt chẽ hơn trong hình 1.2 dưới đây với mô
hình hệ thống các lớp.
Lớp a
Lớp b
Lớp c
Lớp d
User1
User 2
User 3
Compiler Editor Các ứng dụng…
Dịch vụ hệ điều hành
Phần cứng
Hình 1.2. Mô hình các lớp
1.2
Các giao diện và máy ảo
Ở trên chúng ta đã nói tới mô hình của các lớp. Sự tương đối của việc lớp này (
thí dụ lớp a) ứng dụng lớp kia ( thí dụ lớp b) chỉ ra rằng, lớp b đã dịch vụ lớp a. Đó
là trường hợp ở việc sử dụng một procedure dưới lớp b trong một chương trình của
lớp a. Nếu chúng ta xuất phát từ đó, rằng tất cả các khả năng dịch vụ được yêu cầu
theo một thứ tự xác định, do đó những yêu cầu của người sử dụng đới với các
chương trình tiện ích hay các yêu cầu của các chương trình tiện ích đối với các hệ
điều hành hoặc các yêu cầu của hệ điều hành đới với phần cứng thì được diễn biến
theo trục thời gian… Và những yêu cầu đó được sắp xếp liền kề nhau.
Mỗi một lớp không chỉ tạo thành một đơn vị phần mềm như hình 1.2, mà
chúng còn được sắp xếp một cách tuần tự cạnh nhau. Những chức năng dịch vụ
của một lớp ( các procedure, các dữ liệu và các giao thức tiện dụng của chúng)
được người ta tập hợp trong một giao diện. Chương trình mà nó mang lại những
khả năng dịch vụ được tập hợp thành một dãy các lệnh, mà những dịch vụ này
được sử dụng như những khả năng riêng. Lớp dưới cùng được tạo bởi phần cứng
của máy tính. Vì các chức năng của chúng được điều chỉnh qua các giao diện, do
đó người ta coi chúng như một máy. Tuy nhiên, máy này không tự làm việc được,
nó không phải là máy thực và do đó người ta gọi là máy ảo.
Chức năng của các máy ảo tổng thể được tạo bởi sự cộng tác của các máy ảo
riêng lẻ. Cho đến nay chúng ta đã có sự phân biệt giữa máy vật lý và máy ảo. Bây
giờ có thêm loại thứ 3: máy logic. Một số người cho máy logic là máy ảo, số
người khác tách biệt chúng thành máy vật lý và máy ảo.
Một ổ đĩa ảo được mô hình hoá một trường của các khối bộ nhớ mà nó xem
đồng nghĩa với một số khối tuần tự. Ngược lại, ổ đĩa logic được mô tả một cái gì
cụ thể hơn, nó được hiểu là ổ đĩa cứng với nhiều điểm khác biệt như thời gian trễ
và sự ưu tiên khi vận chuyển dữ liệu ( data). Hình 1.3 chỉ ra điều đó
Với ý tưởng đó, người ta đưa ra khái niệm quản lý các khối bộ nhớ, trong đó
chỗ nhớ của các ổ đĩa cứng được quản lý một cách thống nhất mà không cần phải
quan tâm tới giao diện của các ổ đĩa ảo.
Máy ảo (Virtual Machine)
Máy logic 1
Máy logic 2
Drive 1
Drive 2
Máy vật
lý 1
Máy vật
lý 2
Hình 1.3. Minh hoạ máy vật lý, máy logic và máy ảo
Trong kiểu kết hợp thứ 3, ở việc khảo sát một máy logic cụ thể thì độ chính xác
đầy đủ của ổ đĩa cứng ( thanh ghi trạng thái, thông tin lỗi, địa chỉ buffer đọc viết)
phải rõ ràng. Việc quản lý thông tin và việc che phủ của lớp liền kề phía trên ( của
việc quản lý máy logic) cần tới bộ kích tạo chuyên dụng (specify- driver). Trong
trường hợp này, ý nghĩa của các định nghĩa sẽ là:
Máy ảo = máy logic + Bộ kích tạo quản lý (Manager-driver)
Máy logic = Máy vật lý + Bộ kích tạo phần cứng (Hardware - driver)
Cả 3 loại máy tạo nên 3 lớp được trình bày như hình 1.3
1.3
Kiến trúc hệ điều hành
Để điều hành những ứng dụng độc lập của máy tính, hệ điều hành ( operating
system) chứa đựng những phần mềm sau:
Các chương trình dịch vụ và các công cụ: các chương trình tiện dụng
như Editor…
Các chương trình dịch: thông dịch ( interpreter), biên dịch
(compiler), chuyển đổi ( translator)…
Giao diện người sử dụng: hệ thống giao tiếp text và độ họa với
người sử dụng…
Vì một hệ điều hành đầy đủ phải bao gồm hàng trăm MegaByte, do đó với
dùng lượng này thì những chức năng ứng dụng thông thường được nạp để làm
nhân của hệ điều hành ( operating system kernel) ở trong bộ nhớ chính. Hình 1.4
mô tả việc nạp nhân hệ điều hành trong từng lớp của hệ thống máy tính. Đó là các
phần mềm để quản lý thiết bị, bộ nhớ và bộ vi xử lý, đồng thời cả những phần
mềm quan trọng để quản lý mạng.
NSD (User 1)
NSD (User 2)
GIAO DIỆN NSD (User Interface)
Các ứng dụng
Các dịch vụ
Các công cụ
Nhân hệ điều hành (Operating System Kernel)
Phần cứng (Hardware)
Hình 1.4. Cấu trúc khái quát các phần mềm của máy tính
1.3.1Gọi hệ thống (system- call)
Các dịch vụ của nhân được yêu cầu qua việc gọi hệ điều hành và được dẫn tới
như gọi các procedure bình thường theo một khuôn khổ nhất định. Vì việc nạp
nhân hệ điều hành ở bộ nhớ chính có thể thay đổi, do đó các chương trình tiện
dụng luôn luôn được kết nối một cách mới mẻ. Ở hầu hết các nhân hệ điều hành có
một cơ cấu gọi đặc biệt để đáp ứng khả năng dịch vụ mà không biết địa chỉ chính
xác của procedure. Cơ chế gọi này bao gồm bộ nhớ các tham số ở trên ngăn xếp
(stack) và khởi động một tín hiệu phần cứng hay bắt đầu một ngắt phần mềm
(softwareinterrupt). Như vậy, tại một ngắt phần cứng, bộ vi xử lý lưu trữ trạng thái
và địa chỉ lệnh ( instructionadress) ở ngăn xếp, đón nhận trạng thái và địa chỉ của
lệnh kế sau đó ở bộ nhớ chính và tiếp tục thực hiện các lệnh ở địa chỉ này. Ở việc
tự khởi động của hệ thống máy tính thì địa chỉ đưa vào của nhân hệ điều hành
được mô tả trên không gian bộ nhớ ngắt, do đó chương ứng dụng tìm thấy dấu đợi
lệnh ( prompt) hệ điều hành. Hình 1.5 chỉ ra quá trình gọi hệ thống như vậy.
CÁC LỆNH
của program
GỌI HỆ
THỐNG
CÁC LỆNH
của program
NGẮT
TRỞ LẠI TỪ NGẮT
DỊCH VỤ CỦA NHÂN
HỆ ĐIỀU HÀNH
Hình 1.5. Vòng lệnh của việc gọi hệ thống
Sau khi gọi hệ thống thì lệnh kế tiếp không thực hiện đồng thời mà vòng lệnh ở
địa chỉ nhớ này ngừng đột ngột, do đó ngắt phần mềm được biểu thị là cửa bẩy
(trap door).
Việc chuyển đổi chương trình người sử dụng tới một hệ điều hành được tiến
hành bất kì khi nào nhằm mở rộng mọi khả năng truy cập mã một cách hữu hiệu.
Nếu phần lớn các máy tính được bảo vệ trước sự chuyển đổi chương trình người
sử dụng thì do đó tất cả các thiết bị bảo vệ được ngắt ra để không cản trở nhân hệ
điều hành. Ở việc rút khỏi, nhân hệ điều hành được đóng trở lại một cách tự động
mà không cần người sử dụng biết điều hành xảy ra hầu hết qua bộ vi xử lý và
không cần người sử dụng thực hiện bằng tay. Những bộ vi xử lý như thế còn chế
ngự những mức độ bảo vệ kế tiếp, tuy nhiên nó nâng cao chi phí phần cứng trên
vi mạch (chip).
Để khắc phục các lỗi trong khối dấu phẩy trôi ( Floating Point Unit: FPU) thì
ngắt phần mềm được sử dụng. Việc khắc phục lỗi này không chứa đựng trong hệ
điều hành mà nó phó mặc cho chương trình ứng dụng hay chương trình ngoại vi.
1.3.2.Thí dụ về Unix
Trong hệ điều hành Unix truyền thống, ở giao diện người sử dụng có một bộ
thông dịch lệnh mà người ta gọi là vỏ ( shell). Từ đó, tất cả các chương trình người
sử dụng cũng như các chương trình hệ thống của hệ điều hành được khởi động. Sự
trao đổi thông tin giữa những người sử dụng và hệ điều hành xảy ra qua các kênh
xuất nhập. Trường hợp đơn giản, đó là việc nhập các ký tự qua bàn phím và việc
xuất qua thiết bị đầu cuối. Sơ đồ sơ lược được chỉ ra trên hình 1.6
Vỏ NSD1
(User shell 1)
Vỏ NSD2
(User shell 2)
Chương trình
NSD
Chương trình
hệ thống 1
Chương
trình hệ
thống 2
…
-------------------------------------------------------------------------------------------------trạng thái NSD
trạng thái nhân
Giao diện kiểm tra và phân bổ chức năng
quản lý
bộ nhớ
Dãy xuất / nhập
phô
bày
TTY máy
in
Hệ thống file
mouse
tiến trình
đĩa mạng
mềm
quản lý
Phần cứng
Hình 1.6.Các lớp của hệ điều hành Unix
Cho đến nay, Unix vẫn là một hệ điều hành có nhiều thế mạnh khác nhau. Bởi
lẽ, nó không chỉ là một hệ điều hành trợ giúp đồng thời nhiều người sử dụng, mà
còn có thể thực hiện đồng thời nhiều chương trình. Nhờ việc thực thi vượt trội với
ngôn ngữ lập trình bậc cao C thì nó có thể truy cập một cách dễ dàng và nhanh
chóng tới một phần cứng khác. Ở một bộ biên dịch C cũ, người ta muốn thay đổi
bộ tạo mã ( Codegenerator) với câu lệnh mới thì công việc chính phải làm là, phải
mô tả lại các chương trình của hệ điều hành cũng như của nhân bằng ngôn ngữ C
và sau khi biên dịch, chúng có thể chạy như một máy tính mới.
Tuy nhiên, ở việc chuyển đổi như thế cũng còn vài vấn đề cần phải được hoàn
hảo. Các phiên bản đầu tiên của Unix thì phụ thuộc rất nhiều vào phần cứng, trước
hết nó phụ thuộc vào bề rộng từ (word- width) của CPU. Trong các phiên bản sau
này ( Berkeley Unix cũng như Systems IV và V) đã được tu chỉnh và sửa chữa
nhiều. Cho đến nay công việc chuyển đổi không phải không còn vấn đề. Từ sự
thực thi này tới sự thực thi khác đều có cấu trúc cơ sở khác biệt của Unix. Do đó
loại và số lượng của gọi hệ thống là đa dạng. Việc chuyển đổi chương trình người
sử dụng giữa các phiên bản khác nhau thực ra đã được giảm thiểu. Để có sự trợ
giúp, thì những tổ chức khác nhau đã được thành lập. Nỗi bậc nhất là nhóm
X/Open ( tại bắc Mỹ và Châu Âu). Một hiệp định của các công ty và trường đại
học đã đưa ra một vài chuẩn khác nhau. Một trong các chuẩn đầu tiên đó là hệ
thống chuyển đổi POSIX ( Portable Operating System Interface based on Unix)
của Unix, mà nó được định nghĩa là một lượng các dịch vụ có thể sử dụng khác
nhau. Tất nhiên chúng chỉ là những dịch vụ, chứ không được định nghĩa trực tiếp
là gọi hệ thống. Điều thú vị là, biểu trưng Unix phù hợp với một giao diện bắt
buộc chứ không phải là mọt sự thực thi. Điều đó có ý nghĩa rằng, Unix thực chất là
một cơ cấu hệ điều hành ảo chứ không phải thực thi.
1.3.3 Thí dụ về Windows NT
Hệ điều hành Windows NT của hảng Microsoft là một hệ thống tương đối hiện
đại, nó được phát triển dưới sự lảnh đạo của David Cutler vào năm 1988. Một dự
án để sản xuất một hệ điều hành chuyên dụng được Microsoft lần đầu tiên thực
nghiệm, nó bao gồm các ý tưởng sau đây:
1. Một hệ điều hành phải bao hàm các chuẩn hiện hữu (MS- DOS, 16 bitWindows, Unix và OS/2) và được thị trường chấp nhận một cách rộng rãi.
2. Nó phải chắc chắn và bền vững. Nghĩa là các chương trình vừa tương hổ
nhau vừa không làm tổn hại hệ điều hành, các lỗi xuất hiện chỉ có hậu quả giới
hạn.
3. Nó phải được truy cập một cách dễ dàng trên những phần cứng có phiên bản
thấp.
4. Nó không được che phủ tất cả, mà nó phải đáp ứng một cách dễ dàng các
yêu cầu chuyển đổi.
5. Điều quan trọng: nó phải là một hệ điều hành mạnh.
Nếu quan sát những dự kiến này, người ta thấy, đó là những điều nan giải.
Những yêu cầu đồng thời ( như tương thích, bền vững, tiện lợi và mạnh) thì đối
lập với chính nó, vì MS-DOS thì tuyệt đối không bền vững, không mạnh và hoàn
toàn không tương thích với Unix. Tuy nhiên, tác giả vẫn đạt được mục đích, vì anh
ta đã sử dụng kinh nghiệm của các hệ điều hành khác và đã biến điệu một cách
mạnh mẽ. Việc phân lớp và những quan hệ gọi của nhân ở bản phác thảo gốc được
trình bày trên hình 1.7. Nhân của hệ điều hành này mang tên Windows NT
Executive, nó là phần dưới của khối chuyển đổi trạng thái người sử dụng và trạng
thái hệ điều hành.
Để giải quyết vấn đề thiết kế, dưới đây ba tiêu chí quan trọng của hệ điều hành
được nói tới.
Tính tương thích ( compatible)
Đó là khả năng đặc biệt của một hệ điều hành mà ta có thể truy cập được vào
một hệ điều hành riêng lẻ. Với tư cách là cơ cấu hệ điều hành ảo, nó được chứa
đựng trong khả năng dịch vụ của Windows NT Executive ( tức là gọi hệ thống
được biểu thị bằng mũi tên vẽ đậm trên hình 1.7).
Việc xuất nhập định hướng ký tự được dẫn ra bởi dịch vụ của Win32. Những
dịch vụ của hệ thống con (subsystem) được yêu cầu qua các thông tin ( gọi các
local procedure, xem mũi tên vẽ nhạt trên hình 1.7) của các chương trình người sử
dụng hay của khách hàng. Nếu là server, chúng cũng có quan hệ client/server.
Độ bền vững ( strengthen)
Nó đạt được nhờ sự phân chia chặt chẽ của các chương trình với nhau và nhờ
việc luôn luôn giữ vững các quá trình ngoại vi (cơ cấu DOS ảo) đối với các
chương trình chạy trên MS-DOS hay trên Windows. Các chức năng này là đồng
đều, nhưng việc truy cập(số liệu) trực tiếp được tách ra trên phần cứng, do vậy với
các chức năng này thì các chương trình cũ có thể chạy được. Những biện pháp phụ
như một hệ thống files có độ chính xác lỗi và những cơ cấu bảo vệ chuyên dụng để
kiểm tra sự chọn files, mạng và chương trình đã trợ giúp cho mục đích này.
Độ thuận tiện (commodity)
Đó là khả năng có thể bảo quản và mở rộng, qua đó, một hệ điều hành được
viết bằng ngôn ngữ C, có thể trao đổi mạnh và được phân lớp ngay từ đầu. Với lớp
HAL (xem hình 1.7), phần cứng được mô phỏng như là máy ảo và ở việc truy cập
tới các bộ vi xử lý khác nó thu hẹp sự thay đổi cần thiết trên các đơn thể. Điều thú
vị là từ các version 4.0 của hệ thống Win32 thì đã tiết kiệm thời gian để gọi hệ
thống từ Win32 tới Win NT. Sự trợ giúp của chuẩn khác ( như hệ thống file OS/2
với version 4.0) thì hệ điều hành Win NT đã được điều chỉnh.
1.4 Sự giao kết phần cứng và phần mềm.
Cấu tạo của các máy ảo cho phép giữ lại giao diện một cách tương tự tới các
đơn thể và thay đổi sự thực thi. Do đó, nó sẽ có điều kiện để thực hiện việc thực
thi nhờ một sự giao trộn qua lại từ phần cứng và phần mềm. Đối với khả năng dịch
vụ thì điều đó không quan trọng. Vì phần cứng làm việc hầu như nhanh hơn,
nhưng giá đắt hơn; ngược lại phần mềm làm việc chậm hơn, nhưng giá lại rẻ hơn
và có thể thay đổi nhanh chóng hơn. Do đó, khi thiết kế cấu trúc một máy tính ,
người ta phải lưu ý giải quyết hai nguyên do kể trên. Hình 1.8 là một thí dụ, cho
thấy sự phân lớp theo mã máy tượng trưng (trên hình vẽ ký hiệu p-code), mà nó
hoặc là được giao kết bằng phần mềm qua bộ biên dịch (compiler) và bộ thông
dịch(interpreter), hoặc là có thể được thực hiện bằng phần cứng qua các lệnh máy.
Trong trường hợp thứ hai, lớp ở giữa được di chuyển trong phần cứng (xem hình
1.8 ở phía bên trái). Trong đó, mỗi lệnh p-code được thực hiện một chức năng (tức
là được lập trình bằng mã microcode) ở trong CPU.
Program in p-code
p-code/machinecode
CPU- hardware
Program in p-code
Microcodehardware and CPUhardware
Hình 1.8. Sự giao kết phần cứng và phần mềm bằng mã p-code
Đối với vấn đề vừa nêu, một điều khác cần phải nói, đó là sự trợ giúp của các
chức năng mạng. Với các bộ điều khiển mạng rẻ tiền thì hầu hết có chỉ chứa đựng
tập hợp các chip theo tiêu chuẩn, nó chỉ là cấu nối tín hiệu và có thời hạn làm việc
nhất định. Tất cả những chức năng và giao thức cao hơn để kết hợp các gói dữ liệu
hoặc để tìm thấy lộ trình của mạng đều phải được bộ nhớ chính và phần mềm tích
hợp thực hiện, điều đó làm giảm đi đáng kể khả năng của bộ vi xử lý đối với các
nhiệm vụ khác(như giao diện người sử dụng, xử lý text…). Trên cơ sở đó, ở các
bộ điều khiển mạng giá đắt hơn, các chức năng điều khiển mạng và quản lý dữ liệu
được di chuyển trên phần cứng, nghĩa là bộ vi xử lý phải thực hiện một số quy
trình để tiếp cận những chức năng ở mức độ cao.
Ở đây, điều chẳng có gì quan trọng đó là: những chức năng của bộ điều khiển
mạng đã được hoàn thiện nhờ một bộ vi xử lý riêng lẻ hoặc nhờ kết cấu thích hợp
của chip. Ngoài ra, nếu một ngôn ngữ hình thức được sử dụng để thiết kế các lệnh
cho máy thì sự khác nhau của hai vấn đề trên không còn điều gì để nói. Điều quyết
định còn lại cần phải được xem xét, đó là giá thành, chất lượng tiêu chuẩn và sự
mong muốn của khách hàng.
1.5 Cấu trúc nhiều bộ vi xử lý (multi- processorsystem)
Đối với vấn đề quản lý các phương tiện điều hành thì điều quan trọng là phải
xem xét còn tồn tại những quan hệ và những sự phụ thuộc nào giữa chúng. Điều
đó độc lập với việc sử dụng kiểu bộ vi xử lý, kiểu bus, hay loại sản phẩm vi mạch
các bộ nhớ, vấn đề là, người ta phải biết phân biệt một vài kiểu cấu hình cơ bản.
Trong trường hợp kinh điển và đơn giản, trước hết ta khảo sát hệ thống với chỉ
một bộ vi xử lý được dùng làm bộ nhớ quảng đại (massen- memory) và bộ nhớ
chính (main memory) để xây dựng hệ điều hành và thực hiện các chương trình của
người sử dụng (xem hình 1.9). Ở đây, các thiết bị vào- ra (như màn hình, bàn
phím, chuột…) không chỉ ra trên hình vẽ.
Các chương
trình các dữ
liệu
Nhân
HĐH
bộ nhớ
quảng đại
Chương
trìnhNSD1
… Chương
bộ nhớ chính
processor
Hình 1.9. Hệ thống một bộ vi xử lý đơn
trìnhNSDn
Từ việc nghiên cứu hệ thống đơn vi xử lý như vừa nêu, người ta có thể thiết lập
một hệ thống với nhiều bộ vi xử lý. Mỗi lần người ta kết nối các bộ vi xử lý khác
nhau thì sẽ nhận cấu trúc hệ thống khác nhau. Cấu trúc đơn giản nhất cho thấy, đó
là một CPU mà các bộ vi xử lý đơn được mắc song song qua một bảng kết nối,
chẳng hạn qua một bus đa nhiệm (multi-master- systembus). Hình 1.10 mô tả một
hệ thống nhiều bộ vi xử lý; trong đó P1….Pn là các bộ vi xử lý đơn và M1…Mn là
các bộ nhớ quảng đại.
Các đơn thể bộ vi xử lý được định vị trên một phía bảng kết nối, còn phía kia
là các đơn thể bộ nhớ. Đối với mỗi việc truy cập mã chương trình hay mã dữ liệu
thì một sự kết nối giữa chúng được tạo ra, sự kết nối này tồn tại trong suốt thời
gian yêu cầu.
P1
P2
Pn
Bảng kết nối
(với multi-master-systembus)
M1
M2
Nhân
HĐH
Chương
trìnhNSD1
… Chương
trìnhNSDn
Hình 1.10. Hệ thống đa vi xử lý
Một cấu trúc như vậy dẫn tới một cách dễ dàng sự giảm sút hiệu suất thực thi,
vì bảng kết nối quá tải khi phải thường xuyên truy cập bộ nhớ. Trong trường hợp
này, một sự trợ giúp được dẫn ra từ việc quan sát, rằng các bộ vi xử lý hầu như chỉ
tham chiếu giới hạn hẹp một phần chương trình.
Ở đây, bộ nhớ có thể được phân chia và được dẫn ra một cách dày đặc hơn tới
mỗi một bộ vi xử lý (xem hình 1.11). Tất nhiên, sự phân chia này phải được trợ
giúp bởi bộ biên dịch để nó phân chia chương trìng người sử dụng một cách thích
hợp.
Nhân
HĐH
Chương
trìnhNSD1
Nhân
HĐH
Chương
trìnhNSDn
P1
P1
Bảng kết nối
M1
M2
Hình 1.11. Hệ thống nhiều máy tính
Mạng máy tính tồn tại như là một kiểu kết nối thứ ba. Ở đây, các máy tính làm
việc độc lập với hệ điều hành riêng lẻ (nghĩa là không cần thiết phải giống nhau),
được kết nối với nhau trong một mạng (xem hình 1.12)
Nhân
HĐH
Chương
trìnhNSD1
Nhân
HĐH
Chương
trìnhNSDn
M2
M1
P1
P1
Bảng kết nối (mạng LAN, WAN)
Hình 1.12. Mạng máy tính - cấu trúc đa vi xử lý
Nếu có một phần mềm được tạo lập trên máy tính, mà máy tính này làm việc
như là một máy chủ (server), nó cung cấp các dịch vụ (các tài nguyên) cho các
máy tính khác (client) thì người ta gọi cấu trúc này có quan hệ khách- chủ (clientserver). Thông thường, máy chủ có những khả năng dịch vụ là quản lý chương
trình (number- cruncher), quản lý in ấn (print server), quản lý dữ liệu (file
server)…
Mỗi một kiểu cấu trúc máy hệ điều hành máy tính được trình bày ở trên có
những lợi thế và yếu thế khác nhau. Đối với chúng ta, điều quan trọng là, sử dụng
cơ cấu nào để đạt được sự trao đổi thông tin qua các bộ vi xử lý và để đạt được sự
truy cập đồng bộ ở các phương tiện điều hành. Đó chính là phương hướng được
tiếp tục xem xét kỷ lưởng ở các chương sau.
1.6. Các bài tập của chương 1
Bài tập 1.1. Về hệ điều hành
Mục đích của hệ điều hành bao gồm việc phân bổ các phương tiện điều hành
theo sự thỉnh cầu của người sử dụng.
a). Vì sao phải tạo thô một hệ điều hành ?
b). Có những phương tiện điều hành nào bạn biết?
c). Người sử dụng nào có thể được thỉnh cầu ? (Ở đây khái niệm người sử dụng
là một khái niệm khái quát).
d). Người sử dụng đòi hỏi những yêu cầu gì ở hệ điều hành?
e). Bạn hãy giải thích các khái niệm máy ảo và giao diện.
Bài tập 1.2. Về hệ điều hành Unix
a). Trên phạm vi các máy tính của cơ quan bạn, hệ điều hành Unix có bao
nhiêu gọi hệ thống ?
b). Các gọi hệ thống được phân thành máy nhóm chức năng ?
c). Một gọi hệ thống được thực thi trên máy tính của bạn như thế nào?
Gợi ý:Nếu bạn mở quyển sổ tay về lập trình Assembler hay C, hoặc nếu bạn
thực hiện trình Debugger dịch trở lại một gọi hệ thống được viết bằng ngôn ngữ C
thành Assembler; khi đó các tệp tin include của C (như syscall.h. trap.h, proc.h,
kernel.h…)sẽ đưa ra nhiều trợ giúp thú vị.
CHƯƠNG 2.
TIẾN TRÌNH
2.0. Quan niệm về tiến trình
Trước đây tuỳ từng thời điểm, máy tính được xác định một nhiệm vụ chính; tất
cả các chương trình được bó lại thành gói (paket) và được gởi đi liên tục. Điều đó
được gọi là xử lý đóng gói (pile processing) hay quản lý lô (batch manager). Ngày
nay, không chỉ có một chương trình chạy trên máy tính, mà nhiều chương trình
cùng thực hiện (multi-tasking). Cũng như thế, không chỉ có một người sử dụng
làm việc, mà nhiều người sử dụng cùng làm việc (multi- user). Để hạn chế sự
tranh chấp giữa chúng ở việc dùng máy tính, do đó sự phân bổ các phương tiện
điều hành phải được điều chỉnh trên chương trình.
Ngoài ra, điều đó còn tiết kiệm thời gian chạy máy và giảm đáng kể thời gian
thao tác. Thí dụ, người ta có thể điều chỉnh sự phân chia bộ vi xử lý chính (Central
Processing Unit- CPU) cho việc biểu thị Text song song với việc xử lý Text, điều
đó cho thấy rằng, CPU đã trợ giúp việc xử lý Text trong thời gian máy in in ký tự.
Nếu điều đó hoàn thiện thì bộ vi xử lý đẩy một ký tự mới cho máy in và tiếp tục
việc xử lý Text.
Thêm vào đó, chương trình phải được lưu trữ khi cần thiết sử dụng phương tiện
điều hành nào: không gian nhớ, thế hệ CPU, dùng lượng CPU… Từ đó, ta hiểu,
tiến trình là thông tin trạng thái của các phương tiện điều hành đối với một
chương trình (thường gọi là một Job).
Hình 2.1 minh họa điều trên đây:
Tiến trình
Daten
Programm
Stack
Thanh ghi
CPU
Thanh ghi
NMU
luật truy cập
thông tin file
Kernel-stack
ngữ cảnh tiến trình
Hình 2.1. Sự cấu thành các dữ liệu tiến trình
Một tiến trình này có thể sinh ra một tiến trình khác, khi đó người ta gọi tiến
trình đầu là tiến trình cha, còn tiến trình được sinh ra là tiến trình con.
Một hệ thống đa chương trình (multi-programming system) cho phép thực hiện
đồng thời nhiều chương trình và nhiều tiến trình. Một chương trình (gọi là một job
) cũng có thể tự phát sinh ra nhiều tiến trình.
Thí dụ về hệ điều hành UNIX:
Các chương trình hệ thống của Unix được gọi là nền tảng, nó tổng hợp các giải
pháp đồng bộ và thích ứng thuận tiện. Sự độc lập của các tiến trình và kể cả các
chương trình của hệ điều hành Unix cho phép khởi động đồng thời nhiều công
việc.Thí dụ, chương trình pr hình thành Text1, chương trình lpr biểu diễn Text2
thì người ta có thể kết nối thành chương trình cat bằng dòng lệnh sau:
cat Text1 Text2 | pr | lpr
Ở đây, bộ thông dịch, mà người ta sẽ chuyển lệnh cho nó, khởi động ba
chương trình với tư cách là ba tiến trình riêng lẻ, mà ở đây ký tự “|” tạo ra một sự
thay đổi cho việc xuất ra một chương trình thành việc nhập vào một chương trình
khác. Nếu trong hệ thống có nhiều bộ vi xử lý, do đó, mỗi bộ vi xử lý có thể được
sắp xếp theo một tiến trình, và quả vậy, sự điều hành được tiến hành song song.
Ngoài ra, cũng có khi một bộ vi xử lý chỉ thực hiện một phần tiến trình và dẫn tới
bộ tiếp theo.
Ở hệ thống đơn vi xử lý thì luôn chỉ có 1 tiến trình thực hiện, những tiến trình
khác được giữ lại và chờ đợi. Điều này sẽ được khảo sát ở các phần dưới.
2.1 Các trạng thái tiến trình
Kế tiếp trạng thái hoạt động (running) đối với một tiến trình đang diễn ra,
chúng ta phải xem xét những tiến trình khác chờ đợi ở đâu. Đối với một trong
nhiều khả năng biến cố, nó có một hàng đợi riêng, mà trong đó các tiến trình được
phân loại.
Một tiến trình bị hãm phải chờ đợi, để:
+ đón nhận một bộ vi xử lý hoạt động, lúc đó ta có trạng thái sẵn sang
(ready),
+ đón nhận một thông tin (massage) của một tiến trình khác,
+ đón nhận tín hiệu của một bộ chỉ thị thời gian (timer),
+ đón nhận những dữ liệu của một thiết bị xuất nhập.
Thực ra, trạng thái sẵn sang rất đặc biệt: tất cả các tiến trình nhận được các
thay đổi và được giải hãm, tiếp đến, đầu tiên chúng được chuyển dịch vào trong
danh sách sẵn sàng và sau đó, chúng đón nhận bộ vi xử lý ở trong dãy tuần tự.Các
trạng thái và sự quá độ của chúng được sơ đồ hoá trên hình 2.2
Nhaä n CPU
ready
Rs
CPU
Nhaän R
running
Traû CPU
Rs
CPU
blocked
Chôø R
Rs
CPU
Hình 2.2.Các trạng thái tiến trình
Ở đây, chúng ta còn quan tâm tới điều, rằng các chương trình và các tiến trình
thì không tồn tại vĩnh viễn, mà chúng có thể được sinh ra và kết thúc bất kỳ khi
nào. Do đó, từ các lý do bảo vệ, các tiến trình không tự quản lý được, mà chúng
được thuyên chuyển từ một chức năng đặc biệt của một hệ điều hành cho bộ định
giờ, hay thuyên chuyển từ một trạng thái này thành một trạng thái liền kề. Việc
chuyển đổi của các tín hiệu, việc lưu trữ các dữ liệu tiến trình và việc sắp xếp
thành các hàng đợi được một chức năng trung tâm hoàn thiện, các chức năng này
người sử dụng không trực tiếp điều khiển. Bởi vậy, qua việc gọi hệ điều hành thì
những mong muốn của các tiến trình được khai báo, mà những cái đó trong khuôn
khổ của việc quản lý các phương tiện điều hành của bộ định thời phù hợp với sự
quan tâm đối với người sử dụng khác.
Tất cả các trạng thái chứa đựng một hay nhiều danh sách. Các tiến trình ứng
với một trạng thái thì được đưa vào danh sách đó. Điều đã rõ, rằng một tiến trình
có thể được luôn luôn chứa đựng chỉ trong một danh sách.
Trong sự khác nhau với mã máy, những dữ liệu trạng thái của phần cứng (CP,
FPU, MNU), mà với các tiến trình làm việc, chúng được biểu thị là văn cảnh tiến
trình (stask context), xem hình 2.1. Ở một tiến trình hãm, phần dữ liệu chứa đựng
trạng thái sau cùng của CPU thì nó như một bản sao của CPU có thể được biểu thị
là nột vi xử lý ảo và phải được nạp mới nhờ sự chuyển đổi tới một tiến trình khác
cũng như chuyển đổi văn cảnh (context switch).
Những hệ điều hành khác nhau sẽ thu hẹp chỉ số các biến cố và thu hẹp số
lượng cũng như kiểu hàng đợi. Điều đó cũng được phân biệt, rằng những giao thức
nào chúng dự định cho việc bắt đầu và kết thúc của bộ vi xử lý cũng như việc phân
chia và sắp xếp danh sách chờ. Ở đây, người ta còn phân biệt giữa việc đặt kế
hoạch phân bổ các phương tiện điều hành (scheduling) và việc phân bổ trên thực
tế (dispatching).
2.1.1. Thí dụ về Unix
Trong hệ điều hành Unix có sáu trạng thái khác nhau. Có ba trạng thái đã nhắc
tới ở trên. Đó là trạng thái running(SRUN), trạng thái blocked (SSLEEP) và trạng
thái ready (SWAIT). Trạng thái tiếp theo là trạng thái stopped (SSTOP), mà một
cái gì đó phù hợp với sự chờ đợi của các tiến trình cha ở việc tìm lỗi (tracing anh
debugging).
Đón nhận tín hiệu
Không
tồn tại
Phát sinh
bị hãm
chờ đợi tín hiệu
Lý
tưởng
sẵn
sàng
tiếp tục thực hiện
Phân bổ
dừng
hoạt
động
zombi
chờ đợi tiến trình cha
kết thúc
Không
tồn tại
++++++++++++++++++++
Hình 2.3.Những trạng thái tiến trình và sự quá độ ở Unix.
Ngoài ra còn tồn tại những trạng thái trung gian phụ như trạng thái idle (SIDL)
và trạng thái zombie (SZOMB), mà chúng xuất hiện bởi việc sinh ra và kết thúc
của một tiến trình. Sự quá độ trạng thái có những hình thái như trong hình vẽ 2.3 ở
trên.
Sự quá độ của một trạng thái tới một trạng thái kế tiếp đạt được qua sự thăm dò
gọi hệ thống. Thí dụ, nếu có một tiến trình gọi hàm fork(), do đó một bản sao một
tiến trình được lôi ra và đem treo vào danh sách sẵn sàng. Với điều đó, bây giờ ta
có hai tiến trình đồng nhất, mà cả hai trở lại từ việc gọi hàm fork(). Sự khác nhau
giữa hai tiến trình là ở chỗ giá trị trả lại của hàm: tiến trình cha đón nhận chỉ số
tiến trình (PID) của con; khi PID = 0 thì nó nhận ra rằng, đó là tiến trình con và nó
thể hiện sự diễn biến tiếp tục của chương trình qua lần gọi hệ thống khác. Đối với
các chương trình thực thi (execute) có thể nhận thấy rằng, chương trình chạy sẽ
quá tải bởi mã chương trình. Tất cả các thiết bị hiển thị và các biến số được kích
thích (thí dụ sử dụng bộ đếm địa chỉ gọi hệ thống của chương trình) và tiến trình
hoàn tất được treo vào danh sách sẵn sang. Ở hiệu quả cuối cùng của tiến trình cha
thì một chương trình hoàn toàn mới được khởi động.
Tiến trình cha có khả năng chờ đợi hàm gọi hệ thống exit() và chờ đợi sự
kết thúc của tiến trình con với hàm waitpid(PID). Trong hình 2.4 chỉ ra quá trình
phát sinh một tiến trình như vậy.
Người ta quan tâm rằng, tiến trình con đạt được hàm gọi hệ thống exit() như
nói ở trên chỉ khi, nếu một lỗi xuất hiện tại hàm exec(). Điều đó có nghĩa, nếu tệp
tin programm không tồn tại , thì nó không thể đọc được. Ngoài ra, lệnh của
chương trình kế tiếp theo hàm exec() ở trạng thái người sử dụng thì giống hệt với
lệnh đầu tiên của chương trình ‘programm’.
Cha
PID = fork ()
/* PID # 0*/
if (PID = = 0)
{ exec …
…
con
/* PID = = 0*/
if (PID = = 0)
{ exec (“programm”)
…
};
Waitpid (PID)
exit () };
…
Hình 2.4.Sự phát sinh và loại trừ một tiến trình ở hệ điều hành Unix
Tiến trình con kết thúc chỉ khi, nếu như trong ‘programm’ một hàm gọi exit()
tự đạt tới.
Với suy nghĩ này, thí dụ sau đây sẽ làm sáng tỏ một tiến trình đối với sự thỉnh
cầu của người sử dụng ở thiết bị đầu cuối. Tuy nhiên, mã (nói ở trên) chỉ là cơ sở
cho việc thỉnh cầu đó ở trong Unix để mỗi người sử dụng khởi động shell.
Thí dụ shell của Unix:
LOOP
Write(prompt);
(*thí dụ có dạng :>*)
ReadLine(command, params); (*đọc chuỗi, phân cách qua ý tự trống *)
pid := fork();
(*tái bản của tiến trình này*)
IF (pid=0)
THEN execve(command, params,0)
(*con chở tải Programm*)
ELSE waitpid(-1, status, 0)
(*cha chờ sự kết thúc của con*)
END;
END;
Tất cả các tiến trình trong Unix thích hợp với tiến trình khởi đầu (PID =1). Nếu
ở sự chấm dứt của một tiến trình con mà không có một tiến trình cha nào tồn tại
nữa, khi đó tiến trình khởi đầu nói trên được thông báo. Trong khoảng thời gian
gọi hệ thống với hàm exit() và sự tiếp nhận các thông tin tại tiến trình cha, thì tiến
trình con đạt được một trạng thái đặc biệt gọi là “zombi” (xem hình 2.1).
Văn cảnh tiến trình nội bộ (intern process context) được phân thành hai phần:
Phần thứ nhất là phần mang tiến trình ở trong một bảng nhớ trú ngụ, nó thì rất
quan trọng đối với việc điều khiển tiến trình và do đó nó luôn luôn tồn tại. Phần
thứ hai gọi là phần cấu trúc người sử dụng (user structure), nó chỉ quan trọng, nếu
nó là tiến trình hoạt động và nếu nó có thể được xuất ra trên bộ nhớ quảng đại với
mã còn lại và các dữ liệu.
Thực chất hai phần kể trên là:
Các khối điều khiển tiến trình của bảng tiến trình (process control bock- PCB)
+ Thông số định giờ
+ Những tham chiếu nhớ: địa chỉ mã, địa chỉ dữ liệu, địa chỉ ngăn xếp ở bộ
nhớ chính cũng như bộ nhớ quảng đại.
+ Các dữ liệu tín hiệu: mặt nạ, trạng thái.
+ Những điều khác: trạng thái tiến trình, biến cố chờ đợi, trạng thái định
thời, PID, PID cha, người sử dụng.
Văn cảnh người sử dụng (user context):
+ Trạng thái bộ vi xử lý: thanh ghi, thanh ghi FPU…
+ Gọi hệ thống: thông số…
+ Bảng thông tin file
+ Ngăn xếp nhân: không gian ngăn xếp đối với gọi hệ thống của tiến trình.
Khác biệt với PCB là tiến trình có thể thay đổi và kiểm tra chỉ gián tiếp qua gọi
hệ thống, cho phép gọi hệ thống Unix để kiểm tra trực tiếp cấu trúc người sử dụng
và để thay đổi các phần
2.1.2. Thí dụ về Windows NT
Vì trong Windows NT phải được được các loại tiến trình khác nhau trợ giúp,
mà những tiến trình đó không hạn chế sự phát sinh đa dạng, cho nên chỉ đối với
một loại riêng lẻ của các tiến trình ( đối tượng xâu: thread object) thì một hệ thống
tiến trình được tạo nên. Việc phát sinh các đối tượng (như OS/2,
POSIX,Windows32) thì được liên hợp lại thành các đối tượng và ở sự thay đổi
trạng thái của chúng không đóng vai trò gì cả. Sơ đồ đơn giản hoá các quá độ
trạng thái được chỉ ra trong hình 2.5.
Đón nhận tín hiệu
Không
tồn tại
Phát sinh
khởi
xướng
sẵn
sàng
lựa chọn / bẻ gãy
vận
chuyển
Đình chỉ
dừng
chờ đợi biến cô
chạy
kết mãn
gởi đi
Hình 2.5.Các trạng thái tiến trình của Windows NT
kết thúc
Không
tồn tại
Việc sản sinh tiến trình ở Windows NT thì phức tạp hơn trong Unix, vì để có
sự chuyển giao thì nhiều trạng thái tiến trình phải được thực hiện. Do đó, những sự
phát sinh đặc biệt được liên kết trong những hệ thống con.
Để sản sinh ra các tiến trình thì chỉ có duy nhất một hàm gọi hệ thống
NtCreateProcess(), ở đấy, bên cạnh sự kích thích nhờ các mà thì còn có tiến trình
cha có thể được thông báo. Trên cơ sở đó, tất cả các biến gọi hệ thống con khác
được thiết lập, mà cái đó sẽ được người sử dụng quan tâm và cần tới.
Thật vậy, cái đó đã tạo ra cơ cấu của hàm gọi POSIX-fork(). Thí dụ, chương
trình POSIX (hay tiến trình POSIX) gọi lệnh với hàm fork() qua giao diện người
lập trình ứng dụng ( Application Programming Interface). Cái đó sẽ được chuyển
đổi thành một thông tin và được gởi tới một hệ thống con POSIX qua nhân hệ
thống (xem hình 1.7). Cái đó trở lại gọi hàm NtCreateProcess() và thông báo
chương trình POSIX cho PID cha. Chìa khoá đối tượng (object handle) được trao
trở lại hệ thống con POSIX quản lý; tất cả gọi hệ thống của tiến trình POSIX, mà
nó đưa ra thông tin tới hệ thống con POSIX, thì được hoàn thiện ở đó với sự trợ
giúp của gọi hệ thống của Windows NT và đưa kết quả có dạng POSIX trở lại tiến
trình gọi. Tương tự, điều đó cũng dẫn tới gọi tiến trình của các hệ thống con khác.
2.1.3. Các tiến trình trọng lượng nhẹ.
Nhu cầu lưu trữ của một tiến trình thì rất toàn diện. Nó chứa đựng không chỉ
vài con số, như số tiến trình và các dữ liệu,mà cả những thông báo về các files
thông thường như các mã chương trình và các dữ liệu của chúng. Điều đó có hầu
hết ở các tiến trình, khi nó thích ứng ở trong bộ nhớ chính. Cho nên, tiến trình
chiếm rất ít không gian trên bộ nhớ quảng đại (chẳng hạn harddisk). Vì có sự
chuyển đổi tiến trình, bộ nhớ hiện tại bị tiêu tốn (chiếm chỗ), còn bộ nhớ trước đó
của đĩa cứng được phục hồi trở lại, do đó một sự thay đổi tiến trình đều làm cho
tải hệ thống nặng nề và thời gian thực hiện tương đối dài.
Ở nhiều ứng dụng thì không có tiến trình mới được sử dụng, mà chỉ có những
đoạn mã độc lập (threads) được sử dụng. Những đoạn mã độc lập này được mô tả
bằng văn cảnh tiến trình (thí dụ các thủ tục của một chương trình). Trường hợp
này người ta gọi là đồng lập thức (coroutine).
Việc ứng dụng các đoạn mã theards có điều kiện để tạo trong một khoảng tiến
trình bởi một hệ thống tiến trình tiếp theo mà người ta gọi là các tiến trình trọng
lượng nhẹ (light weight process: LWP). Với hình dạng đơn giản nhất thì những
tiến trình này tự chuyển đổi sự điều khiển một cách dứt khoát, mà người gọi là bản
phác thảo đồng lập thức (coroutine concept). Có lý do để nói rằng, những tiến
trình mới này cũng là những tiến trình gọi hệ thống. Nếu mỗi tiến trình mà càng
sinh ra nhiều tiến trình khác, thì điều đó càng khó khăn hơn. Từ lý do đó, người ta
có thể dẫn ra đây một bộ định thời, mà bộ định thời này luôn luôn chứa đựng sự
điều khiển và sự điều khiển này được chuyển tiếp tục tới một tiến trình kế tiếp
trong danh sách sẵn sang của nó. Nếu điều đó không được lập trình bởi người sử
dụng, thì nó đã được chứa đựng trong hệ điều hành qua việc gọi hệ thống. Do đó,
qua thời gian chuyển đổi của gọi hệ thống thì các tiến trình threads sẽ là tiến trình
trọng lượng nặng (heavy weight process: HWP).
Mỗi tiến trình đều phải thâu giữ các dữ liệu riêng của nó một cách độc lập với
các tiến trình khác. Điều đó thì cũng thuận với tiến trình trọng lượng nhẹ: Nếu
chúng phân bổ các files đồng đều (nói chính xác là vùng địa chỉ ảo đồng đều, xem
chương 3) với các tiến trình trọng lượng nhẹ khác. Do vậy, hầu hết các ngăn xếp
của nó được sử dụng, mà ngăn xếp này được dữ trữ không gian để phát sinh cho
mỗi tiến trình. Trong sự khác biệt với các tiến trình xác thực, thì do đó, các tiến
trình trọng lượng nhẹ sử dụng chỉ ít các dữ liệu văn cảnh (context data), mà các dữ
liệu này phải được thay đổi khi chuyển đổi. Từ đó, trạng thái vi xử lý (processorstatus: PS) và con trỏ ngăn xếp (stack-pointer:SP) là những thứ quan trọng nhất.
Còn, tự bản thân bộ đếm chương trình (programm-counter) có thể được tách khỏi
ngăn xếp, do đó, nó không phải chuyển giao một cách rõ ràng. Bằng ngôn ngữ
Assemble, việc chuyển đổi được thực thi một cách hiệu nghiệm và làm cho việc
gọi hệ thống của các tiến trình này xảy ra rất nhanh.
2.1.4. Trạng thái tiến trình ở Unix
Ở hệ điều hành Unix, các tiến trình trọng lượng nhẹ được thực thi bởi thư viện
của người sử dụng và bằng ngôn ngữ C hay C++ (xem phần Unix ở chương 3).
Tuỳ theo sự thực thi, mà hoặc là có một hệ thống đơn giản với việc chuyển giao
điều khiển một cách trực tiếp, hoặc là có một hệ thống phức tạp hơn với bộ định
thời đặc biệt (xem mục 2.2).
Lợi thế của việc thực thi bằng thư viện là tồn tại một sự chuyển đổi rất nhanh,
vì các cơ cấu gọi hệ điều hành và các cơ cấu giải mã của chúng sẽ không có điều
kiện thực hiện theo số dịch vụ và theo các thông số. Còn nhược điểm của nó là
tiến trình thread phải chờ đợi một biến cố (thí dụ biến cố vào/ra) và nó chặn tiến
trình tổng thể lại.
Có những thí nghiệm để tiêu chuẩn hóa các tiến trình threads và để giảm nhẹ
sự thực thi chương trình (xem chuẩn IEEE năm 1922)
Ở các phiên bản mới nhất của Unix, chúng chứa đựng loại 64bit –Unix, còn
gọi là Unix-98.
2.1.5. Trạng thái tiến trình ở Windows NT
Khác với Unix, trong hệ điều hành Windows NT, các tiến trình trọng lượng
nhẹ LWP được thực thi với chức năng gọi hệ điều hành. Tuy nhiên, sự chuyền đổi
chậm chạp hơn, nên được gọi là tiến trình trọng lượng nặng (heavy weight thread),
nhưng nó vẫn có ưu điểm. Đó là, người lập trình hệ thống có một giao diện kết nối
chắc chắn. Nó làm giảm nhẹ sự thực thi chương trình, vì chúng được sử dụng các
tiến trình LWP và nó cũng tránh được việc thực nghiệm để phát triển những hệ
thống lệch lạc riêng lẻ như đối với Unix. Một điều khác nữa là nhân của hệ điều
hành cũng được điều khiển qua các tiến trình LWP.Ở đây, điều cần phải lưu ý là,
- Xem thêm -