TRƯỜNG ĐẠI HỌC ĐỒNG THÁP KHOA SƢ PHẠM TOÁN – TIN
BÀI GIẢNG
HỆ ĐIỀU HÀNH
Biên soạn : Ths. Nguyễn Thị Thùy Linh
LƢU HÀNH NỘI BỘ
ĐỒNG THÁP 11/2013
LỜI NÓI ĐẦU
Tài liệu đƣợc biên soạn chủ yếu dựa trên kiến thức tích lũy trong giảng dạy nhiều
năm về môn học của tác giả và cũng đƣợc tham khảo từ các nguồn về lý thuyết hệ điều
hành và nguyên lý hệ điều hành của các trƣờng Đại học Huế, Đại học Cần Thơ…
Tổng quan:
Bài giảng giới thiệu về các thế hệ hệ điều hành, các thành phần của hệ điều hành,
chức năng của hệ điều hành, các dịch vụ mà hệ điều hành cung cấp. Sau đó nghiên cứu
chi tiết chức năng các thành phần bên trong hệ điều hành: Quản lý tiến trình, Quản lý
bộ nhớ, Đồng bộ hóa tiến trình, Quản lý Deadlock, Quản lý và cài đặt hệ thống tập tin,
Quản lý đĩa.
Mục tiêu:
Kiến thức:
- Hiểu đƣợc vai trò của hệ điều hành và cơ chế hoạt động của hệ điều hành
- Hiểu các kiến trúc thiết kế hệ điều hành.
- Hiểu các chiến lƣợc trong việc thiết kế các hệ điều hành hiện đại.
- Biết những vấn đề phát sinh trong quá trình thiết kế hệ điều hành cũng nhƣ
những tiếp cận khác nhau đƣợc dùng để phân tích và giải quyết những vấn đề
đó.
- Xem xét những chiến lƣợc hệ điều hành phổ biến và cách chúng tác động đến
những dịch vụ của các hệ điều hành hiện đại.
- Vận dụng các chiến lƣợc trong việc thiết kế hệ điều hành để mô phỏng lại trên
máy tính.
Kỹ năng:
- Rèn luyện kỹ năng phân tích và giải quyết các bài toán về chiến lƣợc trong việc
thiết kế các thành phần bên trong hệ điều hành.
- Rèn luyện tƣ duy giải thuật, kỹ năng lập trình kỹ thuật mô phỏng.
1
- Kỹ năng làm việc nhóm, tự học, tự nghiên cứu.
Thái độ:
- Nhận thức đúng đắn về phía ngƣời thiết kế hệ điều hành trong hệ thống máy tính.
- Nâng cao ý thức tự học, tự nghiên cứu để mở rộng kiến thức.
Đối tượng:
Tài liệu dành cho ngƣời học cao đẳng và đại học chuyên ngành công nghệ thông
tin.
Yêu cầu:
Ngƣời học cần phải hiểu cấu trúc dữ liệu và giải thuật kèm theo ngôn ngữ lập
trình Pascal hoặc một trong các ngôn ngữ C/C++, Java, C#. Ngƣời học cũng cần biết
cấu trúc logic của một máy tính nói riêng cũng nhƣ mạng máy tính nói chung.
Nội dung: Tài liệu bao gồm có 5 chƣơng:
Chƣơng 1: Tổng quan về hệ điều hanh
Chƣơng 2: Quản lý tiến trình
Chƣơng 3: Quản lý bộ nhớ
Chƣơng 4: Quản lý tập tin và đĩa
2
Chƣơng 5: Quản lý hệ thống nhập/xuất
MỤC LỤC LỜI NÓI ĐẦU ............................................................................................................................. 1 MỤC LỤC ................................................................................................................................... 3 DANH MỤC THUẬT NGỮ VIẾT TẮT .................................................................................... 6 CHƯ NG 1: TỔNG QU N VỀ HỆ ĐIỀU HÀNH ................................................................ 8 1.1. MỤC TIÊU ....................................................................................................................... 8 1.2. KHÁI NI M VỀ H ĐIỀU HÀNH ................................................................................. 8 1.3. CHỨC N NG H ĐIỀU HÀNH ................................................................................... 10 1.4. PH N LOẠI H ĐIỀU HÀNH ..................................................................................... 12 1.4.1. Hệ điều hành xử lý theo lô đơn chƣơng .................................................................. 12 1.4.2. Hệ thống xử lý theo lô đa chƣơng ........................................................................... 14 1.4.3. Hệ thống chia s thời gian ....................................................................................... 15 1.4.4. Hệ thống đa xử lý hệ thống song song .................................................................. 15 1.4.5. Hệ thống phân tán .................................................................................................... 17 1.4.6. Hệ thống xử lý thời gian thực .................................................................................. 18 1.4.7. Hệ xách tay .............................................................................................................. 18 1.5. L CH S PHÁT TRIỂN CỦA H ĐIỀU HÀNH ......................................................... 19 1.5.1. Thế hệ 1 1945 – 1955)............................................................................................ 19 1.5.2 Thế hệ 2 1955 – 1965)............................................................................................. 20 1.5.3. Thế hệ 3 1965 – 1980)............................................................................................ 20 1.5.4. Thế hệ 4 1980-nay ) ............................................................................................... 21 1.6. CẤU TR C CỦA H ĐIỀU HÀNH ............................................................................. 21 1.6.1. Các thành phần bên trong hệ điều hành ................................................................... 21 1.6.2. Các dịch vụ của hệ điều hành .................................................................................. 26 1.6.3. Lời gọi hệ thống ...................................................................................................... 27 1.6.4. Cấu trúc hệ điều hành .............................................................................................. 28 1.7. MỘT S H ĐIỀU HÀNH HI N ĐẠI ......................................................................... 38 1.7.1. Hệ điều hành Windows95........................................................................................ 38 1.7.2. Hệ điều hành Windows 2000................................................................................... 39 1.7.3. Hệ điều hành Linux ................................................................................................. 40 1.7.4. Hệ điều hành Windows 7......................................................................................... 41 1.7.5. Hệ điều hành Windows 8......................................................................................... 42 1.7.6. Hệ điều hành Android ............................................................................................. 42 1.8. TÓM TẮT ...................................................................................................................... 43 Câu hỏi ôn tập ........................................................................................................................ 44 TÀI LI U THAM KHẢO ..................................................................................................... 44 CHƯ NG 2: QUẢN L TIẾN TR NH ................................................................................ 45 2.1. MỤC TIÊU ..................................................................................................................... 45 2.2. TỔNG QUAN VỀ TIẾN TRÌNH ................................................................................... 45 2.2.1. Nhu cầu xử lý đồng hành ......................................................................................... 45 2.2.2. Khái niệm tiến trình ................................................................................................. 46 2.2.3. Phân loại tiến trình ................................................................................................... 49 2.2.4. Tiểu trình Thread và mô hình đa tiểu trình Multithread .................................... 51 2.3. TỔ CHỨC QUẢN LÝ TIẾN TRÌNH ............................................................................ 54 2.3.1. Các trạng thái của tiến trình ..................................................................................... 54 2.3.2. Chế độ xử lý của tiến trình ...................................................................................... 60
3
2.3.3. Cấu trúc dữ liệu khối quản lý tiến trình ................................................................... 61 2.4. THAO TÁC TRÊN TIẾN TRÌNH ................................................................................. 62 2.4.1. Tạo lập tiến trình ..................................................................................................... 63 2.4.2. Kết thúc tiến trình .................................................................................................... 64 2.4.3. Khi tiến trình thay đổi trạng thái ............................................................................. 64 2.5. CẤP PHÁT TÀI NGUYÊN CHO TIẾN TRÌNH ........................................................... 65 2.6. Đ NH THỜI BIỂU CPU ................................................................................................ 66 2.6.1. Giới thiệu ................................................................................................................. 67 2.6.2. Tổ chức định thời biểu ............................................................................................. 70 2.6.3. Các chiến lƣợc định thời biểu CPU ......................................................................... 75 2.7. ĐỒNG BỘ HÓA TIẾN TRÌNH ..................................................................................... 87 2.7.1. Liên lạc giữa các tiến trình ...................................................................................... 87 2.7.2. Các cơ chế thông tin liên lạc.................................................................................... 88 2.7.3. Nhu cầu đồng bộ hóa synchronisation .................................................................. 95 2.7.4. Tài nguyên găng và đoạn găng ................................................................................ 96 2.7.5. Đồng bộ tiến trình qua đoạn găng ......................................................................... 102 2.8. TẮC NGHẼN VÀ CH NG TẮC NGHẼN ................................................................. 125 2.8.1. Khái niệm tắc nghẽn .............................................................................................. 125 2.8.2. Đặc điểm của Deadlock ......................................................................................... 128 2.8.3. Các phƣơng pháp xử lý deadlock .......................................................................... 134 2.9. TÓM TẮT .................................................................................................................... 151 Câu hỏi ôn tập ...................................................................................................................... 153 Bài tập .................................................................................................................................. 156 TÀI LI U THAM KHẢO ................................................................................................... 160 CHƯ NG 3: QUẢN L BỘ NHỚ ...................................................................................... 161 3.1. MỤC TIÊU ................................................................................................................... 161 3.2. NHI M VỤ QUẢN LÝ BỘ NHỚ ............................................................................... 161 3.3. KIẾN THỨC NỀN ....................................................................................................... 164 3.3.1. Một chƣơng trình qua nhiều bƣớc xử lý ................................................................ 164 3.3.2. Không gian địa chỉ luận lý và không gian địa chỉ vật lý ....................................... 166 3.3.3. Bộ quản lý bộ nhớ MMU .................................................................................... 167 3.3.4. Phủ lắp Overlay .................................................................................................. 167 3.3.5. Hoán vị .................................................................................................................. 168 3.4. QUẢN LÝ BỘ NHỚ CHÍNH ...................................................................................... 170 3.4.1. Bộ nhớ cấp phát liên tục ........................................................................................ 170 3.4.2. Cấp phát không liên tục ......................................................................................... 182 3.5. QUẢN LÝ BỘ NHỚ ẢO ............................................................................................. 202 3.5.1. Khái niệm bộ nhớ ảo.............................................................................................. 203 3.5.2. Cài đặt bộ nhớ ảo ................................................................................................... 204 3.5.3. Kỹ thuật bộ nhớ ảo ................................................................................................ 208 3.6. TÓM TẮT .................................................................................................................... 222 Câu hỏi ôn tập ...................................................................................................................... 224 Bài Tập ................................................................................................................................ 225 TÀI LI U THAM KHẢO ................................................................................................... 230 CHƯ NG 4: QUẢN L TẬP TIN VÀ ĐĨ ....................................................................... 231 4.1. MỤC TIÊU ............................................................................................................... 231 4.2. TỔNG QUAN VỀ QUẢN LÝ TẬP TIN VÀ ĐĨA ...................................................... 232 4.2.1. Tập tin và hệ thống quản lý tập tin ........................................................................ 232
4
4.2.2. Bảng danh mục và tập tin chia s .......................................................................... 235 4.2.3. Quản lý không gian đĩa .......................................................................................... 238 4.2.4. Quản lý các block chứa tập tin trên đĩa ................................................................. 241 4.2.5. An toàn trong quản lý tập tin ................................................................................. 246 4.2.6. Hiệu suất hệ thống tập tin ...................................................................................... 251 4.3. MỘT S KHÁI NI M DÙNG TRONG QUẢN LÝ ĐĨA ........................................... 252 4.4. CÁC ĐIỀU KHIỂN H TH NG TẬP TIN ................................................................ 255 4.5. CÁC H TH NG TẬP TIN ĐƢỢC S DỤNG TRÊN CÁC H ĐIỀU HÀNH HI N NAY 257
4.5.1. FAT12, FAT16, FAT32 ........................................................................................ 257 4.5.2. NTFS ..................................................................................................................... 258 4.5.3. CDFS ..................................................................................................................... 259 4.5.4. UDF ....................................................................................................................... 259 4.6. TỔ CHỨC ĐĨA CỦA MS-DOS ................................................................................... 259 4.6.1. FDISK .................................................................................................................... 259 4.6.2. Tổ chức logic của đĩa ............................................................................................. 261 4.7. QUẢN LÝ TẬP TIN TRÊN ĐĨA CỦA MS-DOS ....................................................... 265 4.7.1. Boot sector ............................................................................................................. 266 4.7.2. File Allocation Table (FAT) .................................................................................. 268 4.7.3. Root Directory Bảng thƣ mục gốc ...................................................................... 274 4.7.4. Thƣ mục con Subdirectory .................................................................................. 279 4.8. TỔ CHỨC LƢU TRỮ TẬP TIN TRÊN ĐĨA CD_ROM ............................................ 281 4.8.1. Hệ thống tập tin ISO 9660 ..................................................................................... 282 4.8.2. Mở rộng Rock Ridge ............................................................................................. 283 4.8.3. Mở rộng Joliet ....................................................................................................... 283 4.9. TÓM TẮT .................................................................................................................... 284 Câu hỏi ôn tập ...................................................................................................................... 286 Bài tập .................................................................................................................................. 286 TÀI LI U THAM KHẢO ................................................................................................... 287 CHƯ NG 5: QUẢN L HỆ THỐNG NHẬP/XUẤT ....................................................... 291 5.1. MỤC TIÊU ................................................................................................................... 291 5.2. CÁC KHÁI NI M CƠ BẢN ........................................................................................ 291 5.3. PHẦN CỨNG NHẬP/XUẤT ....................................................................................... 292 5.3.1. Thiết bị I/O ............................................................................................................ 292 5.3.2. Tổ chức của chức năng I/O .................................................................................... 293 5.4. GIAO DI N NHẬP/XUẤT ỨNG DỤNG ................................................................... 299 5.5. H TH NG CON NHẬP/XUẤT CỦA NH N KERNEL I/O SUBSYTEM .......... 302 5.5.1. Định thời biểu nhập/xuất ....................................................................................... 302 5.5.2. Vùng đệm .............................................................................................................. 303 5.5.3. Vùng lƣu trữ .......................................................................................................... 303 5.5.4. Vùng chứa .............................................................................................................. 304 5.5.5. Quản lý lỗi ............................................................................................................. 304 5.5.6. Cấu trúc dữ liệu nhân ............................................................................................. 305 5.6. CHUYỂN NHẬP/XUẤT TỚI HOẠT ĐỘNG PHẦN CỨNG ..................................... 305 5.7. N NG LỰC ................................................................................................................. 308 5.8. TÓM TẮT .................................................................................................................... 310 Câu hỏi ôn tập ...................................................................................................................... 311 Câu hỏi trắc nghiệm ............................................................................................................. 311
5
TÀI LI U THAM KHẢO ................................................................................................... 311
D NH MỤC THUẬT NGỮ VIẾT TẮT
K HIỆU NGHĨ
API CDFS THUẬT NGỮ Application Programming Interface CD-ROM File System
CLI CPU CRT CS CSDL DMA FAT FCFS FDD FIFO FSD HDD I/O device IC ISO Là hệ thống tập tin đƣợc đƣa ra để quản lý các tập tin, thƣ mục trên các đĩa CD_ROM. Cấm ngắt Bộ xử lý ng phóng điện tử chân không Miền găng, đoạn găng Truy xuất bộ nhớ trực tiếp Bảng cấp phát tập tin Đến trƣớc đƣợc phục vụ trƣớc Đĩa mềm Vào trƣớc ra trƣớc Điều khiển hệ thống tập tin Đĩa cứng Thiết bị nhập/xuất Mạch tích hợp Tổ chức tiêu chuẩn hoá quốc tế
KTCN LCNs LFU LRU LWP Clean Interrupt Processor Cathode-Ray Tube Critical Section Cơ sở dữ liệu Direct Memory Access File Allocation Table First-Come, First-Served Floppy Disk First In First Out File System Driver Hard disk Input/Output device Integrated(cid:13)C(cid:13)rcuit International Organization for Standardization Logical Cluster Numbers The Least Frequently Used Least-Recently-Used Lightweight Process
6
MEM MFT MFU MMU MS-DOS NRU NTFS OPT OS P PC Kiểm tra cập nhật Số hiệu Cluster logic Ít đƣợc dùng thƣờng xuyên nhất. Lâu nhất chƣa sử dụng Liên kết các tiểu trình của cùng một tiến trình Bộ nhớ Memory Master File Table Trang đƣợc sử dụng nhiều nhất The Most Frequently Used Memory Management Unit Đơn vị quản lý bộ nhớ Microsoft Disk Operrating System Hệ điều hành MS-DOS Không sử dụng gần đây Not Recently Used Hệ thống tập tin NTFS New Technology File System Tối ƣu hóa Optimal Hệ điều hành Operating System Tiến trình, quá trình Process Máy tính cá nhân Personal Computer
PCB PCT PDA PTBR RID Program Counter Process Control Block Page Control Table Personal Digital Assistant Page Table Base Register Resource Identification
ROM RR SCT SJF STBR Read Only Memory Round Robin Segment Control Table Shortest Job First Segment Table Base Register
STI STLR Setting Interrupt Segment Table Length Register Nghĩa khác: Bộ đếm chƣơng trình Khối điều khiển tiến trình Bảng trang Thiết bị kỹ thuật số hỗ trợ cá nhân Thanh ghi nền bảng trang Định danh của khối quản lý tài nguyên Bộ nhớ chỉ đọc Bảng phân đoạn Công việc ngắn nhất trƣớc Thanh ghi nền của bảng phân đoạn Mở ngắt Thanh ghi giới hạn của bảng phân đoạn
THE TLBs TSL UDF Technische Hogeschool Eindhoven Hệ điều hành THE Translation Look-aside Buffers Test and Set
7
UMA USER VCNs Bộ nhớ kết hợp Kiểm tra khóa Là hệ thống tập tin đƣợc đƣa ra để quản lý các đĩa từ/quang, chủ yếu là các đĩa DVD_ROM Truy xuất bộ nhớ đồng nhất Ngƣời dùng Số hiệu Cluster ảo Uniform Memory Access USER Virtual Cluster Numbers
CHƯ NG 1: TỔNG QU N VỀ HỆ ĐIỀU HÀNH
1.1. MỤC TIÊU
Sau khi học xong chƣơng này, ngƣời học nắm đƣợc các kiến thức sau:
- Hiểu chức năng của hệ điều hành trong hệ thống máy tính
- Biết phân loại hệ điều hành
- Biết hệ điều hành phát triển qua nhiều giai đoạn
- Các thành phần bên trong hệ điều hành
- Các dịch vụ mà hệ điều hành cung cấp
- Biết đƣợc cấu trúc các hệ điều hành
Bài học này cung cấp cho chúng ta một cái nhìn tổng quát về những nguyên lý cơ
bản của hệ điều hành. Chúng ta bắt đầu với việc xem x t mục tiêu và các chức năng
của hệ điều hành, sau đó phân loại chúng và tìm hiểu quá trình phát triển hệ điều hành
qua từng giai đoạn. Phân biệt các thành phần hệ thống và các thành phần bên trong hệ
điều hành. Thông qua các giai đoạn khác nhau chúng ta sẽ thấy cách thức mà những
thành phần của hệ điều hành đƣợc cải tiến cũng nhƣ các dịch vụ mà hệ điều hành cung
cấp, cuối cùng là khảo sát các cấu trúc khác nhau của các hệ điều hành.
1.2. KHÁI NIỆM VỀ HỆ ĐIỀU HÀNH
Hệ điều hành là một chƣơng trình hệ thống hay một hệ chƣơng trình đóng vai tr
trung gian giữa ngƣời dùng máy tính và phần cứng máy tính. Mục tiêu của hệ điều
hành là cung cấp một môi trƣờng thuận lợi để ngƣời dùng d dàng thực hiện các
chƣơng trình ứng dụng của họ trên máy tính và khai thác triệt để các chức năng phần
cứng máy tính.
Hệ điều hành là một phần quan trọng của hầu hết các hệ thống máy tính. Một hệ
thống máy tính thƣờng đƣợc chia làm bốn phần chính: phần cứng, hệ điều hành, các
chƣơng trình ứng dụng và ngƣời dùng (user).
Phần cứng bao gồm bộ xử lý, bộ nhớ, các thiết bị nhập xuất, đây là những tài
nguyên cơ bản của máy tính. Chương trình ứng dụng nhƣ các chƣơng trình dịch trong
8
ngôn ngữ lập trình Pascal, C,… , hệ thống cơ sở dữ liệu (Access, SQL), các chƣơng
trình tr chơi, và các chƣơng trình thƣơng mại. Các chƣơng trình này sử dụng tài
nguyên của máy tính để giải quyết các yêu cầu của ngƣời dùng. Hệ điều hành làm
nhiệm vụ điều khiển và phối hợp việc sử dụng phần cứng cho những ứng dụng khác
nhau của nhiều người dùng khác nhau bao gồm cả thiết bị đầu cuối, hệ thống máy tính
khác). Hệ điều hành cung cấp một môi trƣờng mà các chƣơng trình có thể làm việc hữu
Ngƣời dùng 1
Ngƣời dùng 2
Ngƣời dùng 3
Ngƣời dùng 4
hiệu trên đó.
Chƣơng trình Hợp ngữ Soạn thảo văn CSDL
dịch bản
Chƣơng trình ứng dụng
Hệ điều hành
Phần cứng
Hình 1.1. Mô hình trừu tượng của hệ thống máy tính
Hệ điều hành có thể đƣợc coi nhƣ là bộ phân phối tài nguyên của máy tính. Nhiều
tài nguyên của máy tính nhƣ thời gian sử dụng CPU, không gian bộ nhớ, vùng lƣu trữ
tập tin, thiết bị nhập xuất v.v… đƣợc các chƣơng trình yêu cầu để giải quyết vấn đề. Hệ
điều hành hoạt động nhƣ một bộ quản lý các tài nguyên và phân phối chúng cho các
chƣơng trình và ngƣời dùng khi cần thiết. Do có rất nhiều yêu cầu, hệ điều hành phải
giải quyết vấn đề tranh chấp và phải quyết định cấp phát tài nguyên cho những yêu cầu
theo thứ tự nào để hoạt động của máy tính là hiệu quả nhất. Một hệ điều hành cũng có
thể đƣợc coi nhƣ là một chƣơng trình kiểm soát việc sử dụng máy tính, đặc biệt khi
ngƣời dùng sử dụng các thiết bị nhập xuất.
Tuy nhiên, nhìn chung chƣa có định nghĩa nào là hoàn hảo về hệ điều hành. Hệ
điều hành tồn tại để giải quyết các vấn đề sử dụng hệ thống máy tính. Mục tiêu cơ bản
9
của nó là giúp cho việc thi hành các chƣơng trình d dàng hơn. Mục tiêu thứ hai là hỗ
trợ cho các thao tác trên hệ thống máy tính hiệu quả hơn. Mục tiêu này đặc biệt quan
trọng trong những hệ thống nhiều ngƣời dùng và trong những hệ thống lớn. Tuy nhiên
hai mục tiêu này cũng có phần tƣơng phản vì vậy thuyết về hệ điều hành à đứng về
phía người thiết ế ra hệ điều hành n n t p trung vào việc tối ưu h a việc s dụng tài
nguy n của máy tính à quan trọng nh t
1.3. CHỨC N NG HỆ ĐIỀU HÀNH
Để đạt mục tiêu trên hệ điều hành thực hiện hai chức năng chính nhƣ sau:
- Gi p một máy tính m rộng: Máy tính là một thiết bị vi điện tử, nó đƣợc cấu
thành từ các bộ phận nhƣ: Bộ xử lý, bộ nhớ, thiết bị nhập/xuất, BUS, ... Do đó, để
làm việc với máy tính ngƣời dùng phải hiểu đƣợc cơ chế hoạt động của các bộ phận
này và phải tác động trực tiếp vào nó, tất nhiên là dùng m máy ký số 0,1 . Điều
này là quá khó đối với ngƣời dùng. Để đơn giản hơn, hệ điều hành phải che dấu hết
các chi tiết phức tạp của phần cứng máy tính bởi một một máy tính m rộng. Máy
tính mở rộng này có đầy đủ các chức năng của một máy tính thực nhƣng đơn giản
và d sử dụng. Theo đó khi cần tác động vào máy tính thực ngƣời sử dụng chỉ cần
tác động vào máy tính mở rộng, mọi sự chuyển đổi thông tin điều khiển từ máy tính
mở rộng sang máy tính thực hoặc ngƣợc lại điều do hệ điều hành thực hiện. Mục
đích của chức năng này là: giúp ngƣời sử dụng khai thác các chức năng phần cứng
máy tính d dàng và hiệu quả hơn.
- Qu n tài nguy n hệ thống gồm Bộ xử lý, bộ nhớ, thiết bị nhập/xuất, tập tin,...
Đây là những tài nguyên cơ bản mà hệ điều hành cấp phát cho các tiến trình trong
khi điều khiển sự hoạt động của hệ thống.
Khi ngƣời dùng cần thực hiện một chƣơng trình hay khi một chƣơng trình cần
nạp thêm một tiến trình mới vào bộ nhớ thì hệ điều hành phải cấp phát không gian nhớ
cho chƣơng trình, tiến trình đó để chƣơng trình, tiến trình đó nạp đƣợc vào bộ nhớ và
hoạt động đƣợc. Trong môi trƣờng hệ điều hành đa nhiệm có thể có nhiều chƣơng
trình, tiến trình đồng thời cần đƣợc nạp vào bộ nhớ, nhƣng không gian lƣu trữ của bộ
nhớ có giới hạn, do đó hệ điều hành phải tổ chức cấp phát bộ nhớ sao cho hợp lý để
đảm bảo tất cả các chƣơng trình, tiến trình khi cần đều đƣợc nạp vào bộ nhớ để hoạt
động. Ngoài ra hệ điều hành c n phải tổ chức bảo vệ các không gian nhớ đ cấp cho
10
các chƣơng trình, tiến trình để tránh sự truy cập bất hợp lệ và sự tranh chấp bộ nhớ
giữa các chƣơng trình, tiến trình, đặc biệt là các tiến trình đồng thời hoạt động trên hệ
thống. Đây là một trong những nhiệm vụ quan trọng của hệ điều hành.
Trong quá trình hoạt động của hệ thống, đặc biệt là các hệ thống đa ngƣời dùng,
đa chƣơng trình, đa tiến trình, c n xuất hiện một hiện tƣợng khác, đó là nhiều chƣơng
trình, tiến trình đồng thời sử dụng một không gian nhớ hay một tập tin dữ liệu, chƣơng
trình nào đó. Trong trƣờng hợp này hệ điều hành phải tổ chức việc chia s và giám sát
việc truy xuất đồng thời trên các tài nguyên nói trên sao cho việc sử dụng tài nguyên có
hiệu quả nhƣng tránh đƣợc sự mất mát dữ liệu và làm hỏng các tập tin.
Trên đây là hai dẫn chứng điển hình để chúng ta thấy vai tr của hệ điều hành
trong việc quản lý tài nguyên hệ thống, sau này chúng ta sẽ thấy việc cấp phát, chia s ,
bảo vệ tài nguyên của hệ điều hành là một trong những công việc khó khăn và phức tạp
nhất. Hệ điều hành đ tốn nhiều chi phí cho công việc nói trên để đạt đƣợc mục tiêu:
Trong mọi trƣờng hợp tất cả các chƣơng trình, tiến trình nếu cần đƣợc cấp phát tài
nguyên để hoạt động thì sớm hay muộn nó đều đƣợc cấp phát và đƣợc đƣa vào trạng
thái hoạt động.
Các nhà thiết kế hệ điều hành luôn hƣớng tới việc phát triển một hệ điều hành
ngày càng thân thiện d sử dụng, c c u n n t c n c c c c n n sau1:
- Hệ điều hành cho phép thực hiện nhiều chương trình đồng thời trong môi
trường đa tác vụ (đa nhiệm). Hệ điều hành đa nhiệm bao gồm: Windows NT,
Windows 2000, Linux và OS/2. Trong hệ thống đa nhiệm, hệ điều hành phải xác
định khi nào thì một ứng dụng đƣợc chạy và mỗi ứng dụng đƣợc chạy trong
khoản thời gian bao lâu thì phải dừng lại để cho các ứng dụng khác đƣợc chạy.
- Hệ điều hành tự nạp n vào bộ nhớ: Quá trình nạp hệ điều hành vào bộ nhớ
đƣợc gọi là quá trình Booting. Chỉ khi nào hệ điều hành đ đƣợc nạp vào bộ nhớ
thì nó mới cho ph p ngƣời dùng giao tiếp với phần cứng. Trong các hệ thống có
nhiều ứng dụng đồng thời hoạt động trên bộ nhớ thì hệ điều hành phải chịu trách
nhiệm chia s không gian bộ nhớ RAM và bộ nhớ cache cho các ứng dụng này.
- Hệ điều hành và API (Application Programming Interface): là một tập các
1 Nguy n Kim Tuấn, Giáo trình lý thuyết hệ điều hành, ĐH Huế, 2004,Tr.3.
11
hàm/thủ tục đƣợc xây dựng sẵn bên trong hệ thống, nó có thể thực hiện đƣợc
nhiều chức năng khác nhau nhƣ shutdown hệ thống, đảo ngƣợc hiệu ứng màn
hình, khởi động các ứng dụng,… Hệ điều hành giúp cho chƣơng trình của ngƣời
dùng giao tiếp với API hay thực hiện một lời gọi đến các hàm/thủ tục của API.
- Nạp dữ iệu cần thiết vào bộ nhớ: Dữ liệu do ngƣời dùng cung cấp đƣợc đƣa
vào bộ nhớ để xử lý. Khi nạp dữ liệu vào bộ nhớ hệ điều hành phải lƣu lại địa
chỉ của bộ nhớ nơi mà dữ liệu đƣợc lƣu ở đó. Hệ điều hành phải luôn theo dõi
bản đồ cấp phát bộ nhớ, nơi dữ liệu và chƣơng trình đƣợc lƣu trữ ở đó. Khi một
chƣơng trình cần đọc dữ liệu, hệ điều hành sẽ đến các địa chỉ bộ nhớ nơi đang
lƣu trữ dữ liệu mà chƣơng trình cần đọc để đọc lại nó.
- Hệ điều hành bi n dịch các chỉ thị chương trình: Hệ điều hành phải đọc và giải
m các thao tác cần đƣợc thực hiện, nó đƣợc viết trong chƣơng trình của ngƣời
dùng. Hệ điều hành cũng chịu trách nhiệm sinh ra thông báo lỗi khi hệ thống
gặp lỗi trong khi đang hoạt động.
- Hệ điều hành qu n tài nguy n: Nó đảm bảo việc sử dụng thích hợp tất cả các
tài nguyên của hệ thống nhƣ là: bộ nhớ, đĩa cứng, máy in, …
1.4. PH N LOẠI HỆ ĐIỀU HÀNH
Có nhiều cách khác nhau để phân loại hệ điều hành, ở đây chúng tôi dựa vào cách
mà hệ điều hành thực hiện các công việc, các tác vụ, các tiến trình của ngƣời dùng để
phân loại hệ điều hành.
1.4.1. Hệ điều hành xử lý theo lô đơn chương
Hệ điều hành loại này thực hiện các tác vụ ần ượt theo những chỉ thị đ đƣợc
xác định trƣớc. Khi một tác vụ chấm dứt thì hệ thống sẽ tự động thực hiện tác vụ tiếp
theo mà không cần sự can thiệp từ bên ngoài, do đó hệ thống đạt tốc độ thực hiện cao.
Để thực hiện đƣợc điều này hệ điều hành phải có bộ giám sát thƣờng trực.
Bộ giám sát thường trực: Khi một công việc chấm dứt, hệ thống sẽ thực hiện
công việc kế tiếp mà không cần sự can thiệp của ngƣời lập trình, do đó thời gian thực
hiện sẽ mau hơn. Một chƣơng trình, c n gọi là bộ giám sát thƣờng trực đƣợc thiết kế để
giám sát việc thực hiện d y các công việc một cách tự động, chƣơng trình này luôn
12
luôn thƣờng trú trong bộ nhớ chính.
Hệ điều hành
Vùng chƣơng
trình ngƣời
dùng
Bản 1.1. S p xếp bộ nhớ của hệ thống x theo ô đơn chương
Nhập công việc
Môi trƣờng máy tính
Hàng đợi công việc
Kết quả
Môi trƣờng sử dụng
n 2. Cài đ t hàng đợi các công việc người d ng
Trong hệ điều hành này khi hệ thống cần thực hiện một công việc thì nó phải lƣu
chƣơng trình và dữ liệu của các công việc vào hàng đợi các công việc, sau đó sẽ thực
hiện lần lƣợt từng bộ chƣơng trình và dữ liệu của công việc tƣơng ứng trong hàng đợi
và cho ra lần lƣợt các kết quả. B ng 1 1 ở trên minh họa cho sự hoạt động của hệ thống
theo lô đơn chƣơng.
Với cách tổ chức hàng đợi công việc, thì hệ thống không thể thay đổi chƣơng
trình và dữ liệu của các công việc ngay cả khi chúng c n nằm trong hàng đợi, đây là
một hạn chế. Mặt khác trong quá trình thực hiện công việc nếu công việc chuyển sang
truy xuất trên thiết bị vào/ra thì CPU rơi vào trạng thái chờ điều này gây l ng phí thời
gian xử lý của CPU. Các thao tác khác của hệ điều hành xử lý theo lô đơn chƣơng:
- CPU và thao tác nh p xu t: CPU thƣờng hay nhàn rỗi do tốc độ làm việc của
các thiết bị nhập xuất thƣờng là thiết bị cơ chậm hơn rất nhiều lần so với các
thiết bị điện tử CPU . Cho dù là một CPU chậm nhất, nó cũng nhanh hơn rất
nhiều lần so với thiết bị nhập xuất. Do đó phải có các phƣơng pháp để đồng bộ
13
hóa việc hoạt động của CPU và thao tác nhập xuất.
- X off_ ine: Thay vì CPU phải đọc trực tiếp từ thiết bị nhập và xuất ra thiết bị
xuất, hệ thống dùng một bộ lƣu trữ trung gian. CPU chỉ thao thác với bộ phận
lƣu trữ trung gian này.
- Spool (simultaneous peripheral operation online : là đồng bộ hóa các thao tác
bên ngoài online. Cơ chế này cho ph p xử lý của CPU là online, sử dụng đĩa để
lƣu các dữ liệu nhập/xuất.
1.4.2. Hệ thống xử lý theo lô đa chương
Một trong những hạn chế của hệ điều hành xử lý theo lô đơn giản là l ng phí thời
gian xử lý của CPU khi công việc hiện tại truy xuất đến thiết bị vào/ra. Hệ điều hành
xử lý theo lô đa chƣơng sẽ khắc phục hạn chế này.
Hệ điều hành
Công việc 1
Công việc 2
Công việc 3
Công việc 4
Bản 2. S p xếp bộ nhớ của hệ thống x theo ô đa chương
Khi có nhiều công việc cùng truy xuất lên thiết bị, vấn đề lập lịch cho các công
việc là cần thiết. Khía cạnh quan trọng nhất trong việc lập lịch là khả năng đa chƣơng
(multiprogram). Mục ti u của n à gia tăng hiệu su t s dụng CPU b ng cách t chức
các công việc sao cho CPU uôn uôn ph i trong trạng thái àm việc.
Hệ điều hành loại này có khả năng thực hiện nhiều công việc, nhiều chƣơng trình
đồng thời. Khi cần thực hiện nhiều công việc đồng thời hệ điều hành sẽ nạp một phần
m lệnh và dữ liệu vào bộ nhớ các phần c n lại sẽ đƣợc nạp sau tại thời điểm thích
hợp và tất cả đều ở trạng thái sẵn sàng thực hiện. Sau đó hệ điều hành dùng bộ định
thời CPU chọn ra một công việc nào đó và cho nó thực thi trong CPU, nhƣng khi công
việc đang thực hiện cần truy xuất thiết bị vào/ra thì CPU sẽ đƣợc chuyển sang thực
14
hiện các công việc khác, và cứ nhƣ thế hệ điều hành tổ chức chuyển hƣớng CPU để
thực hiện hết các phần công việc trong bộ nhớ cũng nhƣ các công việc mà hệ thống yêu
cầu.
Hệ điều hành loại này mang lại hai ƣu điểm đó là tiết iệm được bộ nhớ, vì hông
nạp hết mã ệnh và dữ iệu của các công việc vào bộ nhớ, và hạn chế thời gian rỗi của
CPU. Tuy nhiên nó phải trả chi phí cao cho việc lập lịch CPU, tức là khi CPU r nh hệ
điều hành phải xem x t nên chuyển nó cho công việc nào trong số các công việc đang
đợi ở trạng thái sẵn sàng. Ngoài ra hệ điều hành c n phải giải quyết việc chia s bộ nhớ
chính cho các công việc khác nhau. Hệ điều hành MS-DOS là hệ điều hành đơn nhiệm,
đa chƣơng.
Với hệ đa chƣơng hệ điều hành ra quyết định cho ngƣời dùng. Vì vậy, hệ điều
hành đa chƣơng rất tinh vi. Hệ phải xử lý các vấn đề lập lịch cho công việc, lập lịch
cho bộ nhớ và cho cả CPU.
1.4.3. Hệ thống chia s thời gian
Hệ thống chia s thời gian là một mở rộng logic của hệ đa chƣơng. Hệ thống này
c n đƣợc gọi là hệ thống đa nhiệm nhƣ Windows 9x/NT. Chia sẻ thời gian đây chính
à chia sẻ thời gian x của CPU cho các công việc, các tiến trình đang ở trong trạng
thái sẵn sàng thực hiện. Mục ti u của n à cung c p cơ chế cho phép người d ng giao
tiếp với mỗi chương trình trong hi chạy.
Nguyên tắc của hệ điều hành chia s thời gian tƣơng tự nhƣ trong hệ điều hành xử
lý theo lô đa chƣơng nhƣng việc chuyển CPU từ tác vụ, tiến trình này sang tác vụ, tiến
trình khác không phụ thuộc vào việc tác vụ, tiến trình hiện tại có truy xuất đến thiết bị
vào/ra hay không mà chỉ phụ thuộc vào sự điều phối CPU của hệ điều hành. Công việc
điều phối CPU của hệ điều hành rất phức tạp phụ thuộc vào nhiều yếu tố khác nhau,
chúng ta sẽ đề cập đến vấn đề này trong chƣơng sau của tài liệu này.
Hệ điều hành chia s phức tạp hơn hệ điều hành đa chƣơng. Nó phải có các chức
năng: quản trị và bảo vệ bộ nhớ, sử dụng bộ nhớ ảo. Nó cũng cung cấp hệ thống tập tin
truy xuất online…Hệ điều hành chia s là kiểu của các hệ điều hành hiện đại ngày nay.
15
1.4.4. Hệ thống đa xử lý hệ thống song song)
Ngoài hệ thống một bộ xử lý c n có các hệ thống c nhiều bộ x c ng chia sẻ
hệ thống đường truyền dữ iệu, đồng hồ, bộ nhớ và các thiết bị ngoại vi. Các bộ xử lý
này liên lạc bên trong với nhau.
n 3. Hệ thống đa x
Có n u n uyên n ân xây d n t ốn d n n y:
- Thông ượng được gia tăng: Với sự gia tăng số lƣợng bộ xử lý, công việc đƣợc
thực hiện nhanh chóng hơn, Nhƣng không phải theo đúng tỉ lệ thời gian, nghĩa
là có n bộ xử lý không có nghĩa là sẽ thực hiện nhanh hơn n lần. Vì trong khi
nhiều bộ xử lý cộng tác trên một công việc, một lƣợng chi phí phải chịu trong
việc giữ các thành phần làm việc phù hợp. Chi phí này cộng với chi phí cạnh
tranh tài nguyên đƣợc chia s , làm giảm kết quả đƣợc mong đợi từ những bộ xử
lý bổ sung. Tƣơng tự nhƣ một nhóm gồm N lập trình viên làm việc với nhau
không dẫn đến kết quả công việc đang đạt đƣợc tăng N lần.
- Tính inh tế của việc mở rộng: hệ thống đa xử lý có thể tiết kiệm nhiều chi phí
hơn hệ thống đơn bộ xử lý, bởi vì chúng có thể chia s ngoại vi, thiết bị lƣu trữ
và điện. Nếu nhiều chƣơng trình điều hành trên cùng tập hợp dữ liệu thì lƣu trữ
dữ liệu đó trên một đĩa và tất cả bộ xử lý chia s chúng sẽ r hơn là có nhiều
máy tính với đĩa cục bộ và nhiều bản sao dữ liệu.
- Kh năng tin c y được gia tăng: nếu các chức năng đƣợc phân bổ hợp lý
giữa các bộ xử lý thì lỗi trên một bộ xử lý sẽ không dừng hệ thống, chỉ năng lực
bị giảm. Nếu chúng ta có 10 bộ xử lý và có 1 bộ xử lý bị sự cố thì mỗi bộ xử lý
trong 9 bộ xử lý c n lại phải chia s của công việc của bộ xử lý bị lỗi. Do đó,
2 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005,tr.8
16
toàn bộ hệ thống chỉ giảm 10% năng lực hơn là dừng hoạt động. Các hệ thống đƣợc thiết kế nhƣ thế đƣợc gọi là hệ thống có khả năng chịu lỗi fault tolerant 2.
Hệ thống đa xử lý thông thƣờng sử dụng cách đa x đối xứng, trong cách này
mỗi bộ xử lý chạy với một bản sao của hệ điều hành, những bản sao này liên lạc với
nhau khi cần thiết. Một ví dụ về hệ thống xử lý đối xứng là phiên bản Encore của
UNIX cho máy tính Multimax. Hệ thống này có hàng chục bộ xử lý. Ƣu điểm của nó là
nhiều tiến trình có thể thực hiện cùng lúc. Một hệ thống đa xử lý cho ph p nhiều công
việc và tài nguyên đƣợc chia s tự động trong những bộ xử lý khác nhau.
Hầu nhƣ tất cả hệ điều hành hiện đại - gồm Windows NT, Solaris, Digital UNIX,
OS/2 và LINUX - hiện nay cung cấp sự hỗ trợ đa xử lý đối xứng.
Một số hệ thống sử dụng đa x b t đối xứng, trong đó mỗi bộ xử lý đƣợc giao
một công việc riêng biệt. 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.
1.4.5. Hệ thống phân tán
Hệ thống này cũng tƣơng tự nhƣ hệ thống chia s thời gian nhƣng các bộ xử lý
không chia s bộ nhớ và đồng hồ, thay vào đó mỗi bộ xử lý có bộ nhớ cục bộ riêng.
Các bộ x thông tin với nhau thông qua các đường truyền thông như những bus tốc
độ cao hay đường dây điện thoại.
Các bộ xử lý trong hệ phân tán thƣờng khác nhau về kích thƣớc và chức năng. Nó
có thể bao gồm máy vi tính, trạm làm việc, máy mini, và những hệ thống máy lớn. Các
bộ xử lý thƣờng đƣợc tham khảo với nhiều tên khác nhau nhƣ Site, Node, Computer
v.v.... tùy thuộc vào trạng thái làm việc của chúng.
C c n uyên n ân p ả xây d n t ốn p ân t n l :
- Chia sẻ tài nguy n: Một ngƣời dùng A có thể sử dụng máy in của ngƣời dùng B
và ngƣời dùng B có thể truy xuất những tập tin của A. Tổng quát, chia s tài
nguyên trong hệ thống phân tán cung cấp một cơ chế để chia s tập tin ở vị trí
xa, xử lý thông tin trong một cơ sở dữ liệu phân tán, in ấn tại một vị trí xa, sử
17
dụng những thiết bị ở xa để thực hiện các thao tác.
- 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ùng thực hiện một lúc. Hệ thống phân tán cho ph p phân chia việc tính toán
trên nhiều vị trí khác nhau để tính toán song song.
- An toàn: Nếu một vị trí trong hệ thống phân tán bị hỏng, các vị trí khác vẫn tiếp
tục làm việc.
- Thông tin i n ạc với nhau: Có nhiều lúc, chƣơng trình cần chuyển đổi dữ liệu
từ vị trí này sang vị trí khác. Ví dụ trong hệ thống Windows, thƣờng có sự chia
s và chuyển dữ liệu giữa các cửa sổ. Khi các vị trí đƣợc nối kết với nhau trong
một hệ thống mạng, việc trao đổi dữ liệu di n ra rất d . Ngƣời dùng có thể
chuyển tập tin hay các Email cho nhau từ cùng vị trí hay những vị trí khác.
1.4.6. Hệ thống xử lý thời gian thực
Hệ thống x thời gian thực được s dụng hi c những đòi hỏi h t he về thời
gian tr n các thao tác của bộ x ho c dòng dữ iệu, nó thƣờng đƣợc dùng điều khiển
các thiết bị trong các ứng dụng tận hiến. Máy tính phân tích dữ liệu và có thể chỉnh các
điều khiển giải quyết cho dữ liệu nhập.
Một hệ điều hành xử lý thời gian thực phải đƣợc định nghĩa tốt, thời gian xử lý
nhanh. Hệ thống phải cho kết quả chính xác trong khoảng thời gian bị thúc p nhanh
nhất. Có hai hệ thống xử lý thời gian thực là hệ thống thời gian thực cứng và hệ thống
thời gian thực mềm..
Hệ thống thời gian thực cứng là công việc đƣợc hoàn tất đúng lúc. Lúc đó dữ liệu
thƣờng đƣợc lƣu trong bộ nhớ ngắn hạn hay trong ROM. Việc xử lý theo thời gian thực
sẽ xung đột với tất cả hệ thống liệt kê ở trên.
Dạng thứ hai là hệ thống thời gian thực mềm, mỗi công việc có một độ ƣu tiên
riêng và sẽ đƣợc thi hành theo độ ƣu tiên đó. Có một số lĩnh vực áp dụng hữu hiệu
phƣơng pháp này là các ứng dụng đa phƣơng tiện.
1.4.7. Hệ xách tay
Hệ xách tay gồm các máy ỹ thu t số hỗ trợ cá nhân (personal digital assistants-
PDAs nhƣ Palm hay điện thoại di động với nối kết Internet. Những ngƣời phát triển hệ
xách tay và ứng dụng gặp phải nhiều thử thách, nhất là sự giới hạn về ích thƣớc của
18
thiết bị. Thí dụ, một PDA điển hình cao khoảng 12,7cm và rộng khoảng 7,62cm và
trọng lƣợng của nó ít hơn 225g. Do sự giới hạn về kích thƣớc này, hầu hết các thiết bị
xách tay có bộ nhớ nhỏ gồm các bộ xử lý thấp và màn hình hiển thị nhỏ. Bây giờ chúng
ta sẽ xem x t mỗi sự giới hạn này.
Nhiều thiết bị xách tay có dung lƣợng bộ nhớ 512KB và 8MB ngƣợc lại, các
máy PC hay trạm làm việc có hàng trăm MB bộ nhớ . Do đó, hệ điều hành và các ứng
dụng phải quản lý bộ nhớ hiệu quả. Hiện nay, nhiều thiết bị xách tay không dùng kỹ
thuật bộ nhớ ảo do đó buộc ngƣời phát triển chƣơng trình làm việc trong phạm vi giới
hạn của bộ nhớ vật lý.
Vấn đề thứ hai mà ngƣời phát triển cần quan tâm đến là tốc độ của bộ xử lý đƣợc
dùng trong thiết bị. Các bộ xử lý nhanh hơn yêu cầu điện năng nhiều hơn. Để chứa một
bộ xử lý nhanh hơn bên trong thiết bị xách tay yêu cầu nhiều pin hơn và phải đƣợc nạp
lại thƣờng xuyên. Để tối thiểu hoá kích thƣớc của các thiết bị xách tay đ i hỏi bộ xử lý
nhỏ hơn, chậm hơn tiêu thụ ít điện năng hơn. Do đó, hệ điều hành và các ứng dụng
phải đƣợc thiết kế không đ i hỏi sử dụng nhiều bộ xử lý.
Vấn đề cuối cùng gây khó khăn cho ngƣời thiết kế chƣơng trình cho các thiết bị
xách tay là màn hình hiển thị nhỏ. Màn hình cho thiết bị xách tay thƣờng có diện tích
không quá 7,62cm. Những tác vụ quen thuộc nhƣ đọc email hay hiển thị các trang web,
phải đƣợc cô đọng vào màn hình nhỏ hơn. Một phƣơng pháp để hiển thị nội dung các
trang web là cắt xén web, ở đó chỉ một tập hợp nhỏ trang web đƣợc phân phát và hiển
thị trên thiết bị xách tay.
1.5. L CH S PHÁT TRIỂN CỦ HỆ ĐIỀU HÀNH
1.5.1. Thế hệ 1 1945 – 1955)
Vào khoảng giữa thập niên 1940, Howard Aiken ở Havard và John Von Neumann
ở Princeton, đ thành công trong việc xây dựng máy tính dùng ống chân không. Những
máy này rất lớn với hơn 10000 ống chân không nhƣng chậm hơn nhiều so với máy r nhất ngày nay3.
Mỗi máy đƣợc một nhóm ngƣời thực hiện tất cả các khâu từ thiết kế, xây dựng
3 Nguy n Hạnh Nhi, Bài giảng điện tử hệ điều hành nâng cao, Trƣờng Đại học Khoa học Tự nhiên
19
lập trình, thao tác đến quản lý. Lập trình bằng ngôn ngữ máy tuyệt đối, thƣờng là bằng
cách dùng bảng điều khiển để thực hiện các chức năng cơ bản. Ngôn ngữ lập trình chƣa
đƣợc biết đến và hệ điều hành cũng chưa nghe đến.
Vào đầu thập niên 1950, phiếu đục lổ ra đời và có thể viết chƣơng trình trên phiếu
thay cho dùng bảng điều khiển.
1.5.2 Thế hệ 2 1955 – 1965)
Sự ra đời của thiết bị bán dẫn vào giữa thập niên 1950 làm thay đổi bức tranh
tổng thể. Máy tính trở nên đủ tin cậy hơn. Nó đƣợc sản xuất và cung cấp cho các khách
hàng. Lần đầu tiên có sự phân chia rõ ràng giữa ngƣời thiết kế, ngƣời xây dựng, ngƣời
vận hành, ngƣời lập trình, và ngƣời bảo trì.
Để thực hiện một công việc một chƣơng trình hay một tập hợp các chƣơng
trình , lập trình viên trƣớc hết viết chƣơng trình trên giấy bằng hợp ngữ hay
FORTRAN sau đó đục lỗ trên phiếu và cuối cùng đƣa phiếu vào máy. Sau khi thực
hiện xong nó sẽ xuất kết quả ra máy in.
Hệ thống x theo ô ra đời, nó lƣu các yêu cầu cần thực hiện lên băng từ, và hệ
thống sẽ đọc và thi hành lần lƣợt. Sau đó, nó sẽ ghi kết quả lên băng từ xuất và cuối
cùng ngƣời dùng sẽ đem băng từ xuất đi in.
Hệ thống xử lý theo lô hoạt động dƣới sự điều khiển của một chƣơng trình đặc
biệt là tiền thân của hệ điều hành sau này. Ngôn ngữ lập trình sử dụng trong giai đoạn
này chủ yếu là FORTRAN và hợp ngữ.
1.5.3. Thế hệ 3 1965 – 1980)
Trong giai đoạn này, máy tính đƣợc sử dụng rộng r i trong khoa học cũng nhƣ
trong thƣơng mại. Máy IBM 360 là máy tính đầu tiên sử dụng mạch tích hợp IC . Từ
đó kích thƣớc và giá cả của các hệ thống máy tính giảm đáng kể. Các thiết bị ngoại vi
dành cho máy xuất hiện ngày càng nhiều và thao tác điều khiển bắt đầu phức tạp.
Hệ điều hành ra đời nhằm điều phối, kiểm soát hoạt động và giải quyết các yêu
cầu tranh chấp thiết bị. Chƣơng trình hệ điều hành dài cả triệu d ng hợp ngữ và do
hàng ngàn lập trình viên thực hiện.
Sau đó, hệ điều hành đa chương ra đời, có nhiều công việc cùng xuất hiện trong
bộ nhớ. CPU không bao giờ r nh. Bộ nhớ đƣợc chia làm nhiều phần để lƣu các công
20
việc khác nhau, khi một công việc chờ thực hiện nhập xuất, CPU sẽ xử lý các công
việc khác. Tuy nhiên khi có nhiều công việc cùng tồn tại trong bộ nhớ, vấn đề là phải
có một cơ chế bảo vệ tránh các công việc ảnh hƣởng đến nhau.
Giai đoạn này cũng đánh dấu sự ra đời của hệ điều hành chia sẻ thời gian nhƣ CTSS4 của MIT5. Đồng thời các hệ điều hành lớn ra đời nhƣ MULTICS, UNIX và hệ thống các máy mini cũng xuất hiện nhƣ DEC PDP-1.
1.5.4. Thế hệ 4 1980-nay )
Giai đoạn này đánh dấu sự ra đời của máy tính cá nhân, đặc biệt là hệ thống IBM
PC với hệ điều hành MS-DOS và Windows sau này. Bên cạnh đó là sự phát triển mạnh
của các hệ điều hành tựa Unix trên nhiều hệ máy khác nhau nhƣ Linux. Ngoài ra, từ
đầu thập niên 90 cũng đánh dấu sự phát triển mạnh mẽ của hệ điều hành mạng và hệ
điều hành phân tán.
Các chuyên gia về kiến trúc máy tính cũng dự đoán thế hệ thứ 5 dành cho các
máy tính xử lý song song. Thế hệ của những máy tính thông minh, dựa trên các ngôn
ngữ trí tuệ nhân tạo nhƣ LISP và PROLOG,... và các giao diện ngƣời – máy. Năm
2004, Robot thông minh gần giống con ngƣời nhất là ASIMO Advanced Step
Innovative Mobility: Bƣớc chân tiên tiến của đổi mới và chuyển động .
1.6. CẤU TR C CỦ HỆ ĐIỀU HÀNH
1.6.1. Các thành phần ên trong hệ điều hành
1.6.1.1. Quản lý tiến trình
Một chƣơng trình không thực hiện đƣợc gì cả nếu nhƣ nó không đƣợc CPU thi
hành. Một t ến tr n à một chương trình đang được thực thi, nhƣng ý nghĩa của nó
c n rộng hơn. Một công việc theo lô là một tiến trình. Một chƣơng trình ngƣời dùng
chia s thời gian là một tiến trình, một công việc của hệ thống nhƣ soopling xuất ra
máy in cũng là một tiến trình. Một tiến trình ph i s dụng tài nguy n như thời gian s
dụng CPU, hông gian bộ nhớ, t p tin, các thiết bị nh p xu t, đ hoàn t t công việc
của mình. Các tài nguyên này đƣợc cung cấp khi tiến trình đƣợc tạo hay trong quá trình
thi hành. Khi tiến trình đƣợc tạo, nó sử dụng rất nhiều tài nguyên vật lý và luận lý. Ví
4 Bộ máy tính chia s thời gian thực khổng lồ đƣợc gọi là CTSS 5 Viện công nghệ Massachusetts MIT vào giữa những năm 1960
21
dụ, khảo sát tiến trình hiển thị trạng thái của tập tin lên màn hình. Đầu vào của tiến
trình là tên tập tin, và tiến trình sẽ thực hiện những chỉ thị thích hợp, thực hiện lời gọi
hệ thống để nhận đƣợc những thông tin mong muốn và hiển thị nó lên màn hình. Khi
tiến trình kết thúc, hệ điều hành sẽ thu hồi các tài nguyên trƣớc đây đ cấp phát cho
tiến trình.
Một tiến trình đƣợc coi là một đơn vị làm việc của hệ thống. Một hệ thống có thể
có nhiều tiến trình cùng lúc, trong đó một số tiến trình là của hệ điều hành, một số tiến
trình là của ngƣời dùng. các tiến trình này có thể di n ra đồng thời.
Va trò của u n tron v c quản lý t ến tr n l :
- Tạo và hủy các tiến trình của ngƣời dùng và của hệ thống.
- Ngƣng và kích hoạt lại một tiến trình.
- Cung cấp cơ chế đồng bộ tiến trình.
- Cung cấp các thông tin liên lạc giữa các tiến trình.
- Cung cấp cơ chế quản lý deadlock xem chƣơng2 .
1.6.1.2. Quản lý ộ nhớ chính
Trong hệ thống máy tính hiện đại, bộ n ớ c ín (Physical Memory) là trung tâm
của các thao tác, xử lý. Bộ nhớ chính có thể xem nhƣ một mảng kiểu Byte hay kiểu
word. Mỗi phần tử đều có địa chỉ. Đó là nơi lƣu dữ liệu đƣợc CPU truy xuất một cách
nhanh chóng so với các thiết bị nhập/xuất. CPU đọc những chỉ thị từ bộ nhớ chính. Các
thiết bị nhập/xuất cài đặt cơ chế DMA xem chƣơng 4 cũng đọc và ghi dữ liệu trong
bộ nhớ chính. Thông thƣờng bộ nhớ chính chứa các thiết bị mà CPU có thể định vị trực
tiếp. Ví dụ CPU truy xuất dữ liệu từ đĩa, những dữ liệu này đƣợc chuyển vào bộ nhớ
qua lời gọi hệ thống nhập/xuất.
Một chƣơng trình muốn thi hành trƣớc hết phải đƣợc ánh xạ thành địa chỉ tuyệt
đối và nạp vào bộ nhớ chính. Khi chƣơng trình thi hành, hệ thống truy xuất các chỉ thị
và dữ liệu của chƣơng trình trong bộ nhớ chính. Ngay cả khi tiến trình kết thúc, dữ liệu
vẫn c n trong bộ nhớ chính cho đến khi một tiến trình khác đƣợc ghi chồng lên.
Để tối ƣu hóa quá trình hoạt động của CPU và tốc độ của máy tính, một số tiến
trình đƣợc lƣu giữ trong bộ nhớ. Có rất nhiều kế hoạch quản trị bộ nhớ do có nhiều ứng
22
dụng bộ nhớ khác nhau và hiệu quả của các thuật toán phụ thuộc tùy vào tình huống cụ
thể. Lựa chọn một thuật toán cho một hệ thống đƣợc mô tả trƣớc phụ thuộc vào nhiều
yếu tố, đặc biệt là phần cứng của hệ thống.
u n có n ữn va trò n ư sau tron v c quản lý bộ n ớ c ính:
- Lƣu giữ thông tin về các vị trí trong bộ nhớ đ đƣợc sử dụng và tiến trình nào sử
dụng.
- Quản lý không gian bộ nhớ trống
- Quyết định tiến trình nào đƣợc nạp vào bộ nhớ chính, khi bộ nhớ đ sẳn dùng.
- Cấp phát và thu hồi bộ nhớ khi cần thiết.
- Lập lịch cho vấn đề đọc/ghi thông tin trên đĩa của đầu từ.
1.6.1.3. Quản lý ộ nhớ phụ
Mục tiêu chính của hệ thống máy tính là thực hiện chƣơng trình. Những chƣơng
trình với dữ liệu cần truy xuất của chúng phải đƣợc đặt trong bộ nhớ chính trong suốt
quá trình thi hành. Nhƣng bộ nhớ chính quá nhỏ để có thể lƣu giữ mọi dữ liệu và
chƣơng trình, ngoài ra dữ liệu sẽ mất khi không c n đƣợc cung cấp năng lƣợng. Hệ
thống máy tính ngày nay cung cấp hệ thống ưu trữ phụ backing store nằm trên
không gian c n trống của đĩa từ. Đa số các máy tính đều dùng đĩa để lƣu trữ cả chƣơng
trình và dữ liệu. Hầu nhƣ tất cả chƣơng trình: chƣơng trình dịch, hợp ngữ, thủ tục, trình
soạn thảo, định dạng... đều đƣợc lƣu trữ trên đĩa cho tới khi nó đƣợc thực hiện, nạp vào
trong bộ nhớ chính và cũng sử dụng đĩa để chứa dữ liệu và kết quả xử lý. Vì vậy một
bộ quản lý hệ thống đĩa rất quan trọng cho hệ thống máy tính.
Va trò của u n tron v c quản lý ĩa:
- Quản lý không gian trống trên đĩa.
- Định vị lƣu trữ.
- Lập lịch cho đĩa.
Vì hệ thống đĩa đƣợc sử dụng thƣờng xuyên, nên nó phải đƣợc dùng hiệu quả.
Tốc độ của toàn bộ hệ thống tuỳ thuộc rất nhiều vào tốc độ truy xuất đĩa.
23
1.6.1.4. Quản lý hệ thống nhập/xuất
Mỗi thiết bị nhập/xuất có trình điều khiển thiết bị riêng. Chỉ có device driver mới
hiểu đến cấu trúc đặc thù của thiết bị mà nó mô tả.
Một trong những mục tiêu của hệ điều hành là giúp ngƣời dùng khai thác hệ
thống máy tính d dàng và hiệu quả, do đó các thao tác trao đổi thông tin trên thiết bị
nhập/xuất phải trong suốt đối với ngƣời dùng.
Để thực hiện đƣợc điều này hệ điều hành phải tồn tại một bộ phận điều khiển
thiết bị, bộ phận này phối hợp cùng CPU để quản lý sự hoạt động và trao đổi thông tin
giữa hệ thống, chƣơng trình ứng dụng và ngƣời dùng với các thiết bị xuất/nhập. Bộ
ph n điều hi n thiết bị thực hiện những nhiệm vụ sau:
- G i mã ệnh điều hi n đến thiết bị: Hệ điều hành điều khiển các thiết bị bằng
các m điều khiển, do đó trƣớc khi bắt đầu một quá trình trao đổi dữ liệu với
thiết bị thì hệ điều hành phải gởi m điều khiển đến thiết bị.
- Tiếp nh n y u cầu ng t từ các thiết bị: Các thiết bị khi cần trao đổi với hệ thống
thì nó phát ra một tín hiệu yêu cầu ngắt, hệ điều hành tiếp nhận yêu cầu ngắt từ
các thiết bị, xem x t và thực hiện một thủ tục để đáp ứng yêu cầu từ các thiết bị.
- Phát hiện và x ỗi: quá trình trao đổi dữ liệu thƣờng xảy ra các lỗi nhƣ: thiết
bị vào ra chƣa sẵn sàng, đƣờng truyền hỏng, ... do đó hệ điều hành phải tạo ra
các cơ chế thích hợp để phát hiện lỗi sớm nhất và khắc phục các lỗi vừa xảy ra
nếu có thể.
Một t ốn n ập/xuất bao ồm:
- Hệ thống buffer caching.
- Giao tiếp điều khiển thiết bị tổng quát.
- Bộ điều khiển cho các thiết bị phần cứng.
1.6.1.5. Quản lý hệ thống tập tin
Máy tính có thể lƣu trữ thông tin trên nhiều loại thiết bị lƣu trữ khác nhau, mỗi
thiết bị lại có tính chất và cơ chế tổ chức lƣu trữ thông tin khác nhau, điều này gây khó
khăn cho ngƣời dùng. Để khắc phục điều này hệ điều hành đƣa ra khái niệm đồng nhất
24
cho tất cả các thiết bị lƣu trữ vật lý, đó là tập tin.
Tập tin là đơn vị lƣu trữ cơ bản nhất, mỗi tập tin có một tên riêng. Hệ điều hành
phải thiết lập mối quan hệ tƣơng ứng giữa tên tập tin và thiết bị lƣu trữ chứa tập tin.
Theo đó khi cần truy xuất đến thông tin đang lƣu trữ trên bất kỳ thiết bị lƣu trữ nào
ngƣời dùng chỉ cần truy xuất đến tập tin tƣơng ứng thông qua tên của nó, tất cả mọi
việc c n lại đều do hệ điều hành thực hiện.
Trong hệ thống có nhiều tiến trình đồng thời truy xuất tập tin, hệ điều hành phải
tạo ra những cơ chế thích hợp để bảo vệ tập tin tránh việc đọc/ghi bất hợp lệ trên tập
tin.
Như vậy bộ p ận quản lý tập t n của u n t c n n ữn n m vụ
sau:
- Tạo/xoá một tập tin/thƣ mục.
- Bảo vệ tập tin khi có hiện tƣợng truy xuất đồng thời.
- Cung cấp các thao tác xử lý và bảo vệ tập tin/thƣ mục.
- Tạo mối quan hệ giữa tập tin và bộ nhớ phụ chứa tập tin.
- Tạo cơ chế truy xuất tập tin thông qua tên tập tin.
- Ánh xạ tập tin trên hệ thống lƣu trữ phụ.
- Backup tập tin trên các thiết bị lƣu trữ.
1.6.1.6. Hệ thống ảo vệ
Trong một hệ thống nhiều ngƣời dùng và cho ph p nhiều tiến trình di n ra đồng
thời, các tiến trình phải đƣợc bảo vệ đối với những hoạt động khác. Do đó, hệ thống
cung cấp cơ chế để đảm bảo rằng tập tin, bộ nhớ, CPU, và những tài nguyên khác chỉ
đƣợc truy xuất bởi những tiến trình có quyền. Ví dụ, bộ nhớ đảm bảo rằng tiến trình chỉ
đƣợc thi hành trong phạm vi địa chỉ của nó. Bộ thời gian đảm bảo rằng không có tiến
trình nào độc chiếm CPU. Cuối cùng các thiết bị ngoại vi cũng đƣợc bảo vệ.
Hệ thống b o vệ là một cơ chế kiểm soát quá trình truy xuất của chƣơng trình,
tiến trình, hoặc ngƣời dùng với tài nguyên của hệ thống. Cơ chế này cũng cung cấp
cách thức để mô tả lại mức độ kiểm soát.
Hệ thống bảo vệ cũng làm tăng độ an toàn khi kiểm tra lỗi trong giao tiếp giữa
25
những hệ thống nhỏ bên trong.
1.6.1.7. Hệ thống cơ chế dòng lệnh
Một trong những phần quan trọng của chƣơng trình hệ thống trong một hệ điều
hành là cơ chế dòng ệnh đƣợc biết đến nhƣ bộ thông dịch lệnh thành phần chính là bộ
xử lý shell, đó là giao tiếp giữa ngƣời dùng và hệ điều hành. Bộ x she àm nhiệm
vụ: nhận lệnh, phân tích lệnh, đáp ứng yêu cầu của lệnh.
Một số hệ điều hành đặt cơ chế d ng lệnh bên trong hạt nhân, số khác nhƣ MS-
DOS và UNIX thì xem hệ điều hành nhƣ là một chƣơng trình đặc biệt, đƣợc thi hành
khi các công việc bắt đầu hoặc khi ngƣời dùng login lần đầu tiên.
Các lệnh đƣa vào hệ điều hành thông qua bộ điều hi n ệnh. Trong các hệ thống
chia s thời gian một chƣơng trình có thể đọc và thông dịch các lệnh điều khiển đƣợc
thực hiện một cách tự động. Chƣơng trình này thƣờng đƣợc gọi là bộ thông dịch điều
khiển, cơ chế d ng lệnh hoặc Shell. Chức năng của nó rất đơn giản đó là lấy lệnh kế
tiếp và thi hành.
Mỗi hệ điều hành sẽ có những giao tiếp khác nhau, dạng đơn giản theo cơ chế
d ng lệnh, dạng thân thiện với ngƣời dùng nhƣ giao diện của Macintosh có các biểu
tƣợng, cửa sổ thao tác dùng chuột.
Các lệnh có quan hệ với việc tạo và quản lý các tiến trình, kiểm soát nhập xuất,
quản lý bộ lƣu trữ phụ, quản lý bộ nhớ chính, truy xuất hệ thống tập tin và cơ chế bảo
vệ.
1.6.2. Các dịch vụ của hệ điều hành
Hệ điều hành cung cấp một môi trƣờng để thi hành các chƣơng trình, bằng cách
cung cấp các dịch vụ cho chƣơng trình và cho ngƣời dùng. Các dịch vụ này trên mỗi hệ
thống là khác nhau nhƣng cũng có những lớp chung. Các dịch vụ này giúp cho các lập
trình viên thuận tiện hơn và việc lập trình d dàng hơn.
- Thi hành chương trình: hệ điều hành phải có nhiệm vụ nạp chƣơng trình của
ngƣời dùng vào bộ nhớ, chuẩn bị đầy đủ các điều kiện về tài nguyên để chƣơng
trình có thể chạy đƣợc và kết thúc đƣợc, có thể kết thúc bình thƣờng hoặc kết
thúc do bị lỗi. Khi chƣơng trình kết thúc hệ điều hành phải thu hồi tài nguyên đ
cấp cho chƣơng trình và ghi lại các thông tin mà chƣơng trình đ thay đổi trong
26
quá trình chạy nếu có .
- Thao tác nh p xu t: Một chƣơng trình thi hành có thể yêu cầu nhập xuất. Nhập
xuất này có thể là tập tin hay thiết bị. Đối với thiết bị có một hàm đặc biệt đƣợc
thi hành. Để tăng hiệu quả, ngƣời dùng không truy xuất trực tiếp các thiết bị
nhập xuất mà thông qua cách thức do hệ điều hành cung cấp chẳng hạn, phải
nạp đƣợc dữ liệu mà chƣơng trình cần vào bộ nhớ.
- Thao tác tr n hệ thống t p tin: Hệ điều hành cần cung cấp các công cụ để
chƣơng trình d dàng thực hiện các thao tác đọc ghi trên các tập tin, các thao tác
này phải thực sự an toàn, đặc biệt là trong môi trƣờng đa nhiệm.
- Trao đ i thông tin giữa các tiến trình: có nhiều tình huống một tiến trình cần
trao đổi thông tin với một tiến trình khác. Có hai cách thực hiện: Một là thực
hiện thay thế tiến trình trên cùng máy tính, hai là thay thế tiến trình trên hệ
thống khác trong hệ thống mạng. Thông tin có thể đƣợc cài đặt qua chia s bộ
nhớ, hoặc bằng kỹ thuật chuyển thông điệp. Việc chuyển thông tin đƣợc thực
hiện bởi hệ điều hành.
- Phát hiện và x ỗi: Hệ điều hành phải có các công cụ để chính hệ điều hành
và để hệ điều hành giúp chƣơng trình của ngƣời dùng phát hiện các lỗi do hệ
thống CPU, Memory, I/O device, Program phát sinh. Hệ điều hành cũng phải
đƣa ra các dịch vụ để xử lý các lỗi sao cho hiệu quả nhất.
1.6.3. Lời gọi hệ thống
Lời gọi hệ thống cung cấp một giao tiếp giữa tiến trình và hệ điều hành. Lời gọi
này cũng nhƣ các lệnh hợp ngữ.
Một số hệ thống cho ph p lời gọi hệ thống đƣợc thực hiện từ cấp lập trình ngôn
ngữ cấp cao, nhƣ các hàm và lời gọi hàm. Nó có thể phát sinh lời gọi từ các thủ tục hay
gọi trực tiếp trong cửa sổ lệnh.
Để hiểu quá trình hoạt động của lời gọi hệ thống chúng ta cùng khảo sát một
chƣơng trình nhỏ dùng để đọc dữ liệu từ một tập tin ch p qua tập tin khác. Dữ liệu
nhập đầu tiên của của chƣơng trình là tên của hai tập tin: tập tin nhập và tập tin xuất.
Tên này đƣợc mô tả bằng nhiều cách tùy thuộc vào thiết kế hệ điều hành nhƣ: chƣơng
trình yêu cầu ngƣời dùng cho biết tên của hai tập tin, họ cũng có thể cung cấp bằng
cách lựa chọn với chuột. Khi có tên của hai tập tin, chƣơng trình mở tập tin nhập và tạo
27
tập tin xuất. Mỗi thao tác này đƣợc thực hiện bởi những lời gọi hệ thống khác nhau.
Cũng có những trƣờng hợp phát sinh lỗi: Khi chƣơng trình mở tập tin nhập, có thể xảy
ra trƣờng hợp không có tập tin có tên nhƣ mô tả hoặc tập tin bị cấm truy cập. Trong
trƣờng hợp này chƣơng trình phải xuất thông điệp lên màn hình. Nếu tập tin nhập tồn
tại, phải tạo tập tin mới. Hệ thống phải kiểm tra tiếp xem đ có tập tin xuất tồn tại
không và sẽ có những lời gọi hệ thống tƣơng ứng để giải quyết hoặc là hủy tiến trình,
hai là xóa tập tin đ tồn tại và tạo tập tin mới. Sau khi đ thiết lập xong tập tin, hệ
thống tiếp tục tạo v ng lặp đọc dữ liệu từ tập tin nhận và ghi lên tập tin xuất. Mỗi bƣớc
đều có kiểm tra lỗi. Sau khi ch p xong, chƣơng trình sẽ đóng hai tập tin lại dùng một
lời gọi hệ thống khác , xuất thông báo lên màn hình dùng lời gọi hệ thống cuối cùng
chấm dứt chƣơng trình lời gọi hệ thống cuối cùng .
Trong các ngôn ngữ lập trình cấp cao, ngƣời dùng không cần quan tâm đến chi
tiết mà chỉ cần thông qua các hàm hay các lệnh để thực hiện. Lời gọi hệ thống có thể
di n ra theo một cách khác. Kiểu và khối lƣợng thông tin tùy thuộc vào hệ thống và lúc
gọi.
Có ba phương pháp được s dụng đ chuy n tham số cho hệ điều hành Cách đơn
gi n nh t à chuy n tham số vào thanh ghi Nếu c nhiều tham số, n sẽ được ưu trữ trong hối ho c b ng trong bộ nhớ Cách cuối c ng à d ng cơ chế stac 6.
Lời gọi hệ thống có thể đƣợc chia thành các loại: kiểm soát tiến trình, thao tác tập
tin, thao tác thiết bị, thông tin liên lạc.
1.6.4. Cấu tr c hệ điều hành
1.6.4.1. Cấu tr c đơn giản
Cấu trúc này trong một số hệ thống thƣơng mại và không có cấu trúc đƣợc định
nghĩa tốt. thông thƣờng hệ điều hành bắt đầu là một hệ thống nhỏ, đơn giản và có giới
hạn. MS-DOS là một hệ điều hành có cấu trúc đơn giản, nó cung cấp những chức năng
cần thiết nhất trong một không gian nhỏ nhất do sự giới hạn của phần cứng mà nó chạy
6 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005,tr.25
28
trên đó và không chia thành những đơn thể rõ rệt.
Chƣơng trình ứng dụng
Chƣơng trình hệ thống thƣờng trú
MS-DOS device driver
ROM BIOS device driver
Hình 1.4. C u trúc của MS-DOS
Mặc dù MS-DOS có cấu trúc nhƣng giữa giao diện và chức năng không có sự
phân chia rõ rệt. Các chƣơng trình ứng dụng có thể truy xuất trực tiếp các thủ tục nhập
xuất cơ bản và ghi trực tiếp lên màn hình hay bộ điều khiển đĩa.
Một hệ điều hành cũng có cấu trúc đơn giản là UNIX với những phiên bản đầu
tiên. Cấu trúc của nó chỉ bao gồm hai phần: hạt nhân và các chương trình hệ thống.
Hạt nhân đƣợc chia thành một chuỗi giao tiếp và device driver (xem chƣơng 5, bộ điều
khiển thiết bị).
Ngƣời dùng Shell và lệnh Biên dịch và thông dịch Thƣ viện hệ thống Giao tiếp ời gọi hệ thống với nhân
Tín hiệu kiểm soát hệ thống nhập xuất tuần tự của bộ điều khiển Thiết bị đầu cuối Hệ thống tập tin chuyển đổi giữa hệ thống nhập xuất khối và bộ điều khiển đĩa Lập lịch CPU, thay thế phân trang, yêu cầu phân trang trong bộ nhớ ảo
Giao tiếp giữ hạt nhân và hạt nhân
Bộ kiểm soát đĩa Bộ kiểm soát bộ Bộ kiểm soát Thiết bị đầu cuối nhớ
Bản 1.3. C u trúc của hệ điều hành UNIX
Những gì dƣới lời gọi hệ thống và trên phần cứng là hạt nhân. Hạt nhân cung cấp
29
hệ thống tập tin, lập lịch CPU, quản trị bộ nhớ và những chức năng khác của hệ điều
hành thông qua lời gọi hệ thống. Tóm lại là toàn bộ chức năng của hệ thống đƣợc kết
hợp trong một lớp. Những chƣơng trình hệ thống dùng những lời gọi hệ thống đƣợc hỗ
trợ bởi hạt nhân để cung cấp những chức năng hữu ích nhƣ biên dịch và thao tác tập
tin. Lời gọi hệ thống định nghĩa một giao tiếp lập trình cho UNIX, đó là tập hợp những
chƣơng trình hệ thống thông thƣờng trong đó có định nghĩa giao tiếp với ngƣời dùng.
1.6.4.2. Cấu tr c phân lớp
Những phiên bản mới của UNIX đƣợc thiết kế để sử dụng phần cứng phức tạp
hơn, do đó hệ điều hành đƣợc chia thành nhiều phần nhỏ hơn.
Bằng cách sử dụng kỹ thuật topdown, những chức năng và đặc tính của hệ thống
đƣợc chia làm nhiều thành phần nhỏ. Che dấu thông tin, không cho chƣơng trình của
ngƣời dùng có thể cài đặt những hàm truy xuất cấp thấp, thay vào đó là những lớp giao
tiếp bên trong.
Hệ điều hành đƣợc chia thành nhiều lớp: Lớp dƣới cùng là phần cứng, lớp trên
cùng là giao tiếp với ngƣời dùng. Lớp hệ điều hành đƣợc cài đặt thành những đối
tƣợng trừu tƣợng. Thông thƣờng một lớp của hệ điều hành bao gồm một số cấu trúc dữ
liệu và các hàm có thể đƣợc gọi bởi lớp ở trên và bản thân nó gọi những chức năng của
lớp bên dƣới. Mỗi lớp cài đặt chỉ sử dụng những thao tác do lớp dƣới cung cấp. Một
lớp cũng không cần biết hệ điều hành đƣợc cài đặt nhƣ thế nào, nó chỉ cần biết những
thao tác này làm gì thôi.
Cấu trúc lớp này lần đầu tiên đƣợc thiết kế và áp dụng cho hệ điều hành THE
(Technische Hogeschool Eindhoven). Hệ thống này được chia thành sáu ớp như hình
sau:
Lớp 5: Chƣơng trình của ngƣời dùng
Lớp 4: Quản lý bộ đệm cho thiết bị nhập xuất
Lớp 3: Điều khiển thiết bị nhập xuất
Lớp 2: Quản lý bộ nhớ / bộ nhớ ảo
Lớp 1: Quản lý tiến trình
Lớp 0: Phần cứng hệ thống
30
Ví dụ hác như c u trúc ớp của hệ điều hành VENUS và OS/2:
Lớp 6 Chƣơng trình ngƣời dùng
Lớp 5 Trình điều khiển thiết bị và bộ lập lịch
Lớp 4 Bộ nhớ ảo
Lớp 3 Kênh nhập/xuất
Lớp 2 Lập lịch CPU
Lớp 1 Thông dịch các chỉ thị
Lớp 0 Phần cứng
Giao tiếp với CTUD
Ứng dụng Ứng dụng Ứng dụng
Hệ thống con Hệ thống con Hệ thống con
Mở rộng API
Divice driver
Divice driver
Divice driver
Hạt nhân Hệ thống Quản lý bộ nhớ Gửi các tác vụ Quản lý thiết bị
Divice driver
31
Hình 1.5. C u trúc phân ớp của OS/2
n 6. C u trúc phân ớp của hệ điều hành UNIX
1.6.4.3. Máy ảo Virtual Machine)
Thông thƣờng, một hệ thống máy tính bao gồm nhiều lớp. Phần cứng ở lớp thấp
nhất. Hạt nhân ở lớp kế dùng các chỉ thị của phần cứng để tạo một tập hợp các lời gọi
hệ thống. Các chƣơng trình hệ thống có thể sử dụng hoặc là các lời gọi hệ thống hoặc
là các chỉ thị của phần cứng. Vì vậy nó xem phần cứng và lời gọi hệ thống nhƣ cùng
lớp.
Một số hệ thống có tổ chức sao cho các chƣơng trình ứng dụng có thể gọi d dàng
các chƣơng trình hệ thống. Mặc dù chƣơng trình hệ thống ở lớp cao hơn các phần khác
nhƣng chƣơng trình ứng dụng có thể xem mọi phần dƣới nó là một phần của máy. Lớp
ứng dụng này s dụng một hái niệm à máy o. Ví dụ hệ điều hành máy ảo của IBM.
Bằng cách sử dụng lập lịch cho CPU và kỹ thuật bộ nhớ ảo, hệ điều hành có thể
tạo nhiều tiến trình ảo, mỗi tiến trình sẽ thực hiện trên một bộ xử lý và bộ nhớ riêng.
Những tiến trình này có những đặc điểm riêng nhƣ lời gọi hệ thống và hệ thống tập tin
không đƣợc cung cấp phần cứng trực tiếp.
Tài nguyên của hệ thống cũng đƣợc chia s để tạo những máy ảo. Lập lịch CPU,
32
chia s CPU cho ngƣời dùng. Spooling và hệ thống tập tin đƣợc chia thành những th
(card) đọc ảo và máy in ảo. Một thiết bị đầu cuối terminal cũng cung cấp các chức
năng tạo các thao tác màn hình ảo.
Vấn đề phức tạp nhất của máy ảo là hệ thống đĩa. Giả sử hệ thống chỉ có ba bộ
điều khiển đĩa nhƣng có tới bảy máy ảo. Nhƣ vậy không thể gán cho mỗi máy ảo một
bộ điều khiển đĩa và giải pháp là xây dựng hệ thống đĩa ảo.
Mặc dù khái niệm máy ảo rất hữu ích nhƣng khó cài đặt. Máy ảo phải thực hiện ở
hai dạng: dạng giám sát Monitor và dạng ngƣời dùng. Ngoài ra máy ảo c n phải giải
quyết các vấn đề về vận chuyển dữ liệu và thời gian.
n . So sánh giữa máy thực và máy o
C hai ợi đi m chính trong việc s dụng máy o. Thứ nh t, bằng cách bảo vệ
hoàn toàn các tài nguyên hệ thống, máy ảo cung cấp mức độ bảo mật cao Thứ hai,
máy ảo cho ph p phát triển hệ thống đƣợc thực hiện mà không cần phá vỡ hoạt động hệ
thống thông thƣờng.
Mỗi máy ảo hoàn toàn bị cô lập từ các máy ảo khác, vì thế chúng ta không gặp
phải bất kỳ vấn đề bảo mật nào nhƣ tài nguyên hệ thống khác hoàn toàn đƣợc bảo vệ.
Thí dụ, các ứng dụng không đƣợc tin cậy đƣợc tải về từ Internet có thể đƣợc chạy trong
một máy ảo riêng. Một bất lợi của môi trƣờng này là không có sự chia s tài nguyên
33
trực tiếp. Hai tiếp cận cung cấp sự chia s đƣợc cài đặt. Thứ nh t, có thể chia s một
đĩa nhỏ. Cơ chế này đƣợc làm mẫu sau một đĩa đƣợc chia s vật lý. Thứ hai, có thể
định nghĩa một mạng của các máy ảo, mỗi máy ảo có thể gửi thông tin qua các mạng
giao tiếp này nhƣng nó đƣợc cài đặt bằng phần mềm.
Những hệ thống máy ảo nhƣ thế là một phƣơng tiện truyền thông hữu hiệu cho
việc nghiên cứu và phát triển hệ điều hành. Thông thƣờng, thay đổi một hệ điều hành là
một công việc khó. Vì các hệ điều hành là các chƣơng trình lớn và phức tạp, sự thay
đổi trên một phần này có thể gây một lỗi khó hiểu trong những phần khác. Sức mạnh
của hệ điều hành làm cho trƣờng hợp này là cực kỳ nguy hiểm. Vì hệ điều hành thực
thi trong chế độ kiểm soát, một thay đổi sai trong một con trỏ có thể gây lỗi và có thể
phá hủy toàn hệ thống tập tin. Do đó, cần phải kiểm tra tất cả thay đổi của hệ điều hành
một cách cẩn thận.
Tuy nhiên, hệ điều hành chạy trên máy và điều khiển hoàn toàn máy đó. Do đó,
hệ thống hiện hành phải bị dừng và ngừng việc sử dụng trong khi những thay đổi đƣợc
thực hiện và kiểm tra. Thời điểm này thƣờng đƣợc gọi là thời gian phát triển hệ thống.
Vì nó làm cho hệ thống không sẵn dùng đối với ngƣời dùng nên thời gian phát triển hệ
thống thƣờng đƣợc lập thời biểu vào buổi tối hay cuối tuần, khi tải hệ thống thấp.
Một hệ thống máy ảo có thể loại trừ nhiều vấn đề này. Ngƣời lập trình hệ thống
đƣợc cung cấp chính máy ảo của họ, và phát triển hệ thống đƣợc thực hiện trên máy ảo
thay vì trên máy vật lý thật sự. Một hệ điều hành thông thƣờng ít khi bị phá vỡ vìphát
triển hệ thống. Đƣơng nhiên, muốn cài đặt phần mềm máy ảo đ i hỏi cấu hình phần
cứng phải mạnh.
1.6.4.4. Mô hình Client-Server
Các hệ điều hành hiện đại thƣờng chuyển dần các công việc của hệ điều hành ra
các lớp bên ngoài nhằm thu nhỏ phần cốt lõi của hệ điều hành thành hạt nhân cực tiểu
kernel sao cho chỉ phần hạt nhân này phụ thuộc vào phần cứng. Để thực hiện đƣợc
điều này hệ điều hành xây dựng theo mô hình Client-Server , theo mô hình này hệ điều
hành bao gồm nhiều tiến trình đ ng vai trò Server c các chức năng chuy n biệt như
qu n tiến trình, qu n bộ nhớ, , phần hạt nhân của hệ điều hành chỉ thực hiện
nhiệm vụ tạo cơ chế thông tin i n ạc giữa các tiến trình C ient và Server
Trong mô hình này, chức năng của hạt nhân chỉ là kiểm soát quá trình thông tin
34
giữa Client và Server. Bằng cách chia hệ điều hành thành những phần nhỏ, mỗi phần
chỉ kiểm soát một mặt của hệ thống nhƣ các dịch vụ về tập tin, tiến trình, thiết bị đầu
cuối, bộ nhớ, mỗi phần sẽ gọn hơn và d quản lý hơn. Hơn nữa, tất cả Server thực hiện
nhƣ những tiến trình ở mức độ ngƣời dùng user-mode không phải ở mức độ hạt nhân
(kernel-mode , nên nó không truy xuất trực tiếp phần cứng. Do đó, nếu hệ thống tập tin
bị lỗi, các dịch vụ về tập tin có thể bị hỏng nhƣng nó thƣờng không gây ảnh hƣởng đến
toàn bộ hệ thống.
Một ƣu điểm khác của mô hình Client-Server là nó có thể tƣơng thích d dàng
với mô hình hệ thống phân tán. Nếu một Client giao tiếp với một Server bằng cách gửi
những thông điệp, họ không biết là khi nào thông điệp đó đang đƣợc xử lý cục bộ tại
máy hay đƣợc gửi vào mạng đến Server trên một máy từ xa. Khi Client quan tâm đến,
một yêu cầu đƣợc gửi đi và một trả lời đáp ứng di n ra nhƣ nhau.
N ư vậy c c t ến tr n tron t ốn ược c a t n hai lo :
- Tiến trình bên ngoài hay tiến trình của chƣơng trình ngƣời dùng đƣợc gọi là các
tiến trình Client.
- Tiến trình của hệ điều hành đƣợc gọi là tiến trình Server.
Khi cần thực hiện một chức năng hệ thống các tiến trình Client sẽ gởi yêu cầu tới
tiến trình Server tƣơng ứng, tiến trình Server sẽ xử lý và trả lời kết quả cho tiến trình
Client.
N ận xét:
- Hệ thống này d thay đổi và d mở rộng hệ điều hành. Để thay đổi các chức
năng của hệ điều hành chỉ cần thay đổi ở Server tƣơng ứng, để mở rộng hệ điều
hành chỉ cần thêm các dịch vụ phía Server.
- Các tiến trình Server của hệ điều hành hoạt động trong chế độ không đặc quyền
nên không thể truy cập trực tiếp đến phần cứng, điều này giúp hệ thống đƣợc
35
bảo vệ tốt hơn.
Hình 1.8. Mô hình C ient - Server
Trong mô hình này, chức năng của hạt nhân chỉ là kiểm soát quá trình thông tin
giữa Client và Server. Bằng cách chia hệ điều hành thành những phần nhỏ, mỗi phần
chỉ kiểm soát một mặt của hệ thống nhƣ các dịch vụ về tập tin, tiến trình, thiết bị đầu
cuối, bộ nhớ, mỗi phần sẽ gọn hơn và d quản lý hơn. Hơn nữa, tất cả Server thực hiện
nhƣ những tiến trình ở mức độ ngƣời dùng user-mode không phải ở mức độ hạt nhân
(kernel-mode), nên nó không truy xuất trực tiếp phần cứng. Do đó, nếu Server tập tin
bị lỗi, các dịch vụ về tập tin có thể bị hỏng nhƣng nó thƣờng không gây ảnh hƣởng đến
toàn bộ hệ thống.
Một ƣu điểm khác của mô hình Client-Server là nó có thể tƣơng thích d dàng
với mô hình hệ thống phân tán. Nếu một Client giao tiếp với một Server bằng cách gửi
những thông điệp, họ không biết là khi nào thông điệp đó đang đƣợc xử lý cục bộ tại
máy hay đƣợc gửi vào mạng đến Server trên một máy từ xa. Khi Client quan tâm đến,
một yêu cầu đƣợc gửi đi và một trả lời đáp ứng di n ra nhƣ nhau.
36
n . Mô hình Client-Server trong hệ thông phân tán
Hình vẽ sau đây cho thấy cấu trúc của hệ điều hành Windows NT. Đây là một cấu
trúc phức tạp với nhiều thành phần khác nhau và nó đƣợc xây dựng dựa trên mô hình
hệ điều hành Client/ Server.
n . C u trúc hệ điều hành Windows NT
Tron cấu trúc n y c ún ta t ấy nổ rõ a ểm sau ây:
- Cấu trúc của Windows NT đƣợc chia thành hai mode: Kernel mode và User
mode. Các chƣơng trình ứng dụng của ngƣời dùng chỉ chạy trong User mode,
các dịch vụ của hệ điều hành chỉ chạy trong Kernel mode. Nhờ vậy mà việc bảo
vệ các chƣơng trình của ngƣời dùng cũng nhƣ các thành phần của hệ điều hành,
trên bộ nhớ, đƣợc thực hiện d dàng hơn.
- Trong User mode của Windows NT có chứa các hệ thống con môi trƣờng nhƣ:
OS/2 subsystem và POSIX subsystem, nhờ có các hệ thống con môi trƣờng này
37
mà các ứng dụng đƣợc thiết kế trên các hệ điều hành khác vẫn chạy đƣợc trên hệ
điều hành Windows NT. Đây là điểm mạnh của các hệ điều hành Microsoft của
từ Windows NT.
Chúng tôi sẽ giải thích rõ hơn về hai khái niệm Kernel mode và User mode, và các
thành phần trong cấu trúc của hệ điều hành Windows NT ở phần sau, thông qua việc
giới thiệu về hệ điều hành Windows 2000.
1.7. MỘT SỐ HỆ ĐIỀU HÀNH HIỆN ĐẠI
1.7.1. Hệ điều hành Windows95
Windows95 là kết quả của một sự phát triển lớn từ Windows3.1. Microsoft không
chọn giải pháp nâng cấp Windows3.1 mà nó thực hiện việc kiến trúc lại Windows để
nó đủ mạnh để nó có thể thực hiện đƣợc các ứng dụng 32 bit trong một môi trƣờng ổn
định. Kết quả là Microsoft có đƣợc một phiên bản hệ điều hành Windows95 đủ mạnh,
có độ tin cậy và độ ổn định cao, và đặc biệt là cho ph p các ứng dụng 16 bit và DOS
chạy trên môi Windows95 giữ lại các thành phần hệ thống của Windows3.1 để đảm
bảo tƣơng thích với Win16, USER16 và các thành phần Kernel 16 bit.
Một trong những thành phần quan trọng của Windows95 là thành phần Thunking.
Nhờ có Thunking mà các module 16 bit có thể giao tiếp với các bản sao 32 bit của
chúng và ngƣợc lại. Thunking là một tập các thƣờng trình, mà nó ánh xạ các địa chỉ để
cho ph p các ứng dụng phân đoạn 16 bit chia s hoàn toàn bộ nhớ phẳng với các ứng
dụng 32 bit. Hình vẽ sau đây cho thấy vai tr và vị trí của lớp Thunking trong
Windows95.
Hình 1.11. Lớp Thun ing trong Windows95
H ng Intel đƣa ra vi xử lý 32 bit 80386 đầu tiên năm 1995, nhƣng đến khi hệ
38
điều hành Windows95 ra đời thì những điểm mạnh trong kiến trúc của nó mới đƣợc
phát huy, vì Windows95 đ tận dụng đƣợc các điểm mạnh trong kiến trúc của Intel 32
bit để xây dựng thành một hệ điều hành 32 bit đủ mạnh. Các hệ điều hành 32 bit có thể
truy xuất bộ nhớ theo mô hình bộ nhớ phẳng, trong mô hình này hệ điều hành có thể
đánh địa chỉ bộ nhớ theo kiểu tuyến tính lên đến 4Gb, tức là nó loại trừ đƣợc sự phân
đoạn bộ nhớ mà chúng ta đ thấy trong các hệ điều hành 16 bit. Khi chạy trên vi xử lý
80386 hệ điều hành Windows95 khai thác tối đa các điểm mạnh trong chế độ ảo của vi
xử lý này, vi xử lý 80386 có thể hoạt động ở các chế độ: thực real mode , bảo vệ
protected mode và ảo virtual mode . Chế độ ảo của 80386 c n đƣợc gọi là chế độ
8086 ảo, trong chế độ 8086 ảo ngoài việc cung cấp không gian bộ nhớ ảo cho các ứng
dụng, 80386 c n cho ph p các ứng dụng chế độ 8086 ảo thực thi trong chế độ 8086 ảo,
thực tế thực thi trong chế độ bảo vệ. Các ứng dụng chạy trong chế độ bảo vệ đƣợc hệ
điều hành bảo vệ trên bộ nhớ và đƣợc truy xuất một không gian bộ nhớ lớn hơn đến
4Gb bộ nhớ RAM . Nhờ có chế độ 8086 ảo mà Windows95 có thể cho chạy nhiều ứng
dụng đồng thời, kể cả các ứng dụng 16 bit của DOS và các ứng dụng 32 bit của
Windows, trên bộ nhớ và các ứng dụng này đƣợc hệ điều hành bảo vệ để các ứng dụng
không truy xuất bất hợp lệ lên các vùng nhớ của nhau, nếu có một ứng dụng bị hỏng thì
các ứng dụng c n lại vẫn hoạt động bình thƣờng. Windows95 xây dựng các máy ảo
DOS để chạy các ứng dụng 16 bit của DOS.
Intel 80386 là một vi xử lý 32 bit, nhƣng nếu sử dụng với hệ điều hành 16 bit thì
các hệ điều hành này xem nó nhƣ là các vi xử lý 80286 16 bit, nên khả năng quản lý bộ
nhớ của nó sẽ bị giới hạn. Việc xử lý dữ liệu trong môi trƣờng 32 bit cũng có nhiều
điểm lợi hơn trong môi trƣờng 16 bit. Cùng một ứng dụng đó nhƣng nếu chạy trong
môi trƣờng 16 bit thì nó phải chia thành các phân đoạn 16 bit và chỉ có thể truy xuất dữ
liệu trong không gian 64Kb, nhƣng khi chạy trong môi trƣờng 32 bit thì nó không cần
chia nhỏ và có thể truy xuất dữ liệu trong không gian bộ nhớ 4Gb, trong trƣờng hợp
này dữ liệu đƣợc tham chiếu theo kiểu tuyến tính nên tốc độ truy xuất đƣợc cải thiện
hơn.
1.7.2. Hệ điều hành Windows 2000
Windows 2000 đƣợc thiết kế để chạy trên các kiến trúc phần cứng khác nhau nhƣ:
Các hệ thống dựa trên nền Intel CISC và RISC, Alpha AXP, Motorola PowerPC,.... Nó
đƣợc viết bởi C và C++, ngôn ngữ assembly chỉ đƣợc sử dụng để viết các thành phần
39
giao tiếp trực tiếp với phần cứng, m ngôn ngữ assembly không chỉ tồn tại trong kernel
và HAL mà nó c n tồn tại trong phần kernel mode của hệ thống con Win32, và trong
một vài thƣ viện của user mode.
Windows 2000 là hệ điều hành đa xử lý 32 bit, đƣợc xây dựng để quản lý các hệ
thống mạng máy tính, nó hỗ trợ cả hai mô hình mạng: Client-Server (server-based) và
peer-to-peer. Windows 2000 đƣợc xây dựng dựa trên Windows NT 4.0, nó cung cấp
nhiều công cụ tốt hơn để quản lý Internet và các dịch vụ trên Internet.
Windows 2000 là một họ gồm có 4 sản phẩm, một cho Client và ba cho server
chẳng hạn Client: Windows 2000 Professional; Server: Windows 2000 Server,
Windows 2000 Advanced Server, Windows 2000 datacenter Server.
C c sản p ẩm trên k c n au ở c c ểm sau:
Số các CPU đƣợc hỗ trợ.
Số lƣợng bộ nhớ vật lý đƣợc hỗ trợ.
Số các kết nối mạng hiện tại đƣợc hỗ trợ.
Các dịch vụ có trong các sản phẩm server không có trong sản phẩm Client.
Một số đặc tính của Windows 2000 so với các Windows trước:
- Windows 2000 hỗ trợ các hệ thống đa xử lý trong khi các Windows trƣớc không
hỗ trợ điều này.
- Windows 2000 hỗ trợ hệ thống tập tin an toàn các Windows khác không có hệ
thống tập tin an toàn.
- Windows 2000 là hệ điều hành 32 bit đầy đủ, nó không chứa các m 16 bit, nó
hỗ trợ các m khác để chạy các ứng dụng Windows 16 bit. Các Windows khác
chứa một lƣợng lớn các m 16 bit cũ từ các phiên bản trƣớc.
1.7.3. Hệ điều hành Linux
Linux là hệ điều hành mi n phí đƣợc xây dựng từ hệ điều hành Unix. Nó đƣợc
phát triển bởi Linus Torvalds, một sinh viên của trƣờng Đại học Hensinki. Linus chỉ
chịu trách nhiệm tạo ra hệ thống kernel. Kernel là phần lõi của hệ điều hành, nó chịu
trách nhiệm thực hiện các công việc của hệ thống. Linux bây giờ nhƣ một tập các phần
40
mềm mà trong đó bao gồm kernel và các thành phần khác để nó trở thành một hệ điều
hành hoàn chỉnh. Một trong những nguyên nhân làm cho Linux đƣợc nhiều ngƣời biết
đến là nó đƣợc cung cấp mi n phí với m nguồn mở.
1.7.4. Hệ điều hành Windows 7
Khi phiên bản Windows 7 vừa ra mắt, nhiều ngƣời lựa chọn ngay phiên bản 64
bit để cài đặt cho máy tính cá nhân mà không có lấy chút kiến thức về nó. Tuy nhiên,
đây đúng là sự lựa chọn đúng đắn bởi những ƣu điểm vƣợt trội của Windows 7 (64 bit).
Thứ nh t, nếu với Windows 32 bit, bạn chỉ có thể sử dụng tối đa 4GB RAM.
Trong khi đó, Windows 64 bit cho ph p bạn chạy với thanh RAM 4GB, sau đó có thể
nâng cấp lên 8 hay 16GB.
Thứ hai, về mặt lý thuyết, hệ điều hành 32 bit sử dụng đƣợc 4GB RAM, tuy
nhiên, phiên bản 32 bit của Windows Vista và Win7 chỉ sử dụng tối đa là 3,12GB.
Trong khi với 64 bit, bạn có thể sử dụng toàn bộ 4GB.
Thứ ba, vấn đề bảo mật của Windows 64 bit tốt hơn 32 bit. Nhiều cải tiến trong
nhân đƣợc Microsoft giới thiệu rộng r i cùng với Vista chỉ đƣợc dùng cho phiên bản
64 bit, bao gồm công cụ Data Execution Prevention và PatchGuard hỗ trợ phần cứng.
Ngoài ra, phiên bản Vista và Windows 7 (64 bit) yêu cầu các chƣơng trình điều
khiển phải đƣợc các nhà cung cấp m hóa bằng kí tự số để ngăn chặn tin tặc và những k phát tán Rootkit7 và đặt các công cụ khai thác nhƣ những chƣơng trình điều khiển của nhân.
Thứ tư, do hệ điều hành 64 bit xử lý nhiều thông tin hơn cũng nhƣ hỗ trợ RAM
lớn hơn, máy tính của bạn sẽ đảm bảo chạy ổn định khi sử dụng các ứng dụng lớn,
phức tạp cùng lúc. Nếu bạn thƣờng xuyên làm việc với các ứng dụng đồ họa nhƣ
Photoshop, biên tập Video, tr chơi, sử dụng AutoCAD, thì 64 bit là lựa chọn tốt hơn.
Thứ năm, đó là việc các ứng dụng 32 bit đều làm việc đƣợc trong hệ điều hành 64
bit. Làm đƣợc nhƣ vậy là nhờ có một công cụ đƣợc biết đến dƣới tên Win32 on Win64
hay WOW giúp chuyển các Call lệnh đƣợc các ứng dụng sử dụng để yêu cầu dịch
vụ API - 32 bit từ một ứng dụng Win32 di sản thành Call API - 64 bit có thể đƣợc các
hệ thống phụ riêng của bản Windows 7 (64 bit) hỗ trợ.
7 Phần mềm dùng để chiếm quyền kiểm soát máy tính
41
Khi đó các ứng dụng 32 bit sẽ vận hành ổn định trên hệ điều hành Windows 64 bit, và hiện nay một số d ng CPU của AMD8 và Intel c n có khả năng tối ƣu hóa tới tốc độ cực đại. Một số ngoại lệ với khả năng tƣơng thích của WOW thƣờng xảy ra với
các ứng dụng sử dụng một hay nhiều chƣơng trình điều khiển của các thiết bị 32 bit di
sản riêng không phù hợp với các phiên bản 64 bit. Nếu có vài chƣơng trình không làm
việc, bạn cũng có thể hy vọng nhà phát triển sẽ sớm sửa các lỗi này.
1.7.5. Hệ điều hành Windows 8
Windows 7 ra mắt chính thức 2009, không đƣợc bao lâu thì những thông tin về
phiên bản tiếp theo là Windows 8 đ bị r rỉ từ nhóm nghiên cứu và phát triển.
Theo tin từ chuyên gia cao cấp Robert Morgan, Windows 8 thậm chí là cả
Windows 9 sẽ sử dụng cấu trúc 128 bit, đồng thời Microsoft sẽ mời các nhà sản
xuất máy tính lớn nhƣ Intel, AMD, HP và IBM xây dựng các thông số phần cứng để có
thể tƣơng thích với hệ điều hành mới này.
Về lý thuyết, các máy tính trên nền 64 bit sẽ nhận nhiều RAM hơn do đó tốc độ
xử lý sẽ nhanh hơn so với bản 32 bit. Nhƣ thế, với các phiên bản 128 bit ngƣời dùng sẽ
trải nghiệm một hệ thống đạt tốc độ xử lý ƣu việt hơn. Nếu theo đúng nhƣ những gì
Robert Morgan tiết lộ và theo lộ trình phát hành các bản Windows của Microsoft,
phiên bản 128 bit dành cho máy tính để bàn sẽ xuất hiện vào năm 2012. Theo
PcAdvisor).
1.7.6. Hệ điều hành Android9
Android là một hệ điều hành dựa trên nền tảng Linux đƣợc thiết kế dành cho các
thiết bị di động có màn hình cảm ứng nhƣ điện thoại thông minh và máy tính bảng.
Ban đầu, Android đƣợc phát triển bởi Tổng công ty Android, với sự hỗ trợ tài chính
từ Google và sau này đƣợc chính Google mua lại vào năm 2005. Android ra mắt vào
năm 2007 cùng với tuyên bố thành lập Liên minh thiết bị cầm tay mở: một hiệp hội
gồm các công ty phần cứng, phần mềm, và vi n thông với mục tiêu đẩy mạnh các tiêu
chuẩn mở cho các thiết bị di động. Chiếc điện thoại đầu tiên chạy Android đƣợc bán
8 AMD là nhà sản xuất bộ vi xử lý (CPU) x86 lớn thứ hai thế giới sau Intel 9 http://vi.wikipedia.org/wiki/Android
42
vào tháng 10 năm 2008.
Android có m nguồn mở và Google phát hành m nguồn theo Giấy ph p
Apache. Chính m nguồn mở cùng với một giấy ph p không có nhiều rang buộc đ cho
ph p các nhà phát triển thiết bị, mạng di động và các lập trình viên nhiệt huyết đƣợc
điều chỉnh và phân phối Android một cách tự do. Ngoài ra, Android c n có một cộng
đồng lập trình viên đông đảo chuyên viết các ứng dụng để mở rộng chức năng của thiết
bị, bằng một loại ngôn ngữ lập trình Java có sửa đổi. Vào tháng 10 năm 2012, có
khoảng 700.000 ứng dụng trên Android, và số lƣợt tải ứng dụng từ Google Play, cửa
hàng ứng dụng chính của Android, ƣớc tính khoảng 25 tỷ lƣợt.
1.8. TÓM TẮT
Hệ điều hành thực hiện tất cả các chức năng đáp ứng yêu cầu ngƣời dùng. Hệ
điều hành phải cung cấp một số dịch vụ. Tại cấp thấp nhất, lời gọi hệ thống cho phép
một chƣơng trình đang chạy thực hiện yêu cầu trực tiếp từ hệ thống. Tại cấp cao hơn,
trình thông dịch cung cấp cơ chế cho ngƣời dùng đƣa ra yêu cầu mà không viết chƣơng
trình. Các lệnh có thể xuất phát từ tập tin trong suốt thời gian thực thi theo chế độ xử lý
theo lô, hay trực tiếp từ bàn phím trong chế độ tƣơng tác hay chia s thời gian. Các
chƣơng trình hệ thống đƣợc cung cấp để thoả m n nhiều yêu cầu thông thƣờng của
ngƣời dùng.
Các loại yêu cầu khác nhau dựa theo cấp yêu cầu. Cấp gọi hệ thống phải cung cấp
các chức năng cơ bản, nhƣ điều khiển quá trình, quản lý tập tin và thiết bị. Các yêu cầu
cấp cao hơn đƣợc thoả m n bởi trình thông dịch lệnh và chƣơng trình hệ thống đƣợc
dịch thành một chuỗi các lời gọi hệ thống. Các dịch vụ hệ thống có thể đƣợc phân cấp
thành nhiều loại: điều khiển chƣơng trình, yêu cầu trạng thái, yêu cầu nhập/xuất. Một
khi dịch vụ hệ thống đƣợc định nghĩa, cấu trúc của hệ điều hành đƣợc phát triển. Thiết
kế một hệ điều hành mới là công việc rất quan trọng.
Khái niệm máy ảo thực hiện tiếp cận phân tầng và xem nhân của hệ điều hành và
phần cứng nhƣ là phần cứng của nó. Các hệ điều hành khác có thể đƣợc nạp trên đỉnh
của máy ảo.
Các hệ điều hành đƣợc sử dụng ngày nay trên các máy tính đa chức năng
nhƣ máy tính cá nhân chủ yếu gồm hai chủng loại: hệ điều hành họ Unix và hệ điều
43
hành họ Microsoft Windows. Các máy tính mẹ (Mainframe computer) và các hệ thống
nhúng dùng nhiều loại hệ điều hành khác nhau, không phải là Unix hay Windows,
nhƣng cũng tƣơng tự nhƣ Unix hay Windows.
Các hệ điều hành hiện đại:
Hệ điều hành thuộc họ Unix: Linux, Ubuntu, Android, Sailfish, Fedora, Firefox
OS … đƣợc coi là hệ điều hành nguồn mở.
Hệ điều hành thuộc họ Windows: WinXP, Win7, Win8, Windows Phone, …
Câu hỏi ôn tập
1. Chức năng hệ điều hành là gì?
2. Thiết kế hệ điều hành đáp ứng mục tiêu gì?
3. Các thành phần hệ thống máy tính?
4. Phân biệt hệ điều hành đơn chƣơng và đa chƣơng?
5. Phân biệt hệ điều hành đơn nhiệm và đa nhiệm?
6. Phân biệt bộ nhớ chính và bộ nhớ thứ cấp?
7. Giải thích đa nhiệm, đa chƣơng, đa xử lý?
8. CPU ảo là gì? Cho ví dụ trong hệ điều hành?
9. Hệ đa xử lý có ƣu điểm gì?
10. Liệt kê các kiến trúc của hệ điều hành?
11. Hệ điều hành Windows đƣợc thiết kế theo kiến trúc nào?
12. Lý do hệ điều hành linux không đƣợc sử dụng rộng r i trong sinh viên
Việt Nam?
13. Ƣu điểm của Windows 8 so với các phiên bản trƣớc đó là gì?
TÀI LIỆU TH M KHẢO
[1] Nguyễn Kim Tuấn, Giáo trình Hệ điều hành, ĐH Huế, 2004.
44
[2] Nguyễn Ph Trường, Hệ điều hành , Khoa CNTT, Đại học Cần Thơ, 2005
CHƯ NG 2: QUẢN L TIẾN TR NH
2.1. MỤC TIÊU
Sau khi học xong chƣơng này, ngƣời học nắm đƣợc những kiến thức sau:
- Hiểu các khái niệm liên quan đến tiến trình quá trình - Process)
- Hiểu cách lập thời biểu CPU cho các tiến trình
- Hiểu cơ chế đồng bộ hóa các quá trình
- Hiểu cơ chế tắc nghẽn và chống tắc nghẽn
Tất cả các hệ điều hành từ đơn chƣơng đến đa chƣơng, từ đơn nhiệm đến đa
nhiệm đều phải đƣợc xây dụng dựa trên khái niệm về tiến trình. Vì thế, một yêu cầu
quan trọng trong thiết kế hệ điều hành là thành phần quản lý tiến trình của hệ điều hành
phải đáp ứng tất cả những gì liên quan đến tiến trình:
- Hệ điều hành phải cho ph p thực hiện nhiều tiến trình đồng thời để khai thác tối
đa thời gian xử lý của CPU nhƣng cũng cung cấp đƣợc thời gian hồi đáp hợp lý.
- Hệ điều hành phải cấp phát tài nguyên để tiến trình hoạt động một cách hiệu quả
với một chính sách hợp lý nhƣng không xảy ra tình trạng tắc nghẽn trong hệ
thống.
- Hệ điều hành phải có cơ chế đồng bộ hóa yêu cầu các tiến trình hợp tác lẫn nhau
tránh việc mất mát dữ liệu.
2.2. TỔNG QU N VỀ TIẾN TR NH
2.2.1. Nhu cầu xử lý đồng hành
Hầu hết các hệ điều hành hiện đại đều cho phép người d ng thi hành nhiều công
việc đồng thời tr n c ng một máy tính Nhu cầu x đồng hành (concurrency) này
xu t phát từ đâu, và hệ điều hành cần ph i t chức hỗ trợ như thế nào cho các môi
trường đa nhiệm như thế? Đ à nội dung chúng ta sẽ tìm hi u trong bài này
Có hai động lực chính khiến cho các hệ điều hành hiện đại thƣờng hỗ trợ môi
trƣờng đa nhiệm trong đó chấp nhận nhiều công việc thực hiện đồng thời trên cùng một
45
máy tính:
- Tăng hiệu suất sử dụng CPU:
Phần lớn các công việc khi thi hành đều trải qua nhiều chu kỳ xử lý Chu kỳ
CPU, sử dụng CPU và chu kỳ nhập xuất Chu kỳ IO, sử dụng các thiết bị nhập xuất
xen kẽ nhƣ sau :
CPU IO CPU IO CPU
Bản 2 Chu ỳ CPU và chu ỳ I/O
Nếu chỉ có một tiến trình duy nhất trong hệ thống, thì vào các chu kỳ I/O của
công việc, CPU sẽ hoàn toàn nhàn rỗi. Ý tƣởng tăng cƣờng số lƣợng công việc trong
hệ thống là để tận dụng CPU: nếu công việc 1 yêu cầu I/O, thì có thể tận dụng CPU để
thực hiện công việc 2...
Công việc 1 CPU IO CPU IO CPU
Công việc 2 CPU IO CPU IO
Bản 2 2. Tăng hiệu su t s dụng CPU
- Tăng tốc độ xử lý:
Một số bài toán có bản chất xử lý song song nếu đƣợc xây dựng thành nhiều
module hoạt động đồng thời thì sẽ tiết kiệm đƣợc thời gian xử lý.
Ví dụ : X t bài toán tính giá trị biểu thức kq = a*b + c*d . Nếu tiến hành tính
đồng thời a*b và c*d thì thời gian xử lý sẽ ngắn hơn là thực hiện tuần tự.
Trong các trƣờng hợp đó, cần có một mô hình xử lý đồng hành thích hợp. Trên
máy tính có cấu hình nhiều CPU, hỗ trợ xử lý song song thật sự, điều này sẽ giúp tăng
hiệu quả thi hành của hệ thống đáng kể.
2.2.2. Khái niệm tiến trình
Những hệ điều hành ban đầu cho ph p chỉ một chƣơng trình đƣợc thực thi tại một
thời điểm. Chƣơng trình này có toàn quyền điều khiển hệ thống và có thể truy xuất tới
46
tất cả tài nguyên của hệ thống. Những hệ điều hành hiện đại cho ph p nhiều chƣơng
trình đƣợc nạp vào bộ nhớ và đƣợc thực thi đồng hành. Sự phát triển này yêu cầu sự
điều khiển mạnh mẽ hơn và phân chia tài nguyên nhiều hơn giữa các tiến trình sao cho
cân bằng và hiệu quả. Yêu cầu này dẫn đến khái niệm tiến trình Process .
Hình 2.1. (a) đa chương với 4 chương trình
(b)Mô hình hái niệm với 4 chương trình độc p
(c)Tại một thời đi m chỉ c 1 chương trình hoạt động
Tiến trình à một chương trình đang x , s hữu một con trỏ ệnh, t p các thanh
10 Trần Hạnh Nhi, Giáo trình điện tử hệ điều hành nâng cao, Trƣờng Đại học Khoa học Tự nhiên TP.HCM.
47
ghi và các biến Đ hoàn thành công việc của mình, một tiến trình c th cần đến một số tài nguy n như CPU, bộ nhớ chính, các t p tin và thiết bị nh p/xu t10.
Hình 2.2. Tiến trình (Process)
Cần phân biệt hai hái niệm chương trình và tiến trình Một chương trình à một
thực th thụ động, chứa đựng các chỉ thị điều hi n máy tính đ tiến hành một công
việc nàođ ; hi cho thực hiện các chỉ thị này, chương trình chuy n thành tiến trình, à
một thực th hoạt động, với con trỏ ệnh xác định chỉ thị ế tiếp sẽ thi hành, èm theo
t p các tài nguy n phục vụ cho hoạt động của tiến trình
Về mặt ý niệm, có thể xem nhƣ mỗi tiến trình sở hữu một bộ xử lý ảo cho riêng
nó, nhƣng trong thực tế, chỉ có một bộ xử lý thật sự đƣợc chuyển đổi qua lại giữa các
tiến trình. Sự chuyển đổi nhanh chóng này đƣợc gọi là sự đa chương
(multiprogramming). Hệ điều hành chịu trách nhiệm sử dụng một thuật toán định thời
CPU để quyết định thời điểm cần dừng hoạt động của tiến trình đang xử lý để phục vụ
một tiến trình khác, và lựa chọn tiến trình tiếp theo sẽ đƣợc phục vụ. Bộ phận thực hiện
chức năng này của hệ điều hành đƣợc gọi là bộ định thời (scheduler).
Một hệ điều hành phức tạp hơn đƣợc mong đợi nhiều hơn trong việc thực hiện
các hành vi của ngƣời dùng. Mặc dù quan tâm chủ yếu của hệ điều hành là thực thi
chƣơng trình ngƣời dùng, nhƣng nó cũng quan tâm đến các công việc khác nhau bên
ngoài nhân. Do đó, một hệ thống chứa tập hợp các quá trình: quá trình hệ điều hành
thực thi m hệ thống, quá trình ngƣời dùng thực thi m ngƣời dùng. Tất cả quá trình
này có tiềm năng thực thi đồng hành, với một CPU hay nhiều CPU đƣợc đa hợp giữa
chúng. Bằng cách chuyển đổi CPU giữa các quá trình, hệ điều hành có thể làm cho
48
máy tính hoạt động với năng suất cao hơn.
2.2.3. Phân loại tiến trình
Các tiến trình trong hệ thống có thể chia thành hai loại: tiến trình tuần tự và tiến
trình song song. Tiến trình tuần tự là các tiến trình mà điểm khởi tạo của nó là điểm kết
thúc của tiến trình trƣớc đó. Tiến trình song song là các tiến trình mà điểm khởi tạo của
tiến trình này mằn ở thân của các tiến trình khác, tức là có thể khởi tạo một tiến trình
mới khi các tiến trình trƣớc đó chƣa kết thúc. Tiến trình song song đƣợc chia thành
nhiều loại:
- Tiến trình song song độc p: là các tiến trình hoạt động song song nhƣng không có
quan hệ thông tin với nhau, trong trƣờng hợp này hệ điều hành phải thiết lập cơ chế
bảo vệ dữ liệu của các tiến trình, và cấp phát tài nguyên cho các tiến trình một cách
hợp lý.
- Tiến trình song song c quan hệ thông tin: trong quá trình hoạt động các tiến trình
thƣờng trao đổi thông tin với nhau, trong một số trƣờng hợp tiến trình gởi thông
báo cần phải nhận đƣợc tín hiệu từ tiến trình nhận để tiếp tục, điều này d dẫn đến
bế tắc khi tiến trình nhận tín hiệu không ở trong trạng thái nhận hay tiến trình gởi
không ở trong trạng thái nhận thông báo trả lời.
- Tiến trình song song phân c p: Trong quá trình hoạt động một tiến trình có thể khởi
tạo các tiến trình khác hoạt động song song với nó, tiến trình khởi tạo đƣợc gọi là
tiến trình cha, tiến trình đƣợc tạo gọi là tiến trình con. Trong mô hình này hệ điều
hành phải giải quyết vấn đề cấp phát tài nguyên cho các tiến trình con. Tiến trình
con nhận tài nguyên ở đâu, từ tiến trình cha hay từ hệ thống. Để giải quyết vấn đề
này hệ điều hành đƣa ra hai mô hình quản lý tài nguyên: Thứ nhất, mô hình tập
trung, trong mô hình này hệ điều hành chịu trách nhiệm phân phối tài nguyên cho
tất cả các tiến trình trong hệ thống. Thứ hai, mô hình phân tán, trong mô hình này
hệ điều hành cho ph p tiến trình con nhận tài nguyên từ tiến trình cha, tức là tiến
trình khởi tạo có nhiệm vụ nhận tài nguyên từ hệ điều hành để cấp phát cho các tiến
trình mà nó tạo ra, và nó có nhiệm vụ thu hồi lại tài nguyên đ cấp phát trả về cho
hệ điều hành trƣớc khi kết thúc.
- Tiến trình song song đồng mức: là các tiến trình hoạt động song song sử dụng
chung tài nguyên theo nguyên tắc lần lƣợt, mỗi tiến trình sau một khoảng thời gian
49
chiếm giữ tài nguyên phải tự động trả lại tài nguyên cho tiến trình kia.
Các tiến trình tuần tự chỉ xuất hiện trong các hệ điều hành đơn nhiệm đa chƣơng,
nhƣ hệ điều hành MS-DOS, loại tiến trình này tồn tại nhiều hạn chế, điển hình nhất là
không khai thác tối đa thời gian xử lý của CPU. Các tiến trình song song xuất hiện
trong các hệ điều hành đa nhiệm đa chƣơng, trên cả hệ thống đơn xử lý và đa xử lý.
Nhƣng sự song song thực, chỉ có ở các hệ thống đa xử lý, trong hệ thống này mỗi CPU
chịu trách nhiệm thực hiện một tiến trình. Sự song song trên các hệ thống đơn xử lý là
sự song song giả, các tiến trình song song trên hệ thống này thực chất là các tiến trình
thay nhau sử dụng CPU, tiến trình này đang chạy thì có thể dừng lại để nhƣờng CPU
cho tiến trình khác chạy và sẽ tiếp tục lại sau đó khi có đƣợc CPU. Đây là trƣờng hợp
mà ở trên ta cho rằng: điểm khởi tạo của tiến trình này nằm ở thân của tiến trình khác.
Hình vẽ sau đây minh họa sự khác nhau, về mặt thực hiện, giữa các tiến trình
song song/đồng thời trong hệ thống đơn xử lý với các tiến trình song song/đồng thời
trong hệ thống đa xử lý.
Hình 2.3. Sự thực hiện đồng thời của các tiến trình trong hệ thống đơn x
Hình 2.4. Sự thực hiện đồng thời của các tiến trình trong hệ thống đa x
Trong tài iệu này chúng ta chỉ h o sát sự hoạt động của các tiến trình song
song (hay đồng thời) tr n các hệ thống đơn x .
Đối với ngƣời dùng thì trong hệ thống chỉ có hai nhóm tiến trình. Thứ nhất, là các
tiến trình của hệ điều hành. Thứ hai, là các tiến trình của chƣơng trình ngƣời dùng. Các
tiến trình của hệ điều hành hoạt động trong chế độ đặc quyền, nhờ đó mà nó có thể truy
xuất vào các vùng dữ liệu đƣợc bảo vệ của hệ thống. Trong khi đó các tiến trình của
50
chƣơng trình ngƣời dùng hoạt động trong chế độ không đặc quyền user mode , nên nó
không thể truy xuất vào hệ thống, nhờ đó mà hệ điều hành đƣợc bảo vệ. Các tiến trình
của chƣơng trình ngƣời dùng có thể truy xuất vào hệ thống thông qua các tiến trình của
hệ điều hành bằng cách thực hiện một lời gọi hệ thống.
2.2.4. Tiểu trình Thread) và mô hình đa tiểu trình Multithread)
2.2.4.1. Khái niệm tiểu trình
Trong hầu hết các hệ điều hành, mỗi tiến trình có một không gian địa chỉ và chỉ
có một d ng xử lý. Tuy nhiên, có nhiều tình huống ngƣời dùng mong muốn có nhiều
d ng xử lý cùng chia s một không gian địa chỉ, và các d ng xử lý này hoạt động song
song tƣơng tự nhƣ các tiến trình phân biệt ngoại trừ việc chia s không gian địa chỉ .
Ví dụ : Một server quản lý tập tin thỉnh thoảng phải tự khóa để chờ các thao tác
truy xuất đĩa hoàn tất. Nếu server có nhiều d ng xử lý, hệ thống có thể xử lý các yêu
cầu mới trong khi một d ng xử lý bị khoá. Nhƣ vậy việc thực hiện chƣơng trình sẽ có
hiệu quả hơn. Điều này không thể đạt đƣợc bằng cách tạo hai tiến trình server riêng
biệt vì cần phải chia s cùng một vùng đệm, do vậy bắt buộc phải chia s không gian
địa chỉ.
Chính vì các tình huống tƣơng tự, ngƣời ta cần có một cơ chế xử lý mới cho ph p
có nhiều d ng xử lý trong cùng một tiến trình.
Ngày nay đ có nhiều hệ điều hành cung cấp một cơ chế nhƣ thế và gọi là ti u
trình (threads).
Hình 2.5. Ti u trình (Thread)
Một ti u trình à một đơn vị x cơ b n trong hệ thống Mỗi ti u trình x tuần
51
tự đoạn mã ệnh của n , s hữu một con trỏ ệnh, t p các thanh ghi và một v ng nhớ
stac ri ng Các ti u trình chia sẻ CPU với nhau giống như cách chia sẻ giữa các tiến
trình: một ti u trình x trong hi các ti u trình hác chờ đến ượt Một ti u trình
cũng c th tạo p các tiến trình con, và nh n các trạng thái hác nhau như một tiến
trình th t sự Một tiến trình c th s hữu nhiều ti u trình
2.2.4.2. Phân iệt tiến trình và tiểu trình
Process có code segment, data segment, stack
Tiến trình Process) Tiểu trình Thread)
segment, heap & một số phần I/O nữa
Thread không có data segment & heap
Mỗi process có ít nhất một thread Thread tồn tại trong process
Thread trong cùng một process dùng chung Có thể có nhiều thread trong một
nhau code/data/heap và I/O; nhƣng chúng process, và main là một trong số đó
có stack segment, registers riêng.
Tạo ra một process mất nhiều thời gian Tạo ra một thread mất ít thời gian
Chuyển đổi chậm Chuyển đổi nhanh
Khi process kết thúc hoạt động, tất cả các Khi thread kết thúc hoạt động vùng bộ
thread kết thúc theo. nhớ stack của nó đƣợc giải phóng
Bản 2 3. So sánh tiến trình và ti u trình
Các tiến trình tạo thành những thực thể độc lập. Mỗi tiến trình có một tập tài
nguyên và một môi trƣờng riêng một con trỏ lệnh, một Stack, các thanh ghi và không
gian địa chỉ . Các tiến trình hoàn toàn độc lập với nhau, chỉ có thể liên lạc thông qua
các cơ chế thông tin giữa các tiến trình mà hệ điều hành cung cấp. Ngƣợc lại, các tiểu
trình trong cùng một tiến trình lại chia s một không gian địa chỉ chung, điều này có
nghĩa là các tiểu trình có thể chia s các biến toàn cục của tiến trình. Một tiểu trình có
thể truy xuất đến cả các stack của những tiểu trình khác trong cùng tiến trình. Cấu trúc
này không đề nghị một cơ chế bảo vệ nào, và điều này cũng không thật cần thiết vì các
tiểu trình trong cùng một tiến trình thuộc về cùng một sở hữu chủ đ tạo ra chúng trong
52
ý định cho ph p chúng hợp tác với nhau.
Hình 2.6. Các ti u trình trong c ng một tiến trình
Phân bổ thông tin lƣu trữ cấu trúc mô tả tiến trình và tiểu trình:
Tiến trình Tiểu trình
Không gian địa chỉ Con trỏ lệnh+các thanh ghi
Tài nguyên toàn cục Stack
Các thông tin thống kê Tài nguyên cục bộ
2.2.4.3. Kernel thread và user thread
Khái niệm tiểu trình có thể đƣợc cài đặt trong kernel của Hệ điều hành, khi đó
đơn vị cơ sở sử dụng CPU để xử lý là tiểu trình, Hệ điều hành sẽ phân phối CPU cho
các tiểu trình trong hệ thống. Tuy nhiên đối với một số hệ điều hành, khái niệm tiểu
trình chỉ đƣợc hỗ trợ nhƣ một đối tƣợng ngƣời dùng, các thao tác tiểu trình đƣợc cung
cấp kèm theo do một bộ thƣ viện xử lý trong chế độ ngƣời dùng không đặc quyền user
mode . Lúc này Hệ điều hành sẽ chỉ biết đến khái niệm tiến trình, do vậy cần có cơ chế
để liên kết các tiểu trình cùng một tiến trình với tiến trình cha trong kernel đối tƣợng
53
này đôi lúc đƣợc gọi là LWP lightweight process .
Hình 2.7. chế độ người d ng hông đ c quyền (user mode)
2.3. TỔ CHỨC QUẢN L TIẾN TR NH
2.3.1. Các trạng thái của tiến trình
Trạng thái của tiến trình tại một thời điểm đƣợc xác định bởi hoạt động hiện thời
của tiến trình tại thời điểm đó. Trong quá trình sống, một tiến trình thay đổi trạng thái
do nhiều nguyên nhân nhƣ: phải chờ một sự kiện nào đó xảy ra, hay đợi một thao tác
nhập/xuất hoàn tất, buộc phải dừng hoạt động do đ hết thời gian xử lý …
Xét tiến trình hai trạng thái
Một số ít hệ điều hành chỉ cho ph p tiến trình tồn tại ở một trong hai trạng thái:
Not Running và Running. Khi hệ điều hành tạo ra một tiến trình mới, hệ điều hành đƣa
tiến trình đó vào hệ thống ở trạng thái Not Running, tiến trình ở trạng thái này để chờ
đƣợc chuyển sang trạng thái Running. Vì một lý do nào đó, tiến trình đang thực hiện bị
ngắt thì bộ phân phát dispatcher sẽ thu hồi lại CPU của tiến trình này và chọn một
tiến trình ở trạng thái Not running để cấp CPU cho nó và chuyển nó sang trạng thái
Running. Tiến trình bị thu hồi CPU sẽ đƣợc chuyển về lại trạng thái Not running.
54
Hình 2.8. Sơ đồ tiến trình hai trạng thái
Tại một thời điểm xác định chỉ có duy nhất một tiến trình ở trạng thái Runnig,
nhƣng có thể có nhiều tiến trình ở trạng thái Not running, các tiến trình ở trạng thái Not
running đƣợc chứa trong một hàng đợi Queue . Tiến trình đang ở trạng thái Running
bị chuyển sang trạng thái Not running sẽ đƣợc đƣa vào hàng đợi. Hình vẽ sau đây mô
tả việc chuyển tiến trình vào hàng đợi.
Hình 2.9. Sơ đồ chuy n tiến trình vào hàng đợi
Xét tiến trình ba trạng thái
Đa số hệ điều hành đều cho ph p tiến trình tồn tại ở một trong ba trạng thái, đó là:
ready, running, blocked:
Hình 2.10. Sơ đồ tiến trình 3 trạng thái
Trạng thái sẵn sàng Ready: Ngay sau khi khởi tạo tiến trình, đƣa tiến trình vào
hệ thống và cấp phát đầy đủ tài nguyên trừ CPU cho tiến trình, hệ điều hành
đƣa tiến trình vào trạng thái ready. Hay nói cách khác, trạng thái ready là trạng
thái của một tiến trình trong hệ thống đang chờ đƣợc cấp CPU để bắt đầu thực
hiện.
Trạng thái thực thi (Running): Là trạng thái mà tiến trình đang đƣợc sở hữu
CPU để hoạt động, hay nói cách khác là các chỉ thị của tiến trình đang đƣợc
55
thực hiện/ xử lý bởi CPU.
Trạng thái khoá (Blocked): Là trạng thái mà tiến trình đang chờ để đƣợc cấp
phát thêm tài nguyên, để một sự kiện nào đó xảy ra, hay một quá trình vào/ra kết
thúc.
Quá trình chuyển trạng thái trong sơ đồ Hình 2.10 nhƣ sau:
1. Admit Tiến trình đƣợc khởi tạo, đƣợc đƣa vào hệ thống, đƣợc cấp phát đầy đủ
tài nguyên chỉ thiếu CPU.
2. Dispatch Tiến trình đƣợc cấp CPU để bắt đầu thực hiện/ xử lý.
3. Release Tiến trình hoàn thành xử lý và kết thúc.
4. Time_out Tiến trình bị bộ phân phát thu hồi CPU, do hết thời gian đƣợc quyền
sử dụng CPU, để cấp phát cho tiến trình khác.
5. (Event Wait Tiến trình đang chờ một sự kiện nào đó xảy ra hay đang chờ một
thao vào/ra kết thúc hay tài nguyên mà tiến trình yêu cầu chƣa đƣợc hệ điều hành đáp
ứng.
6. (Event Occurs Sự kiện mà tiến trình chờ đ xảy ra, thao tác vào/ra mà tiến trình
đợi đ kết thúc, hay tài nguyên mà tiến trình yêu cầu đ đƣợc hệ điều hành đáp ứng,
Bộ phận phân phát thu hồi CPU từ một tiến trình đang thực hiện trong các trƣờng
hợp sau:
(1) Tiến trình đang thực hiện hết thời gian time-out đƣợc quyền sử dụng CPU mà
bộ phận phân phát dành cho nó.
(2) Có một tiến trình mới phát sinh và tiến trình mới này có độ ƣu tiên cao hơn tiến
trình hiện tại.
(3) Có một tiến trình mới phát sinh và tiến trình mới cần một khoảng thời gian của
CPU nhỏ hơn nhiều so với khoảng thời gian c n lại của tiến trình hiện tại.
Tại một thời điểm xác định trong hệ thống có thể có nhiều tiến trình đang ở trạng
thái Ready hoặc Blocked nhƣng chỉ có một tiến trình ở trạng thái Running. Các tiến
56
trình ở trạng thái Ready và Blocked đƣợc chứa trong các hàng đợi Queue riêng.
Hình 2.11. Sơ đồ chuy n tiến trình vào các hàng đợi
Có nhiều lý do để một tiến trình đang ở trạng thái running chuyển sang trạng thái
blocked, do đó đa số các hệ điều hành đều thiết kế một hệ thống hàng đợi gồm nhiều
hàng đợi, mỗi hàng đợi dùng để chứa những tiến trình đang đợi cùng một sự kiện nào
đó.
Xét tiến trình ốn trạng thái
Trong môi trƣờng hệ điều hành đa nhiệm thì việc tổ chức các Queue để lƣu các
tiến trình chƣa thể hoạt động là cần thiết, nhƣng nếu tồn tại quá nhiều tiến trình trong
Queue, hay chính xác hơn trong bộ nhớ chính, sẽ dẫn đến trình trạng l ng phí bộ nhớ,
không c n đủ bộ nhớ để nạp các tiến trình khác khi cần thiết. Mặt khác nếu các tiến
trình trong Queue đang chiếm giữ tài nguyên của hệ thống, mà những tài nguyên này
lại là những tài nguyên các tiến trình khác đang cần, điều này dẫn đến tình trạng sử
dụng tài nguyên không hợp lý, làm cho hệ thống thiếu tài nguyên thực chất là thừa
trầm trọng và có thể làm cho hệ thống tắc nghẽn. Với những lý do trên các hệ điều
hành đa nhiệm thiết kế thêm một trạng thái tiến trình mới, đ à trạng thái Suspend
(tạm dừng). Trạng thái này rất cần thiết cho các hệ thống sử dụng kỹ thuật Swap trong
việc cấp phát bộ nhớ cho các tiến trình. Khái niệm Swap sẽ đƣợc đề cập đến trong
chƣơng Quản lý bộ nhớ của tài liệu này.
57
Hình 2.12. Sơ đồ tiến trình 4 trạng thái
Trạng thái Suspend là trạng thái của một tiến trình khi nó đang đƣợc lƣu trữ trên
bộ nhớ phụ, hay chính xác hơn đây là các tiến trình đang ở trong trạng thái blocked
và/hoặc ready bị hệ điều hành chuyển ra đĩa để thu hồi lại không gian nhớ đ cấp cho
tiến trình hoặc thu hồi lại tài nguyên đ cấp cho tiến trình để cấp cho một tiến trình
khác đang rất cần đƣợc nạp vào bộ nhớ tại thời điểm hiện tại.
Tiến trình năm trạng thái
Trong thực tế hệ điều hành thiết kế hai trạng thái suspend: một trạng thái suspend
dành cho các tiến trình từ blocked chuyển đến, trạng thái này đƣợc gọi là blocked-
suspend và một trạng thái suspend dành cho các tiến trình từ ready chuyển đến, trạng
thái này đƣợc gọi là ready-suspend.
Tới đây ta c th hi u các trạng thái tiến trình như sau:
- New: tiến trình mới tạo ra đƣợc đƣa vào hệ thống
- Ready: tiến trình đƣợc định vị trong bộ nhớ chính và đang chờ đƣợc cấp CPU để
thực hiện.
- Running: tiến trình đang đƣợc thực thi đang sở hữu CPU
- Blocked: tiến trình đƣợc định vị trong bộ nhớ chính và đang đợi một sự kiện hay
một quá trình I/O nào đó.
- Blocked-suspend: tiến trình đang bị chứa trên bộ nhớ phụ đĩa và đang đợi một sự
kiện nào đó.
- Ready-suspend: tiến trình đang bị chứa trên bộ nhớ phụ nhƣng sẵn sàng thực hiện
ngay sau khi đƣợc nạp vào bộ nhớ chính.
58
Sau đây chúng ta xem x t sự chuyển trạng thái tiến trình trong sơ đồ Hình 2.13:
Hình 2.13. Sơ đồ chuy n tiến trình năm trạng thái
Blocked sang Blocked-suspend: nếu không c n tiến trình ready trong bộ nhớ chính
và bộ nhớ chính không c n không gian nhớ trống thì phải có ít nhất một tiến trình
blocked bị chuyển ra ngoài, blocked-suspend, để dành bộ nhớ cho một tiến trình
không bị khoá khác.
Blocked-suspend sang Ready-suspend: một tiến trình đang ở trạng thái blocked-
suspend đƣợc chuyển sang trạng thái ready-suspend khi sự kiện mà nó đợi đ xảy
ra.
Ready-suspend sang Ready: có hai lý do để hệ điều hành chọn khi chuyển một tiến
trình ở trạng thái ready-suspend sang trạng thái ready:
o Không c n tiến trình ready trong bộ nhớ chính, hệ điều hành phải nạp một tiến
trình mới vào để nó tiếp tục thực hiện.
o Nếu có tiến trình ready-suspend có độ ƣu tiên cao hơn so với các tiến trình
ready hiện tại thì hệ điều hành có thể chuyển nó sang trạng thái ready để nó
nhiều cơ hội để đƣợc thực hiện hơn.
Ready sang Ready suspend: Hệ điều hành thƣờng chuyển các tiến trình blocked
sang suspend hơn là các tiến trình ready, vì các tiến trình ở trạng thái blocked
không thể thực hiện ngay lập tức nhƣng lại chiếm nhiều không gian bộ nhớ chính
hơn so với các tiến trình ở trạng thái ready. Tuy nhiên, nếu việc chọn tiến trình để
chuyển sang suspend dựa vào hai điều kiện: chiếm ít không gian bộ nhớ hơn và có
độ ƣu tiên thấp hơn thì hệ điều hành có thể chuyển một tiến trình ready sang trạng
59
thái suspend.
Nhƣ vậy với việc chuyển tiến trình sang trạng thái suspend hệ điều hành sẽ chủ
động hơn trong việc cấp phát bộ nhớ và ngăn chặn các tình huống tắc nghẽn có thể xảy
ra do sự tranh chấp về tài nguyên, nhờ vậy mà hệ điều hành tiết kiệm đƣợc bộ nhớ, chia
s đƣợc tài nguyên cho nhiều tiến trình và tăng đƣợc mức độ đa chƣơng của hệ thống.
Tuy nhiên, để có đƣợc những lợi ích trên hệ điều hành đ phải chi phí rất nhiều cho
việc tạm dừng tiến trình. Hệ điều hành phải xem x t tiến trình nào đƣợc chọn để
suspend, khi suspend một tiến trình hệ điều hành phải lƣu lại tất cả các thông tin liên
quan đến tiến trình đó con trỏ lệnh, tài nguyên mà tiến trình đ đƣợc cấp, ... , hệ điều
hành phải lựa chọn thời điển thích hợp để đƣa tiến trình ra bộ nhớ ngoài, ... những thao
tác đó sẽ làm chậm tốc độ thực hiện của toàn bộ hệ thống. Nhƣng dầu sao đi nữa thì hệ
điều hành vẫn phải sử dụng trạng thái suspend vì tăng mức độ đa chƣơng của hệ thống
là một trong những mục tiêu lớn của hệ điều hành.
2.3.2. Chế độ xử lý của tiến trình
Để đảm bảo hệ thống hoạt động đúng đắn, hệ điều hành cần phải đƣợc bảo vệ
khỏi sự xâm phạm của các tiến trình. Bản thân các tiến trình và dữ liệu cũng cần đƣợc
bảo vệđể tránh các ảnh hƣởng sai lạc lẫn nhau. Một cách tiếp cận để giải quyết vấn đề
là phân biệt hai chế độ xử lý cho các tiến trình: chế độ hông đ c quyền và chế độ đ c
quyền nhờ vào sự trợ giúp của cơ chế phần cứng. Tập lệnh của CPU đƣợc phân chia
thành các lệnh đặc quyền và lệnh không đặc quyền. Cơ chế phần cứng chỉ cho ph p các
lệnh đặc quyền đƣợc thực hiện trong chế độ đặc quyền. Thông thƣờng chỉ có hệ điều
hành hoạt động trong chế độ đặc quyền, các tiến trình của ngƣời dùng hoạt động trong
chế độ không đặc quyền, không thực hiện đƣợc các lệnh đặc quyền có nguy cơ ảnh
hƣởng đến hệ thống. Nhƣ vậy hệ điều hành đƣợc bảo vệ. Khi một tiến trình ngƣời dùng
gọi đến một lời gọi hệ thống, tiến trình của hệ điều hành xử lý lời gọi này sẽ hoạt động
trong chế độ đặc quyền, sau khi hoàn tất thì trả quyền điều khiển về cho tiến trình
60
ngƣời dùng trong chế độ không đặc quyền.
Ngƣời dùng
Chế độ không đặc quyền
Shell, editor,compiler,...
Hệ điều hành
Chế độ đặc quyền
Hardware
Hình 2.14. Hai chế độ x đ c quyền và hông đ c quyền
2.3.3. Cấu tr c dữ liệu khối quản lý tiến trình
Hệ điều hành quản lý các tiến trình trong hệ thống thông qua hối qu n tiến
trình (process control block -PCB . PCB là một vùng nhớ lƣu trữ các thông tin mô tả
cho tiến trình, với các thành phần chủ yếu bao gồm:
Hình 2.15. Khối mô t tiến trình
Định danh của tiến trình (1 : giúp phân biệt các tiến trình
61
Trạng thái tiến trình 2 : xác định hoạt động hiện hành của tiến trình.
Ngữ c nh của tiến trình 3 : mô tả các tài nguyên tiến trình đang trong quá trình,
hoặc để phục vụ cho hoạt động hiện tại, hoặc để làm cơ sở phục hồi hoạt động cho
tiến trình, bao gồm các thông tin về:
Trạng thái CPU: bao gồm nội dung các thanh ghi, quan trọng nhất là con trỏ
lệnh IP lƣu trữ địa chỉ câu lệnh kế tiếp tiến trình sẽ xử lý. Các thông tin này cần
đƣợc lƣu trữ khi xảy ra một ngắt, nhằm có thể cho ph p phục hồi hoạt động
của tiến trình đúng nhƣ trƣớc khi bị ngắt.
Bộ x : dùng cho máy có cấu hình nhiều CPU, xác định số hiệu CPU mà tiến
trình đang sử dụng.
Bộ nhớ chính: danh sách các khối nhớ đƣợc cấp cho tiến trình.
Tài nguy n s dụng: danh sách các tài mguyên hệ thống mà tiến trình đang sử
dụng.
Tài nguy n tạo p: danh sách các tài nguyên đƣợc tiến trình tạo lập.
Thông tin giao tiếp 4 : phản ánh các thông tin về quan hệ của tiến trình với các
tiến trình khác trong hệ thống :
Tiến trình cha: tiến trình tạo lập tiến trình này.
Tiến trình con: các tiến trình do tiến trình này tạo lập.
Độ ưu ti n: giúp bộ định thời biểu CPU có thông tin để lựa chọn tiến trình nào
đƣợc cấp CPU.
Thông tin thống (5): đây là những thông tin thống kê về hoạt động của tiến trình,
nhƣ thời gian đ sử dụng CPU, thời gian chờ. Các thông tin này có thể có ích cho
công việc đánh giá tình hình hệ thống và dự đoán các tình huống tƣơng lai.
2.4. TH O TÁC TRÊN TIẾN TR NH
Hệ điều hành cung cấp các thao tác chủ yếu sau đây trên một tiến trình :
Tạo lập tiến trình create
Kết thúc tiến trình destroy
Tạm dừng tiến trình suspend
62
Tái kích hoạt tiến trình resume
Thay đổi độ ƣu tiên tiến trình
2.4.1. Tạo lập tiến trình
Trong quá trình xử lý, một tiến trình có thể tạo lập nhiều tiến trình mới bằng cách
sử dụng một lời gọi hệ thống tƣơng ứng. Tiến trình gọi lời gọi hệ thống để tạo tiến
trình mới sẽ đƣợc gọi là tiến trình cha, tiến trình đƣợc tạo gọi là tiến trình con. Mỗi tiến
trình con đến lƣợt nó lại có thể tạo các tiến trình mới…quá trình này tiếp tục sẽ tạo ra
một cây tiến trình.
http://www.dthu.edu.vn
Khoa SP Toán - Tin Khoa TNMT Khoa VH-DL
CNTT TOÁN
Hình 2.16. Một cây tiến trình trong hệ thống UNIX
C c côn v c u n cần t c n k t o lập t ến tr n bao ồm:
Định danh cho tiến trình mới phát sinh
Đƣa tiến trình vào danh sách quản lý của hệ thống
Xác định độ ƣu tiên cho tiến trình
Tạo PCB cho tiến trình
Cấp phát các tài nguyên ban đầu cho tiến trình
Khi một tiến trình tạo lập một tiến trình con, tiến trình con có thể sẽ đƣợc hệ
điều hành trực tiếp cấp phát tài nguyên hoặc đƣợc tiến trình cha cho thừa
hƣởng một số tài nguyên ban đầu.
Khi một tiến trình tạo tiến trình mới, tiến trình ban đầu có thể xử lý theo một
63
trong hai khả năng sau :
- Tiến trình cha tiếp tục xử lý đồng hành với tiến trình con.
- Tiến trình cha chờ đến khi một tiến trình con nào đó, hoặc tất cả các tiến
trình con kết thúc xử lý.
Các hệ điều hành khác nhau có thể chọn lựa các cài đặt khác nhau để thực hiện
thao tác tạo lập một tiến trình.
2.4.2. Kết th c tiến trình
Một tiến trình kết thúc xử lý khi nó hoàn tất chỉ thị cuối cùng và sử dụng một lời
gọi hệ thống để yêu cầu hệ điều hành hủy bỏ nó. Đôi khi một tiến trình có thể yêu cầu
hệ điều hành kết thúc xử lý của một tiến trình khác. Khi một tiến trình ết thúc, hệ điều
hành thực hiện các công việc:
Thu hồi các tài nguyên hệ thống đ cấp phát cho tiến trình
Hủy tiến trình khỏi tất cả các danh sách quản lý của hệ thống
Hủy bỏ PCB của tiến trình
Hầu hết các hệ điều hành không cho ph p các tiến trình con tiếp tục tồn tại nếu
tiến trình cha đ kết thúc. Trong những hệ thống nhƣ thế, hệ điều hành sẽ tự động phát
sinh một loạt các thao tác kết thúc tiến trình con.
2.4.3. Khi tiến trình thay đổi trạng thái
Khi một tiến trình đang ở trạng thái running bị chuyển sang trạng thái khác
(ready, blocked, … thì hệ điều hành phải tạo ra sự thay đổi trong môi trƣờng làm việc
của nó. Sau đây là các bƣớc mà hệ điều hành phải thực hiện đầy đủ khi thay đổi trạng
thái tiến trình:
Lƣu ngữ cảnh của CPU, bao gồm thanh ghi bộ đếm chƣơng trình PC (program
counter) và các thanh ghi khác.
Cập nhật PCB của tiến trình, sao cho phù hợp với trạng thái mới của tiến
trình, bao gồm trạng thái mới của tiến trình, các thông tin tính toán, vv.
Di chuyển PCB của tiến trình đến một hàng đợi thích hợp, để đáp ứng đƣợc
các yêu cầu của công tác điều phối tiến trình.
64
Chọn một tiến trình khác để cho ph p nó thực hiện.
Cập nhật PCB của tiến trình vừa đƣợc chọn thực hiện ở trên, chủ yếu là thay
đổi trạng thái của tiến trình đến trạng thái running.
Cập nhật các thông tin liên quan đến quản lý bộ nhớ. Bƣớc này phụ thuộc vào
các yêu cầu chuyển đổi địa chỉ bộ nhớ đang đƣợc sử dụng.
Khôi phục lại ngữ cảnh của CPU và thay đổi giá trị của bộ đếm chƣơng trình
và các thanh ghi khác sao cho phù hợp với tiến trình đƣợc chọn ở trên, để tiến
trình này có thể bắt đầu hoạt động đƣợc.
Nhƣ vậy, khi hệ điều hành chuyển một tiến trình từ trạng thái running đang
chạy sang một trạng thái nào đó tạm dừng thì hệ điều hành phải lƣu trữ các thông tin
cần thiết, nhất là bộ đếm chƣơng trình, để sau này hệ điều hành có thể cho tiến trình
tiếp tục hoạt động trở lại đƣợc tái kích hoạt . Đồng thời hệ điều hành phải chọn một
tiến trình nào đó đang ở trạng thái ready để cho tiến trình này chạy chuyển tiến trình
sang trạng thái running . Tại đây, trong các thao tác phải thực hiện, hệ điều hành phải
thực hiện việc thay đổi giá trị của PC, thay đổi ngữ cảnh CPU, để PC chỉ đến địa chỉ
của chỉ thị đầu tiên của tiến trình running mới này trong bộ nhớ. Đây cũng chính là bản
chất của việc thực hiện các tiến trình trong các hệ thống đơn xử lý.
2.5. CẤP PHÁT TÀI NGUYÊN CHO TIẾN TR NH
Khi có nhiều ngƣời dùng đồng thời làm việc trong hệ thống, hệ điều hành cần
phải cấp phát các tài nguyên theo yêu cầu cho mỗi ngƣời dùng. Do tài nguyên hệ thống
thƣờng rất giới hạn và có khi không thể chia s , nên hiếm khi tất cả các yêu cầu tài
nguyên đồng thời đều đƣợc thỏa m n. Vì thế cần phải nghiên cứu một phƣơng pháp để
chia s một số tài nguyên hữu hạn giữa nhiều tiến trình ngƣời dùng đồng thời. Hệ điều
hành quản lý nhiều loại tài nguyên khác nhau CPU, bộ nhớ chính, các thiết bị ngoại vi
… , với mỗi loại cần có một cơ chế cấp phát và các chiến lƣợc cấp phát hiệu quả. Mỗi
tài nguyên đƣợc biểu di n thông qua một cấu trúc dữ liệu, khác nhau về chi tiết cho
từng loại tài nguyên, nhƣng cơ bản chứa đựng các thông tin sau:
Định danh tài nguy n
Trạng thái tài nguy n: đây là các thông tin mô tả chi tiết trạng thái tài nguyên :
phần nào của tài nguyên đ cấp phát cho tiến trình, phần nào c n có thể sử
65
dụng?
Hàng đợi tr n một tài nguy n: danh sách các tiến trình đang chờ đƣợc cấp phát
tài nguyên tƣơng ứng.
Bộ c p phát: là đoạn m lệnh đảm nhiệm việc cấp phát một tài nguyên đặc thù.
Một số tài nguyên đ i hỏi các giải thuật đặc biệt nhƣ CPU, bộ nhớ chính, hệ
thống tập tin , trong khi những tài nguyên khác nhƣ các thiết bị nhập/xuất) có
thể cần các giải thuật cấp phát và giải phóng tổng quát hơn.
Ví dụ k ố quản lý t n uyên:
Định danh RID
Trạng thái tài Danh sách các phần có thể
nguyên sử dụng
Hàng đợi Danh sách các tiến trình
đang đợi tài nguyên
Bộ cấp phát Con trỏ đến đoạn m lệnh
cấp phát tài nguyên
Bản 2 4 Khối qu n tài nguy n
C c mục t êu của kỹ t uật cấp p t:
Bảo đảm một số lƣợng hợp lệ các tiến trình truy xuất đồng thời đến các tài
nguyên không chia s đƣợc.
Cấp phát tài nguyên cho tiến trình có yêu cầu trong một khoảng thời gian trì
ho n có thể chấp nhận đƣợc.
Tối ƣu hóa việc sử dụng tài nguyên.
Để có thể thỏa m n các mục tiêu kể trên, cần phải giải quyết các vấn đề nảy sinh
khi có nhiều tiến trình đồng thời yêu cầu một tài nguyên không thể chia s .
2.6. Đ NH THỜI BIỂU CPU
Trong môi trƣờng đa chƣơng, có thể xảy ra tình huống nhiều tiến trình đồng thời
66
sẵn sàng để xử lý. Mục ti u của các hệ phân chia thời gian (time-sharing) à chuy n
đ i CPU qua ại giữa các tiến trình một cách thường xuy n đ nhiều người dùng c th
tương tác c ng úc với từng chương trình trong quá trình x .
Để thực hiện đƣợc mục tiêu này, hệ điều hành phải lựa chọn tiến trình đƣợc xử lý
tiếp theo. Bộ định thời biểu sẽ sử dụng một giải thuật định thời thích hợp để thực hiện
nhiệm vụ này. Một thành phần khác của hệ điều hành cũng tiềm ẩn trong công tác định
thời là bộ phân phát dispatcher . Bộ phân phát sẽ chịu trách nhiệm chuyển đổi ngữ
cảnh và trao CPU cho tiến trình đƣợc chọn bởi bộ định thời biểu CPU để xử lý.
2.6.1. Giới thiệu
2.6.1.1. Mục tiêu định thời iểu CPU
Bộ định thời không cung cấp cơ chế, mà đƣa ra các quyết định. Các hệ điều hành
xây dựng nhiều chiến lƣợc khác nhau để thực hiện việc điều phối, nhƣng tiêu chí chung
cần đạt đƣợc các mục tiêu sau:
a) Sự công ằng Fairness):
Các tiến trình chia s CPU một cách công bằng, không có tiến trình nào phải
chờ đợi vô hạn để đƣợc cấp phát CPU.
b) Tính hiệu quả (Efficiency):
Hệ thống phải tận dụng đƣợc 100% thời gian CPU.
c) Thời gian đáp ứng hợp lý Response time):
Cực tiểu hoá thời gian hồi đáp cho các tƣơng tác của ngƣời dùng
d) Thời gian lưu lại trong hệ thống Turnaround Time) :
Cực tiểu hóa thời gian hoàn tất các công việc xử lý theo lô.
e) Thông lượng tối đa Throughput):
Cực đại hóa số lƣợng công việc đƣợc xử lý trong một đơn vị thời gian.
Tuy nhiên thƣờng không thể thỏa m n tất cả các mục tiêu kể trên vì bản thân
chúng có sự mâu thuẫn với nhau mà chỉ có thể dung h a chúng ở mức độ nào đó.
67
2.6.1.2. Các đặc điểm của tiến trình
Điều phối hoạt động của các tiến trình là một vấn đề rất phức tạp, đ i hỏi hệ điều
hành khi giải quyết phải xem x t nhiều yếu tố khác nhau để có thể đạt đƣợc những mục
tiêu đề ra. Một số đặc tính của tiến trình cần đƣợc quan tâm nhƣ tiêu chuẩn định thời:
Tính hướng xu t / nh p của tiến trình ( I/O-boundedness):
Khi một tiến trình nhận đƣợc CPU, chủ yếu nó chỉ sử dụng CPU đến khi phát
sinh một yêu cầu nhập xuất? Hoạt động của các tiến trình nhƣ thế thƣờng bao
gồm nhiều lƣợt sử dụng CPU, mỗi lƣợt trong một thời gian khá ngắn.
Tính hướng x của tiến trình (CPU-boundedness):
Khi một tiến trình nhận đƣợc CPU, nó có khuynh hƣớng sử dụng CPU đến khi
hết thời gian dành cho nó? Hoạt động của các tiến trình nhƣ thế thƣờng bao gồm
một số ít lƣợt sử dụng CPU, nhƣng mỗi lƣợt trong một thời gian đủ dài.
Tiến trình tương tác hay x lý theo lô:
Ngƣời dùng theo kiểu tƣơng tác thƣờng yêu cần đƣợc hồi đáp tức thời đối với
các yêu cầu của họ, trong khi các tiến trình của công việc đƣợc xử lý theo lô nói
chung có thể trì ho n trong một thời gian chấp nhận đƣợc.
Độ ưu ti n của tiến trình:
Các tiến trình có thể đƣợc phân cấp theo một số tiêu chuẩn đánh giá nào đó, một
cách hợp lý, các tiến trình quan trọng hơn có độ ƣu tiên cao hơn cần đƣợc ƣu
tiên hơn.
Thời gian đã s dụng CPU của tiến trình:
Một số quan điểm ƣu tiên chọn những tiến trình đ sử dụng CPU nhiều thời gian
nhất vì hy vọng chúng sẽ cần ít thời gian nhất để hoàn tất và rời khỏi hệ thống.
Tuy nhiên cũng có quan điểm cho rằng các tiến trình nhận đƣợc CPU trong ít
thời gian là những tiến trình đ phải chờ lâu nhất, do vậy ƣu tiên chọn chúng.
Thời gian còn ại tiến trình cần đ hoàn t t:
Có thể giảm thiểu thời gian chờ đợi trung bình của các tiến trình bằng cách cho
các tiến trình cần ít thời gian nhất để hoàn tất đƣợc thực hiện trƣớc. Tuy nhiên
đáng tiếc là rất hiếm khi biết đƣợc tiến trình cần bao nhiêu thời gian nữa để kết
68
thúc xử lý.
2.6.1.3. Định thời iểu không độc quyền và định thời iểu độc quyền preemptive /
nopreemptive)
Thuật toán định thời biểu cần xem x t và quyết định thời điểm chuyển đổi CPU
giữa các tiến trình. Hệ điều hành có thể thực hiện cơ chế định thời biểu theo nguyên lý
độc quyền hoặc không độc quyền.
- Định thời iểu độc quyền không trưng dụng): Nguyên lý định thời biểu độc
quyền cho ph p một tiến trình khi nhận đƣợc CPU sẽ có quyền độc chiếm CPU
đến khi hoàn tất xử lý hoặc tự nguyện giải phóng CPU. Khi đó quyết định định
thời biểu CPU sẽ xảy ra trong các tình huống sau:
Khi tiến trình chuyển từ trạng thái running sang trạng thái blocked (ví dụ
chờ một thao tác nhập xuất hay chờ một tiến trình con kết thúc… .
Khi tiến trình kết thúc.
Các giải thuật độc quyền thƣờng đơn giản và d cài đặt. Tuy nhiên chúng thƣờng
không thích hợp với các hệ thống tổng quát nhiều ngƣời dùng, vì nếu cho ph p một
tiến trình có quyền xử lý bao lâu tùy ý, có nghĩa là tiến trình này có thể giữ CPU một
thời gian không xác định, có thể ngăn cản những tiến trình c n lại trong hệ thống có
một cơ hội để xử lý.
- Định thời iểu không độc quyền trưng dụng): Ngƣợc với nguyên lý độc quyền,
định thời biểu theo nguyên lý không độc quyền cho ph p tạm dừng hoạt động của
một tiến trình đang xử lý. Khi một tiến trình nhận đƣợc CPU, nó vẫn đƣợc sử dụng
CPU đến khi hoàn tất hoặc tự nguyện giải phóng CPU, nhƣng một tiến trình khác
có độ ƣu tiên cao hơn có thể giành quyền sử dụng CPU của tiến trình đang xử lý.
Nhƣ vậy là tiến trình có thể bị tạm dừng hoạt động bất cứ lúc nào mà không đƣợc
báo trƣớc, để tiến trình khác đƣợc xử lý. Các quyết định định thời biểu xảy ra khi:
Khi tiến trình chuyển từ trạng thái running sang trạng thái blocked ví dụ
chờ một thao tác nhập xuất hay chờ một tiến trình con kết thúc… .
Khi tiến trình chuyển từ trạng thái running sang trạng thái ready ví dụ xảy
ra một ngắt .
Khi tiến trình chuyển từ trạng thái chờ blocked sang trạng thái ready ví dụ
69
một thao tác nhập/xuất hoàn tất .
Khi tiến trình kết thúc.
Các thuật toán định thời biểu theo nguyên tắc không độc quyền ngăn cản đƣợc
tình trạng một tiến trình độc chiếm CPU, nhƣng việc tạm dừng một tiến trình có thể
dẫn đến các mâu thuẫn trong truy xuất, đ i hỏi phải sử dụng một phƣơng pháp đồng bộ
hóa thích hợp để giải quyết.
Trong các hệ thống sử dụng nguyên lý định thời biểu độc quyền có thể xảy ra tình
trạng các công việc cần thời gian xử lý ngắn phải chờ công việc xử lý với thời gian quá
dài hoàn tất! Nguyên lý định thời biểu độc quyền thƣờng chỉ thích hợp với các hệ xử lý
theo lô.
Đối với các hệ thống tƣơng tác time sharing , các hệ thời gian thực real time ,
cần phải sử dụng nguyên lý định thời biểu không độc quyền để các tiến trình quan
trọng có cơ hội hồi đáp kịp thời. Tuy nhiên thực hiện định thời biểu theo nguyên lý
không độc quyền đ i hỏi những cơ chế phức tạp trong việc phân định độ ƣu tiên, và
phát sinh thêm chi phí khi chuyển đổi CPU qua lại giữa các tiến trình.
2.6.2. Tổ chức định thời iểu
2.6.2.1. Các danh sách sử dụng trong quá trình định thời iểu.
Hệ điều hành sử dụng hai loại danh sách để thực hiện định thời biểu các tiến trình
là danh sách sẵn sàng (ready list) và danh sách chờ đợi (waiting list).
Khi một tiến trình bắt đầu đi vào hệ thống, nó đƣợc chèn vào danh sách các công
việc job list . Danh sách này bao gồm tất cả các tiến trình của hệ thống. Nhƣng chỉ các
tiến trình đang thƣờng trú trong bộ nhớ chính và ở trạng thái sẵn sàng tiếp nhận CPU
để hoạt động mới đƣợc đƣa vào danh sách sẵn sàng.
Bộ định thời biểu sẽ chọn một tiến trình trong danh sách sẵn sàng và cấp CPU
cho tiến trình đó. Tiến trình đƣợc cấp CPU sẽ thực hiện xử lý, và có thể chuyển sang
trạng thái chờ khi xảy ra các sự kiện nhƣ đợi một thao tác nhập/xuất hoàn tất, yêu cầu
tài nguyên chƣa đƣợc thỏa m n, đƣợc yêu cầu tạm dừng... Khi đó tiến trình sẽ đƣợc
chuyển sang một danh sách chờ đợi.
Hệ điều hành chỉ s dụng một danh sách sẵn sàng cho toàn hệ thống, nhưng mỗi
một tài nguy n (thiết bị ngoại vi) c một danh sách chờ đợi ri ng bao gồm các tiến
70
trình đang chờ được c p phát tài nguy n đ
Hình 2.17. Các danh sách điều phối
Quá trình xử lý của một tiến trình trải qua những chu kỳ chuyển đổi qua lại giữa
danh sách sẵn sàng và danh sách chờ đợi. Sơ đồ dƣới đây mô tả sự định thời biểu các
tiến trình dựa trên các danh sách của hệ thống.
Thoạt đầu tiến trình mới đƣợc đặt trong danh sách các tiến trình sẵn sàng, nó sẽ
đợi trong danh sách này cho đến khi đƣợc chọn để cấp phát CPU và bắt đầu xử lý. Sau
đó có thể xảy ra một trong các tình huống sau:
Tiến trình phát sinh một yêu cầu một tài nguyên mà hệ thống chƣa thể đáp ứng,
khi đó tiến trình sẽ đƣợc chuyển sang danh sách các tiến trình đang chờ tài
nguyên tƣơng ứng.
Tiến trình có thể bị bắt buộc tạm dừng xử lý do một ngắt xảy ra, khi đó tiến
trình đƣợc đƣa trở lại vào danh sách sẵn sàng để chờ đƣợc cấp CPU cho lƣợt
71
tiếp theo.
Hàng đợi sẳn sàng
CPU
CPU
Hàng đợi nhập/xuất
Yêu cầu nhập/xuất
Hết thời hạn
Gọi chƣơng trình con
Thực hiện chƣơng trình con
Ngắt ƣu tiên hơn
Ngắt xảy ra trình con
Hình 2.18. Sơ đồ chuy n đ i giữa các danh sách định thời bi u
Trong trƣờng hợp đầu tiên, tiến trình cuối cùng sẽ chuyển từ trạng thái blocked
sang trạng thái ready và lại đƣợc đƣa trở vào danh sách sẵn sàng. Tiến trình lặp lại chu
kỳ này cho đến khi hoàn tất công việc thì đƣợc hệ thống hủy bỏ khỏi mọi danh sách
định thời biểu.
2.6.2.2. Các cấp độ định thời iểu
Thực ra công việc định thời biểu đƣợc hệ điều hành thực hiện ở hai mức độ: định
thời bi u công việc (job scheduling) và định thời bi u tiến trình (process scheduling).
2.6.2.2.1. Định thời iểu công việc
Quyết định lựa chọn công việc nào đƣợc đƣa vào hệ thống, và nạp những tiến
trình của công việc đó vào bộ nhớ chính để thực hiện. Chức năng định thời biểu công
việc quyết định mức độ đa chƣơng của hệ thống số lƣợng tiến trình trong bộ nhớ
chính . Khi hệ thống tạo lập một tiến trình, hay có một tiến trình kết thúc xử lý thì chức
năng định thời biểu công việc mới đƣợc kích hoạt. Vì mức độ đa chƣơng tƣơng đối ổn
định nên chức năng định thời biểu công việc có tần suất hoạt động thấp .
Để hệ thống hoạt động tốt, bộ định thời biểu công việc cần biệt tính chất của tiến
trình là hƣớng nhập xuất I/O bounded hay hƣớng xử lý CPU bounded . Một tiến
trình đƣợc gọi là hƣớng nhập xuất nếu nó chủ yếu nó chỉ sử dụng CPU để thực hiện các
72
thao tác nhập xuất. Ngƣợc lại một tiến trình đƣợc gọi là hƣớng xử lý nếu nó chủ yếu nó
chỉ sử dụng CPU để thực hiện các thao tác tính toán. Để cân bằng hoạt động của CPU
và các thiết bị ngoại vi, bộ định thời biểu công việc nên lựa chọn các tiến trình để nạp
vào bộ nhớ sao cho hệ thống là sự pha trộn hợp lý giữa các tiến trình hƣớng nhập xuất
và các tiến trình hƣớng xử lý
2.6.2.2.2. Định thời iểu tiến trình
Bộ định thời biểu chọn một tiến trình ở trạng thái sẵn sàng đ đƣợc nạp vào bộ
nhớ chính, và có đủ tài nguyên để hoạt động và cấp phát CPU cho tiến trình đó thực
hiện.
Một thành phần khác liên quan đến chức năng định thời biểu tiến trình là bộ phân
phát (dispatcher . Bộ phân phát là một module có nhiệm vụ trao điều khiển CPU tới
quá trình đƣợc chọn bởi bộ định thời biểu tiến trình. Chức năng này có liên quan đến:
Chuyển ngữ cảnh
Chuyển chế độ ngƣời dùng
Nhảy tới vị trí hợp lý trong chƣơng trình ngƣời dùng để khởi động lại quá trình
Bộ định thời biểu tiến trình có tần suất hoạt động cao, sau mỗi lần xảy ra ngắt do
đồng hồ báo giờ, do các thiết bị ngoại vi... , thƣờng là 1 lần trong khoảng 100ms. Do
vậy để nâng cao hiệu suất của hệ thống, cần phải tăng tốc độ xử lý của bộ định thời
biểu tiến trình. Chức năng định thời biểu tiến trình là một trong chức năng cơ bản, quan
trọng nhất của hệ điều hành.
Một số hệ thống nhƣ hệ chia thời, có thể không có bộ định thời biểu công việc
hoặc tách biệt rất ít đối với bộ định thời biểu tiến trình. Một vài hệ điều hành lại đƣa ra
một cấp độ định thời biểu trung gian kết hợp cả hai cấp độ định thời biểu công việc và
tiến trình.
Hàng đợi sẳn sàng
CPU
I/O
Danh sách chờ trên tài nguyên
Tiến trình trong bộ nhớ phụ đƣợc nạp từng phần để xử lý
73
Hình 2.19. C p độ định thời bi u trung gian
Định thời biểu trung gian có nhiệm vụ xóa các quá trình ra khỏi bộ nhớ từ sự
canh tranh CPU và do đó giảm mức độ đa chƣơng. Tại thời điểm sau đó, quá trình có
thể đƣợc đƣa trở lại bộ nhớ và việc thực thi của nó có thể đƣợc tiếp tục nơi nó bị đƣa
ra. Cơ chế này đƣợc gọi là hoán vị swapping . Quá trình đƣợc hoán vị ra và sau đó
đƣợc hoán vị vào bởi bộ định thời biểu trung gian. Hoán vị là cần thiết để cải tiến sự
trộn lẫn quá trình giữa các quá trình hƣớng nhập/xuất và hƣớng CPU , hay vì một thay
đổi trong yêu cầu bộ nhớ vƣợt quá kích thƣớc bộ nhớ sẵn dùng.
2.6.2.2.3. Chuyển ngữ cảnh
Chuyển CPU tới một tiến trình khác yêu cầu lƣu trạng thái tiến trình cũ và nạp
trạng thái đƣợc lƣu cho tiến trình mới. Công việc này đƣợc xem nhƣ chuyển ngữ cảnh.
Hình 2.20. Chuy n đ i ngữ c nh từ P0 sang P1
Ngữ cảnh của tiến trình đƣợc hiện diện trong PCB của tiến trình; Nó chứa giá trị
74
các thanh ghi, trạng thái tiến trình và thông tin quản lý bộ nhớ. Khi chuyển ngữ cảnh
ngữ cảnh xảy ra, nhân lƣu ngữ cảnh của tiến trình cũ trong PCB của nó và nạp ngữ
cảnh đƣợc lƣu của tiến trình mới đƣợc định thời để chạy. Thời gian chuyển ngữ cảnh là
chi phí thuần vì hệ thống không thực hiện công việc có ích trong khi chuyển. Tốc độ
của nó khác từ máy này tới máy khác phụ thuộc vào tốc độ bộ nhớ, số ượng thanh ghi
phải đƣợc ch p và sự tồn tại của các chỉ thị đặc biệt nhƣ chỉ thị để nạp và lƣu tất cả
thanh ghi . Điển hình d y tốc độ từ 1 tới 1000 ms.
Những lần chuyển đổi ngữ cảnh phụ thuộc nhiều vào hỗ trợ phần cứng. Thí dụ,
vài bộ xử lý nhƣ Sun UltraSPARC cung cấp nhiều tập thanh ghi. Một chuyển ngữ
cảnh đơn giản chứa chuyển đổi con trỏ tới tập thanh ghi hiện hành. Dĩ nhiên, nếu tiến
trình hoạt động vƣợt quá tập thanh ghi thì hệ thống sắp xếp lại dữ liệu thanh ghi tới và
từ bộ nhớ. Cũng vì thế mà hệ điều hành phức tạp hơn và nhiều công việc đƣợc làm hơn
trong khi chuyển ngữ cảnh. Kỹ thuật quản lý bộ nhớ nâng cao có thể yêu cầu dữ liệu bổ
sung để đƣợc chuyển với mỗi ngữ cảnh. Thí dụ, không gian địa chỉ của tiến trình hiện
hành phải đƣợc lƣu khi không gian của công việc kế tiếp đƣợc chuẩn bị dùng. Không
gian địa chỉ đƣợc lƣu nhƣ thế nào và lƣợng công việc đƣợc yêu cầu để lƣu nó phụ
thuộc vào phƣơng pháp quản lý bộ nhớ của hệ điều hành. Chuyển ngữ cảnh có thể dẫn
đến thắt cổ chai năng lực thực hiện vì thế các lập trình viên đang sử dụng các cấu trúc
mới để tránh nó bất cứ khi nào có thể.
2.6.3. Các chiến lược định thời iểu CPU
Các chiến lƣợc định thời biểu giải quyết vấn đề quyết định tiến trình nào trong
hàng đợi sẵn sàng đƣợc cấp phát CPU. Trong phần này chúng ta mô tả nhiều giải thuật
định thời biểu đang có.
2.6.3.1. Chiến lược FCFS first-come, first-served-FCFS)
Giải thuật đơn giản nhất là đến trƣớc, đƣợc phục vụ trƣớc. Với cơ chế này, quá
trình yêu cầu CPU trƣớc đƣợc cấp phát CPU trƣớc. Việc cài đặt chính sách FCFS đƣợc
quản lý d dàng với hàng đợi FIFO. Khi một quá trình đi vào hàng đợi sẵn sàng, PCB
của nó đƣợc liên kết tới đuôi của hàng đợi. Khi CPU rảnh, nó đƣợc cấp phát tới một
quá trình tại đầu hàng đợi. Sau đó, quá trình đang chạy đƣợc lấy ra khỏi hàng đợi. M
của giải thuật FCFS đơn giản để viết và hiểu. Tuy nhiên, thời gian chờ đợi trung bình
75
dƣới chính sách FCFS thƣờng là dài.
Hình 2.21. Định thời bi u FCFS
X t tập hợp các quá trình sau đến tại thời điểm 0, với chiều dài thời gian chu kỳ
CPU đƣợc tính bằng mini giây.
Trường hợp 1: Giả sử các quá trình đến theo thứ tự P1, P2, P3
Tiến trình Thời điểm vào Ready List Thời gian xử lý
0 24 P1
1 3 P2
2 3 P3
Bản 2 5. Ví dụ 1 về chiến ược FCFS
P1, P2, P3 đƣợc phục vụ theo thứ tự FCFS, thứ tự cấp phát CPU cho các tiến
trình nhƣ sau:
P1 P2 P3
24 27 30 0
Bản 2 6. Bi u đồ Gannt ví dụ 1 về chiến ược FCFS
Tính thời gian chờ để đƣợc xử lý: P1 (0ms), P2 (23ms), P3 (25ms)
Thời gian chờ trung bình = 0+23+25 /3=16ms
Số lần chuyển đổi ngữ cảnh =2
Trường hợp 2: Giả sử các quá trình đến theo thứ tự P2, P3, P1
Tiến trình Thời điểm vào Ready List Thời gian xử lý
P2 3 0
P3 3 1
P1 24 2
76
Bản 2 7. Ví dụ 2 về chiến ược FCFS
P2, P3, P1 đƣợc phục vụ theo thứ tự FCFS, thứ tự cấp phát CPU cho các tiến
trình nhƣ sau:
P2 P3 P1
0 3 6 30
Bản 2 8. Bi u đồ Gannt ví dụ 2 về chiến ược FCFS
Tính thời gian chờ để đƣợc xử lý: P1 (4ms), P2 (0ms), P3 (2ms)
Thời gian chờ trung bình = 4+0+2 /3=2ms
Số lần chuyển đổi ngữ cảnh =2
- N ận xét: Trong trƣờng hợp 1 thời gian chờ trung bình không đạt cực tiểu, vì có
sự biến đổi đáng kể đối với các giá trị về thời gian xử lý và thứ tự khác nhau của
các tiến trình đến trong danh sách sẵn sàng. Có thể xảy ra hiện tƣợng tích lũy thời
gian chờ khi các tiến trình P2, P3 yêu cầu thời gian xử lý ngắn phải chờ đợi một
tiến trình P1 yêu cầu thời gian xử lý dài kết thúc xử lý. Giải thuật này đặc biệt
không phù hợp với các hệ điều hành phân chia thời gian, trong các hệ này, cần cho
ph p mỗi tiến trình đƣợc cấp phát CPU đều đặn trong từng khoảng thời gian.
2.6.3.2. Chiến lược phân phối xoay vòng RR - Round Robin)
Danh sách sẵn sàng đƣợc xử lý nhƣ một danh sách v ng, bộ định thời biểu lần
lƣợt cấp phát cho từng tiến trình trong danh sách một khoảng thời gian sử dụng CPU
gọi là định mức q quantum . Đây là một giải thuật định thời biểu hông độc quyền: khi
một tiến trình sử dụng CPU đến hết thời gian q dành cho nó, hệ điều hành thu hồi CPU
và cấp cho tiến trình kế tiếp trong danh sách. Nếu tiến trình bị khóa hay kết thúc trƣớc
khi sử dụng hết thời gian q, hệ điều hành cũng lập tức cấp phát CPU cho tiến trình kế
tiếp trong danh sách. Khi tiến trình tiêu thụ hết thời gian q dành cho nó mà chƣa hoàn
tất, tiến trình đƣợc đƣa trở lại vào cuối danh sách sẵn sàng để đợi đƣợc cấp CPU trong
77
lƣợt kế tiếp.
Hình 2.22. Định thời bi u Round Robin
X t các tiến trình P1, P2, P3 đến theo thứ tự:
Tiến trình Thời điểm vào Ready List Thời gian xử lý ms
P1 24 0
P2 3 1
P3 3 2
Bản 2 9. Ví dụ về chiến ược Round Robin
Nếu sử dụng q là 4ms, thứ tự cấp phát CPU sẽ là :
P1 P2 P3 P1 P1 P1 P1 P1
0 4 7 10 14 18 22 26 30
Bản 2 10. Bi u đồ Gannt ví dụ về chiến ược Round Robin
Thời gian chờ trung bình là (6+3+5)/3 = 4.66 ms.
Nếu có n tiến trình trong danh sách sẵn sàng và sử dụng q, thì mỗi tiến trình sẽ
đƣợc cấp phát CPU 1/n trong từng khoảng thời gian q. Mỗi tiến trình sẽ không phải đợi
quá (n-1)q đơn vị thời gian trƣớc khi nhận đƣợc CPU cho lƣợt kế tiếp.
- Nhận xét: Vấn đề đáng quan tâm đối với giải thuật RR là độ dài của q. Nếu thời
lƣợng q quá nhỏ sẽ phát sinh quá nhiều sự chuyển đổi giữa các tiến trình và khiến
cho việc sử dụng CPU k m hiệu qủa. Nhƣng nếu sử dụng q quá lớn sẽ làm tăng
thời gian hồi đáp, thời gian chờ trung bình cũng tăng và giảm khả năng tƣơng tác
của hệ thống.
2.6.3.3. Định thời iểu với độ ưu tiên
Mỗi tiến trình đƣợc gán cho một độ ƣu tiên tƣơng ứng, tiến trình có độ ƣu tiên
78
cao nhất sẽ đƣợc chọn để cấp phát CPU đầu tiên. Độ ƣu tiên có thể đƣợc định nghĩa nội
tại hay nhờ vào các yếu tố bên ngoài. Độ ƣu tiên nội tại sử dụng các đại lƣợng có thể
đo lƣờng để tính toán độ ƣu tiên của tiến trình, ví dụ các giới hạn thời gian, nhu cầu bộ
nhớ… Độ ƣu tiên cũng có thể đƣợc gán từ bên ngoài dựa vào các tiêu chuẩn do hệ điều
hành nhƣ tầm quan trọng của tiến trình, loại ngƣời dùng sở hữu tiến trình…
Giải thuật định thời biểu với độ ƣu tiên có thể theo nguyên tắc độc quyền hay
hông độc quyền. Khi một tiến trình đƣợc đƣa vào danh sách các tiến trình sẵn sàng, độ
ƣu tiên của nó đƣợc so sánh với độ ƣu tiên của tiến trình hiện hành đang xử lý. Giải
thuật định thời biểu với độ ƣu tiên và không độc quyền sẽ thu hồi CPU từ tiến trình
hiện hành để cấp phát cho tiến trình mới nếu độ ƣu tiên của tiến trình này cao hơn tiến
trình hiện hành. Một giải thuật độc quyền sẽ chỉ đơn giản chèn tiến trình mới vào danh
sách sẵn sàng, và tiến trình hiện hành vẫn tiếp tục xử lý hết thời gian dành cho nó.
X t các tiến trình P1, P2, P3 đến theo thứ tự:
Tiến trình Thời điểm vào RL Độ ƣu tiên Thời gian xử lý
chỉ số 1 là cao nhất (ms)
P1 0 3 24
P2 1 1 3
P3 2 2 3
Bản 2 11. Ví dụ về định thời bi u với độ ưu ti n
Sử dụng giải thuật ƣu tiên độc quyền, thứ tự cấp phát CPU nhƣ sau :
P1 P2 P3
0 24 27 30
Bản 2 12. Bi u đồ Gannt ví dụ về định thời bi u với độ ưu ti n độc quyền
Thời gian chờ trung bình là (0+23+25)/3 = 16 ms.
Sử dụng giải thuật ƣu tiên không độc quyền, thứ tự cấp phát CPU nhƣ sau:
P1 P2 P3 P1
0 1 4 7 30
Bản 2 13. Bi u đồ Gannt ví dụ về định thời bi u với độ ưu ti n hông độc quyền
79
Thời gian chờ trung bình là (6+0+2)/3 = 2.66 ms.
- Nhận xét: Một giải thuật không độc quyền bao giờ cũng tối ƣu hơn giải thuật độc
quyền. Tình trạng “đói CPU” starvation là một vấn đề chính yếu của các giải
thuật sử dụng độ ƣu tiên. Các giải thuật này có thể để các tiến trình có độ ƣu tiên
thấp chờ đợi CPU vô hạn! Để ngăn cản các tiến trình có độ ƣu tiên cao chiếm dụng
CPU vô thời hạn, bộ định thời biểu sẽ giảm dần chỉ số độ ƣu tiên của các tiến trình
chờ sau mỗi ngắt đồng hồ. Nếu chỉ số độ ƣu tiên của tiến trình này giảm xuống
thấp hơn tiến trình có chỉ số độ ƣu tiên cao thứ nhì, sẽ xảy ra sự chuyển đổi quyền
sử dụng CPU. Quá trình này gọi là sự “l o hóa” (aging) tiến trình.
2.6.3.4. Chiến lược công việc ngắn nhất trước Shortest-job-first- SJF)
Đây là một trƣờng hợp đặc biệt của giải thuật định thời biểu với độ ƣu tiên. Trong
giải thuật này, độ ƣu tiên p đƣợc gán cho mỗi tiến trình là nghịch đảo của thời gian xử
lý t mà tiến trình yêu cầu : p = 1/t. Khi CPU đƣợc tự do, nó sẽ đƣợc cấp phát cho tiến
trình yêu cầu ít thời gian xử lý nhất để kết thúc- tiến trình ngắn nhất trƣớc. Giải thuật
này cũng có thể độc quyền hay hông độc quyền. Sự chọn lựa xảy ra khi có một tiến
trình mới đƣợc đƣa vào danh sách sẵn sàng trong khi một tiến trình khác đang xử lý.
SJF độc quyền: một CPU khi đƣợc giao cho một tiến trình, tiến trình sẽ chiếm
dụng CPU cho đến hết thời gian xử lý của nó.
SJF hông độc quyền: nếu một tiến trình mới đến có thời gian sử dụng CPU ngắn
hơn thời gian thực hiện c n lại của tiến trình đang xử lý thì giao CPU cho tiến trình
mới đến.
X t các tiến trình đến theo thứ tự:
Tiến trình Thời điểm vào RL Thời gian xử lý ms
P1 6 0
P2 8 1
P3 4 2
P4 2 3
Bản 2 14. Ví dụ về định thời bi u SJF
80
Sử dụng giải thuật SJF độc quyền, thứ tự cấp phát CPU nhƣ sau:
P1 P4 P3 P2
0 6 8 12 20
Bản 2 15. Bi u đồ Gannt ví dụ về định thời bi u SJF độc quyền
Thời gian chờ trung bình = (0+11+6+3)/4 = 5,0 ms.
Số lần chuyển đổi ngữ cảnh : 3
Sử dụng giải thuật SJF không độc quyền, thứ tự cấp phát CPU nhƣ sau:
P1 P4 P1 P3 P2
0 3 5 8 12 20
Bản 2 16. Bi u đồ Gannt ví dụ về định thời bi u SJF hông độc quyền
Thời gian chờ trung bình = (2+11+6+0)/4 = 4,75 ms.
Số lần chuyển đổi ngữ cảnh : 4
- Nhận xét: Giải thuật SJF không độc quyền cho phép đạt đƣợc thời gian chờ trung
bình cực tiểu. Khó khăn thực sự của giải thuật SJF là không thể biết đƣợc thời gian
yêu cầu xử lý c n lại của tiến trình? Chỉ có thể dự đoán giá trị này theo cách tiếp
cận sau: gọi tn là độ dài của thời gian xử lý lần thứ n, n+1 là giá trị dự đoán cho lần xử lý tiếp theo. Với hy vọng giá trị dự đoán sẽ gần giống với các giá trị trƣớc
đó, có thể sử dụng công thức:
n+1 = tn + (1- ) n
Trong công thức này,tn chứa đựng thông tin gần nhất ; n chứa đựng các thông tin quá khứ đƣợc tích lũy. Tham số (0 1 kiểm soát trọng số của hiện tại gần
hay quá khứ ảnh hƣởng đến công thức dự đoán.
2.6.3.5. Chiến lược định thời iểu với hàng đợi đa cấp nhiều cấp độ ưu tiên)
Ý tƣởng chính của giải thuật là phân lớp các tiến trình tùy theo độ ƣu tiên của
chúng để có cách thức định thời biểu thích hợp cho từng nhóm. Danh sách sẵn sàng
đƣợc phân tách thành các danh sách riêng biệt theo cấp độ ƣu tiên, mỗi danh sách bao
gồm các tiến trình có cùng độ ƣu tiên và đƣợc áp dụng một giải thuật định thời biểu
thích hợp để định thời biểu. Ngoài ra, c n có một giải thuật định thời biểu giữa các
81
nhóm, thƣờng giải thuật này là giải thuật không độc quyền và sử dụng độ ƣu tiên cố
định. Một tiến trình thuộc về danh sách ở cấp ƣu tiên i sẽ chỉ đƣợc cấp phát CPU khi
Độ ƣu tiên cao nhất
Tiến trình hệ thống
Tiến trình tƣơng tác
Tiến trình không tƣơng tác
Tác vụ xử lý theo lô
Tiến trình thực tập
Độ ƣu tiên thấp nhất
các danh sách ở cấp ƣu tiên lớn hơn i đ trống.
Hình 2.23. Định thời bi u nhiều c p độ ưu ti n
- Nhận xét: Thông thƣờng, một tiến trình sẽ đƣợc gán vĩnh vi n với một danh sách
ở cấp ƣu tiên i khi nó đƣợc đƣa vào hệ thống. Các tiến trình không di chuyển giữa
các danh sách. Cách tổ chức này sẽ làm giảm chi phí định thời biểu, nhƣng lại
thiếu linh động và có thể dẫn đến tình trạng “đói CPU” cho các tiến trình thuộc về
những danh sách có độ ƣu tiên thấp. Do vậy có thể xây dựng giải thuật định thời
biểu với hàng đợi ph n hồi đa c p. Giải thuật này sẽ chuyển dần một tiến trình từ
danh sách có độ ƣu tiên cao xuống danh sách có độ ƣu tiên thấp hơn sau mỗi lần sử
dụng CPU. Cũng vậy, một tiến trình chờ quá lâu trong các danh sách có độ ƣu tiên
thấp cũng có thể đƣợc chuyển dần lên các danh sách có độ ƣu tiên cao hơn.
2.6.3.6. Chiến lược định thời iểu với hàng đợi phản hồi đa cấp
Thông thƣờng, trong giải thuật hàng đợi đa cấp, các quá trình đƣợc gán vĩnh vi n
tới hàng đợi khi đƣợc đƣa vào hệ thống. Các quá trình không di chuyển giữa các hàng
đợi. Nếu có các hàng đợi riêng cho các quá trình giao tiếp và các quá trình nền thì các
quá trình không di chuyển từ một hàng đợi này tới hàng đợi khác vì các quá trình
không thay đổi tính tự nhiên giữa giao tiếp và nền. Cách tổ chức này có ích vì chi phí
82
định thời thấp nhƣng thiếu linh động và có thể dẫn đến tình trạng “đói CPU”.
Tuy nhiên, định thời hàng đợi phản hồi đa cấp cho ph p một quá trình di chuyển
giữa các hàng đợi. Ý tƣởng là tách riêng các quá trình với các đặc điểm chu kỳ CPU
khác nhau. Nếu một quá trình dùng quá nhiều thời gian CPU thì nó sẽ đƣợc di chuyển
tới hàng đợi có độ ƣu tiên thấp. Cơ chế này để lại các quá trình hƣớng nhập/xuất và các
quá trình giao tiếp trong các hàng đợi có độ ƣu tiên cao hơn. Tƣơng tự, một quá trình
chờ quá lâu trong hàng đợi có độ ƣu tiên thấp hơn có thể đƣợc di chuyển tới hàng đợi
Q0
Q1
Q2
có độ ƣu tiên cao hơn. Đây là hình thức của sự l o hóa nhằm ngăn chặn sự đói CPU.
Hình 2.24. Hàng đợi ph n hồi đa c p
Ví dụ, x t một bộ định thời hàng đợi phản hồi đa cấp với ba hàng đợi đƣợc đánh
số từ Q0 tới Q2 hình 2.24 . Bộ định thời trƣớc tiên thực thi tất cả quá trình chứa trong
hàng đợi Q0. Chỉ khi hàng đợi Q0 rỗng nó sẽ thực thi các quá trình trong hàng đợi Q1.
Tƣơng tự, các quá trình trong hàng đợi Q2 sẽ đƣợc thực thi chỉ nếu hàng đợi Q0 và Q1
rỗng. Một quá trình đến hàng đợi Q1 sẽ ƣu tiên hơn quá trình đến hàng đợi Q2. Tƣơng
tự, một quá trình đến hàng đợi Q0 sẽ ƣu tiên hơn một quá trình vào hàng đợi Q1.
Một quá trình đƣa vào hàng đợi sẵn sàng đƣợc đặt trong hàng đợi Q0. Một quá
trình trong hàng đợi Q0 đƣợc cho một định mức thời gian là 8 ms. Nếu nó không kết
thúc trong thời gian này thì nó sẽ di chuyển vào đuôi của hàng đợi Q1. Nếu hàng đợi
Q0 rỗng thì quá trình tại đầu của hàng đợi Q1 đƣợc cho định mức thời gian là 16ms.
Nếu nó không hoàn thành thì nó bị tƣớc CPU và đƣợc đặt vào hàng đợi Q2. Các quá
83
trình trong hàng đợi Q2 đƣợc chạy trên cơ sở FCFS chỉ khi hàng đợi Q0 và Q1 rỗng.
Giải thuật định thời này cho độ ƣu tiên cao nhất tới bất cứ quá trình nào với chu
kỳ CPU 8 ms hay ít hơn. Một quá trình nhƣ thế sẽ nhanh chóng nhận CPU, kết thúc
chu kỳ CPU của nó và bỏ đi chu kỳ I/O kế tiếp của nó. Các quá trình cần hơn 8ms
nhƣng ít hơn 24ms đƣợc phục vụ nhanh chóng mặc dù với độ ƣu tiên thấp hơn các quá
trình ngắn hơn. Các quá trình dài tự động rơi xuống hàng đợi Q2 và đƣợc phục vụ
trong thứ tự FCFS với bất cứ chu kỳ CPU c n lại từ hàng đợi Q0 và Q1.
Giả sử có 5 tiến trình đến theo thứ tự:
Tiến trình Thời điểm vào RL Thời gian xử lý ms
P1 0 40
P2 5 10
P3 10 15
P4 12 20
P5 55 10
Bản 2 17. Ví dụ về định thời bi u hàng đợi ph n hồi đa c p
Sử dụng giải thuật hàng đợi phản hồi đa cấp trong Hình 2.24, thứ tự cấp phát
CPU nhƣ sau:
P1 P2 P3 P4 P1 P2 P3 P5 P4 P5 P1
0 8 16 24 32 48 50 57 65 77 79 95
Bản 2 18. Bi u đồ Gannt ví dụ về định thời bi u hàng đợi ph n hồi đa c p
Thời gian chờ trung bình = (55+35+32+45+14)/5 = 36,2 ms.
Số lần chuyển đổi ngữ cảnh : 10
- Khi xây dựng một giải thuật định thời biểu với hàng đợi ph n hồi đa c p cần quyết
định các tham số:
o Số lƣợng các cấp ƣu tiên
o Giải thuật định thời biểu cho từng danh sách ứng với một cấp ƣu tiên.
o Phƣơng pháp xác định thời điểm di chuyển một tiến trình lên danh sách
có độ ƣu tiên cao hơn.
o Phƣơng pháp xác định thời điểm di chuyển một tiến trình xuống danh
84
sách có độ ƣu tiên thấp hơn.
o Phƣơng pháp sử dụng để xác định một tiến trình mới đƣợc đƣa vào hệ
thống sẽ thuộc danh sách ứng với độ tiên nào.
2.6.3.7. Chiến lược định thời iểu xổ số Lottery)
Ý tƣởng chính của giải thuật là phát hành một số v số và phân phối cho các tiến
trình trong hệ thống. Khi đến thời điểm ra quyết định định thời biểu, sẽ tiến hành chọn
1 v "trúng giải", tiến trình nào sở hữu v này sẽ đƣợc nhận CPU.
- Nhận xét: Giải thuật Lottery cung cấp một giải pháp đơn giản nhƣng bảo đảm tính
công bằng cho thuật toán định thời biểu với chi phí thấp để cập nhật độ ƣu tiên cho
các tiến trình.
2.6.3.8. Định thời iểu đa ộ xử lý
Phần trên đây chúng ta tập trung vào các chiến lƣợc định thời biểu tiến trình trong
một hệ thống với một bộ vi xử lý đơn. Nếu có nhiều CPU, vấn đề định thời biểu tƣơng
ứng sẽ phức tạp hơn. Nhiều khả năng đ đƣợc thử nghiệm và nhƣ chúng ta đ thấy với
định thời biểu trong hệ thống đơn bộ xử lý, không có giải pháp tốt nhất. Trong phần
sau đây, chúng ta sẽ thảo luận vắn tắt một số vấn đề tập trung về định thời biểu đa bộ
xử lý. Chúng ta tập trung vào những hệ thống mà các bộ xử lý của nó đƣợc xác định
hay đồng nhất trong thuật ngữ chức năng của chúng; bất cứ bộ xử lý nào sẵn có thì có
thể đƣợc dùng để chạy bất kỳ quá trình nào trong hàng đợi. Chúng ta cũng cho rằng
truy xuất bộ nhớ đồng nhất uniform memory access-UMA . Chỉ những chƣơng trình
đƣợc biên dịch đối với tập hợp chỉ thị của bộ xử lý đƣợc cho mới có thể đƣợc chạy trên
chính bộ xử lý đó.
Ngay cả trong một bộ đa xử lý đồng nhất đôi khi có một số giới hạn cho việc định
thời biểu. X t một hệ thống với một thiết bị nhập/xuất đƣợc gán tới một đƣờng bus
riêng của một bộ xử lý. Các quá trình muốn dùng thiết bị đó phải đƣợc định thời biểu
để chạy trên bộ xử lý đó, ngƣợc lại thiết bị đó là không sẵn dùng.
Nếu nhiều bộ xử lý xác định sẵn dùng thì chia s tải có thể xảy ra. Nó có thể cung
cấp một hàng đợi riêng cho mỗi bộ xử lý. Tuy nhiên, trong trƣờng hợp này, một bộ xử
lý có thể rảnh với hàng đợi rỗng, trong khi bộ xử lý khác rất bận. Để ngăn chặn trƣờng
hợp này, chúng ta dùng một hàng đợi sẵn sàng chung. Tất cả quá trình đi vào một hàng
85
đợi và đƣợc định thời biểu trên bất cứ bộ xử lý sẵn dùng nào.
Trong một cơ chế nhƣ thế, một trong hai tiếp cận định thời biểu có thể đƣợc
dùng. Trong tiếp cận thứ nhất, mỗi bộ xử lý định thời biểu chính nó. Mỗi bộ xử lý xem
x t hàng đợi sẵn sàng chung và chọn một quá trình để thực thi. Nếu chúng ta có nhiều
bộ xử lý cố gắng truy xuất và cập nhật một cấu trúc dữ liệu chung thì mỗi bộ xử lý phải
đƣợc lập trình rất cẩn thận. Chúng ta phải đảm bảo rằng hai bộ xử lý không chọn cùng
quá trình và quá trình đó không bị mất từ hàng đợi. Tiếp cận thứ hai tránh vấn đề này
bằng cách đề cử một bộ xử lý nhƣ bộ định thời biểu cho các quá trình khác, do đó tạo
ra cấu trúc chủ-tớ master-slave).
vài hệ thống thực hiện cấu trúc này từng bƣớc bằng cách tất cả quyết định định
thời biểu, xử lý nhập/xuất và các hoạt động hệ thống khác đƣợc quản lý bởi một bộ xử
lý đơn-một server chủ. Các bộ xử lý khác chỉ thực thi m ngƣời dùng. Đa xử lý không
đối xứng asymmetric multiprocessing đơn giản hơn đa xử lý đối xứng symmetric
multiprocessing vì chỉ một quá trình truy xuất các cấu trúc dữ liệu hệ thống, làm giảm
đi yêu cầu chia s dữ liệu. Tuy nhiên, nó cũng không hiệu quả. Các quá trình giới hạn
nhập/xuất có thể gây thắt cổ chai bottleneck trên một CPU đang thực hiện tất cả các
hoạt động. Điển hình, đa xử lý không đối xứng đƣợc cài đặt trƣớc trong một hệ điều
hành và sau đó đƣợc nâng cấp tới đa xử lý đối xứng khi hệ thống tiến triển.
2.6.3.9. Định thời iểu thời gian thực
Trong chƣơng đầu chúng ta đ tìm hiểu tổng quan về hệ điều hành thời thực và
thảo luận tầm quan trọng của nó. Ở đây, chúng ta tiếp tục thảo luận bằng cách mô tả
các điều kiện thuận lợi định thời biểu cần để hỗ trợ tính toán thời thực trong hệ thống
máy tính đa mục đích.
Tính toán thời thực đƣợc chia thành hai loại: hệ thống thời thực cứng đƣợc yêu
cầu để hoàn thành một công việc tới hạn trong lƣợng thời gian đƣợc đảm bảo. Thông
thƣờng, một quá trình đƣợc đƣa ra xem x t cùng với khai báo lƣợng thời gian nó cần
để hoàn thành hay thực hiện nhập/xuất. Sau đó, bộ định thời biểu nhận đƣợc quá trình,
đảm bảo rằng quá trình sẽ hoàn thành đúng giờ hay từ chối yêu cầu khi không thể.
Điều này đƣợc gọi là đặt trƣớc tài nguyên. Để đảm bảo nhƣ thế đ i hỏi bộ định thời
biểu biết chính xác bao lâu mỗi loại chức năng hệ điều hành mất để thực hiện và do đó
mỗi thao tác phải đƣợc đảm bảo để mất lƣợng thời gian tối đa. Một đảm bảo nhƣ thế là
không thể trong hệ thống với lƣu trữ phụ và bộ nhớ ảo vì các hệ thống con này gây ra
86
sự biến đổi không thể tránh hay không thể thấy trƣớc trong lƣợng thời gian thực thi
một quá trình xác định. Do đó, hệ thống thời thực cứng đƣợc hình thành từ nhiều phần
mềm có mục đích đặc biệt chạy trên phần cứng tận hiến cho các quá trình tới hạn, và
thiếu chức năng đầy đủ của các máy tính và các hệ điều hành hiện đại. Tính toán thời
gian thực mềm ít nghiêm khắc hơn. Nó yêu cầu các quá trình tới hạn nhận độ ƣu tiên
cao hơn các quá trình khác. Mặc dù, thêm chức năng thời thực mềm tới hệ chia s thời
gian có thể gây ra việc cấp phát tài nguyên không công bằng và có thể dẫn tới việc trì
ho n lâu hơn hay thậm chí đói tài nguyên đối với một số quá trình, nhƣng nó ít có thể
đạt đƣợc. Kết quả là hệ thống mục đích chung cũng có thể hỗ trợ đa phƣơng tiện, đồ
họa giao tiếp tốc độ cao, và nhiều công việc khác nhƣng không hỗ trợ tính toán thời
thực mềm.
2.7. ĐỒNG BỘ HÓ TIẾN TR NH
2.7.1. Liên lạc giữa các tiến trình
2.7.1.1 Nhu cầu liên lạc giữa các tiến trình
Trong môi trƣờng đa chƣơng, một tiến trình không độc lập trong hệ thống, mà nó
có thể ảnh hƣởng đến các tiến trình khác, hoặc bị các tiến trình khác tác động. Nói cách
khác, các tiến trình là những thực thể độc lập, nhƣng chúng vẫn có nhu cầu liên lạc với
nhau để:
Chia s thông tin: nhiều tiến trình có thể cùng quan tâm đến những dữ liệu nào đó,
do vậy hệ điều hành cần cung cấp một môi trƣờng cho ph p sự truy cập đồng thời
đến các dữ liệu chung.
Hợp tác hoàn thành công việc: đôi khi để đạt đƣợc một sự xử lý nhanh chóng,
ngƣời ta phân chia một công việc thành các công việc nhỏ có thể tiến hành song
song. Thƣờng thì các công việc nhỏ này cần hợp tác với nhau để cùng hoàn thành
công việc ban đầu, ví dụ dữ liệu kết xuất của tiến trình này lại là dữ liệu nhập cho
tiến trình khác… Trong các trƣờng hợp đó, hệ điều hành cần cung cấp cơ chế để
các tiến trình có thể trao đổi thông tin với nhau.
2.7.1.2. Các vấn đề nảy sinh trong việc liên lạc giữa các tiến trình
Do mỗi tiến trình sở hữu một không gian địa chỉ riêng biệt, nên các tiến trình
87
không thể liên lạc trực tiếp d dàng mà phải nhờ vào các cơ chế do hệ điều hành cung
cấp. Khi cung cấp cơ chế liên lạc cho các tiến trình, hệ điều hành thƣờng phải tìm giải
pháp cho các vấn đề chủ yếu sau:
Li n ết tường minh hay tiềm ẩn: tiến trình có cần phải biết tiến trình nào đang trao
đổi hay chia s thông tin với nó? Mối liên kết đƣợc gọi là tƣờng minh khi đƣợc
thiết lập rõ ràng, trực tiếp giữa các tiến trình; và là tiềm ẩn khi các tiến trình liên
lạc với nhau thông qua một qui ƣớc ngầm nào đó.
Li n ạc theo chế độ đồng bộ hay hông đồng bộ: khi một tiến trình trao đổi thông
tin với một tiến trình khác, các tiến trình có cần phải đợi cho thao tác liên lạc hoàn
tất rồi mới tiếp tục các xử lý khác? Các tiến trình liên lạc theo cơ chế đồng bộ sẽ
chờ nhau hoàn tất việc liên lạc, c n các tiến trình liên lạc theo cơ chế nonblocking
thì không.
Li n ạc giữa các tiến trình trong hệ thống t p trung và hệ thống phân tán: cơ chế
liên lạc giữa các tiến trình trong cùng một máy tính có sự khác biệt với việc liên lạc
giữa các tiến trình giữa những máy tính khác nhau?
Hầu hết các hệ điều hành đƣa ra nhiều cơ chế liên lạc khác nhau, mỗi cơ chế có
những đặc tính riêng, và thích hợp trong một hoàn cảnh chuyên biệt.
2.7.2. Các cơ chế thông tin liên lạc
2.7.2.1. Tín hiệu Signal)
Tín hiệu là một cơ chế phần mềm tƣơng tự nhƣ các ngắt cứng tác động đến các
tiến trình. Một tín hiệu đƣợc sử dụng để thông báo cho tiến trình về một sự kiện nào đó
xảy ra. Có nhiều tín hiệu đƣợc định nghĩa, mỗi một tín hiệu có một ý nghĩa tƣơng ứng
88
với một sự kiện đặc trƣng.
Ví dụ : Một số tín hiệu của UNIX
Tín hiệu Mô tả
SIGINT Ngƣời dùng nhấn phím DEL để ngắt xử lý tiến trình
SIGQUIT Yêu cầu thoát xử lý
SIGILL Tiến trình xử lý một chỉ thị bất hợp lệ
SIGKILL Yêu cầu kết thúc một tiến trình
SIGFPT Lỗi floating – point xảy ra chia cho 0)
SIGPIPE Tiến trình ghi dữ liệu vào ống dẫn mà không có reader
SIGSEGV Tiến trình truy xuất đến một địa chỉ bất hợp lệ
SIGCLD Tiến trình con kết thúc
SIGUSR1 Tín hiệu 1 do ngƣời dùng định nghĩa
SIGUSR2 Tín hiệu 2 do ngƣời dùng định nghĩa
Bản 2 19. Một số tín hiệu của UNIX
Mỗi tiến trình sở hữu một bảng biểu di n các tín hiệu khác nhau. Với mỗi tín hiệu
sẽ có tƣơng ứng một trình xử lý tín hiệu qui định các xử lý của tiến trình khi nhận đƣợc
tín hiệu tƣơng ứng.
Các tín hiệu đƣợc gởi đi bởi :
Phần cứng ví dụ lỗi do các ph p tính số học
Hạt nhân hệ điều hành gởi đến một tiến trình ví dụ lƣu ý tiến trình khi có một
thiết bị nhập/xuất tự do .
Một tiến trình gởi đến một tiến trình khác ví dụ tiến trình cha yêu cầu một tiến
trình con kết thúc
Ngƣời dùng ví dụ nhấn phím Ctl-C để ngắt xử lý của tiến trình
Khi một tiến trình nhận một tín hiệu, nó có thể xử sự theo một trong các cách
sau :
Bỏ qua tín hiệu
Xử lý tín hiệu theo kiểu mặc định
89
Tiếp nhận tín hiệu và xử lý theo cách đặc biệt của tiến trình.
Hình 2.25. Li n ạc b ng tín hiệu
- Nhận xét: Liên lạc bằng tín hiệu mang tính chất không đồng bộ, nghĩa là một tiến
trình nhận tín hiệu không thể xác định trƣớc thời điểm nhận tính hiệu. Hơn nữa các
tiến trình không thể kiểm tra đƣợc sự kiện tƣơng ứng với tín hiệu có thật sự xảy ra?
Cuối cùng, các tiến trình chỉ có thể thông báo cho nhau về một biến cố nào đó, mà
không trao đổi dữ liệu theo cơ chế này đƣợc.
2.7.2.2. Ống dẫn Pipe)
ng dẫn là một kênh liên lạc trực tiếp giữa hai tiến trình: dữ liệu xuất của tiến
trình này đƣợc chuyển đến làm dữ liệu nhập cho tiến trình kia dƣới dạng một d ng các
Byte.
Khi ống dẫn đƣợc thiết lập giữa hai tiến trình, một trong chúng sẽ ghi dữ liệu vào
ống dẫn và tiến trình kia sẽ đọc dữ liệu từ ống dẫn. Thứ tự dữ liệu truyền qua ống dẫn
đƣợc bảo toàn theo nguyên tắc FIFO. Một ống dẫn có kích thƣớc giới hạn thƣờng là
ng dẫn
P1
P2
c b …. a
4096 ký tự
Hình 2.26. Li n ạc qua ống dẫn
Một tiến trình chỉ có thể sử dụng một ống dẫn do nó tạo ra hay kế thừa từ tiến
90
trình cha. Hệ điều hành cung cấp các lời gọi hệ thống read/write cho các tiến trình thực
hiện thao tác đọc/ghi dữ liệu trong ống dẫn. Hệ điều hành cũng chịu trách nhiệm đồng
bộ hóa việc truy xuất ống dẫn trong các tình huống:
- Tiến trình đọc ống dẫn sẽ bị khóa nếu ống dẫn trống, nó sẽ phải đợi đến khi ống
dẫn có dữ liệu để truy xuất.
- Tiến trình ghi ống dẫn sẽ bị khóa nếu ống dẫn đầy, nó sẽ phải đợi đến khi ống dẫn
có chỗ trống để chứa dữ liệu.
- Nhận xét: Liên lạc bằng ống dẫn là một cơ chế liên lạc một chiều (unidirectiona ),
nghĩa là một tiến trình kết nối với một ống dẫn chỉ có thể thực hiện một trong hai
thao tác đọc hoặc ghi, nhƣng không thể thực hiện cả hai. Một số hệ điều hành cho
ph p thiết lập hai ống dẫn giữa một cặp tiến trình để tạo liên lạc hai chiều. Trong
những hệ thống đó, có nguy cơ xảy ra tình trạng t c nghẽn deadlock : một ống
dẫn bị giới hạn về kích thƣớc, do vậy nếu cả hai ống dẫn nối kết hai tiến trình đều
đầy hoặc đều trống và cả hai tiến trình đều muốn ghi hay đọc dữ liệu vào ống
dẫn mỗi tiến trình ghi dữ liệu vào một ống dẫn , chúng sẽ cùng bị khóa và chờ lẫn
nhau mãi mãi!
Cơ chế này cho ph p truyền dữ liệu với cách thức không cấu trúc.
Ngoài ra, một giới hạn của hình thức liên lạc này là chỉ cho ph p kết nối hai tiến
trình có quan hệ cha-con, và trên cùng một máy tính.
2.7.2.3. Vùng nhớ chia s
Cách tiếp cận của cơ chế này là cho nhiều tiến trình cùng truy xuất đến một vùng
nhớ chung gọi là v ng nhớ chia sẻ (shared memory). Không có bất kỳ hành vi truyền
dữ liệu nào cần phải thực hiện ở đây, dữ liệu chỉ đơn giản đƣợc đặt vào một vùng nhớ
mà nhiều tiến trình có thể cùng truy cập đƣợc.
Với phƣơng thức này, các tiến trình chia s một vùng nhớ vật lý thông qua trung
gian không gian địa chỉ của chúng. Một vùng nhớ chia s tồn tại độc lập với các tiến
trình, và khi một tiến trình muốn truy xuất đến vùng nhớ này, tiến trình phải kết gắn
vùng nhớ chung đó vào không gian địa chỉ riêng của từng tiến trình, và thao tác trên đó
91
nhƣ một vùng nhớ riêng của mình.
P1
P2
Vùng nhớ chia s
Hình 2.27. Li n ạc qua v ng nhớ chia sẻ
- Nhận xét:. Đây là phƣơng pháp nhanh nhất để trao đổi dữ liệu giữa các tiến trình.
Nhƣng phƣơng thức này cũng làm phát sinh các khó khăn trong việc bảo đảm sự
toàn vẹn dữ liệu, ví dụ : làm sao biết đƣợc dữ liệu mà một tiến trình truy xuất là dữ
liệu mới nhất mà tiến trình khác đ ghi ? Làm thế nào ngăn cản hai tiến trình cùng
đồng thời ghi dữ liệu vào vùng nhớ chung ?…Rõ ràng vùng nhớ chia s cần đƣợc
bảo vệ bằng những cơ chế đồng bộ hóa thích hợp..
Một khuyết điểm của phƣơng pháp liên lạc này là không thể áp dụng hiệu quả
trong các hệ phân tán, để trao đổi thông tin giữa các máy tính khác nhau.
2.7.2.4. Trao đổi thông điệp Message)
Hệ điều hành c n cung cấp một cơ chế liên lạc giữa các tiến trình không thông
qua việc chia s một tài nguyên chung , mà thông qua việc gởi thông điệp. Để hỗ trợ cơ
chế liên lạc bằng thông điệp, hệ điều hành cung cấp các hàm IPC chuẩn Interprocess
communication , cơ bản là hai hàm:
Send(message) : gởi một thông điệp
Receive(message) : nhận một thông điệp
Nếu hai tiến trình P và Q muốn liên lạc với nhau, cần phải thiết lập một mối liên
kết giữa hai tiến trình, sau đó P, Q sử dụng các hàm IPC thích hợp để trao đổi thông
điệp, cuối cùng khi sự liên lạc chấm dứt mối liên kết giữa hai tiến trình sẽ bị hủy. Có
nhiều cách thức để thực hiện sự liên kết giữa hai tiến trình và cài đặt các theo tác
Send/Receive tƣơng ứng: liên lạc trực tiếp hay gián tiếp, liên lạc đồng bộ hoặc không
đồng bộ, kích thƣớc thông điệp là cố định hay không… Nếu các tiến trình liên lạc theo
kiểu liên kết tƣờng minh, các hàm Send và Receive sẽ đƣợc cài đặt với tham số:
Send destination, message : gởi một thông điệp đến destination
92
Receive source,message : nhận một thông điệp từ source
- Nhận xét: Đơn vị truyền thông tin trong cơ chế trao đổi thông điệp là một
thông điệp, do đó các tiến trình có thể trao đổi dữ liệu ở dạng có cấu trúc.
2.7.2.5. Sockets
Một socket là một thiết bị truyền thông hai chiều tƣơng tự nhƣ tập tin, chúng ta có
thể đọc hay ghi lên nó, tuy nhiên mỗi socket là một thành phần trong một mối nối
nào đó giữa các máy trên mạng máy tính và các thao tác đọc/ghi chính là sự trao đổi dữ
liệu giữa các ứng dụng trên nhiều máy khác nhau.
Sử dụng socket có thể mô phỏng hai phƣơng thức liên lạc trong thực tế: liên lạc
thƣ tín socket đóng vai tr bƣu cục và liên lạc điện thoại socket đóng vai trò
tổng đài .
Các thuộc tính của socket:
Domaine: định nghĩa dạng thức địa chỉ và các nghi thức sử dụng. Có nhiều
domaines, ví dụ UNIX, INTERNET, XEROX_NS, ...
Type: định nghĩa các đặc điểm liên lạc:
Sự tin cậy
Sự bảo toàn thứ tự dữ liệu
Lặp lại dữ liệu
Chế độ nối kết
Bảo toàn giới hạn thông điệp
Khả năng gởi thông điệp khẩn
Để thực hiện liên lạc bằng socket, cần tiến hành các thao tác:
Tạo lập hay mở một socket
Gắn kết một socket với một địa chỉ
Liên lạc: Có hai kiểu liên lạc tùy thuộc vào chế độ nối kết:
Li n ạc trong chế độ hông i n ết : liên lạc theo hình thức hộp thƣ
o Hai tiến trình liên lạc với nhau không kết nối trực tiếp
93
o Mỗi thông điệp phải kèm theo địa chỉ ngƣời nhận.
Hình thức liên lạc này có đặc điểm:
o Ngƣời gởi không chắc chắn thông điệp của họ đƣợc gởi đến ngƣời
nhận.
o Một thông điệp có thể đƣợc gởi nhiều lần
o Hai thông điệp đƣợc gởi theo một thứ tự nào đó có thể đến tay ngƣời
nhận theo một thứ tự khác.
Một tiến trình sau khi đ mở một socket có thể sử dụng nó để liên lạc với
nhiều tiến trình khác nhau nhờ sử dụng hai primitive send và receive.
Li n ạc trong chế độ nối ết:
Một liên kết đƣợc thành lập giữa hai tiến trình. Trƣớc khi mối liên kết này đƣợc
thiết lập, một trong hai tiến trình phải đợi có một tiến trình khác yêu cầu kết nối. Có thể
sử dụng socket để liên lạc theo mô hình Client-Server . Trong mô hình này, server sử
dụng lời gọi hệ thống listen và accept để nối kết với Client, sau đó Client và server có
thể trao đổi thông tin bằng cách sử dụng các primitive send và receive.
- Hủy một socket
Ví dụ: Trong nghi thức truyền thông TCP, mỗi mối nối giữa hai máy tính đƣợc
xác định bởi một port, khái niệm port ở đây không phải là một cổng giao tiếp trên thiết
bị vật lý mà chỉ là một khái niệm logic trong cách nhìn của ngƣời lập trình, mỗi
port đƣợc tƣơng ứng với một số nguyên dƣơng.
Hình 2.28. Các soc et và port trong mối nối TCP11.
Hình 2.28 minh họa một cách giao tiếp giữa hai máy tính trong nghi thức truyền
11 Trần Hạnh Nhi, Bài giảng điện tử hệ điều hành, ĐH Khoa học tự nhiên TP.HCM
94
thông TCP. Máy A tạo ra một socket và kết buộc bind socket này với một port X tức
là một số nguyên dƣơng có ý nghĩa cục bộ trong máy A , trong khi đó máy B tạo một
socket khác và móc vào (connect) port X trong máy A.
- Nhận xét: Cơ chế socket có thể sử dụng để chuẩn hoá mối liên lạc giữa các tiến
trình vốn không liên hệ với nhau, và có thể hoạt động trong những hệ thống khác
nhau.
2.7.3. Nhu cầu đồng ộ hóa synchronisation)
Trong một hệ thống cho ph p các tiến trình liên lạc với nhau, bao giờ hệ điều
hành cũng cần cung cấp kèm theo những cơ chế đồng bộ hóa để bảo đảm hoạt động
của các tiến trình đồng hành không tác động sai lệch đến nhau vì các lý do sau đây:
2.7.3.1. Yêu cầu độc quyền truy xuất Mutual exclusion)
Các tài nguyên trong hệ thống đƣợc phân thành hai loại: tài nguyên có thể chia sẻ
cho ph p nhiều tiến trình đồng thời truy xuất, và tài nguyên hông th chia sẻ chỉ chấp
nhận một hay một số lƣợng hạn chế tiến trình sử dụng tại một thời điểm. Tính không
thể chia s của tài nguyên thƣờng có nguồn gốc từ một trong hai nguyên nhân sau đây:
Đặc tính cấu tạo phần cứng của tài nguyên không cho ph p chia s .
Nếu nhiều tiến trình sử dụng tài nguyên đồng thời, có nguy cơ xảy ra các kết
quả không dự đoán đƣợc do hoạt động của các tiến trình trên tài nguyên ảnh
hƣởng lẫn nhau.
Để giải quyết vấn đề, cần bảo đảm tiến trình độc quyền truy xuất tài nguyên,
nghĩa là hệ thống phải kiểm soát sao cho tại một thời điểm, chỉ có một tiến
trình đƣợc quyền truy xuất một tài nguyên không thể chia s .
2.7.3.2. Yêu cầu phối hợp Synchronization)
Nhìn chung, mối tƣơng quan về tốc độ thực hiện của hai tiến trình trong hệ thống
là không thể biết trƣớc, vì điều này phụ thuộc vào nhiều yếu tố động nhƣ tần suất xảy
ra các ngắt của từng tiến trình, thời gian tiến trình đƣợc cấp phát bộ xử lý … Có thể nói
rằng các tiến trình hoạt động không đồng bộ với nhau. Nhƣng có những tình huống các
tiến trình cần hợp tác trong việc hoàn thành công việc, khi đó cần phải đồng bộ hóa
hoạt động của các tiến trình, ví dụ một tiến trình chỉ có thể xử lý nếu một tiến trình
95
khác đ kết thúc một công việc nào đó …
2.7.4. Tài nguyên găng và đoạn găng
2.7.4.1. Tài nguyên găng Critical Resource)
Trong môi trƣờng hệ điều hành đa nhiệm - đa chƣơng – đa ngƣời dùng, việc chia
s tài nguyên cho các tiến trình của ngƣời dùng, dùng chung là cần thiết, nhƣng nếu hệ
điều hành không tổ chức tốt việc sử dụng tài nguyên dùng chung của các tiến trình hoạt
động đồng thời, thì không những không mang lại hiệu quả khai thác tài nguyên của hệ
thống mà c n làm hỏng dữ liệu của các ứng dụng. Và nguy hiểm hơn là việc hỏng dữ
liệu này có thể hệ điều hành và ứng dụng không thể phát hiện đƣợc. Việc hỏng dữ liệu
của ứng dụng có thể làm sai lệch ý nghĩa thiết kế của nó. Đây là điều mà cả hệ điều
hành và ngƣời lập trình đều không mong muốn.
Các tiến trình hoạt động đồng thời thƣờng cạnh tranh với nhau trong việc sử dụng
tài nguyên dùng chung. Hai tiến trình hoạt động đồng thời cùng ghi vào một không
gian nhớ chung một biến chung trên bộ nhớ hay hai tiến trình đồng thời cùng ghi dữ
liệu vào một tập tin chia s , đó là những biểu hiện của sự cạnh tranh về việc sử dụng tài
nguyên dùng chung của các tiến trình. Để các tiến trình hoạt động đồng thời không
cạnh tranh hay xung đột với nhau khi sử dụng tài nguyên dùng chung hệ điều hành
phải tổ chức cho các tiến trình này đƣợc độc quyền truy xuất/sử dụng trên các tài
nguyên dùng chung này.
Những tài nguy n được hệ điều hành chia sẻ cho nhiều tiến trình hoạt động đồng
thời, mà c nguy cơ dẫn đến sự tranh ch p giữa các tiến trình này hi s dụng chúng,
được gọi à tài nguy n găng. Tài nguyên găng có thể là tài nguyên phần cứng hoặc tài
nguyên phần mềm, có thể là tài nguyên phân chia đƣợc hoặc không phân chia đƣợc,
nhƣng đa số thƣờng là tài nguyên phân chia đƣợc nhƣ là: các biến chung, các t p tin
chia sẻ, t p tin cơ s dữ iệu
Các ví dụ sau đây cho thấy hậu quả của việc sử dụng tài nguyên găng trong các
chƣơng trình có các tiến trình hoạt động đồng thời:
Ví dụ 1: Giả sử có một chƣơng trình, trong đó có hai tiến trình P1 và P2 hoạt
động đồng thời với nhau. Tiến trình P1 phải tăng biến Count lên 1 đơn vị, tiến trình P2
phải tăng biến Count lên 1 đơn vị, với mục đích tăng Count lên đƣợc 2 đơn vị.
96
Chƣơng trình có thể thực hiện nhƣ sau:
1. Tiến trình P1 ghi nội dung biến toàn cục Count vào biến cục bộ L1
2. Tiến trình P2 ghi nội dung biến toàn cục Count vào biến cục bộ L2
3. Tiến trình P1 thực hiện L1:= L1 + 1 và Count := L1
4. Tiến trình P2 thực hiện L2:= L2 + 1 và Count := L2
Nhƣ vậy thoạt nhìn ta thấy rằng chắc chắn Count đ tăng đƣợc 2 đơn vị, nhƣng
trong thực tế có thể Count chỉ tăng đƣợc 1 đơn vị. Bởi vì, nếu P1 và P2 đồng thời nhận
giá trị của Count giả sử ban đầu Count = 4 vào L1 và L2, sau đó P1 tăng L1 lên 1 và
P2 tăng L2 lên 1 L1 = 5, L2 = 5 , rồi sau đó cả P1 và P2 đồng thời ghi giá trị biến L
của nó vào lại Count, thì Count chỉ tăng đƣợc 1 đơn vị, Count= 5. Đây là điều mà
chƣơng trình không mong muốn nhƣng cả chƣơng trình và hệ điều hành đều khó có thể
phát hiện đƣợc.
Nguyên nhân ở trên là do hai tiến trình P1 và P2 đồng thời truy xuất biến Count,
cả khi nhận giá trị của count, lẫn khi ghi giá trị vào Count. Trong trƣờng hợp này nếu
hệ điều hành không cho ph p hai tiến trình P1 và P2 đồng thời truy xuất Count, hoặc
hệ điều hành cho ph p mỗi tiến trình đƣợc độc quyền truy xu t Count trong đoạn mã
lệnh sau, thì lỗi trên sẽ không xảy ra.
P1 P2
Begin Begin
L1 := Count; L2 := Count;
L1 := L1 + 1; L2 := L2 + 1;
Count := L1; Count := L2;
End; End;
Trong trƣờng hợp này tài nguy n găng là biến Count.
Ví dụ 2: Giả sử có hai tiến trình P1 và P2 đồng hành thực hiện công việc của các kế toán, và cùng chia s một vùng nhớ chung lƣu trữ biến taikhoan phản ánh thông tin
về tài khoản. Mỗi tiến trình muốn rút một khoản tiền tienrut từ tài khoản:
if (taikhoan - tienrut >=0)
taikhoan = taikhoan - tienrut;
else
97
error(« khong the rut tien ! »);
Giả sử trong tài khoản hiện c n 800, P1 muốn rút 500 và P2 muốn rút 400.
P1 rút 500 P2 rút 400
if (taikhoan - tienrut >=0) if (taikhoan - tienrut >=0)
taikhoan = taikhoan - tienrut; taikhoan = taikhoan - tienrut;
else else
error(« khong the rut tien ! »); error(« khong the rut tien ! »);
Tiến trình P1 và P2 đồng thời rút tiền. Theo nguyên tắc điều trên không thể xảy ra, vì tổng số tiền mà hai tiến trình cần rút lớn hơn số tiền c n lại trong tài khoản 500 +
400 > 800 . Nhƣng trong môi trƣờng đa nhiệm, đa ngƣời dùng nếu hệ điều hành không
giám sát tốt việc sử dụng tài nguyên dùng chung của các tiến trình hoạt động đồng thời
thì điều trên vẫn có thể xảy ra. tức là, cả hai tiến trình P1 và P2 đều thành công trong thao tác rút tiền, mà ứng dụng cũng nhƣ hệ điều hành không hề phát hiện. Bởi vì, quá trình rút tiền của các tiến trình P1 và P2 có thể di n ra nhƣ sau:
P1 Sau khi đ kiểm tra điều kiện (taikhoan - tienrut >=0) và nhận kết quả là 300, P1 hết thời gian xử lý mà hệ thống cho ph p, hệ điều hành cấp phát CPU cho P2.
P2 kiểm tra cùng điều kiện trên, nhận đƣợc kết quả là 400 (do P1 vẫn chƣa rút
tiền và rút 400. Giá trị của taikhoan đƣợc cập nhật lại là 400.
Khi P1 đƣợc tái kích hoạt và tiếp tục xử lý, nó sẽ không kiểm tra lại điều kiện (taikhoan - tienrut >=0)-vì đã kiểm tra trong lượt xử lý trước- mà thực
hiện rút tiền. Giá trị của taikhoan sẽ lại đƣợc cập nhật thành -100. Tình huống
lỗi xảy ra!
Nhƣ vậy cả 2 tiến trình P1 và P2 đều hoàn thành việc rút tiền, không thông báo lỗi, mà không gặp bất kỳ một lỗi hay một trở ngại nào. Nhƣng đây là một lỗi nghiêm trọng
đối với ứng dụng, vì không thể rút một khoảng tiền lớn hơn số tiền c n lại trong tài
khoản, hay Tài khoản không thể nhận giá trị âm.
98
Nguyên nhân của lỗi này không phải là do hai tiến trình P1 và P2 đồng thời truy xuất biến Tài khoản, mà do hai thao tác: kiểm tra tài khoản và thực hiện rút tiền, của
các tiến trình này bị tách rời nhau. Nếu hệ điều hành làm cho hai thao tác này không
tách rời nhau thì lỗi này sẽ không xảy ra. Trong trƣờng hợp này tài nguy n găng là
biến taikhoan.
Các tình huống tƣơng tự nhƣ thế - có thể xảy ra khi có nhiều hơn hai tiến
trình đọc và ghi dữ liệu trên cùng một vùng nhớ chung nhƣ taikhoan, và kết quả phụ
thuộc vào sự điều phối của hệ thống- đƣợc gọi là các tình huống tranh đoạt điều
hi n (race condition) gọi t t à cạnh tranh
2.7.4.2. Đoạn găng CS-critical section)
Đoạn găng (miền găng): Đoạn mã ệnh dùng chung trong các tiến trình đồng
thời, đoạn này c hành động truy c p (đọc/ghi) đến các tài nguy n găng được gọi à
đoạn găng hay miền găng. Tức là, các đoạn m lệnh dùng chung trong các chƣơng
trình dùng để truy cập đến các vùng nhớ chia s biến Count, biến taikhoan , các tập
tin chia s đƣợc gọi là các đoạn găng.
Trong ví dụ 1 ở trên có hai đoạn găng là:
{ L1 := Count và Count := L1}
Trong ví dụ 2 ở trên, đoạn m lệnh sau đây là đoạn găng:
{ IF Tài khoản - Tiền rút >= 0 Tài khoản := Tài khoản - Tiền rút }
Để hạn chế các lỗi có thể xảy ra do sử dụng tài nguyên găng, hệ điều hành phải
điều khiển các tiến trình sao cho, tại một thời điểm chỉ có một tiến trình nằm trong
đoạn găng, nếu có nhiều tiến trình cùng muốn vào thực hiện đoạn găng thì chỉ có một
tiến trình đƣợc vào, các tiến trình khác phải chờ, một tiến trình khi ra khỏi kết thúc
đoạn găng phải báo cho hệ điều hành và/hoặc các tiến trình khác biết để các tiến trình
này vào đoạn găng, vv. Các công tác điều khiển tiến trình thực hiện trên đoạn găng của
hệ điều hành đƣợc gọi là đồng bộ tiến trình qua đoạn găng. Để công tác đồng bộ tiến
trình qua đoạn găng đƣợc thành công, thì cần phải có sự phối hợp giữa vi xử lý, hệ điều
hành và ngƣời lập trình. Vi xử lý đƣa ra các chỉ thị, hệ điều hành cung cấp các công cụ
để ngƣời lập trình xây dựng các sơ đồ đồng bộ hợp lý, để đảm bảo sự độc quyền trong
99
việc sử dụng tài nguyên găng của các tiến trình.
Trong phần sau đây chúng ta sẽ tìm hiểu về các phƣơng pháp và các sơ đồ đồng
bộ tiến trình qua đoạn găng. Nhƣng trƣớc hết ở đây chúng ta chấp nhận một mẫu
chương trình được sử dụng trong các sơ đồ đồng bộ tiến trình. Mẫu chƣơng trình này
mang tính chất trừu tƣợng, dùng để minh hoạ cho các ý tƣởng đồng bộ.
Rất ít ngôn ngữ lập trình hỗ trợ cú phát viết chƣơng trình đồng bộ này. Mặc dầu
đ cung cấp đầy đủ các công cụ đồng bộ tiến trình cho ngƣời lập trình, nhƣng các hệ
điều hành hiện nay đều tổ chức đồng bộ tiến trình ngay trong lõi kernel của nó nên
ngƣời lập trình ít quan tâm đến tổ chức đồng bộ tiến trình khi lập trình. Sau đây là sơ
đồ đồng bộ minh hoạ:
Program MultualExclution; Const N = ….. /*số lượng tiến trình */ {--------------------------------------------------} Procedure P(i: integer); Begin Repeat EnterCritical(R); //kiểm tra và xác lập quyền vào đoạn găng <Đoạn găng của P>; ExitCritical(R); //xác lập khi rời đoạn găng <Đoạn không găng của>; Until .F. End; {---------------------------------------------------}
//chương trình chính chứa các tiến trình đồng thời
BEGIN PerBegin P(1); P(2); ….. P(n); ParEnd; END. {---------------------------------------------------}
Sơ đồ trên tổ chức đồng bộ cho n tiến trình P, n tiến trình này hoạt động đồng thời
với nhau và chia s tài nguyên dùng chung R. Mỗi tiến trình trong trƣờng hợp này có
một đoạn găng với tài nguyên R. Để tổ chức truy xuất độc quyền trên tài nguyên găng,
mỗi tiến trình trƣớc khi vào đoạn găng tiến trình phải gọi thủ tục EnterCritical() để
thiết lập quyền vào đoạn găng, để báo cho các tiến trình biết là tiến trình hiện tại đang
ở trong đoạn găng. Để ra khỏi đoạn găng mỗi tiến trình phải gọi thủ tục ExitCritical(),
100
để báo cho các tiến trình khác biết là tiến trình hiện tại đ ra khỏi đoạn găng.
2.7.4.3. Điều kiện của công tác đồng ộ qua đoạn găng
Trƣớc hết chúng ta lƣu ý lại rằng, nhiệm vụ đồng bộ tiến trình phải là sự phối hợp
giữ phần cứng vi xử lý, hệ điều hành, ngôn ngữ lập trình và ngƣời lập trình, trong đó
nhiệm vụ chính là của hệ điều hành và ngƣời lập trình. Vi xử lý, hệ điều hành và ngôn
ngữ lập trình cung cấp các công cụ để hệ điều hành và/hoặc ngƣời lập trình tổ chức sơ
đồ đồng bộ. Hệ điều hành sẽ giám sát và tổ chức thực hiện các sơ đồ đồng bộ này. Cho
dù nhiệm vụ đồng bộ là của thành phần nào, thì tất cả phải đạt đƣợc các yêu cầu sau:
(1) Tại một thời điểm không thể có hai tiến trình nằm trong đoạn găng. Nếu có
nhiều tiến trình đồng thời cùng xin đƣợc vào đoạn găng thì chỉ có một tiến
trình đƣợc ph p vào đoạn găng, các tiến trình khác phải xếp hàng chờ trong
hàng đợi.
(2) Tiến trình chờ ngoài đoạn găng không đƣợc ngăn cản các tiến trình khác vào
đoạn găng.
(3) Không có tiến trình nào đƣợc ph p ở lâu vô hạn trong đoạn găng và không
có tiến trình phải chờ lâu mới đƣợc vào đoạn găng chờ trong hàng đợi .
(4) Nếu tài nguyên găng đƣợc giải phóng thì hệ điều hành có nhiệm vụ đánh
thức các tiến trình trong hàng đợi ra để tạo điều kiện cho nó vào đoạn găng.
(5) Không có giả thiết nào đặt ra cho sự liên hệ về tốc độ của các tiến trình, cũng
nhƣ về số lƣợng bộ xử lý trong hệ thống.
Trƣớc khi tìm hiểu về các giải pháp đồng bộ tiến trình qua đoạn găng chúng ta
cần lƣu ý một lần nữa rằng: nguyên lý cơ bản của đồng bộ là tổ chức truy xuất độc
quyền trên tài nguyên găng, nhƣng sự bắt buộc độc quyền này c n tồn tại hai hạn chế
lớn:
Các tiến trình c th dẫn đến t c nghẽn (Dead oc ) trong hệ thống. Chúng ta
sẽ tìm hiểu về tắc nghẽn sau, bây gời chúng ta h y xem một ví dụ về tắc
nghẽn: Giả nhƣ có hai tiến trình P1 và P2, và hai tài nguyên găng R1 và R2,
mỗi tiến trình đều cần truy xuất đến hai tài nguyên này. Và trƣờng hợp sau
đây hoàn toàn có thể xảy ra: R1 đang đƣợc giao cho P2, R2 đƣợc giao cho P1.
Mỗi tiến trình đều chờ đợi đƣợc sử dụng tài nguyên thứ hai. Không một tiến
101
trình nào giải phóng tài nguyên mà nó đang sở hữu cho đến khi có nhận đƣợc
tài nguyên c n lại để thực hiện đoạn găng của nó. Cả hai tiến trình đó đều bị
t c nghẽn – t t c các thread đều rơi vào trạng thái chờ vô hạn
Các tiến trình c th bị đ i (Starvation) tài nguy n: Ví dụ sau đây cho thấy sự
đói tài nguyên của các tiến trình trên hệ thống: Giả sử rằng có 3 tiến trình P1,
P2, P3, mỗi tiến trình đều cần truy xuất định kỳ đến tài nguyên R. X t trƣờng
hợp P1 đang sở hữu tài nguyên c n hai tiến trình P2, P3 phải chờ đợi tài
nguyên đó. Khi mà P1 thoát khỏi đoạn găng của nó, cả P2 lẫn P3 đều có thể
đƣợc chấp nhận truy xuất đến R. Giả sử rằng P3 đƣợc truy xuất R, sau đó
trƣớc khi P3 kết thúc đoạn găng của nó P1 lại một lần nữa cần truy xuất, và
giả sử P1 đƣợc đáp ứng. Sau đó đến lƣợt P3 truy xuất. Nhƣ vậy P1, P3 thay
nhau nhận đƣợc quyền truy xuất tài nguyên R thì P2 hầu nhƣ không thể truy
cập đến tài nguyên, cho dù không có sự tắc nghẽn nào xảy ra. Trƣờng hợp này
P2 bị đ i tài nguy n – chỉ một vài thread ph i chờ đợi vô hạn định
2.7.5. Đồng ộ tiến trình qua đoạn găng
2.7.5.1. Các giải pháp phần cứng
2.7.5.1.1. Dùng cặp chỉ thị STI & CLI
Một số vi xử lý cung cấp cặp chỉ thị CLI và STI để ngƣời lập trình thực hiện các
thao tác mở ngắt STI: Setting Interrupt và cấm ngắt CLI: Clean Interrupt của hệ
thống trong lập trình. Ngƣời lập trình có thể dùng cặp chỉ thị này để tổ chức đồng bộ
cho các tiến trình nhƣ sau: Trƣớc khi vào đoạn găng tiến trình thực hiện chỉ thị CLI, để
yêu cầu cấm các ngắt trong hệ thống, khi đó ngắt đồng hồ không thể phát sinh, nghĩa là
không có một tiến trình nào khác có thể phát sinh, nhờ đó mà tiến trình trong đoạn
găng toàn quyền sử dụng tài nguyên găng cho đến hết thời gian xử lý của nó. Khi kết
thúc truy xuất tài nguyên găng, tiến trình ra khỏi đoạn găng, tiến trình thực hiện chỉ thị
STI để cho ph p ngắt trở lại. Khi đó các tiến trình khác có thể tiếp tục hoạt động và có thể vào đoạn găng12.
Trong sơ đồ đồng bộ này tiến trình Pi đƣợc viết nhƣ sau:
Procedure P(i: integer); Begin
; //cấm ngắt trước khi vào đoạn găng
Repeat CLI 12 Nguy n Kim Tuấn, Giáo trình hệ điều hành, ĐH Huế, 2004,tr.60
102
; // mở ngắt khi ra khỏi đoạn găng
<Đoạn găng của P>; STI <Đoạn không găng>;
Until .F.
End; {-----------------------------------------------}
Sơ đồ trên cho thấy, khi tiến trình ở trong đoạn găng nó không hề bị ngắt, do đ
cấm ngắt phát sinh, nên nó đƣợc độc quyền sử dụng tài nguyên găng cho đến khi ra
khỏi đoạn găng.
Sơ đồ đồng bộ này đơn giản, d cài đặt. Tuy nhiên, cần phải có sự hỗ trợ của vi
xử lý và d gây ra hiện tƣợng treo toàn bộ hệ thống, khi tiến trình trong đoạn găng
không có khả năng ra khỏi đoạn găng. Tiến trình không ra khỏi đoạn găng nên nó
không thể thực hiện chỉ thị STI để mở ngắt cho hệ thống, nên hệ thống bị treo hoàn
toàn.
Giải pháp này không thể sử dụng trên các hệ thống đa xử lý, vì CLI chỉ cấm ngắt
trên vi xử lý hiện tại chứ không thể cấm ngắt các vi xử lý khác. Tức là, sau khi đ cấm
ngắt, tiến trình trong đoạn găng vẫn có thể bị tranh chấp tài nguyên găng bởi các tiến
trình trên các vi xử lý khác trong hệ thống.
2.7.5.1.2. Dùng chỉ thị TSL Test and set)
Trong ví dụ 2 ở trên ta đ thấy, nguyên nhân của lỗi là do hai thao tác kiểm tra tài
khoản và rút tiền, bị tách rời nhau. Để tổ chức đồng bộ cho những trƣờng hợp nhƣ vậy,
một số vi xử lý cung cấp một chỉ thị đặc biệt cho ph p kiểm tra và cập nhật nội dung
;// hai lệnh này không ;// thể tách rời
một vùng nhớ trong một thao tác không thể phân chia đƣơc, gọi là Test and Set lock TSL . TSL đƣợc định nghĩa nhƣ sau13:
Function TestAndSetLock(Var I:Integer):Boolean; Begin IF I = 0 Then Begin I := 1 TestAndSetLock:=True End Else TestAndSetLock := False End; {-------------------------------------------------}
13 Nguy n Kim Tuấn, Giáo trình hệ điều hành, ĐH Huế, 2004,tr.61
103
Để tổ chức đồng bộ tiến trình với TSL chƣơng trình phải sử dụng biến chia s
Lock, khởi gán bằng 0. Theo đó, mỗi tiến trình trƣớc khi vào đoạn găng phải kiểm tra
giá trị của Lock. Nếu Lock = 0 thì vào đoạn găng. Nếu Lock = 1 thì phải đợi cho đến
khi Lock = 0. Nhƣ vậy, trƣớc khi vào đoạn găng tiến trình phải gọi hàm
TestAndSetLock, để kiểm tra giá trị trả về của hàm này:
Nếu bằng False, là đang có một tiến trình trong đoạn găng, thì phải chờ cho đến
khi hàm trả về True, có một tiến trình vừa ra khỏi đoạn găng.
Nếu bằng True, thì tiến trình s vào đoạn găng để sử dụng tài nguyên găng. Khi
kết thúc sử dụng tài nguyên găng ra khỏi đoạn găng thì tiến trình phải đặt lại gía
trị của Lock, Lock = 0, để các tiến trình khác có thể vào đoạn găng.
Nên nhớ rằng TestAndSetLock là chỉ thị của CPU, nên hệ thống đ tổ chức thực
hiện độc quyền cho nó. Tức là, các thao tác mà hệ thống phải thực hiện trong chỉ thị
này là không thể tách rời nhau.
Trong sơ đồ đồng bộ này tiến trình P đƣợc viết nhƣ sau:
Procedure P(Lock: integer); Begin Repeat
<Đoạn găng của P>;
While (TestAndSetlock(lock)) DO; Lock:= 0;
<Đoạn không găng>;
Until .F. End; {---------------------------------------------}
Sơ đồ này đơn giản, d cài đặt nhƣng cần phải có sự hỗ trợ của vi xử lý. Ngoài ra
nó c n một hạn chế lớn là gây l ng phí thời gian xử lý của CPU do tồn tại hiện tƣợng
chờ đợi tích cực trong sơ đồ While TestAndSetlock lock DO; . Hiện tƣợng chờ đợi
tích cực là hiện tƣợng CPU chỉ chờ một sự kiện nào đó xảy ra mà không làm gì cả.
T m ại: Việc sử dụng các chỉ thị phần cứng đặc biệt để tổ chức đồng bộ tiến trình
qua đoạn găng, hay c n gọi là tổ chức truy xuất độc quyền trên tài nguyên găng, có
những thuận lợi và bất lợi sau đây:
Thu n ợi:
Nó thích hợp với một số lƣợng bất kỳ các tiến trình cả trên hệ hệ thống Đơn xử
104
lý và hệ thống Đa xử lý.
Nó khá đơn giản cho nên d xác định độ chính xác.
Nó có thể đƣợc sử dụng để hỗ trợ cho nhiều đoạn găng; mỗi đoạn găng có thể
định nghĩa cho nó một biến riêng.
B t ợi:
Trong khi một tiến trình đang chờ đợi đƣợc vào đoạn găng thì nó tiếp tục làm
tốn thời gian xử lý của CPU, mà ta gọi là chờ đợi tích cực.
Sự đói tài nguyên có thể xảy ra. Khi một tiến trình rời khỏi một đoạn găng, bộ
phận đồng bộ tiến trình phải chọn một tiến trình trong số nhiều tiến trình ngoài
đoạn găng để cho nó vào đoạn găng. Việc chọn này có thể dẫn đến hiện tƣợng
có một tiến trình đợi m i mà không thể vào đoạn găng đƣợc.
Sự tắc nghẽn có thể xảy ra. H y x t một tình huống trên một hệ thống đơn xử
lý. Tiến trình P1 thực thi chỉ thị đặc biệt TesAndSetLock, Exchange và vào
đoạn găng của nó. P1 sau đó bị ngắt để nhƣờng CPU cho P2, P2 là tiến trình có
độ ƣu tiên cao hơn. Nếu nhƣ P2 cũng định sử dụng tài nguyên nhƣ P1, P2 sẽ bị
từ chối truy xuất bởi vì cơ chế độc quyền. Do đó P2 sẽ đi vào v ng lặp busy -
Waitting. Tuy nhiên, P1 sẽ không bao giờ đƣợc cấp CPU để tiếp tục vì nó có độ
ƣu tiên thấp hơn so với P2.
2.7.5.2. Các giải pháp dùng iến khoá
2.7.5.2.1. Dùng iến khoá chung
Xuất phát từ nguyên tắc cơ bản của tổ chức độc quyền là, tại mỗi thời điểm chỉ có
duy nhất một tiến trình có thể truy xuất đến một vùng nhớ chia s , các hệ điều hành sử
dụng biến khoá chung để tổ chức truy xuất độc quyền trên tài nguyên găng. Phƣơng
pháp này c n gọi là phƣơng pháp Busy and Waitting bận và đợi , nó đƣợc nhà toán
học ngƣời Hà Lan tên là Dekker đề xuất.
Với mỗi tài nguyên găng, hệ điều hành dùng một biến chung để điều khiển việc
sử dụng tài nguyên này của các tiến trình đồng thời. Tạm gọi là biến chung này là
Lock, Lock đƣợc chia s cho nhiều tiến trình và đƣợc khởi gán = 0.
105
Theo đó, mỗi tiến trình trƣớc khi vào đoạn găng phải kiểm tra giá trị của Lock:
Nếu Lock = 1, tức là đ có tiến trình nào đó trong đoạn găng, thì tiến trình phải
chờ cho đến khi Lock = 0 có thể chuyển sang trạng thái blocked để chờ .
Nếu Lock = 0, tức là không có tiến trình nào trong đoạn găng, thì tiến trình thiết
lập quyền vào đoạn găng, đặt Lock = 1, và vào đoạn găng. Tiến trình vừa ra
khỏi đoạn găng phải đặt Lock = 0, để các tiến trình khác có thể vào đoạn găng.
Trong sơ đồ đồng bộ này tiến trình P đƣợc viết nhƣ sau:
Procedure P(Lock: integer);
// đợi cho đến khi Lock = 0 // thiết lập quyền vào đoạn găng // vào đoạn găng // thông báo là đã rời đoạn găng
Begin Repeat Lock :=1; Lock:= 0;
While Lock = 1 DO ; <Đoạn găng của P>; <Đoạn không găng>;
Until .F.
End; {------------------------------------------------}
Sơ đồ đồng bộ dùng biến khoá chung này đơn giản, d xây dựng nhƣng vẫn xuất
hiện hiện tƣợng chờ đợi tích cực, khi chờ cho đến khi Lock = 0 While Lock =1 DO;
//Không làm gì cả . Hiện tƣợng chờ đợi tích cực gây l ng phí thời gian của CPU. Mặt
khác, nếu một tiến trình trong đoạn găng không thể ra khỏi đoạn găng, thì các tiến trình
chờ ngoài đoạn găng có thể chờ đợi vô hạn vì Lock không đƣợc đặt lại = 0 .
2.7.5.2.2. Dùng iến khoá riêng
Để khắc phục hạn chế của phƣơng pháp dùng biến chung, các hệ điều hành có thể
dùng giải pháp biến riêng để tổ chức đồng bộ tiến trình. Mỗi tiến trình sử dụng một
biến khoá Lock riêng, tƣơng ứng với một tài nguyên găng trong hệ thống. Biến khoá
riêng của tất cả các tiến trình đều đƣợc khởi gán bằng 0, tức là chƣa vào đoạn găng.
Theo đó, mỗi tiến trình trƣớc khi vào đoạn găng ứng với một tài nguyên găng nào
đó thì trƣớc hết phải kiểm tra biến khoá riêng, tƣơng ứng với tài nguyên găng mà tiến
trình muốn truy xuất, của tất cả các tiến trình c n lại:
Nếu tồn tại một biến khoá riêng của một tiến trình nào đó bằng 1, Lock= 1, tức
là đ có một tiến trình nào đó ở trong đoạn găng, thì tiến trình phải chờ ngoài
106
đoạn găng cho đến khi tất cả biến khoá riêng = 0.
Nếu tất cả các biến khóa riêng của các tiến trình đều = 0, Lock = 0, tức là không
có tiến trình nào trong đoạn găng, thì tiến trình thiết lập quyền vào đoạn găng,
đặt Lock = 1, và vào đoạn găng. Tiến trình vừa ra khỏi đoạn găng phải đặt
Lock=0, để các tiến trình khác có thể vào đoạn găng.
Sau đây là sơ đồ đồng bộ dùng biến khoá riêng cho hai tiến trình đồng thời P1 và
P2. Hai tiến trình này dùng hai biến khoá riêng là Lock1 và Lock2:
Program MultualExclution;
Const N:2; Var
Lock1, Lock2: byte;
BEGIN
Lock1 = 0; Lock2 = 0;
ParBegin
P1: Repeat
// tiến trình P1
While Lock2 = 1 Do ; // P2 đang ở trong đoạn găng
// P1 thiết lập quyền vào đoạn găng
Lock1 := 1;
<Đoạn găng của P1>;
;
// P1 ra khỏi đoạn găng
<Đoạn không găng của P1>;
Lock1 := 0 Until .F. P2: Repeat
// tiến trình P2
While Lock1 = 1 Do; // P1 đang ở trong đoạn găng
// P2 thiết lập quyền vào đoạn găng
<Đoạn găng của P2>;
// P2 ra khỏi đoạn găng
<Đoạn không găng của P2>;
Lock2 := 1; Lock2 := 0; Until .F.
ParEnd END.
{--------------------------------------------------------}
Sơ đồ này đơn giản d cài đặt. Một tiến trình nào đó ở ngoài đoạn găng bị
blocked sẽ không ngăn cản đƣợc các tiến trình khác vào đoạn găng, nhƣng nếu tiến
trình trong đoạn găng bị lỗi không thể ra khỏi đoạn găng , Lock luôn luôn = 1, thì các
tiến trình khác sẽ không đƣợc quyền vào đoạn găng.
Phƣơng pháp này vẫn c n tồn tại hiện tƣợng chờ đợi tích cực và sơ đồ đồng bộ sẽ
trở nên phức tạp khi có nhiều hơn hai tiến trình muốn vào đoạn găng.
Sơ đồ này có thể xảy ra một lỗi nghiêm trọng đó là: Có thể có hai tiến trình cùng
nằm trong đoạn găng. Nguyên nhân của lỗi này là do việc kiểm tra quyền vào đoạn
găng và và việc xác lập quyền vào đoạn găng của tiến trình bị tách rời khi thực hiện.
107
Tức là, P1 và P2 có thể bị định thời biểu thực hiện theo thứ tự sau:
(1) P1 đƣợc cấp CPU: P1 thực thi v ng lặp While và tìm xem thử Lock2 = 1
không. Khi P1 vừa nhìn thấy Lock2 = 0 đáng l P1 đƣợc ph p vào đoạn găng ,
thì bị thu hồi CPU.
(2) P2 đƣợc cấp CPU: P2 thực thi v ng lặp While và tìm xem thử Lock1 = 1
không. Khi P2 vừa nhìn thấy Lock1 = 0, thì bị thu hồi CPU.
(3) P1 đƣợc cấp CPU trở lại: P1 không kiểm tra lại Lock2 mà chỉ đặt Lock1 = 1 và
vào đoạn găng của nó. Khi vừa vào đoạn găng thì bị thu hồi CPU.
(4) P2 đƣợc cấp CPU trở lại: P2 không kiểm tra lại Lock1 mà chỉ đặt Lock2 = 1 và
vào đoạn găng của nó.
Rõ ràng với thực tế này thì cả P1 và P2 đều nằm trong đoạn găng. Và chúng ta đ
biết điều gì sẽ xảy ra khi hai tiến trình đồng thời truy xuất tài nguyên găng trong các ví
dụ về tài nguyên găng ở trên.
2.7.5.3. Các giải pháp được hỗ trợ ởi hệ điều hành và ngôn ngữ lập trình
Các giải pháp trên tồn tại hiện tƣợng chờ đợi tích cực, gây l ng phí thời gian xử
lý của CPU. Điều này có thể khắc phục bằng một nguyên tắc rất cơ bản: nếu một tiến
trình khi chƣa đủ điều kiện vào đoạn găng thì đƣợc chuyển ngay sang trạng thái
blocked, trả lại CPU cho hệ thống cấp cho tiến trình khác. Để thực hiện đƣợc điều này
cần phải có sự hỗ trợ của hệ điều hành và các ngôn ngữ lập trình để các tiến trình có
thể chuyển trạng thái của nó. Hai thủ tục Sleep và Wakeup là các lời gọi hệ thống đƣợc
hệ điều hành cung cấp để sử dụng cho mục đích này:
Khi tiến trình chƣa đủ điều kiện vào đoạn găng nó sẽ thực hiện một lời gọi hệ
thống Sleep, tiến trình này chuyển sang trạng thái blocked và đƣợc đƣa vào
hàng đợi để chờ cho đến khi có một tiến trình khác đánh thức Wakeup để giải
phóng nó ra khỏi hàng đợi cho tiến trình này một cơ hội vào đoạn găng.
Một tiến trình khi ra khỏi đoạn găng phải gọi Wakeup để đánh thức một tiến
trình trong hàng đợi blocked để tạo điều khiện cho tiến trình này vào đoạn găng.
Nhƣ vậy giải pháp này đƣợc áp dụng trên nhóm các tiến trình hoạt động đồng
thời có trao đổi thông tin với nhau, và các tiến trình phải hợp thác với nhau để hoàn
108
thành nhiệm vụ. Các tiến trình này liên lạc với nhau bằng cách gởi tín hiệu cho nhau.
Một tiến trình trong hệ thống này có thể bị buộc phải dừng bị blocked cho đến khi
nhận đƣợc một tín hiệu nào đó từ tiến trình bên kia, đó là tiến trình hợp tác với nó.
Thực tế đ chỉ ra đƣợc rằng, nếu chỉ dùng hai thủ tục trên thì sơ đồ đồng bộ sẽ
không đáp ứng đƣợc các yêu cầu của công tác đồng bộ, do đó khi cài đặt các hệ điều
hành chỉ nên sử dụng ý tƣởng của Sleep và Wakeup mà thôi. Sau đây là các giải pháp
sử dụng ý tƣởng của Sleep và Wakeup.
2.7.5.3.1. Giải pháp dùng Semaphore đèn áo)
Giải pháp này đƣợc Dijkstra đề xuất vào năm 1965. Semaphore đƣợc định nghĩa
để sử dụng trong các sơ đồ đồng bộ nhƣ sau:
Semaphore S là một biến nguyên, khởi gán bằng một giá trị không âm, đó là
khả năng phục vụ của tài nguyên găng tƣơng ứng với nó.
Ứng với S có một hàng đợi F s để lƣu các tiến trình đang bị blocked trên S.
Chỉ có hai thao tác Down và Up đƣợc tác động đến semaphore S. Down S
là giảm S xuống một đơn vị, Up S là tăng S lên một đơn vị.
Mỗi tiến trình trƣớc khi vào đoạn găng thì phải gọi Down để kiểm tra và xác
lập quyền vào đoạn găng. Khi tiến trình gọi Down S thì hệ thống sẽ thực
hiện nhƣ sau: S := S -1, nếu S ≥ 0 thì tiến trình tiếp tục xử lý và vào đoạn
găng, nếu S < 0 thì tiến trình phải vào hàng đợi để chờ cho đến khi S ≥ 0.
Down đƣợc cài đặt nhƣ sau:
Procedure Down(s);
Begin
S := S -1; If S < 0 Then
// S >= 0 thì tiếp tục
Status(p)= blocked; //chuyển tiến trình sang blocked Enter(p, F(s)); //đưa tiến trình vào hàng đợi F(S)
Begin end;
End; {----------------------------------------------------------------}
Mỗi tiến trình ngay sau khi ra khỏi đoạn găng phải gọi Up để kiểm tra xem
có tiến trình nào đang đợi trong hàng đợi hay không, nếu có thì đƣa tiến trình
trong hàng đợi vào đoạn găng. Khi tiến trình gọi Up thì hệ thống sẽ thực hiện
nhƣ sau: S:= S + 1, nếu S ≤ 0 đƣa một tiến trình trong F s vào đoạn găng.
109
Up đƣợc cài đặt nhƣ sau:
Procedure Up(s);
Begin
// đưa tiến trình ra khỏi F(S)
S := S + 1; If S <= 0 Then Begin Exit(Q,F(s) ); Status(Q) = ready ; // chuyển tiến trình sang ready Enter(Q, ready-list ); // đưa tiến trình vào ready list End;
End;
Sau đây là sơ đồ đồng bộ dùng Semaphore cho 2 tiến trình P1 và P2, hai tiến trình
này hoạt động đồng thời cùng truy xuất đến tài nguyên găng tƣơng ứng với semaphore
S. Tài nguyên găng này chỉ có thể đáp ứng cho một tiến trình tại một thời điểm nên S
đƣợc khởi gán bằng 1.
Program MultualExclution; Const n = 2; Var s: semaphore; {-------------------------------------} Procedure P(i:Integer);
Begin
// kiểm tra và xác lập quyền vào đoạn găng
//rời đoạn găng và kích hoạt tiến trình khác
Repeat Down(s); <Đoạn găng>; Up(s); <Đoạn không găng>; Until .F.;
End;
{------------------------------------------} BEGIN
S := 1;
ParBegin P(1); P(2); ParEnd; END. {-------------------------------------------}
Ở đây chúng ta cần lƣu ý rằng: Down và Up là các thủ tục của hệ điều hành, nên
hệ điều hành đ cài đặt cơ chế độc quyền cho nó, tức là các lệnh bên trong nó không
thể tách rời nhau. Nếu điều này không đƣợc thực hiện thì sơ đồ này trở nên vô nghĩa.
Hai thủ tục Down S và Up S mà chúng tôi đƣa ra ở trên chỉ để minh họa cho nguyên
lý hoạt động của Down và Up.
110
Sử dụng semaphore để đồng bộ tiến trình, mang lại những thuận lợi sau:
Mỗi tiến trình chỉ kiểm tra quyền vào đoạn găng một lần, khi chờ nó không
làm gì cả, tiến trình ra khỏi đoạn găng phải đánh thức nó.
Không xuất hiện hiện tƣợng chờ đợi tích cực, nên khai thác tối đa thời gian
xử lý của CPU.
Nhờ cơ chế hàng đợi mà hệ điều hành có thể thực hiện gán độ ƣu tiên cho
các tiến trình khi chúng ở trong hàng đợi.
Trị tuyệt đối của S cho biết số lƣợng các tiến trình đang đợi trên F S .
Nên nhớ rằng, Down và Up là các thủ tục của hệ điều hành nên sơ đồ đồng bộ sẽ
bị thay đổi khi thay đổi hệ điều hành. Đây là một trở ngại của việc sử dụng semaphore
để tổ chức đồng bộ tiến trình.
Các ví dụ sau đây thay cho sự giải thích về sơ đồ đồng bộ ở trên:
Ví dụ 1: Sự thực hiện của hai tiến trình P1 và P2 trong sơ đồ đồng bộ trên:
Thời gian Tiến trình Thủ tục Tài nguyên Trạng thái
1 2 3 4 5 P1 P2 P1 P1 P2 Down Down Up Down Up S=1 0 -1 0 -1 0 P1 đang chạy P2 chờ P2 đang chạy P1 chờ P1 đang chạy
Bản 2 20. Sơ đồ đồng bộ hai tiến trình
Ví dụ 2: Nếu trong hệ thống có 6 tiến trình hoạt động đồng thời, cùng sử dụng tài
nguyên găng, tài nguyên găng này chỉ cho ph p một tiến trình truy xuất đến nó tại một
thời điểm. Tức là hệ điều hành phải tổ chức truy xuất độc quyền trên tài nguyên găng
này. Thứ tự yêu cầu sử dụng tài nguyên găng của các tiến trình đƣợc mô tả nhƣ sau:
Thời gian đến Tiến trình 1 2 3 4 6 8 A B C D E F Thời gian xử lý Độ ưu tiên 1 cao nhất) 4 2 2 2 1 1 5 5 4 2 4 1
111
Bản 2 2 Ví dụ c c t ến tr n yêu cầu sử dụn t n uyên n
Đồng bộ 6 tiến trình trên sử dụng tài nguyên S theo cơ chế độc quyền nhƣ sau:
Thời gian Thủ tục Running Hàng đợi Tiến trình
1 2 3 4 5 6 7 8 9 10 11 12 A B C D A E D F C F E B Down Down Down Down Up Down Up Down Up Up Up Up Tài nguyên S=1 0 -1 -2 -3 -2 -3 -2 -3 -2 -1 0 1 A A A A D D C C F E B - - B CB DCB CB CEB EB F EB EB B - -
Bản 2 22. Sơ đồ đồng bộ 6 tiến trình
Bảng trên lƣu ý với chúng ta hai điều. Thứ nhất, trị tuyệt đối của S cho biết số
lƣợng các tiến trình trong hàng đợi F S . Thứ hai, tiến trình chƣa đƣợc vào đoạn găng
thì đƣợc đƣa vào hàng đợi và tiến trình ra khỏi đoạn găng sẽ đánh thức tiến trình có độ
ƣu tiên cao nhất trong hàng đợi để đƣa nó vào đoạn găng. Tiến trình đƣợc đƣa vào
hàng đợi sau nhƣng có độ ƣu tiên cao hơn sẽ đƣợc đứng trƣớc trong hàng đợi.
2.7.5.3.2. Giải pháp dùng Monitors
Giải pháp này đƣợc Hoar đề xuất năm 1974 sau đó vào năm 1975 đƣợc Brinch &
Hansnen đề xuất lại. Monitor là cấu trúc phần mềm đặc biệt đƣợc cung cấp bởi ngôn
ngữ lập trình đùng để đồng bộ hóa cấp cao, nó bao gồm các thủ tục, các biến và các
cấu trúc dữ liệu đƣợc định nghĩa bởi Monitor. Monitor đƣợc định nghĩa trong các ngôn
ngữ lập trình nhƣ Pascal+, Modula–2, Modula-3. Monitor của Hoar có các tính chất
sau đây:
1. Các biến và cấu trúc dữ liệu bên trong Monitor chỉ có thể đƣợc thao tác bởi các
thủ tục đƣợc định nghĩa bên trong Monitor đó.
2. Một tiến trình muốn vào Monitor phải gọi một thủ tục của Monitor đó.
3. Tại một thời điểm, chỉ có một tiến trình duy nhất đƣợc hoạt động bên trong
112
Monitor. Các tiến trình khác đ gọi Monitor phải ho n lại để chờ Monitor rảnh.
Hai tính chất 1 và 2 tƣơng tự nhƣ các tính chất của các đối tƣợng trong lập trình
hƣớng đối tƣợng. Nhƣ vậy một hệ điều hành hoặc một ngôn ngữ lập trình hƣớng đối
tƣợng có thể cài đặt Monitor nhƣ là một đối tƣợng có các tính chất đặc biệt. Với tính
chất thứ 3 Monitor có khả năng thực hiện các cơ chế độc quyền, các biến trong
Monitor có thể đƣợc truy xuất chỉ bởi một tiến trình tại một thời điểm.
Nhƣ vậy các cấu trúc dữ liệu dùng chung bởi các tiến trình có thể đƣợc bảo vệ
bằng cách đặt chúng bên trong Monitor. Nếu dữ liệu bên trong Monitor là tài nguyên
găng thì Monitor cung cấp sự độc quyền trong việc truy xuất đến tài nguyên găng đó.
Monitor cung cấp các công cụ đồng bộ hoá để ngƣời lập trình sử dụng trong các
sơ đồ đồng bộ. Công cụ đồng bộ hoá đƣợc định nghĩa để sử dụng trong các sơ đồ đồng
bộ nhƣ sau: Trong một Monitor, có thể định nghĩa các biến điều kiện và hai thao tác
kèm theo là Wait và Signal, chỉ có Wait và Signal đƣợc tác động đến các biến điều
kiện.
Giả sử c là biến điều kiện đƣợc định nghĩa trong Monitor.
Wait(c): khi một tiến trình gọi Wait, thì Wait sẽ chuyển tiến trình gọi sang
trạng thái blocked, và đặt tiến trình này vào hàng đợi trên biến điều kiện c. Wait
đƣợc cài đặt nhƣ sau:
Procedure Wait(c); Begin Status(p) = blocked; Enter(p,f(c)); End;
Signal(c): khi một tiến trình gọi Signal, thì Signal sẽ kiểm tra trong hàng đợi
của c có tiến trình nào hay không, nếu có thì tái kích hoạt tiến trình đó, và tiến
trình gọi Signal sẽ rời khỏi Monitor. Signal đƣợc cài đặt nhƣ sau:
Procedure Signal(c); Begin If f(c) <> Null Then Begin
Exit(Q,f(c)); // Q là tiến trình chờ trên C
Status(Q) = ready; Enter(Q,ready-lits); end; End;
113
Trình biên dịch chịu trách nhiệm thực hiện việc truy xuất độc quyền đến dữ liệu
trong Monitor. Để thực hiện điều này, hệ điều hành dùng một semaphore nhị phân.
Mỗi Monitor có một hàng đợi toàn cục lƣu các tiến trình đang chờ đƣợc vào Monitor,
ngoài ra mỗi biến điều kiện c cũng gắn với một hàng đợi F c .
Với mỗi nhóm tài nguyên găng, có thể định nghĩa một Monitor trong đó đặc tả tất
cả các thao tác trên tài nguyên này với một số điều kiện nào đó. Sau đây là cấu trúc
một Monitor:
Monitor
Condition;
{------------------------------------------------------}
Procdure Action1(); //thao tác i
//thao tác n();
Begin ...... End; {---------------------------} Procedure Actionn Begin ...... End;
{---------------------------}
End Monitor;
Mỗi tiến trình muốn sử dụng tài nguyên găng chỉ có thể thao tác thông qua các
thủ tục bên trong Monitor.
Sau đây là sơ đồ đồng bộ sử dụng Monitor cho 2 tiến trình P1 và P2.
Program MultualExclution; Monitor ……. EndMonitor;{Monitor được định nghĩa như trên} BEGIN ParBegin P1: Repeat <Đoạn không găng của P1>;
// Đoạn găng của P1
<Đoạn không găng của P1>;
Until .F.
P2: Repeat
<Đoạn không găng của P2>;
//Đoạn găng của P2
<Đoạn không găng của P2>;
Until .F.
Parend
END. {----------------------------------------------------------------}
114
Với Monitor, việc tổ chức truy xuất độc quyền đƣợc trình biên dịch thực hiện,
nên nó đơn giản hơn cho ngƣời lập trình. Tuy nhiên hiện nay rất ít ngôn ngữ lập trình
hỗ trợ cấu trúc Monitor cho lập trình.
2.7.5.3.3. Giải pháp trao đổi thông điệp Message)
Khi các tiến trình có sự tƣơng tác với tiến trình khác, hai yêu cầu cơ bản cần phải
đƣợc thỏa m n đó là: sự đồng bộ hoá synchronization và sự truyền thông
(communication . Các tiến trình phải đƣợc đồng bộ để thực hiện độc quyền. Các tiến
trình hợp tác có thể cần phải trao đổi thông tin. Một hƣớng tiếp cận để cung cấp cả hai
chức năng đó là sự truyền thông điệp message passing . Truyền thông điệp có ƣu điểm
là có thể thực hiện đƣợc trên cả hai hệ thống đơn xử lý và đa xử lý, khi các hệ thống
này hoạt động trên mô hình bộ nhớ chia s .
Các hệ thống truyền thông điệp có thể có nhiều dạng. Trong phần này chúng tôi
giới thiệu một dạng chung nhất mà trong đó đề cập đến các đặc trƣng có trong nhiều hệ
thống khác nhau. Các hàm của truyền thông điệp trên thực tế có dạng tƣơng tự nhƣ hai
hàm sau:
Send destination, message : gởi thông điệp đến tiến trình đích destination.
Receive source, message : nhận thông điệp từ tiến trình nguồn source.
Một tiến trình gởi thông tin dƣới dạng một thông điệp đến một tiến trình khác,
bằng hàm Send, đƣợc nhận biết bởi tham số destination. Một tiến trình nhận thông
điệp, bằng hàm Receive, từ một tiến trình đƣợc nhận biết bởi tham số source. Tiến
trình gọi Receive phải chờ cho đến khi nhận đƣợc message từ tiến trình source thì mới
có thể tiếp tục đƣợc.
Việc sử dụng Send và Receive để tổ chức đồng bộ đƣợc thực hiện nhƣ sau:
Có một tiến trình kiểm soát việc sử dụng tài nguyên găng.
Có nhiều tiến trình khác yêu cầu sử dụng tài nguyên găng này.
Tiến trình có yêu cầu tài nguyên găng sẽ gởi một thông điệp đến tiến trình
kiểm soát và sau đó chuyển sang trạng thái blocked cho đến khi nhận đƣợc
một thông điệp chấp nhận cho truy xuất từ tiến trình kiểm soát tài nguyên
115
găng.
Khi sử dụng xong tài nguyên găng, tiến trình vừa sử dụng tài nguyên găng
gởi một thông điệp khác đến tiến trình kiểm soát để báo kết thúc truy xuất.
Tiến trình kiểm soát, khi nhận đƣợc thông điệp yêu cầu tài nguyên găng, nó
sẽ chờ cho đến khi tài nguyên găng sẵn sàng để cấp phát thì gởi một thông
điệp đến tiến trình đang bị khoá trên tài ngyên đó để đánh thức tiến trình
này.
Trong sơ đồ đồng bộ dùng message tiến trình P đƣợc viết nhƣ sau:
Procedure P(i: Integer);
Begin Repeat Send(process controler, request message); Receive(process controler, accept message ); <Đoạn găng của P>; Send(process controler ,end message); <Đoạn không găng của P>;
Until .F.
End;
{----------------------------------------------------------------------}
Giải pháp này thƣờng đƣợc cài đặt trên các hệ thống mạng máy tính, đặc biệt là
trên các hệ thống mạng phân tán. Đây là lợi thế mà semaphore và Monitor không có
đƣợc.
Sơ đồ đồng bộ dùng message phải chú ý sự đồng bộ giữa các tiến trình nhận và
gởi message, nếu không các tiến trình này sẽ không thoát khỏi trạng thái blocked để
tiếp tục đƣợc. Điều này cũng có nghĩa là công tác đồng bộ có thể không thành công
mặc dù sơ đồ đồng bộ đ đƣợc tổ chức rất tốt. Sau đây chúng ta sẽ xem x t về sự đồng
bộ giữ tiến trình send và tiến trình receive trong trƣờng hợp này.
2.7.5.4. Các ài toán về đồng ộ hóa
Bài toán 1: Bài toán nhà sản xuất và nhà tiêu thụ Producer/Consumer . Trong hệ
thống đa nhiệm – đa ngƣời dùng. Ứng dụng này có hai tiến trình chính đó là, tiến trình
ngƣời sản xuất Producer và tiến trình ngƣời tiêu thụ Consumer , hai tiến trình này
hoạt động đồng thời với nhau và c ng chia sẻ một bộ đệm (Buffer) c ích thước giới
hạn, chỉ có 3 phần tử. Tiến trình Producer tạo ra dữ liệu và đặt vào Buffer, tiến trình
Consumor nhận dữ liệu từ Buffer ra để xử lý. Rõ ràng hệ thống này cần phải có các
116
ràng buộc sau:
(1) Hai tiến trình Producer và Consumer không đƣợc đồng thời truy xuất
Buffer vì Buffer là tài nguyên găng).
(2) Tiến trình Producer không đƣợc ghi dữ liệu vào Buffer khi Buffer đ bị
đầy.
(3) Tiến trình Consumer không đƣợc đọc dữ liệu từ Buffer khi Buffer rỗng.
H y dùng các giải pháp Semafore, Monitor, Message để tổ chức đồng bộ cho các
tiến trình Producer và Consumer trong bài toán trên.
2.7.5.4.1. Giải pháp dùng Semaphore
Với giải pháp này sơ đồ đồng bộ phải sử dụng 3 Semaphore:
Full: dùng để theo dõi số chỗ đ có dữ liệu trong bộ đệm, nó đƣợc khởi gán
bằng 0. Tức là, ban đầu Buffer rỗng.
Empty: dùng để theo dõi số chỗ c n trống trên bộ đệm, nó đƣợc khởi gán bằng
3. Tức là, ban đầu Buffer không chứa một phần tử dữ liệu nào.
Mutex: dùng để kiểm tra truy xuất đồng thời trên bộ đệm, nó đƣợc khởi gán
bằng 1. Tức là, chỉ có 1 tiến trình đƣợc ph p truy xuất Buffer.
Sơ đồ đồng bộ sẽ nhƣ sau:
Program Producer/Consumer;
Var
Full, Empty, Mutex: Semaphore;
{----------------------------------------------} Procedure Producer();
Begin Repeat
//kiểm tra xem buffer còn chỗ trống ? //kiểm tra và xác lập quyền truy xuất
<Đặt dữ liệu vào Buffer>;
//kết thúc truy xuất buffer //đã có 1 phần tử dữ liệu trong Buffer
< Tạo dữ liệu>; Down(empty); Down(mutex); Buffer Up(mutex); Up(Full);
Until .F.
End;
{----------------------------------} Procedure Consumer();
Begin Repeat
Down(full); //còn phần tử dữ liệu trong Buffer?
//kiểm tra và xác lập quyền truy xuất
Down(mutex); Buffer}
117
Up(mutex); //kết thúc truy xuất buffer
//đã lấy 1 phần tử dữ liệu trong
Up(empty); Buffer Until .F.
End;
{---------------------------------------------} BEGIN Full = 0; Empty = 3; Mutex = 1; Producer(); Consumer(); END. {----------------------------------------------}
2.7.5.4.2. Giải pháp dùng Monitor
Với giải pháp này ngƣời lập trình phải định nghĩa một Monitor, có tên là
Producer/Consumer, trong đó có hai thủ tục Enter và Remove, dùng để thao tác trên
Buffer. Xử lý của các thủ tục này phụ thuộc vào các biến điều kiện full và empty. Full
và Emtry đƣợc quy định sử dụng nhƣ trong giải pháp semaphore.
Sơ đồ đồng bộ sẽ nhƣ sau:
Program Producer/Consumer; Monitor ProducerConsumer; Condition Full, Empty; Var
Count: Integer; //để đếm số phần tử đữ liệu được đưa vào
Buffer
N
: Interger; //số phần tử của Buffer
{ ---------------------------------} Procedure Enter();
Begin
If Count = N Then Wait(Full); //nếu Buffer đầy thì đợi Buffer rỗng <Đặt dữ liệu vào đệm>; Count := Count + 1; If Count = 1 Then Signal(Empty); //nếu Buffer không rỗng End;
//thì báo cho consumer biết
{---------------------------------------------------} Procedure Remove();
Begin
If Count = 0 Then Wait(Empty); //nếu Buffer rỗng thì đợi đầy
// báo cho producer biết
End;
EndMonitor; {------------------------------------------------------} BEGIN
118
Count = 0; N = 3;
ParBegin
Procedure Producer();
Repeat Until .F.
Begin End;
{----------------------------------------}
Procedure Consumor();
Producer/Consumer.Remove;
Repeat Until .F.
Begin End;
Parend
END. {--------------------------------------}
2.7.5.4.3. Giải pháp dùng Message
Với giải pháp này chƣơng trình dùng thông điệp Empty. Empty hàm ý có một chỗ
trống trong Buffer. Khi khởi tạo tiến trình Consumer gởi ngay N thông điệp Empty đến
tiến trình Producer. Tiến trình Producer tạo ra một dữ liệu mới và chờ đến khi nhận
đƣợc một thông điệp Empty từ Consumer thì gởi ngƣợc lại cho Consumer một thông
điệp có chứa dữ liệu mà nó tạo ra. Sau khi gởi đi thông điệp Empty, tiến trình
Consumer sẽ chờ để nhận thông điệp chứa dữ liệu từ tiến trình Producer. Sau khi xử lý
xong dữ liệu thì Consumer gởi lại một thông điệp Empty đến tiến trình Producer.
Buffersize: integer; //kích thước Buffer
Sơ đồ đồng bộ sẽ nhƣ sau:
Program Producer/Consumer; Var M, m’: Message; { -------------------------------------} BEGIN
Buffersize = N; ParBegin
Repeat
Procedure Producer(); Begin
119
Until .F.
End;
{ ----------------------------------------}
Procedure
Consumer ()
Var I:integer; Begin
For I := 0 to N Do Send(Producer ,m); Repeat
Receive(Producer ,m);
Until .F.
End.
Parend
END. {--------------------------------------------------------}
Bài toán 2: Bài toán bộ đọc-bộ ghi
Trong môi trƣờng hệ điều hành đa nhiệm, có thể tồn tại các tập tin chia s , có thể
là các tập tin cơ sở dữ liệu. Nhiều tiến trình hoạt động đồng thời trong hệ thống có thể
truy xuất cùng lúc đến một tập tin cơ sở dữ liệu chia s này. Tiến trình cần đọc nội
dung của tập tin cơ sở dữ liệu đƣợc gọi là tiến trình Reader. Tiến trình cần cập nhật
thông tin vào tập tin cơ sở dữ liệu đƣợc gọi là tiến trình Writer. Trong hệ thống này,
công tác đồng bộ tiến trình cần phải thực hiện các ràng buộc sau:
(1) Có thể có nhiều tiến trình Reader đồng thời đọc tập tin cơ sở dữ liệu.
(2) Không cho ph p một tiến trình Writer ghi vào cơ sở dữ liệu khi các tiến
trình Reader khác đang đọc cơ sở dữ liệu.
(3) Chỉ có duy nhất một tiến trình Writer đƣợc ph p ghi vào tập tin cơ sở dữ liệu tại
một thời điểm.
H y dùng các giải pháp Semafore, Monitor, Message để tổ chức đồng bộ cho các
tiến trình Reader và Writer trong bài toán ở trên.
2.7.5.4.4. Giải pháp dùng Semaphore
Giải pháp này sử dụng một biến chung RC và hai semaphore là Mutex và DB.
RC readcount dùng để ghi nhận số lƣợng các tiến trình Reader muốn truy
xuất tập tin cơ sở dữ liệu, khởi gán bằng 0.
120
Mutex: dùng để kiểm soát truy xuất đến RC, khởi gán bằng 1.
DB:dùng để kiểm tra sự truy xuất độc quyền đến cơ sở dữ liệu, khởi gán
bằng 1.
Db: Seamafore = 1;
Sau đây là sơ đồ đồng bộ:
Program Producer/Consumer; Const Mutex: Seamafore = 1; Rc: byte = 0; {------------------------------------} BEGIN
ParBegin
Procedure Reader();
//chấm dứt truy xuất Rc
Begin Repeat
Down(mutex); Rc = Rc+1; If Rc = 1 then Down(db); Up(mutex); <Đọc dữ liệu >; Down(mutex) Rc = Rc-1 If Rc = 0 then Up(db); Up(mutex); < Xử lý dữ liệu đọc được>
Until .F.
End;
{--------------------------------------------}
Procedure Writer();
Repeat Until .F.
Begin End;
ParEnd
END. {--------------------------------------------}
2.7.5.4.5. Giải pháp dùng Monitor
Giải pháp này sử dụng một biến chung RC, để ghi nhận số lƣợng các tiến trình
reader muốn truy xuất cơ sở dữ liệu. Tiến trình Writer phải chuyển sang trạng thái khoá
nếu RC > 0. Khi ra khỏi đoạn găng tiến trình Reader cuối cùng sẽ đánh thức tiến trình
Write đang bị khoá.
121
Sau đây là sơ dồ đồng bộ:
Program Producer/Consumer; Monitor Readerwriter Condition Okwrite,Okread Var Rc: integer; Busy: boolean = False; {-------------------------------------} Procedure Beginread()
Begin
If (busy) then Wait(okread); Rc = Rc+1; Signal(okread);
End;
Procedure Finishread()
Begin
Rc = Rc - 1; If Rc = 0 Then Wait(okwrite);
End;
Procedure Beginwrite();
Begin
Rc = Rc - 1; If (busy) or (Rc <> 0) Then Wait(okwrite); Busy = True;
End;
Procedure FinishWrite()
Begin
Busy = False; If (Okread) Then Signal(okread) Else Signal(okwrite);
End; EndMonitor. {------------------------------------------------------------} BEGIN
ParBegin
Procedure Reader ();
Begin
Repeat
ReaderWriter.BeginRead(); <đọc dữ liệu> ReaderWriter.FinishRead(); Until .F.
End;
Procedure Writer ();
Begin
Repeat
ReaderWriter.BeginWrite(); <đọc dữ liệu> ReaderWriter.FinishWrite();
Until .F.
End;
Parend
122
END. {------------------------------------------------}
2.7.5.4.6. Giải pháp dùng Message
Giải pháp này cần phải có một tiến trình Sever điều khiển việc truy xuất cơ sở dữ
liệu. Các tiến trình Writer và Reader gửi các thông điệp yêu cầu truy xuất đến Server
và nhận từ Sever các thông điệp hồi đáp tƣơng ứng.
Sơ đồ đồng bộ sẽ nhƣ sau:
Program Producer/Consumer; Begin
ParBegin
Procedure Reader();
Repeat
Send (Sever,Requesread); Receive(sever,value); Print(value); Until .F.
Begin End;
Procedure Writer();
Repeat
;
Send (Sever, Requeswrite,value);
Receive(sever, okwrite);
Until .F.
Begin End;
ParEnd
End. {--------------------------------------------------}
Bài toán 3: Năm nhà triết gia ăn tối
Có năm nhà triết gia, vừa suy nghĩ vừa ăn tối. Các triết gia ngồi trên cùng một
bàn tr n xung quanh có năm chiếc ghế, mỗi chiếc ghế đƣợc ngồi bởi một triết gia.
123
Chính giữa bàn là năm bát cơm và năm chiếc đũa đƣợc hiển thị nhƣ hình sau:
Hình 2.29. Tình huống các triết gia ăn tối
Khi một triết gia suy nghĩ, ông ta không giao tiếp với các triết gia khác. Thỉnh
thoảng, một triết gia cảm thấy đói và cố gắng chọn hai chiếc đũa gần nhất hai chiếc
đũa nằm bên trái và phải của ông ta . Một triết gia có thể lấy chỉ một chiếc đũa tại một
thời điểm. Chú ý, ông ta không thể lấy chiếc đũa mà nó đang đƣợc dùng bởi ngƣời láng
giềng. Khi một triết gia đói và có hai chiếc đũa cùng một lúc, ông ta ăn mà không đặt
đũa xuống. Khi triết gia ăn xong, ông ta đặt đũa xuống và bắt đầu suy nghĩ tiếp.
Bài toán các triết gia ăn tối đƣợc xem nhƣ một bài toán đồng bộ hoá kinh điển.
Nó trình bày yêu cầu cấp phát nhiều tài nguyên giữa các quá trình trong cách tránh việc
khoá chết deadlock và đói tài nguyên starvation .
Một giải pháp đơn giản là thể hiện mỗi chiếc đũa bởi một biến Semaphore. Một
triết gia cố gắng chiếm lấy một chiếc đũa bằng cách thực thi thao tác Down trên biến
semaphore đó; triết gia đặt hai chiếc đũa xuống bằng cách thực thi thao tác Up trên các
biến Semaphore tƣơng ứng. Do đó, dữ liệu đƣợc chia s là:
Semaphore chopstick[5];
ở đây tất cả các phần tử của chopstick đƣợc khởi tạo 1. Cấu trúc m lệnh của
Procedure philosopher (var i:integer);
Begin
124
philosopher i đƣợc hiển thị nhƣ sau:
while (1) do
Begin
think ();
//suy nghĩ
Down(chopstick[ i ]);
//kiểm tra để nhặt đũa bên trái
Down(chopstick[ ( i + 1 ) % 5 ]); //kiểm tra để nhặt đũa bên trái
Eat();
//ăn
Up(chopstick[ i ]);
//trả đũa bên trái
Up(chopstick[ ( i + 1 ) % 5 ]);//trả đũa bên phải
End;
End;
Mặc dù giải pháp này đảm bảo rằng không có hai láng giềng nào đang ăn cùng
một lúc nhƣng nó có khả năng gây ra khoá chết. Giả sử rằng năm triết gia bị đói cùng
một lúc và mỗi triết gia chiếm lấy chiếc đũa bên trái của ông ta. Bây giờ tất cả các phần
tử chopstick sẽ là 0. Khi mỗi triết gia cố gắng dành lấy chiếc đũa bên phải, triết gia sẽ
bị chờ m i m i xảy ra deadlock .
Giải pháp cho vấn đề các triết gia ăn tối mà nó đảm bảo không bị deadlock.
- Cho ph p nhiều nhất bốn triết gia đang ngồi cùng một lúc trên bàn
- Cho ph p một triết gia lấy chiếc đũa của ông ta chỉ nếu cả hai chiếc đũa là sẵn
dùng để làm điều này ông ta phải lấy chúng trong miền găng .
- Dùng một giải pháp bất đối xứng; nghĩa là một triết gia lẽ chọn đũa bên trái
đầu tiên của ông ta và sau đó đũa bên phải, trái lại một triết gia chẳn chọn
chiếc đũa bên phải và sau đó chiếc đũa bên trái của ông ta.
Tóm lại, bất cứ một giải pháp nào thoả m n đối với bài toán các triết gia ăn tối
phải đảm bảo dựa trên khả năng một trong những triết gia sẽ đói chết. Giải pháp giải
quyết việc khoá chết không cần thiết xoá đi khả năng đói tài nguyên.
2.8. TẮC NGHẼN VÀ CHỐNG TẮC NGHẼN
2.8.1. Khái niệm tắc nghẽn
Trong môi truờng đa chƣơng, nhiều quá trình có thể cạnh tranh một số giới hạn
125
tài nguyên. Một quá trình yêu cầu tài nguyên, nếu tài nguyên không sẵn dùng tại thời
điểm đó, quá trình đi vào trạng thái chờ. Quá trình chờ có thể tới vô hạn vì tài nguyên
chúng yêu cầu bị giữ bởi những quá trình đang chờ khác. Trƣờng hợp này đƣợc gọi là
deadlock khoá chết hay tắc nghẽn .
Ví dụ 1: hai ô-tô qua cầu hẹp
Hình 2.30. Hai ô-tô qua cầu
Các tiến trình bây giờ là các ôtô, mỗi lƣợt chỉ một ôtô qua cầu. Đoạn cầu có thể
xem là đoạn găng. Vậy điều kiện qua đoạn găng là tại một thời điểm chỉ một ôtô đƣợc
ph p qua cầu. Nếu cả hai ôtô từ hai phía qua cầu cùng lúc thì tắc nghẽn xảy ra.
Ví dụ 2: Giả sử có hai tiến trình P1 và P2 hoạt động đồng thời trong hệ thống.
Tiến trình P1 đang giữ tài nguyên R1 và xin đƣợc cấp R2 để tiếp tục hoạt động, trong
khi đó tiến trình P2 đang giữ tài nguyên R2 và xin đƣợc cấp R1 để tiếp tục hoạt động.
Trong trƣờng hợp này cả P1 và P2 sẽ không tiếp tục hoạt động đƣợc. Nhƣ vậy P1 và
P2 rơi vào trạng thái tắc nghẽn xem hình 2.31)
Hình 2.31 Chờ đợi v ng tr n
Tắc nghẽn thƣờng xảy ra do xung đột về tài nguyên thuộc loại không phân chia
đƣợc I/O, đĩa từ , một số ít trƣờng hợp xảy ra với tài nguyên phân chia đƣợc CPU,
126
Memory).
Ví dụ 3: Giả sử không gian bộ nhớ c n trống là 200Kb, và trong hệ thống có hai
tiến trình P1 và P2 hoạt động đồng thời. P1 và P2 yêu cầu đƣợc sử dụng bộ nhớ nhƣ
sau:
Thời điểm P1 P2
….. …. ….
T1 Request1 80Kb Request1 70Kb
….. ….. …..
T2 Request1 30Kb Request2 40Kb
….. …. …..
Bản 2 23. Hai quá trình đồng hành y u cầu bộ nhớ
Tắc nghẽn xảy ra khi cả hai tiến trình cùng yêu cầu thêm bộ nhớ lần thứ hai. Tại
thời điểm này không gian bộ nhớ c n trống là 50Kb, lớn hơn lƣợng bộ nhớ mà mỗi tiến
trình yêu cầu 30Kb và 40Kb , nhƣng vì cả hai tiến trình đồng thời yêu cầu thêm bộ
nhớ, nên hệ thống không để đáp ứng đƣợc, và tắc nghẽn xảy ra.
Ví dụ 4: Trong các ứng dụng cơ sở dữ liệu, một chƣơng trình có thể khoá một vài
record mà nó sử dụng, để dành quyền điều khiển về cho nó. Nếu tiến trình P1 khoá
record R1, tiến trình P2 khoá record R2, và rồi sau đó mỗi tiến trình lại cố gắng khoá
record của một tiến trình khác. Tắc nghẽn sẽ xảy ra.
T c nghẽn: Một t p hợp các quá trình, mỗi quá trình đang giữ một tài nguy n và
cũng đang chờ đ xin một tài nguy n hác, mà tài nguy n này ại đang bị giữ b i một
quá trình hác trong t p hợp tr n
Trong trƣờng hợp của ví dụ 2 ở trên: hai tiến trình P1 và P2 sẽ rơi vào trạng thái
tắc nghẽn, nếu không có sự can thiệp của hệ điều hành. Để phá bỏ tắc nghẽn này hệ
điều hành có thể cho tạm dừng tiến trình P1 để thu hồi lại tài nguyên R1, lấy R1 cấp
cho tiến trình P2 để P2 hoạt động và kết thúc, sau đó thu hồi cả R1 và R2 từ tiến trình
P2 để cấp cho P1 và tái kích hoạt P1 để P1 hoạt động trở lại. Nhƣ vậy sau một khoảng
thời gian cả P1 và P2 đều ra khỏi tình trạng tắc nghẽn.
Trong trƣờng hợp của ví dụ 3 ở trên: nếu hai tiến trình này không đồng thời yêu
cầu thêm bộ nhớ thì tắc nghẽn không thể xảy ra, hoặc khi cả hai tiến trình đồng thời
yêu cầu thêm bộ nhớ thì hệ điều hành phải kiểm tra lƣợng bộ nhớ c n trống của hệ
127
thống, nếu không đáp ứng cho cả hai tiến trình thì hệ điều hành phải có cơ chế ngăn
chặn từ chối một tiến trình và chỉ cho một tiến trình đƣợc quyền sử dụng bộ nhớ đáp
ứng thì tắc nghẽn cũng không thể xảy ra. Tuy nhiên để giải quyết vấn đề tắc nghẽn do
thiếu bộ nhớ, các hệ điều hành thƣờng sử dụng cơ chế bộ nhớ ảo. Bộ nhớ ảo là một
phần quan trọng của hệ điều hành mà chúng ta sẽ khảo sát ở Chƣơng Quản lý bộ nhớ
của tài liệu này.
Khi hệ thống xảy ra tắc nghẽn nếu hệ điều hành không kịp thời phá bỏ tắc nghẽn
thì hệ thống có thể rơi vào tình trạng treo toàn bộ hệ thống. Nhƣ trong trƣờng hợp tắc
nghẽn ở ví dụ 2, nếu sau đó có tiến trình P3, đang giữ tài nguyên R3, cần R2 để tiếp tục
thì P3 cũng sẽ rơi vào tập tiến trình bị tắc nghẽn, rồi sau đó nếu có tiến trình P4 cần tài
nguyên R1 và R3 để tiếp tục thì P4 cũng rơi vào tập các tiến trình bị tắc nghẽn nhƣ P3,
… cứ thế dần dần có thể dẫn đến một thời điểm tất cả các tiến trình trong hệ thống đều
rơi vào tập tiến trình tắc nghẽn. Và nhƣ vậy hệ thống sẽ bị treo hoàn toàn.
Vấn đề deadlock đ trở thành vấn đề phổ biến, đối với một hệ điều hành hiện đại
không thể chấp nhận tình trạng treo máy xảy ra. Trong phần này chúng ta sẽ mô tả các
phƣơng pháp mà hệ điều hành có thể dùng để ngăn chặn hay giải quyết deadlock. Xu
hƣớng hiện hành, một hệ thống gồm số lƣợng lớn quá trình, chƣơng trình đa luồng,
nhiều tài nguyên trong hệ thống và đặc biệt các tập tin có đời sống dài và những máy
phục vụ cơ sở dữ liệu hơn là các hệ thống bó.
2.8.2. Đặc điểm của Deadlock
2.8.2.1. Mô hình hệ thống
Một hệ thống chứa số tài nguyên hữu hạn đƣợc phân bổ giữa nhiều quá trình cạnh
tranh. Các tài nguyên có thể là tài nguyên vật lý thí dụ, thiết bị nhập xuất máy in, đĩa
từ , không gian bộ nhớ và chu kỳ CPU hay tài nguyên luận lý thí dụ tập tin,
semaphores, Monitors). Các tài nguyên này đƣợc phân chia thành nhiều loại, mỗi loại
chứa một số thể hiện xác định. Nếu hệ thống có hai CPU, thì loại tài nguyên CPU có
128
hai thể hiện. Tƣơng tự, hệ thống có bốn đĩa từ thì tài nguyên đĩa từ có bốn thể hiện.
Hình 2.32. Mô hình hệ thống
Nếu một quá trình yêu cầu một thể hiện của loại tài nguyên thì việc cấp phát bất
cứ thể hiện nào của loại tài nguyên này sẽ thoả m n yêu cầu. Nếu nó không có thì các
thể hiện là không xác định và các lớp loại tài nguyên sẽ không đƣợc định nghĩa hợp lý.
Thí dụ, một hệ thống có thể có hai máy in. Hai loại máy in này có thể đƣợc định nghĩa
trong cùng lớp loại tài nguyên nếu không có quá trình nào quan tâm máy nào in ra dữ
liệu. Tuy nhiên, nếu một máy in ở tầng 9 và máy in khác ở tầng trệt thì ngƣời dùng ở
tầng 9 không thể xem hai máy in là tƣơng tự nhau và lớp tài nguyên riêng r cần đƣợc
định nghĩa cho mỗi máy in.
Một quá trình phải yêu cầu một tài nguyên trƣớc khi sử dụng nó, và phải giải
phóng nó sau khi sử dụng xong. Một quá trình có thể yêu cầu nhiều tài nguyên nhƣ nó
đƣợc yêu cầu để thực hiện công việc đƣợc gán của nó. Chú ý, số tài nguyên đƣợc yêu
cầu không vƣợt quá số lƣợng tổng cộng tài nguyên sẵn có trong hệ thống. Nói cách
khác, một quá trình không thể yêu cầu ba máy in nếu hệ thống chỉ có hai. Dƣới chế độ
điều hành thông thƣờng, một quá trình có thể sử dụng một tài nguyên chỉ trong thứ tự
sau:
Y u cầu: nếu yêu cầu không thể đƣợc gán tức thì thí dụ tài nguyên đang
đƣợc dùng bởi quá trình khác thì quá trình đang yêu cầu phải chờ cho tới
khi nó có thể nhận đƣợc tài nguyên.
S dụng: quá trình có thể điều hành tài nguyên thí dụ nếu tài nguyên là máy
129
in, quá trình có thể in ra máy in .
Gi i ph ng: quá trình tự nguyện giải phóng tài nguyên sau khi đ dùng xong.
Yêu cầu và giải phóng tài nguyên là các lời gọi hệ thống. Thí dụ nhƣ yêu cầu và
giải phóng thiết bị, mở và đóng tập tin, cấp phát và giải phóng bộ nhớ cũng là các lời
gọi hệ thống. Yêu cầu và giải phóng các tài nguyên khác nhƣ CPU, Memory có thể đạt
đƣợc thông qua thao tác chờ Wait và báo hiệu Signal. Do đó, cho mỗi trƣờng hợp sử
dụng, hệ điều hành kiểm tra để đảm bảo rằng quá trình sử dụng yêu cầu và đƣợc cấp
phát tài nguyên. Hệ điều hành dùng một bảng ghi nhận tài nguyên nào đang tự do và tài
nguyên nào đang đƣợc cấp phát và cấp phát cho quá trình nào . Nếu một quá trình yêu
cầu tài nguyên mà tài nguyên đó hiện đƣợc cấp phát cho một quá trình khác, quá trình
có thể đƣợc thêm vào hàng đợi để chờ tài nguyên này.
Để minh hoạ trạng thái deadlock, chúng ta x t hệ thống với ba ổ đĩa từ. Giả sử
mỗi quá trình đang giữ một ổ đĩa từ. Bây giờ, nếu mỗi quá trình yêu cầu thêm một ổ
đĩa từ khác thì ba quá trình sẽ ở trong trạng thái deadlock. Mỗi quá trình đang chờ một
sự kiện “ổ đĩa từ đƣợc giải phóng” mà có thể đƣợc gây ra chỉ bởi một trong những quá
trình đang chờ. Thí dụ này minh hoạ dead oc i n quan đến c ng oại tài nguy n.
Deadlock cũng liên quan nhiều loại tài nguyên khác nhau. Thí dụ, x t một hệ thống với
một máy in và một ổ đĩa từ. Giả sử, quá trình Pi đang giữ ổ đĩa từ và quá trình Pj đang
giữ máy in. Nếu Pi yêu cầu thêm máy in và Pj yêu cầu thêm ổ đĩa từ thì deadlock xảy
ra.
Một ngƣời lập trình đang phát triển những ứng dụng đa luồng phải quan tâm đặc
biệt tới vấn đề này: Các chƣơng trình đa luồng là ứng cử viên cho vấn đề deadlock vì
nhiều luồng có thể cạnh tranh trên tài nguyên đƣợc chia s .
2.8.2.2. Điều kiện hình thành tắc nghẽn
Năm 1971, E.G Coffman, JR đ đƣa ra và chứng tỏ đƣợc rằng, nếu hệ thống tồn
tại đồng thời bốn điều kiện sau đây thì hệ thống sẽ xảy ra tắc nghẽn:
- Loại trừ ẫn nhau (mutua excution) hay độc quyền s dụng: Đối với các
tài nguyên không phân chia đƣợc thì tại mỗi thời điểm chỉ có một tiến trình sử
dụng đƣợc tài nguyên.
- Giữ và chờ (hold and Wait : Một tiến trình hiện đang chiếm giữ tài nguyên, lại
130
yêu cầu thêm tài nguyên mới.
- Không ưu ti n No preemption : Không có tài nguyên nào có thể đƣợc giải
phóng từ một tiến trình đang chiếm giữ nó. Tức là tài nguyên chỉ có thể tự
nguyện giải phóng khi quá trình sử dụng xong.
Trong nhiều trƣờng hợp các điều kiện trên là rất cần thiết đối với hệ thống. Sự
thực hiện độc quyền là cần thiết để bảo đảm tính đúng đắn của kết quả và tính toàn vẹn
của dữ liệu chúng ta đ thấy điều này ở phần tài nguyên găng trên đây .
Tƣơng tự, sự ƣu tiên không thể thực hiện một cách tuỳ tiện, đặt biệt đối với các
tài nguyên có liên quan với nhau, việc giải phóng tài nguyên từ một tiến trình này có
thể ảnh hƣởng đên kết quả xử lý của các tiến trình khác.
Sự tắc nghẽn có thể tồn tại với ba điều kiện trên, nhƣng cũng có thể không xảy ra
chỉ với 3 điều kiện đó. Để chắc chắn tắc nghẽn xảy ra cần phải có điều kiện thứ tƣ
- Đợi vòng tròn (Circular Wait : Đây là trƣờng hợp của ví dụ 2 mà chúng ta đ
nêu ở trên. Tức là, mỗi tiến trình đang chiếm giữ tài nguyên mà tiến trình khác
đang cần.
Ba điều kiện đầu là điều kiện cần chứ không phải là điều kiện đủ để xảy ra tắc
nghẽn. Điều kiện thứ tƣ là kết quả tất yếu từ ba điều kiện đầu.
2.8.2.3. Đồ thị cấp phát tài nguyên
Deadlock có thể mô tả chính xác hơn bằng cách hiển thị đồ thị có hƣớng gọi là đồ
thị cấp phát tài nguyên hệ thống. Đồ thị này chứa một tập các đỉnh V và tập hợp các
cạnh E. Một tập các đỉnh V đƣợc chia làm hai loại nút P = {P1, P2,…,Pn} là tập hợp
các quá trình hoạt động trong hệ thống, và R = {R1, R2, ..., Rm} là tập hợp chứa tất cả
các loại tài nguyên trong hệ thống.
Một cạnh có hƣớng từ quá trình Pi tới loại tài nguyên Rj đƣợc ký hiệu Pi → Rj;
nó biểu thị rằng quá trình Pi đ yêu cầu loại tài nguyên Rj và hiện đang chờ loại tài
nguyên đó. Một cạnh có hƣớng từ loại tài nguyên Rj tới quá trình Pi đƣợc hiển thị bởi
Rj → Pi; nó hiển thị rằng một thể hiện của loại tài nguyên Rj đ đƣợc cấp phát tới quá
trình Pi. Một cạnh có hƣớng Pi → Rj đƣợc gọi là cạnh yêu cầu; một cạnh có hƣớng
Rj→ Pi đƣợc gọi là cạnh gán.
Bằng hình tƣợng, chúng ta hiển thị mỗi quá trình Pi là một hình tr n, và mỗi loại
131
tài nguyên Rj là hình chữ nhật. Vì loại tài nguyên Rj có thể có nhiều hơn một thể hiện,
chúng ta hiển thị mỗi thể hiện là một chấm nằm trong hình vuông. Chú ý rằng một
cạnh yêu cầu trỏ tới chỉ một hình vuông Rj, trái lại một cạnh gán cũng phải gán tới một
trong các dấu chấm trong hình vuông.
Khi quá trình Pi yêu cầu một thể hiện của loại tài nguyên Rj, một cạnh yêu cầu
đƣợc chèn vào đồ thị cấp phát tài nguyên. Khi yêu cầu này có thể đƣợc đáp ứng, cạnh
yêu cầu lập tức đƣợc truyền tới cạnh gán. Khi quá trình không c n cần truy xuất tới tài
nguyên, nó giải phóng tài nguyên, và khi đó dẫn đến cạnh gán bị xoá.
Hình 2.33. Đồ thị c p phát tài nguyên14
Đồ thị cấp phát tài nguyên trong hình 2.33:
Các tập P, R là tập hợp đỉnh và E là tập hợp cạnh:
P = {P1, P2, P3}
R = {R1, R2, R3, R4}
E = {P1→R1, P2 →R3, R1 →P2, R2→P2, R3→P3}
Các thể hiện của tài nguyên:
Tài nguyên loại R1 có một thể hiện
Tài nguyên loại R2 có hai thể hiện
Tài nguyên loại R3 có một thể hiện
14 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, tr.116
132
Tài nguyên loại R4 có ba thể hiện
Trạng thái quá trình:
Quá trình P1 đang giữ một thể hiện của loại tài nguyên R2 và đang chờ
yêu cầu thêm một thể hiện của loại tài nguyên R1.
Quá trình P2 đang giữ một thể hiện của loại tài nguyên R1 và một thể
hiện của loại tài nguyên R2 và đang chờ một thể hiện của loại tài nguyên
R3.
Quá trình P3 đang giữ một thể hiện của R3
Nhận x t thấy không có quá trình nào trong hệ thống bị deadlock vì không tồn tại
chu trình đợi v ng tr n. Nếu đồ thị có chứa chu trình, thì deadlock có thể xảy ra.
Nếu mỗi loại tài nguyên có chính xác một thể hiện, thì một chu trình ngụ ý rằng
một deadlock xảy ra. Nếu một chu trình bao gồm chỉ một tập hợp các loại tài nguyên,
mỗi loại tài nguyên chỉ có một thể hiện thì deadlock xảy ra. Deadlock xảy ra đối với tất
cả các quá trình trong chu trình đó. Trong trƣờng hợp này, một chu trình trong đồ thị là
điều kiện cần và đủ để tồn tại deadlock.
Nếu mỗi loại tài nguyên có nhiều thể hiện thì chu trình không ngụ ý deadlock xảy
ra. Trong trƣờng hợp này, một chu trình trong đồ thị là điều kiện cần nhƣng chƣa đủ để
tồn tại deadlock.
Giả sử quá trình P3 yêu cầu một thể hiện của loại tài nguyên R2. Một cạnh yêu
cầu P3 → R2 đƣợc thêm vào đồ thị Hình 2.34
133
Hình 2.34. Đồ thị c p phát tài nguy n xu t hiện Dead oc
Vì tài nguyên R2 không có sẵn một thể hiện. Tại thời điểm này, hai chu trình nhỏ
tồn tại trong hệ thống:
P1 → R1 → P2 → R3 → P3 → R2 → P1
P2 → R3 → P3 → R2 → P2
Quá trình P1, P2, và P3 bị deadlock. Quá trình P3 đang chờ tài nguyên R2, hiện
đƣợc giữ bởi quá trình P2. Hay nói cách khác, quá trình P3 đang chờ quá trình P1 hay
P2 giải phóng tài nguyên R2. Ngoài ra, quá trình P1 đang chờ quá trình P2 giải phóng
tài nguyên R1.
Hình 2.35. Đồ thị c p phát tài nguy n c chu trình nhưng hông bị dead oc
Bây giờ xem x t đồ thị cấp phát tài nguyên trong hình 2.35. Trong đồ thị này, tồn
tại một chu trình:
P1 → R1 → P3 → R2 → P1
Tuy nhiên, không có deadlock. Chú ý rằng quá trình P4 có thể giải phóng một thể
hiện của loại tài nguyên R2. Tài nguyên đó có thể đƣợc cấp phát tới P3 sau đó, chu
trình sẽ không c n.
Tóm lại, nếu đồ thị cấp phát tài nguyên không có chu trình thì hệ thống không có
trạng thái deadlock. Ngoài ra, nếu có chu trình thì có thể có hoặc không trạng thái
deadlock. Nhận x t này là quan trọng khi chúng ta giải quyết vấn đề deadlock.
2.8.3. Các phương pháp xử lý deadlock
134
Phần lớn, chúng ta có thể giải quyết vấn đề deadlock theo một trong hai cách:
Chúng ta có thể sử dụng một giao thức để ngăn ch n hay tránh dead oc s,
đảm bảo rằng hệ thống sẽ không bao giờ đi vào trạng thái deadlock.
Chúng ta có thể cho ph p hệ thống đi vào trạng thái deadlock, phát hiện nó
và phục hồi.
Chúng ta sẽ tìm hiểu vắn tắt mỗi phƣơng pháp. Sau đó, chúng ta sẽ trình bày các
giải thuật một cách chi tiết trong các phần sau đây.
Để đảm bảo deadlock không bao giờ xảy ra, hệ thống có thể dùng kế hoạch ngăn
ch n hay tránh deadlock. Ngăn chặn deadlock là một tập hợp các phƣơng pháp để đảm
bảo rằng ít nhất một điều kiện cần (trong 2.8.2.2.) không thể xảy ra. Ngƣợc lại, tránh
deadlock yêu cầu hệ điều hành cung cấp những thông tin bổ sung tập trung vào loại tài
nguyên nào một quá trình sẽ yêu cầu và sử dụng trong thời gian sống của nó. Để quyết
định yêu cầu hiện tại có thể đƣợc thoả m n hay phải bị trì ho n, hệ thống phải xem x t
tài nguyên hiện có, tài nguyên hiện cấp phát cho mỗi quá trình, và các yêu cầu tài
nguyên và giải phóng tài nguyên tƣơng lai của mỗi quá trình.
Nếu một hệ thống không dùng giải thuật ngăn chặn hay tránh deadlock thì trƣờng
hợp deadlock có thể xảy ra. Trong môi trƣờng này, hệ thống có thể cung cấp một giải
thuật để xem x t trạng thái của hệ thống để xác định deadlock có xảy ra hay không và
giải thuật phục hồi từ deadlock.
Nếu hệ thống không đảm bảo rằng deadlock sẽ không bao giờ xảy ra và cũng
không cung cấp một cơ chế để phát hiện và phục hồi deadlock thì có thể dẫn đến
trƣờng hợp hệ thống ở trong trạng thái deadlock. Trong trƣờng hợp này, deadlock
không đƣợc phát hiện sẽ làm giảm năng lực hệ thống vì tài nguyên đang đƣợc giữ bởi
những quá trình mà chúng không thể thực thi, đi vào trạng thái deadlock. Cuối cùng, hệ
thống sẽ dừng các chức năng và cần đƣợc khởi động lại bằng thủ công.
2.8.3.1. Ngăn chặn deadlock
Để deadlock xảy ra, một trong bốn điều kiện cần phải xảy ra. Bằng cách đảm bảo
ít nhất một trong bốn điều kiện này không thể xảy ra, chúng ta có thể ngăn chặn việc
xảy ra của deadlock.
Đối với điều iện độc quyền: Điều kiện này gần nhƣ không tránh khỏi, vì sự độc
135
quyền là cần thiết đối với tài nguyên thuộc loại phân chia đƣợc nhƣ các biến chung,
các tập tin chia s , hệ điều hành cần phải hỗ trợ sự độc quyền trên các tài nguyên
này. Tuy nhiên, với những tài nguyên thuộc loại không phân chia đƣợc máy in hệ
điều hành có thể sử dụng kỹ thuật SPOOL Smulataneous Peripheral Operation
Online để tạo ra nhiều tài nguyên ảo cung cấp cho các tiến trình đồng thời. Ví dụ,
một máy in không thể đƣợc chia s cùng lúc bởi nhiều quá trình. Ngƣợc lại, các tài
nguyên có thể chia s tập tin chỉ đọc không đ i hỏi truy xuất độc quyền và do đó
không thể liên quan đến deadlock. Nếu nhiều quá trình cố gắng mở một tập tin chỉ
Đối với điều iện giữ và đợi: Để đảm bảo điều kiện giữ-và-chờ cấp thêm tài nguyên
đọc tại cùng một thời điểm thì chúng có thể đƣợc gán truy xuất cùng lúc đến tập tin.
không bao giờ xảy ra trong hệ thống, chúng ta phải đảm bảo rằng bất cứ khi nào
một quá trình yêu cầu tài nguyên, nó không giữ bất cứ tài nguyên nào khác. Điều
kiện này có thể ngăn chặn bằng cách cho tiến trình yêu cầu tất cả tài nguyên mà nó
cần tại một thời điểm và tiến trình sẽ bị khoá blocked cho đến khi yêu cầu tài
nguyên của nó đƣợc hệ điều hành đáp ứng. Phƣơng pháp này không hiệu quả. Thứ
nh t, tiến trình phải đợi trong một khoảng thời gian dài để có đủ tài nguyên mới có
th chuyển sang hoạt động đƣợc, trong khi tiến trình chỉ cần một số ít tài nguyên
trong số đó là có thể hoạt động đƣợc, sau đó yêu cầu tiếp. Thứ hai, lãng phí tài
nguyên, vì có thể tiến trình giữa nhiều tài nguyên mà chỉ đến khi sắp kết thúc tiến
trình mới sử dụng, và có thể đây là những tài nguyên mà các tiến trình khác đang
rất cần. Ở đây hệ điều hành có thể tổ chức phân lớp tài nguyên hệ thống. Theo đó
tiến trình phải trả tài nguyên ở mức thấp mới đƣợc cấp phát tài nguyên ở cấp cao
hơn. Ví dụ, chúng ta x t một quá trình ch p dữ liệu từ băng từ tới tập tin đĩa, sắp
xếp tập tin đĩa và sau đó in kết quả ra máy in. Nếu tất cả tài nguyên phải đƣợc yêu
cầu cùng một lúc thì khởi đầu quá trình phải yêu cầu băng từ, tập tin đĩa và máy in.
Nó sẽ giữ máy in trong toàn thời gian thực thi của nó mặc dù nó cần máy in chỉ ở
giai đoạn cuối.
Đối với điều iện hông ưu ti n: không đ i lại tài nguyên từ quá trình đang giữ
chúng để đảm bảo điều kiện này không xảy ra, chúng ta có thể dùng giao thức sau.
Nếu một quá trình đang giữ một số tài nguyên và yêu cầu tài nguyên khác mà
không đƣợc cấp phát tức thì tới nó nghĩa là quá trình phải chờ thì tất cả tài nguyên
hiện đang giữ đƣợc đ i lại. Điều kiện này có thể ngăn chặn bằng cách, khi tiến trình
136
bị rơi vào trạng thái khoá, hệ điều hành có thể thu hồi tài nguyên của tiến trình bị
khoá để cấp phát cho tiến trình khác và cấp lại đầy đủ tài nguyên cho tiến trình khi
tiến trình đƣợc đƣa ra khỏi trạng thái khoá.
Đối với điều iện chờ đợi vòng tròn: Điều kiện này có thể ngăn chặn bằng cách
phân lớp tài nguyên của hệ thống. Theo đó, nếu một tiến trình đƣợc cấp phát tài
nguyên ở lớp L, thì sau đó nó chỉ có thể yêu cầu các tài nguyên ở lớp thấp hơn lớp
L.
2.8.3.2. Tránh deadlock
Các giải thuật ngăn chặn deadlock, đƣợc nghiên cứu ở trên, ngăn chặn deadlock
bằng cách hạn chế cách các yêu cầu có thể đƣợc thực hiện. Các ngăn chặn đảm bảo
rằng ít nhất một trong những điều kiện cần cho deadlock không thể xảy ra. Do đó,
deadlock không thể xảy ra. Tuy nhiên, các tác dụng phụ có thể ngăn chặn deadlock bởi
phƣơng pháp này là việc sử dụng thiết bị chậm và thông lƣợng hệ thống bị giảm.
Một phƣơng pháp khác để tránh deadlock là yêu cầu thông tin bổ sung về cách tài
nguyên đƣợc yêu cầu. Ví dụ, trong một hệ thống với một ổ băng từ và một máy in,
chúng ta có thể bảo rằng quá trình P sẽ yêu cầu ổ băng từ trƣớc và sau đó máy in trƣớc
khi giải phóng cả hai tài nguyên. Trái lại, quá trình Q sẽ yêu cầu máy in trƣớc và sau
đó ổ băng từ. Với kiến thức về thứ tự hoàn thành của yêu cầu và giải phóng cho mỗi
quá trình, chúng ta có thể quyết định cho mỗi yêu cầu của quá trình sẽ chờ hay không.
Mỗi yêu cầu đ i hỏi hệ thống xem tài nguyên hiện có, tài nguyên hiện đƣợc cấp tới mỗi
quá trình, và các yêu cầu và giải phóng tƣơng lai của mỗi quá trình, để yêu cầu của quá
trình hiện tại có thể đƣợc thoả m n hay phải chờ để tránh khả năng xảy ra deadlock.
Các giải thuật khác nhau có sự khác nhau về lƣợng và loại thông tin đƣợc yêu
cầu. Mô hình đơn giản và hữu ích nhất yêu cầu mỗi quá trình khai báo số lớn nhất tài
nguyên của mỗi loại mà nó cần. Thông tin trƣớc về số lƣợng tối đa tài nguyên của mỗi
loại đƣợc yêu cầu cho mỗi quá trình, có thể xây dựng một giải thuật đảm bảo hệ thống
sẽ không bao giờ đi vào trạng thái deadlock. Đây là giải thuật định nghĩa tiếp cận tránh
deadlock. Giải thuật tránh deadlock tự xem x t trạng thái cấp phát tài nguyên để đảm
bảo điều kiện tồn tại chu trình trong đồ thị cấp phát tài nguyên có thể không bao giờ
xảy ra. Trạng thái cấp phát tài nguyên đƣợc định nghĩa bởi số tài nguyên sẵn dùng và
tài nguyên đƣợc cấp phát và số yêu cầu tối đa của các quá trình.
137
2.8.3.2.1 Trạng thái an toàn
Một trạng thái là an toàn nếu hệ thống có thể cấp phát các tài nguyên tới mỗi quá
trình trong một vài thứ tự và vẫn tránh deadlock. Hay nói cách khác, một hệ thống ở
trong trạng thái an toàn chỉ nếu ở đó tồn tại một thứ tự an toàn. Thứ tự của các quá
trình
với mỗi thứ tự Pi, các tài nguyên mà Pi yêu cầu vẫn có thể đƣợc thoả m n bởi tài
nguyên hiện có cộng với các tài nguyên đƣợc giữ bởi tất cả Pj, với j hợp này, nếu những tài nguyên mà quá trình Pi yêu cầu không sẵn dùng tức thì thì Pi có thể chờ cho đến khi tất cả Pj hoàn thành. Khi chúng hoàn thành, Pi có thể đạt đƣợc tất cả những tài nguyên nó cần, hoàn thành các công việc đƣợc gán, trả về những tài nguyên đƣợc cấp phát cho nó và kết thúc. Khi Pi kết thúc, Pi+1 có thể đạt đƣợc các tài nguyên nó cần, ... Nếu không có thứ tự nhƣ thế tồn tại thì trạng thái hệ thống là không an toàn. Một trạng thái an toàn không là trạng thái deadlock. Do đó, trạng thái deadlock là trạng thái không an toàn. Tuy nhiên, không phải tất cả trạng thái không an toàn là deadlock. Một trạng thái không an toàn có thể dẫn đến deadlock. Hình 2.36. Không gian trạng thái an toàn, hông an toàn, dead oc Ví dụ 1: Để minh hoạ, chúng ta x t một hệ thống với 12 ổ băng từ và 3 quá trình: P0,P1, P2. Quá trình P0 yêu cầu 10 ổ băng từ Quá trình P1 có thể cần 4 ổ băng từ Quá trình P2 có thể cần tới 9 ổ băng từ. Giả sử rằng tại thời điểm T0, quá trình P0 giữ 5 ổ băng từ, quá trình P1 giữ 2 và 138 quá trình P2 giữ 2 ổ băng từ. Do đó, có 3 ổ băng từ c n rảnh . Hệ thống c n tự 3 Thứ
cấp phát
P1 P0 P2 Quá
trình
P0
P1
P2 Đang sử
dụng
5
2
2 Nhu cầu tối
đa
10
4
9 Nhu cầu tiếp theo
có thể yêu cầu
5
2
7 5-5+5+5=10
3-2+2+2 =5
10-7+2+7 =12 Bản 2 24. Ví dụ 1a về tránh deadlock Tại thời điểm T0, hệ thống ở trạng thái an toàn. Thứ tự kiện an toàn vì quá trình P1 có thể đƣợc cấp phát tức thì 2 ổ băng từ và sau đó trả lại chúng sau đó hệ thống cập nhật 3+2= 5 ổ băng từ sẵn dùng , tiếp theo cấp cho quá trình P0 nhận tất cả 5 ổ băng từ và trả lại chúng sau đó hệ thống sẽ có 10 ổ băng từ sẵn dùng , và cuối cùng cấp cho quá trình P2 có thể nhận tất cả 7 ổ băng từ nó yêu cầu và trả lại chúng sau đó hệ thống sẽ có tất cả 12 ổ băng từ sẵn dùng). Quá
trình Đang sử
dụng Nhu cầu tối
đa Nhu cầu tiếp
theo có thể Hệ thống
còn 3-1 Thứ tự cấp
phát P1 P0
P1
P2 5
2
2+1 10
4
9 5
2
7-1 2-2+2+2 =4 Bản 2.25. Ví dụ 1b về tránh deadlock Một hệ thống có thể đi từ trạng thái an toàn tới một trạng thái không an toàn. Giả sử rằng tại thời điểm T1, quá trình P2 yêu cầu và đƣợc cấp 1 ổ băng từ nữa. Hệ thống không c n trong trạng thái an toàn. Tại điểm này, chỉ quá trình P1 có thể đƣợc cấp tất cả 2 ổ băng từ của nó. Khi nó trả lại chúng, hệ thống đƣợc cập nhật 4 ổ băng từ sẵn có. Tiếp theo, quá trình P0 yêu cầu 5 ổ băng từ hệ thống chỉ có 4 nên P0 phải chờ. Tƣơng tự, quá trình P2 có thể yêu cầu thêm 6 ổ băng từ hệ thống chỉ có 4 và P2 phải chờ dẫn đến P0, P2 bị deadlock. Lỗi của chúng ta là gán yêu cầu từ quá trình P2 cho 1 ổ băng từ nữa. Nếu chúng ta làm cho P2 phải chờ cho đến khi các quá trình khác kết thúc và giải phóng tài nguyên của nó thì chúng ta có thể tránh deadlock. Với khái niệm trạng thái an toàn đƣợc cho, chúng ta có thể định nghĩa các giải thuật tránh deadlock. Ý tƣởng đơn giản là đảm bảo hệ thống sẽ luôn c n trong trạng thái an toàn. Khởi đầu, hệ thống ở trong trạng thái an toàn. Bất cứ khi nào một quá 139 trình yêu cầu một tài nguyên hiện có, hệ thống phải quyết định cấp phát tài nguyêncho quá trình ngay lập tức hoặc quá trình phải chờ. Yêu cầu đƣợc chấp nhận chỉ nếu việc cấp phát để lại hệ thống trong trạng thái an toàn. Trong mô hình này, nếu quá trình yêu cầu tài nguyên đang có, nó có thể vẫn phải chờ. Do đó, việc sử dụng tài nguyên có thể chậm hơn mà không có giải thuật tránh deadlock. 2.8.3.2.2. Giải thuật đồ thị cấp phát tài nguyên Nếu chúng ta có một hệ thống cấp phát tài nguyên với một thể hiện của mỗi loại. Ngoài các cạnh yêu cầu và gán, chúng ta giới thiệu một loại cạnh mới đƣợc gọi là cạnh thỉnh cầu claim edge . Một cạnh thỉnh cầu Pi → Rj hiển thị quá trình Pi có thể yêu cầu tài nguyên Rj vào một thời điểm trong tƣơng lai. Cạnh này tƣơng tự cạnh yêu cầu về phƣơng hƣớng nhƣng đƣợc hiện diện bởi n t đứt. Khi quá trình Pi yêu cầu tài nguyên Rj, cạnh thỉnh cầu Pi → Rj chuyển tới cạnh yêu cầu. Tƣơng tự, khi một tài nguyên Rj đƣợc giải phóng bởi Pi, cạnh gán Rj → Pi đƣợc chuyển trở lại thành cạnh thỉnh cầu Pi → Rj. Chúng ta chú ý rằng các tài nguyên phải đƣợc yêu cầu trƣớc trong hệ thống. Nghĩa là, trƣớc khi Pi bắt đầu thực thi, tất cả các cạnh thỉnh cầu của nó phải xuất hiện trong đồ thị cấp phát tài nguyên. Chúng ta có thể giảm nhẹ điều kiện này bằng cách cho ph p một cạnh Pi → Rj để đƣợc thêm tới đồ thị chỉ nếu tất cả các cạnh gắn liền với quá trình Pi là các cạnh thỉnh cầu. Giả sử rằng Pi yêu cầu tài nguyên Rj. Yêu cầu có thể đƣợc gán chỉ nếu chuyển cạnh yêu cầu Pi → Rj tới cạnh gán Rj→Pi không dẫn đến việc hình thành chu trình trong đồ thị cấp phát tài nguyên. Chú ý rằng chúng ta kiểm tra tính an toàn bằng cách dùng giải thuật phát hiện chu trình. Một giải thuật để phát hiện một chu trình trong đồ
thị này yêu cầu một thứ tự của n2 thao tác, ở đây n là số quá trình trong hệ thống. 140 Hình 2.37. Đồ thị c p phát tài nguy n đ tránh dead oc Nếu không có chu trình tồn tại, thì việc cấp phát tài nguyên sẽ để lại hệ thống trong trạng thái an toàn. Nếu chu trình đƣợc tìm thấy thì việc cấp phát sẽ đặt hệ thống trong trạng thái không an toàn. Do đó, quá trình Pi sẽ phải chờ yêu cầu của nó đƣợc thoả. Để minh hoạ giải thuật này, chúng ta x t đồ thị cấp phát tài nguyên của hình Hình 2.37. Giả sử rằng P2 yêu cầu R2. Mặc dù R2 hiện rảnh nhƣng chúng ta không thể cấp phát nó tới P2 vì hoạt động này sẽ tạo ra chu trình trong đồ thị Hình 2.38 . Một chu trình hiển thị rằng hệ thống ở trong trạng thái không an toàn. Nếu P1 yêu cầu R2 và P2 yêu cầu R1 thì deadlock sẽ xảy ra. Hình 2.38. Trạng thái hông an toàn trong đồ thị c p phát tài nguyên 2.8.3.2.3. Giải thuật của Banker Giải thuật đồ thị cấp phát tài nguyên không thể áp dụng tới hệ thống cấp phát tài nguyên với nhiều thể hiện của mỗi loại tài nguyên. Giải thuật tránh deadlock mà chúng ta mô tả tiếp theo có thể áp dụng tới một hệ thống nhƣng ít hiệu quả hơn cơ chế đồ thị cấp phát tài nguyên. Giải thuật này thƣờng đƣợc gọi là giải thuật của Banker. Tên giải thuật đƣợc lấy từ ý tƣởng hệ thống ngân hàng để đảm bảo ngân hàng không bao giờ cấp phát tiền mặt đang có của nó khi nó không thể thoả m n các yêu cầu của tất cả khách hàng. Khi một quá trình mới đƣa vào hệ thống, nó phải khai báo số tối đa các thể hiện của mỗi loại tài nguyên mà nó cần. Số này có thể không vƣợt quá tổng số tài nguyên trong hệ thống. Khi một ngƣời dùng yêu cầu tập hợp các tài nguyên, hệ thống phải xác định việc cấp phát của các tài nguyên này sẽ để lại hệ thống ở trạng thái an toàn hay không. Nếu trạng thái hệ thống sẽ là an toàn, tài nguyên sẽ đƣợc cấp; ngƣợc lại quá 141 trình phải chờ cho tới khi một vài quá trình giải phóng đủ tài nguyên. Cấu trúc dữ liệu để cài đặt giải thuật Banker. Gọi n là số quá trình trong hệ thống và m là số loại tài nguyên trong hệ thống. Available: một vector có chiều dài m hiển thị số lƣợng tài nguyên sẵn dùng của mỗi loại. Nếu Available[j]= k, có k thể hiện của loại tài nguyên Rj sẵn dùng. Max: một ma trận n x m định nghĩa số lƣợng tối đa yêu cầu của mỗi quá trình. Nếu Max[ i , j ] = k, thì quá trình Pi có thể yêu cầu nhiều nhất k thể hiện của loại tài nguyên Rj. Allocation: một ma trận n x m định nghĩa số lƣợng tài nguyên của mỗi loại hiện đƣợc cấp tới mỗi quá trình. Nếu Allocation[ i, j ] = k, thì quá trình Pi hiện đƣợc cấp k thể hiện của loại tài nguyên Rj. Need: một ma trận n x m hiển thị yêu cầu tài nguyên c n lại của mỗi quá trình. Nếu Need[ i, j ] = k, thì quá trình Pi có thể cần thêm k thể hiện của loại tài nguyên Rj để hoàn thành công việc của nó. Chú ý rằng, Need[ i, j ] = Max[ i, j ] – Allocation [i,j]. Cấu trúc dữ liệu này biến đổi theo thời gian về kích thƣớc và giá trị. Để đơn giản việc trình bày của giải thuật Banker, chúng ta thiết lập vài ký hiệu. Gọi X và Y là các vector có chiều dài n. Chúng ta nói rằng: X ≤ Y nếu và chỉ nếu X[i] ≤ Y[i] cho tất cả i = 1, 2, …, n. Ví dụ, nếu X = 1, 7, 3, 2 và Y = 0, 3, 2, 1 thì Y ≤ X Y < X nếu Y ≤ X và Y ≠ X. Giải thuật an toàn Giải thuật này để xác định hệ thống ở trạng thái an toàn hay không. Bước 1: Gọi Work và Finish là các vector có chiều dài m và n tƣơng ứng. Khởi tạo Work:=Available và Finish[i]:=false với i = 1, 2, …,n) Bước 2: Tìm i thỏa 2 điều kiện sau với 1= 1,2,3,…n : Finish[i] = false Need i ≤ Work. 142 Nếu không có i nào thỏa, di chuyển tới bƣớc 4 Bước 3: Work:=Work + Allocation i Finish[i] := true Di chuyển về bƣớc 2. Bước 4: Nếu Finish[i] = true cho tất cả i, thì hệ thống đang ở trạng thái an toàn. D y các quá trình Pi theo thứ tự đó là d y an toàn. Giải thuật này có thể yêu cầu độ phức tạp mxn2 thao tác để quyết định hệ thống đang ở trạng thái an toàn hay không. Giải thuật yêu cầu tài nguyên Cho Requesti là vector yêu cầu cho quá trình Pi. Nếu Request[i,j] = k, thì quá trình Pi muốn k thể hiện của loại tài nguyên Rj. Khi một yêu cầu tài nguyên đƣợc thực hiện bởi quá trình Pi, thì các hoạt động sau đƣợc thực hiện: (1) Nếu Requesti ≤ Needi, di chuyển tới bƣớc 2. Ngƣợc lại, phát sinh một điều kiện lỗi vì quá trình vƣợt quá yêu cầu tối đa của nó. (2) Nếu Requesti ≤ Available, di chuyển tới bƣớc 3. Ngƣợc lại, Pi phải chờ vì tài nguyên không sẵn có. (3) Giả sử hệ thống cấp phát các tài nguyên đƣợc yêu cầu tới quá trình Pi bằng cách thay đổi trạng thái sau: Available := Available – Requesti; Allocationi := Allocationi + Requesti; Needi := Needi – Requesti; Kiểm tra lại trạng thái an toàn hệ thống. Nếu kết quả trạng thái hệ thống vẫn an toàn thì giao dịch đƣợc hoàn thành và quá trình Pi đƣợc cấp phát tài nguyên ngay lập tức. Ngƣợc lại, nếu trạng thái mới là không an toàn, thì Pi phải chờ Requesti và trạng thái cấp phát tài nguyên cũ đƣợc phục hồi. Thí dụ minh họa 143 X t một hệ thống với 5 quá trình từ P0,P1,P2,P3,P4, và 3 loại tài nguyên A, B, C.
Loại tài nguyên A có 10 thể hiện, loại tài nguyên B có 5 thể hiện và loại tài nguyên C
có 7 thể hiện. Giả sử rằng tại thời điểm T0 trạng thái hiện tại của hệ thống nhƣ sau: Need = Max - Allocation Process Allocation Max Need Available Maximum
Resource
Vector 10 5 7 Available = MRV - ∑ Allocation A B C A B C A B C A B C A B C
0
2
3
2
0 0 7
0 3
2 9
1 2
2 4 5
2
0
2
3 3
2
2
2
3 1
0
0
1
0 P0
P1
P2
P3
P4 Bản 2.26. Ví dụ 2a về tránh deadlock Chúng ta khẳng định rằng hệ thống hiện ở trong trạng thái an toàn. Thật vậy, thứ tự Need = Max - Allocation quá trình theo thứ tự an toàn sẽ tránh đƣợc deadlock. Process Allocation Max Need Available Work Maximum
Resource
Vector 10 5 7 3 3 2 Available = MRV - ∑ Allocation A B C A B C A B C A B C A B C A B C
0
10 5 7
5 3 2
2
10 4 7
3
7 4 3
2
7 4 5
0 0 7 5
0 3 2
2 9 0
1 2 2
2 4 3 3 7 4
2 1 2
2 6 0
2 0 1
3 4 3 3
2
0
1
1 1
0
0
1
0 P0
P1
P2
P3
P4 Bản 2.27. Ví dụ 2b về tránh deadlock 144 Giả sử bây giờ tại thời điểm T1, tiến trình P1 yêu cầu thêm một thể hiện loại A và
hai thể hiện loại C, vì thế Request1 = 1, 0, 2 . Để quyết định yêu cầu này có thể đƣợc cấp tức thì hay không, trƣớc tiên chúng ta phải kiểm tra thông qua giải thuật yêu cầu tài nguyên: Request1 ≤ Need1 nghĩa là , 1, 0, 2 ≤ 1, 2, 2 là đúng Request1 ≤ Available nghĩa là, 1, 0, 2) ≤ 3, 3, 2 là đúng. Need = Max - Allocation Tài nguyên hệ thống đƣợc cập nhật nhƣ sau: Process Allocation Max Need Available Work Maximum
Resource
Vector 10 5 7 2 3 0 Available = MRV - ∑ Allocation A B C A B C A B C A B C A B C A B C
0
10 5 7
5 3 2
3
10 4 7
3
7 4 3
2
7 4 5
0 0 7 5
2 3 2
2 9 0
1 2 2
2 4 3 3 7 4
2 0 2
2 6 0
2 0 1
3 4 3 3
0
0
1
1 1
0
0
1
0 P0
P1
P2
P3
P4 Bản 2.28. Ví dụ 2c về tránh deadlock Chúng ta phải xác định trạng thái mới này là an toàn hay không? Để thực hiện
điều này, chúng ta thực thi giải thuật an toàn và tìm đƣợc thứ tự quá trình P1 (1, 0, 2). Ngƣợc lại, thứ tự thứ tự nào an toàn thì câu trả lời là Requesti phải đợi. Tuy nhiên, chúng ta cũng thấy rằng, khi hệ thống ở trong trạng thái T0, giả sử tại
thời điểm T1, tiến trình P4 yêu cầu Request4 3, 3, 0 không thể đƣợc gán vì các tài
nguyên là không sẵn dùng. 145 Giả sử tiến trình P0 yêu cầu Request0 0, 2, 0 không thể đƣợc cấp theo thứ tự
toàn. Tuy nhiên có thể cấp phát theo thứ tự mới 2.8.3.3. Phát hiện Deadlock Nếu một hệ thống không thực hiện giải thuật ngăn chặn deadlock hay tránh deadlock thì trƣờng hợp deadlock có thể xảy ra. Trong môi trƣờng này, hệ thống phải cung cấp giải thuật xem x t trạng thái của hệ thống để quyết định deadlock có xảy ra hay không. Nếu có thì xác định xem các quá trình nào đang bị deadlock sau đó tìm cách khắc phục deadlock. Trong thảo luận dƣới đây, chúng ta thảo luận chi tiết về hai yêu cầu khi chúng liên quan đến những hệ thống với chỉ một thể hiện của mỗi loại tài nguyên cũng nhƣ đối với hệ thống có nhiều thể hiện cho mỗi loại tài nguyên. Tuy nhiên, tại thời điểm này chúng ta chú ý lƣợc đồ phát hiện và phục hồi yêu cầu chi phí bao gồm không chỉ chi phí tại thời điểm thực thi cho việc duy trì thông tin cần thiết và thực thi giải thuật phát hiện mà c n các l ng phí có thể phát sinh trong việc phát hiện deadlock. 2.8.3.3.1. Một thể hiện của mỗi loại tài nguyên Nếu tất cả tài nguyên chỉ có một thể hiện thì chúng ta có thể định nghĩa giải thuật phát hiện deadlock dùng một biến dạng của đồ thị cấp phát tài nguyên, đƣợc gọi là đồ thị chờ Wait-for . Chúng ta đạt đƣợc đồ thị này từ đồ thị cấp phát tài nguyên bằng cách gỡ bỏ các nút của loại tài nguyên và xóa các cạnh tƣơng ứng. 15 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, Tr.127 146 Hình 2.39. a Đồ thị cấp phát tài nguyên. b Đồ thị chờ tƣơng ứng15 Chính xác hơn, một cạnh từ Pi tới Pj trong đồ thị chờ hiển thị rằng quá trình Pi đang chờ một quá trình Pj để giải phóng tài nguyên mà Pi cần. Cạnh Pi → Pj tồn tại trong đồ thị chờ nếu và chỉ nếu đồ thị cấp phát tài nguyên tƣơng ứng chứa hai cạnh Pi→ Rq và Rq → Pj đối với một số tài nguyên Rq. Nhƣ đ đề cập trƣớc đó, deadlock tồn tại trong hệ thống nếu và chỉ nếu đồ thị chờ chứa chu trình. Để phát hiện deadlock, hệ thống cần duy trì đồ thị chờ và định kỳ gọi giải thuật để tìm kiếm chu trình trong đồ thị. Một giải thuật phát hiện chu trình trong đồ thị chờ yêu cầu độ phức tạp n2 thao tác, ở đây n là số cạnh của đồ thị. 2.8.3.3.2. Nhiều thể hiện của một loại tài nguyên Lƣợc đồ đồ thị chờ không thể áp dụng đối với hệ thống cấp phát tài nguyên với nhiều thể hiện cho mỗi loại tài nguyên. Giải thuật phát hiện deadlock mà chúng ta mô tả sau đây có thể áp dụng cho hệ thống này. Giải thuật thực hiện nhiều cấu trúc dữ liệu thay đổi theo thời gian mà chúng tƣơng tự nhƣ đƣợc dùng trong giải thuật Banker. Available: một vector có chiều dài m hiển thị số lƣợng tài nguyên sẵn có của mỗi loại. Allocation: ma trận nxm định nghĩa số lƣợng tài nguyên của mỗi loại hiện đƣợc cấp phát tới mỗi quá trình. Request: ma trận nxm hiển thị yêu cầu hiện tại của mỗi quá trình. Nếu Request[i,j] = k, thì quá trình Pi đang yêu cầu k thể hiện nữa của loại tài nguyên Rj. Bước 1: Gọi Work và Finish là các vector có chiều dài m và n tƣơng ứng. Khởi tạo Work:=Available. For i := 1, 2, …,n nếu Allocationi ≠ 0, thì Finish[i]:= false; ngƣợc lại Finish[i]:= true. Bước 2: Tìm chỉ số i thỏa: (a) Finish[i] = false 147 b Request i ≤ Work. Nếu không có i nào thỏa, di chuyển tới bƣớc 4 Bước 3: Work:=Work + Allocation i Finish[i] := true Di chuyển về bƣớc 2. Bước 4: Nếu Finish[i] = false cho một vài i, 1 ≤ i ≤ n thì hệ thống đang ở trạng thái deadlock. Ngoài ra, nếu Finish[i] = false thì quá trình Pi bị deadlock. Giải thuật này yêu cầu độ phức tạp mxn2 để phát hiện hệ thống có ở trong trạng thái deadlock hay không. Câu hỏi đặt ra là tại sao chúng ta trả lại tài nguyên của quá trình Pi trong bƣớc 3 ngay sau khi chúng ta xác định rằng Requesti ≤ Work trong bƣớc 2b . Chúng ta biết rằng Pi hiện tại không liên quan deadlock vì Requesti ≤ Work . Do đó, chúng ta lạc quan và khẳng định rằng Pi sẽ không yêu cầu thêm tài nguyên nữa để hoàn thành công việc của nó; do đó nó sẽ trả về tất cả tài nguyên hiện đƣợc cấp phát tới hệ thống. Nếu giả định của chúng ta không đúng, deadlock có thể xảy ra sao đó. Deadlock sẽ đƣợc phát hiện tại thời điểm kế tiếp mà giải thuật phát hiện deadlock đƣợc nạp. Để minh hoạ giải thuật này, chúng ta x t hệ thống với 5 quá trình P0, P1, P2, P3, P4
và 3 loại tài nguyên A, B, C. Loại tài nguyên A có 7 thể hiện, loại tài nguyên B có 2 thể hiện và loại tài nguyên C có 6 thể hiện. Giả sử rằng tại thời điểm T0, chúng ta có
trạng thái cấp phát tài nguyên sau: Process Allocation Request Available Work 0 2 6 0 0 7 Available = MRV - ∑ Allocation Maximum
Resource
Vector
A B C A B C A B C A B C A B C
0
2
3
2
0 0 0 0
0 2 0
3 0 0
1 1 0
2 0 0 0
2
0
0
2 1
0
0
1
0 P0
P1
P2
P3
P4 148 Bản 2.29. Ví dụ về phát hiện deadlock Chúng ta khẳng định rằng hệ thống không ở trong trạng thái deadlock. Thật vậy, nếu chúng ta thực thi giải thuật an toàn, chúng ta sẽ tìm ra thứ tự Bây giờ giả sử rằng quá trình P2 thực hiện yêu cầu thêm một thể hiện loại C. Ma trận yêu cầu đƣợc hiệu chỉnh nhƣ sau: Process Request
A B C
0
0 0
2
2 0
1
0 0
0
1 0
2
0 0 P0
P1
P2
P3
P4 Bản 2.30. Ma tr n Request Chúng ta khẳng định rằng hệ thống bây giờ bị deadlock. Mặc dù chúng ta có thể đ i lại tài nguyên đƣợc giữ bởi quá trình P0, số lƣợng tài nguyên sẵn dùng không đủ để hoàn thành các yêu cầu của các quá trình c n lại. Do đó, deadlock tồn tại và bao gồm các quá trình P1, P2, P3, P4. Khi nào thì chúng ta nên nạp giải thuật phát hiện deadlock? Câu trả lời phụ thuộc vào hai yếu tố: Deadlock có khả năng xảy ra thƣờng xuyên nhƣ thế nào? Bao nhiêu quá trình sẽ bị ảnh hƣởng bởi deadlock khi nó sẽ ra? Nếu deadlock xảy ra thƣờng xuyên thì giải thuật phát hiện nên đƣợc nạp lên thƣờng xuyên. Những tài nguyên đƣợc cấp phát để các quá trình bị deadlock sẽ rảnh cho đến khi deadlock có thể bị phá vỡ. Ngoài ra, số lƣợng quá trình liên quan trong chu trình deadlock có thể tăng lên. Deadlock xảy ra chỉ khi một số quá trình thực hiện yêu cầu mà không đƣợc cấp tài nguyên tức thì. Yêu cầu này có thể là yêu cầu cuối hoàn thành một chuỗi các quá trình đang yêu cầu. Ngoài ra, chúng ta có thể nạp giải thuật phát hiện mọi khi một yêu cầu cho việc cấp phát không thể đƣợc cấp tức thì. Dĩ nhiên, nạp giải thuật phát hiện deadlock cho mỗi yêu cầu có thể gây ra một chi phí có thể xem x t trong thời gian tính toán. Một thay đổi ít đắt hơn là nạp giải thuật tại thời điểm ít thƣờng xuyên hơn - ví dụ, một lần một giờ hay bất cứ khi nào việc sử dụng CPU rơi 149 xuống thấp hơn 40%. Mỗi khi deadlock đƣợc phát hiện, hệ điều hành thực hiện một vài giải pháp để thoát khỏi deadlock. Sau đây là một vài giải pháp có thể: (1) Thoát tất cả các tiến trình bị deadlock. Đây là một giải pháp đơn giản nhất, thƣờng đƣợc các hệ điều hành sử dụng nhất. (2) Sao lƣu lại mỗi tiến trình bị deadlock tại một vài điểm kiểm tra đƣợc định nghĩa trƣớc, sau đó khởi động lại tất cả các tiến trình. Giải pháp này yêu cầu hệ điều hành phải lƣu lại các thông tin cần thiết tại điểm dừng của tiến trình, đặc biệt là con trỏ lệnh và các tài nguyên tiến trình đang sử dụng, để có thể khởi động lại tiến trình đƣợc. Giải pháp này có nguy cơ xuất hiện deadlock trở lại là rất cao, vì khi tất cả các tiến trình đều đƣợc reset trở lại thì việc tranh chấp tài nguyên là khó tránh khỏi. Ngoài ra hệ điều hành thƣờng phải chi phí rất cao cho việc tạm dừng và tái kích hoạt tiến trình. (3) Chỉ kết thúc một tiến trình trong tập tiến trình bị deadlock, thu hồi tài nguyên của tiến trình này, để cấp phát cho một tiến trình nào đó trong tập tiến trình deadlock để giúp tiến trình này ra khỏi deadlock, rồi gọi lại thuật toán kiểm tra deadlock để xem hệ thống đ ra khỏi deadlock hay chƣa, nếu rồi thì dừng, nếu chƣa thì tiếp tục giải phóng thêm tiến trình khác. Và lần lƣợt nhƣ thế cho đến khi tất cả các tiến trình trong tập tiến trình deadlock đều ra khỏi tình trạng deadlock. Trong giả pháp này vấn đề đặt ra đối với hệ điều hành là nên chọn tiến trình nào để giải phóng đầu tiên và dựa vào tiêu chuẩn nào để chọn lựa sao cho chi phí để giải phóng deadlock là thấp nhất. (4) Tập trung toàn bộ quyền ƣu tiên sử dụng tài nguyên cho một tiến trình, để tiến trình này ra khỏi deadlock, và rồi kiểm tra xem hệ thống đ ra khỏi deadlock hay chƣa, nếu rồi thì dừng lại, nếu chƣa thì tiếp tục. Lần lƣợt nhƣ thế cho đến khi hệ thống ra khỏi deadlock. Trong giải pháp này hệ điều hành phải tính đến chuyện tái kích hoạt lại tiến trình sau khi hẹ thống ra khỏi deadlock. Đối với các giải pháp 3 và 4 , hệ điều hành dựa vào các tiêu chuẩn sau đây để chọn lựa tiến trình giải phóng hay ƣu tiên tài nguyên: Thời gian xử lý ít nhất; Thời gian cần CPU c n lại ít nhất; Tài nguyên cần cấp phát là ít nhất; Quyền ƣu tiên là thấp nhất. Nếu phƣơng pháp kết thúc đƣợc dùng thì với một tập hợp các quá trình deadlock 150 đƣợc cho, chúng ta phải xác định quá trình nào nên đƣợc kết thúc trƣớc trong sự cố gắng để phá vỡ deadlock. Quyết định này dựa vào chính sách kinh tế mà chúng ta nên hủy bỏ quá trình nào thì sự kết thúc của quá trình đó sẽ chịu chi phí tối thiểu. Tuy nhiên, thuật ngữ chi phí tối thiểu là không chính xác. Nhiều yếu tố có thể xác định quá trình nào đƣợc chọn bao gồm: Độ ƣu tiên của quá trình là gì. Quá trình đ đƣợc tính toán bao lâu và bao lâu nữa quá trình sẽ tính toán trƣớc khi hoàn thành công việc đƣợc chỉ định của nó. Bao nhiêu và loại tài nguyên gì quá trình đang sử dụng. Bao nhiêu tài nguyên nữa quá trình cần để hoàn thành Bao nhiêu quá trình sẽ cần đƣợc kết thúc. Quá trình là giao tiếp hay dạng bó. 2.9. TÓM TẮT Trong suốt chu trình sống, tiến trình chuyển đổi qua lại giữa các trạng thái ready, running và blocked. Bộ định thời biểu của hệ điều hành chịu trách nhiệm áp dụng một gỉai thuật định thời thích hợp để chọn tiến trình phù hợp đƣợc sử dụng CPU, và bộ phân phát sẽ chuyển giao CPU cho tiến trình này. Các giải thuật định thời biểu thông dụng: FCFS, Round Robin, định thời biểu với độ ƣu tiên, SJF, định thời biểu phản hồi đa cấp. Một số tiến trình trong hệ thống có nhu cầu trao đổi thông tin để phối hợp hoạt động, do mỗi tiến trình có một không gian địa chỉ độc lập nên việc liên lạc chỉ có thể thực hiện thông qua các cơ chế do hệ điều hành cung cấp. Khi các tiến trình trao đổi thông tin, chia s tài nguyên chung, cần phải đồng bộ hoá hoạt động của chúng chủ yếu do yêu cầu độc quyền truy xuất hoặc phối hợp hoạt động. Miền găng là đoạn lệnh trong chƣơng trình có khả năng phát sinh mâu thuẫn truy xuất. Để không xảy ra mâu thuẫn truy xuất, cần đảm bảo tại một thời điểm chỉ có một tiến trình đƣợc vào miền găng. Trạng thái deadlock xảy ra khi hai hay nhiều quá trình đang chờ không xác định một sự kiện mà có thể đƣợc gây ra chỉ bởi một trong những quá trình đang chờ. Về 151 nguyên tắc, có ba phƣơng pháp giải quyết deadlock: Sử dụng một số giao thức để ngăn chặn hay tránh deadlock, đảm bảo rằng hệ thống sẽ không bao giờ đi vào trạng thái deadlock. Cho ph p hệ thống đi vào trạng thái deadlock, phát hiện và sau đó phục hồi. Bỏ qua vấn đề deadlock và giả vờ deadlock chƣa bao giờ xảy ra trong hệ thống. Giải pháp này là một giải pháp đƣợc dùng bởi hầu hết các hệ điều hành bao gồm UNIX. Trƣờng hợp deadlock có thể xảy ra nếu và chỉ nếu bốn điều kiện cần xảy ra cùng một lúc trong hệ thống: loại trừ lẫn nhau, giữ và chờ cấp thêm tài nguyên, không ƣu tiên, và tồn tại chu trình trong đồ thị cấp phát tài nguyên. Để ngăn chặn deadlock, chúng ta đảm bảo rằng ít nhất một điều kiện cần không bao giờ xảy ra. Một phƣơng pháp để tránh deadlock mà ít nghiêm ngặt hơn giải thuật ngăn chặn deadlock là có thông tin trƣớc về mỗi quá trình sẽ đang dùng tài nguyên nhƣ thế nào. Ví dụ, giải thuật Banker cần biết số lƣợng tối đa của mỗi lớp tài nguyên có thể đƣợc yêu cầu bởi mỗi quá trình. Sử dụng thông tin này chúng ta có thể định nghĩa giải thuật tránh deadlock. Nếu hệ thống không thực hiện một giao thức để đảm bảo rằng deadlock sẽ không bao giờ xảy ra thì lƣợc đồ phát hiện và phục hồi phải đƣợc thực hiện. Giải thuật phát hiện deadlock phải đƣợc nạp lên để xác định deadlock có thể xảy ra hay không. Nếu deadlock đƣợc phát hiện hệ thống phải phục hồi bằng cách kết thúc một số quá trình bị deadlock hay đ i lại tài nguyên từ một số quá trình bị deadlock. Trong một hệ thống mà nó chọn các nạn nhân để phục hồi về trạng thái trƣớc đó chủ yếu dựa trên cơ sở yếu tố chi phí, việc đói tài nguyên có thể xảy ra. Kết quả là quá 152 trình đƣợc chọn không bao giờ hoàn thành công việc đƣợc chỉ định của nó. Câu hỏi ôn tập 1. Phân biệt tiến trình và tiểu trình? 2. Phân biệt chƣơng trình và tiến trình? 3. Tiến trình có thể có bao nhiêu trạng thái? 4. Chƣơng trình có phải là tiến trình không? Tại sao? 5. Thuật ngữ PCB có nghĩa là gì?Chức năng của nó? 6. Kể ra các tiêu chí điều phối tiến trình nhƣ thế nào thì tối ƣu? 7. Định nghĩa thời gian hoàn thành, thông lƣợng, thời gian chờ ? 8. Nhận x t về thời gian chuyển ngữ cảnh của CPU? Thời gian CPU bỏ ra để chuyển từ việc phục vụ cho quá trình này sang quá trình khác, lúc này CPU làm gì? Tại sao những lần chuyển ngữ cảnh phụ thuộc nhiều vào hỗ trợ phần cứng? 9. Nêu ý nghĩa các chiến lƣợc định thời biểu tiến trình? Phân tích ƣu, khuyết của các chiến lƣợc định thời biểu? Chiến lƣợc nào tối ƣu nhất? 10. Phân biệt chiến lƣợc định thời biểu độc quyền không trƣng dụng và không độc quyền trƣng dụng ?Chiến lƣợc nào tối ƣu hơn? 11. Ý tƣởng của giải thuật SJF trƣng dụng và không trƣng dụng, Ƣu điểm và khuyết điểm của giải thuật SJF, khó khăn thật sự của giải thuật này là gì? 12. Nêu giải pháp giải quyết vấn đề chết đói Starvation trong giải thuật lập lịch biểu theo kiểu ƣu tiên trƣng dụng không độc quyền . 13. Tại sao phổ thời gian q trong giải thuật Round Robin phải đƣợc chọn là đủ lớn? 14. Kể tên các chiến lƣợc phân công công việc của hệ điều hành? 15. Thế nào là miền găng hay đoạn găng Critical Section ?cho ví dụ? 16. Phân biệt tài nguyên găng Critical Resouce và đoạn găng (CS)?cho ví dụ để phân biệt? điều kiện cho các tiến trình muốn sử dụng đoạn găng là gì? 17. Tại sao phải đồng bộ hóa quá trình? Các giải pháp để đồng bộ hóa?Thế nào là chờ đợi tích cực?Giải pháp đƣợc hổ trợ bởi hệ điều hành là giải pháp gì?nó có 153 ƣu điểm gì? 18. Phân biệt Deadlock và Starvation?Cho ví dụ trong hệ điều hành? R1 P1 P2 R2 19. Đồ thị cấp phát tài nguyên sau có xảy ra deadlock không? Tại sao? 20. Phƣơng pháp quản lý deadlock?có thể đ i lại tài nguyên từ quá trình đạng bị deadlock hay không?Nếu có đ i lại bằng cách nào? 21. Tại sao phải xử lý song song?Nêu một số phƣơng pháp lập trình xử lý song song? 22. Thuật ngữ Monitor trong hệ điều hành là gì?dùng Monitor để làm gì? 23. Thuật ngữ Semaphore là gì?dùng semaphore để làm gì? định nghĩa 2 thao thác truy cập semaphore? 24. Thuật ngữ race condition là gì?Lấy ví dụ trong hệ điều hành? 25. Hiện tƣợng “dùng đúp” dữ liệu và “mất dữ liệu” ở bài toán Producer và Cunsumer di n ra khi nào? Biện pháp khắc phục? 26. Nêu giải pháp tránh tắc nghẽn cho bài toán 5 nhà triết gia ăn tối? 27. Nêu Ý nghĩa 3 bài toán nguyên thủy trong hệ điều hành? 28. Vấn đề bỏ qua hoàn toàn deadlock và xem nhƣ nó không xảy ra trong hệ thống có gây ảnh hƣởng gì đến hệ thống không? Tại sao? 154 29. Tìm hiểu tiến trình trong Windows NT? 30. Giả sử một hệ thống ở trong trạng thái không an toàn nhƣng không bị deadlock. Hệ thống có nhất thiết đi vào trạng thái deadlock hay không? Giải thích? 31. X t một hệ thống gồm 4 loại tài nguyên cùng loại. Hệ thống có 3 quá trình, mỗi quá trình cần tối đa 2 tài nguyên. Chứng tỏ hệ thống không bị deadlocked. R1 R2 P2 P1 P3 R5 P4 R3 R4 32. Ý nghĩa đồ thị chờ?Vẽ đồ thị chờ biết rằng đồ thị cấp phát tài nguyên nhƣ sau? 33. Xác định thời lƣợng q là một nhiệm vụ khó khăn. Giả sử chi phí trung bình cho một lần chuyển đổi ngữ cảnh là s, và thời gian trung bình một tiến trình hƣớng nhập xuất sử dụng CPU trƣớc khi phát sinh một yêu cầu nhập xuất là t ( t>>s). Thảo luận các tác động đến sự thực hiện của hệ thống khi chọn q theo các quy tắc sau : a) q = s b) s < q < t c) q = t d) q > t 34. Giả sử một hệ điều hành áp dụng giải thuật định thời biểu multilevel feedback với 5 mức ƣu tiên giảm dần . Thời lƣợng q dành cho hàng đợi cấp 1 là 0,5s. Mỗi hàng đợi cấp thấp hơn sẽ có thời lƣợng q dài gấp đôi hàng đợi ứng với mức ƣu tiên cao hơn nó. Một tiến trình khi vào hệ thống sẽ đƣợc đƣa vào hàng đợi mức cao nhất, và chuyển dần xuống các hàng đợi bên dƣới sau mỗi lƣợt sử 155 dụng CPU. Một tiến trình chỉ có thể bị thu hồi CPU khi đ sử dụng hết thời lƣợng q dành cho nó. Hệ thống có thể thực hiện các công việc xử lý theo lô hoặc tƣơng tác, và mỗi công việc lại có thể hƣớng xử lý hay hƣớng nhập xuất. a) Giải thích tại sao hệ thống này hoạt động không hiệu quả? b) Cần phải thay đổi tối thiểu nhƣ thế nào để hệ thống điều phối các công việc với những bản chất khác biệt nhƣ thế tốt hơn? Bài tập Bài 1. Xét tập các tiến trình sau với thời gian yêu cầu CPU và độ ƣu tiên kèm theo Tiến trình Thời điểm vào RL Thời gian CPU Độ ƣu tiên 0 10 3 P1 1 1 1 P2 2 2 3 P3 3 1 4 P4 4 5 2 P5 Giả sử các tiến trình cùng đƣợc đƣa vào hệ thống tại thời điểm 0 a) Cho biết kết quả định thời biểu hoạt động của các tiến trình trên theo giải thuật FCFS; SJF độc quyền và không độc quyền; định thời biểu theo độ ƣu tiên độc quyền độ ƣu tiên 1 cao nhất ; và RR q=2). b) Cho biết thời gian lƣu lại trong hệ thống Turnaround Time của từng tiến trình trong từng giải thuật định thời biểu ở câu a. c) Cho biết thời gian chờ trong hệ thống Waiting time của từng tiến trình trong từng giải thuật định thời biểu ở câu a. d) Cho biết thời gian chờ trung bình trong hệ thống đối với mỗi giải thuật định thời biểu ở câu a. e) Giải thuật định thời biểu nào trong các giải thuật ở câu a cho thời gian chờ trung 156 bình là cực tiểu? Bài 2. Giả sử có các tiến trình sau trong hệ thống : Tiến trình Thời điểm vào RL Thời gian CPU 0.0 8 0.4 4 1.0 1 P1
P2
P3 Sử dụng chiến lƣợc định thời biểu độc quyền và các thông tin có đƣợc tại thời điểm ra quyết định để trả lời các câu hỏi sau đây: a) Cho biết thời gian lƣu lại trung bình trong hệ thống Turnaround Time của các tiến trình trong giải thuật định thời biểu FCFS. b) Cho biết thời gian lƣu lại trung bình trong hệ thống Turnaround Time của các tiến trình trong giải thuật định thời biểu SJF không độc quyền. c) Giải thuật SJF dự định cải tiến sự thực hiện của hệ thống, nhƣng lƣu ý chúng ta phải chọn định thời biểu P1 tại thời điểm 0 vì không biết rằng sẽ có hai tiến trình
ngắn hơn vào hệ thống sau đó. Thử tính thời gian lƣu lại trung bình trong hệ thống nếu để CPU nhàn rỗi trong 1 đơn vị thời gian đầu tiên và sau đó sử dụng SJF để định thời biểu. Lƣu ý P1 và P2 sẽ phải chờ trong suốt thời gian nhàn rỗi
này, do vậy thời gian chờ của chúng tăng lên. Giải thuật định thời biểu này đƣợc biết đến nhƣ định thời biểu dựa trên thông tin về tƣơng lai. Bài 3. Cho tập hợp các tiến trình nhƣ trong bảng. Có 4 hàng đợi: Q0, Q1, Q2, Q3 với phổ thời gian phục vụ nhƣ trong hình dƣới. H y lập biểu đồ Gannt để minh họa sự thực thi của các tiến trình với giải thuật: hàng đợi phản hồi đa cấp. Tính thời gian chờ trung bình và tổng số lần chuyển đổi ngữ cảnh? Tiến trình Thời điểm vào RL Thời gian CPU ms 0 100 10 75 20 15 25 8 30 20 40 50 157 P1
P2
P3
P4
P5
P6 Q0 Q1 Q2 Q3 Bài 4. Cho tập hợp các quá trình, ma trận max, allocation và 3 loại tài nguyên A có 10 thể hiện , B có 7 thể hiện , C có 6 thể hiện . Available ?
A B C Allocation
A
5
2
1
1 B
2
1
0
2 C
4
0
0
1 Max
A
5
6
4
2 B
3
4
2
4 C
5
4
2
3 Need ?
B
A C P0
P1
P2
P3 a) Hệ thống có ở trạng thái an toàn không? D y b) Có tất cả bao nhiêu thứ tự an toàn và không an toàn? Liệt kê tất cả các thứ tự an toàn?Liệt kê tất cả các thứ tự không an toàn? Bài 5: H y nêu cách xử lý song song cho các biểu thức sau trong một máy tính có hổ trợ xử lý song song. a. (-a + (b * (c/2) + (d * d * 4 * c))) / (2 * a) b. (-b + sqrt(b * b – 4 * a * c)) / (2 * a) c. sqrt(p * (p - a) * (p - b) * (p - c vớp p = a + b + c * 0.5 Lập trình Chương trình 1. Viết chƣơng trình đa luồng thực hiện tính tổng n số nguyên đầu tiên 158 n nhập từ bàn phím Chương trình 2. Viết chƣơng trình đa luồng thực hiện tính tích phân từ a đến b của hàm f(x). Chương trình 3. Chƣơng trình tính tích của 2 ma trận A và B kích thƣớc nxm và giá trị các phần tử trong ma trận đƣợc khởi tạo là các số nguyên ngẫu nhiên từ 1 đến 100. Chương trình 4. Chƣơng trình sắp xếp giá trị các phần tử trong ma trận tăng dần giảm dần , giá trị các phần tử trong ma trận đƣợc khởi tạo là các số nguyên ngẫu nhiên từ 1 đến 100. Chương trình 5. Chƣơng trình mô phỏng bài toán 5 nhà triết gia ăn tối. và giải quyết tình trạng deadlocked cho bài toán này. Chương trình 6. Một ph ng máy tính gồm 40 máy, số lƣợng sinh viên cần sử dụng là nhiều hơn số máy. H y viết chƣơng trình xử lý việc sử dụng máy tính sao cho mỗi máy chỉ có một sinh viên đƣợc sử dụng. Chương trình 7. Trong giảng đƣờng có n ghế, sinh viên đăng ký vào học thông thƣờng lớn hơn số ghế 10%. H y viết chƣơng trình mô phỏng sinh viên vào lớp học, nếu có ghế thì vào học, ngƣợc lại nghỉ. 159 Ghi chú: Học viên có thể tự chọn bài toán có tính chất song song để lập trình. TÀI LIỆU TH M KHẢO [3] Trần Hạnh Nhi, Giáo trình hệ điều hành nâng cao, Đại học Khoa học Tự nhiên TP.HCM, 2003. [4] [Lê Khắc Nhiên n, Hoàng Kiếm], Giáo trình Nh p môn hệ điều hành, Đại học Khoa học Tự nhiên TP.HCM, 2003. [5] Nguyễn Kim Tuấn, Giáo trình Hệ điều hành, Đại học Huế, 2004. 160 [6] Nguyễn Ph Trường, Giáo trình Hệ điều hành, Đại học Cần Thơ,2005. 3.1. MỤC TIÊU Bài học này sẽ giúp các bạn hình dung những vấn đề cần quan tâm khi thiết kế thành phần quản lý bộ nhớ của hệ điều hành. Sau khi học xong chƣơng này, ngƣời học nắm đƣợc những kiến thức sau: Hi u các cách hác nhau đ qu n bộ nhớ Hi u tiếp c n qu n bộ d ng ỹ thu t phân trang và phân đoạn V n dụng một tiếp c n qu n bộ nhớ ph hợp với hệ thống xác định Bộ nhớ chính là thiết bị lƣu trữ duy nhất thông qua đó CPU có thể trao đổi thông tin với môi trƣờng ngoài, do vậy nhu cầu tổ chức, quản lý bộ nhớ là một trong những nhiệm vụ trọng tâm hàng đầu của hệ điều hành. Bộ nhớ chính đƣợc tổ chức nhƣ một mảng một chiều các từ nhớ word , mỗi từ nhớ có một địa chỉ. Việc trao đổi thông tin với môi trƣờng ngoài đƣợc thực hiện thông qua các thao tác đọc hoặc ghi dữ liệu vào một địa chỉ cụ thể nào đó trong bộ nhớ. 3.2. NHIỆM VỤ QUẢN L BỘ NHỚ Trong các hệ thống đơn chƣơng trình uniprogramming , trên bộ nhớ chính ngoài hệ điều hành, chỉ có một chƣơng trình đang thực hiện. Trong các hệ thống đa chƣơng multiprogramming trên bộ nhớ chính ngoài hệ điều hành, có thể có nhiều tiến trình đang hoạt động. Do đó nhiệm vụ quản lý bộ nhớ của hệ điều hành trong hệ thống đa chƣơng trình sẽ phức tạp hơn nhiều so với trong hệ thống đơn chƣơng trình. Trong hệ thống đa chƣơng bộ phận quản lý bộ nhớ phải có nhiệm vụ đƣa bất kỳ một tiến trình vào bộ nhớ khi có yêu cầu, kể cả khi trên bộ nhớ chính không c n không gian trống, ngoài ra nó phải bảo vệ chính hệ điều hành và các tiến trình trên bộ nhớ tránh các trƣờng hợp truy xuất bất hợp lệ xảy ra. Nhƣ vậy việc quản lý bộ nhớ trong các hệ thống đa chƣơng là quan trọng và cần thiết. Khi thiết ế thành phần qu n bộ nhớ ph i thực Sự tương ứng giữa địa chỉ logic và địa chỉ v t : làm cách nào để chuyển đổi một hiện các nhiệm vụ sau đây: địa chỉ dạng danh biểu tƣợng trƣng symbolic trong chƣơng trình ngƣời dùng 161 thành một địa chỉ thực trong bộ nhớ chính? Nhiệm vụ này đƣợc thực hiện bởi đơn vị quản lý bộ nhớ MMU Memory Management Unit đƣợc định nghĩa trong phần sau. Sự tái định vị (Relocation): Trong các hệ thống đa chƣơng, không gian bộ nhớ chính thƣờng đƣợc chia s cho nhiều tiến trình khác nhau và yêu cầu bộ nhớ của các tiến trình luôn lớn hơn không gian bộ nhớ vật lý mà hệ thống có đƣợc. Vấn đề là không gian bộ nhớ là có hạn trong khi yêu cầu bộ nhớ của tiến trình là vô hạn. Do dó, một chƣơng trình đang hoạt động trên bộ nhớ cũng có thể bị đƣa ra đĩa (swap out) và nó sẽ đƣợc đƣa vào lại (swap in) bộ nhớ tại một thời điểm thích hợp sau đó. Đây là cơ chế hoán vị (Swap). B o vệ bộ nhớ (Protection): làm thế nào để ngăn chặn các tiến trình xâm phạm đến vùng nhớ đƣợc cấp phát cho tiến trình khác? Mỗi tiến trình phải đƣợc bảo vệ để chống lại sự truy xuất bất hợp lệ vô tình hay có chủ ý của các tiến trình khác. Để thực hiện điều này hệ thống quản lý bộ nhớ phải biết đƣợc không gian địa chỉ của các tiến trình khác trên bộ nhớ và phải kiểm tra tất cả các yêu cầu truy xuất bộ nhớ của mỗi tiến trình khi tiến trình đƣa ra địa chỉ truy xuất. Điều này khó thực hiện vì không thể xác định địa chỉ của các chƣơng trình trong bộ nhớ chính trong quá trình biên dịch mà phải thực hiện việc tính toán địa chỉ tại thời điểm chạy chƣơng trình. Hệ điều hành có nhiều chiến lƣợc khác nhau để thực hiện điều này. Điều quan trọng nhất mà hệ thống quản lý bộ nhớ phải thực hiện là không cho ph p các tiến trình của ngƣời dùng truy cập đến bất kỳ một vị trí nào của chính hệ điều hành, ngoại trừ vùng dữ liệu và các rountine mà hệ điều hành cung cấp cho chƣơng trình ngƣời dùng. Chia sẻ thông tin: làm thế nào để cho ph p hai tiến trình có thể chia s thông tin trong bộ nhớ? 162 Bất kỳ một chiến lƣợc nào đƣợc cài đặt đều phải có tính mềm d o để cho phép
nhiều tiến trình có thể truy cập đến cùng một địa chỉ trên bộ nhớ chính. Ví dụ, khi
có nhiều tiến trình cùng thực hiện một chƣơng trình thì việc cho phép mỗi tiến trình
cùng truy cập đến một bản copy của chƣơng trình sẽ thuận lợi hơn khi cho phép
mỗi tiến trình truy cập đến một bản copy sở hữu riêng. Các tiến trình đồng thực
hiện trên một vài công việc có thể cần để chia s truy cập đến cùng một cấu trúc dữ
liệu. Hệ thống quản lý bộ nhớ phải điều khiển việc truy cập đến không gian bộ nhớ
đƣợc chia s mà không vi phạm đến các yêu cầu bảo vệ bộ nhớ. Ngoài ra, trong môi trƣờng hệ điều hành đa nhiệm hệ điều hành phải chia s không gian nhớ cho các tiến trình để hệ điều hành có thể nạp đƣợc nhiều tiến trình vào bộ nhớ để các tiến
trình này có thể hoạt động đồng thời với nhau. T chức bộ nhớ logic: Bộ nhớ chính của hệ thống máy tính đƣợc tổ chức nhƣ là một d ng hoặc một mảng, không gian địa chỉ bao gồm một d y có thứ tự các Byte hoặc các word. Bộ nhớ phụ cũng đƣợc tổ chức tƣơng tự. Mặc dù việc tổ chức này có sự kết hợp chặt chẽ với phần cứng thực tế của máy nhƣng nó không phù hợp với các chƣơng trình. Đa số các chƣơng trình đều đƣợc chia thành các module, một vài trong số đó là không thể thay đổi read only, execute only và một vài trong số đó chứa dữ liệu là có thể thay đổi. Và không gian địa chỉ logic của chƣơng trình này sẽ do CPU sinh ra tại thời điểm biên dịch. Nếu hệ điều hành và phần cứng máy tính có thể giao dịch một cách hiệu quả với các chƣơng trình của ngƣời dùng và dữ liệu trong các module thì một số thuận lợi có thể thấy rõ sau đây: Các module có thể đƣợc viết và biên dịch độc lập, với tất cả các tham chiếu từ một module này đến module khác đƣợc giải quyết bởi hệ thống tại thời điểm chạy. Các mức độ khác nhau của sự bảo vệ, read-only, execute-only, có thể cho ra các module khác nhau. Nó có thể đƣa ra các cơ chế để các module có thể đƣợc chia s giữa các tiến trình. Kỹ thuật đáp ứng cho yêu cầu này là sự phân đoạn segmentation , đây là một trong những kỹ thuật quản lý bộ nhớ đƣợc trình bày trong chƣơng này. Qu n bộ nhớ v t : làm cách nào để mở rộng bộ nhớ có sẵn nhằm lƣu trữ đƣợc nhiều tiến trình đồng thời? Tổ chức bộ nhớ vật lý Physical organization : Nhƣ chúng ta đ biết bộ nhớ máy tính đƣợc tổ chức theo hai cấp: bộ nhớ chính và bộ nhớ phụ. Bộ nhớ chính cung cấp một tốc độ truy cập dữ liệu cao, nhƣng dữ liệu trên nó phải đƣợc làm tƣơi thƣờng xuyên và không thể tồn tại lâu dài trên nó. Bộ nhớ phụ có tốc độ truy xuất chậm và r tiền hơn so với bộ nhớ chính nhƣng nó không cần làm tƣơi thƣờng xuyên. Vì thế bộ nhớ phụ có khả năng lƣu trữ lớn và cho ph p lƣu trữ dữ liệu và chƣơng trình trong một khoảng thời gian dài, trong khi đó bộ nhớ chính chỉ để giữ 163 (hold) một khối lƣợng nhỏ các chƣơng trình và dữ liệu đang đƣợc sử dụng tại thời điểm hiện tại. Trong giản đồ hai cấp này, việc tổ chức luồng thông tin giữa bộ nhớ chính và bộ nhớ phụ là một nhiệm vụ quan trọng của hệ thống. Sự chịu trách nhiệm cho luồng này có thể đƣợc gán cho từng ngƣời lập trình riêng, nhƣng điều này là không hợp lý và có thể gây rắc rối, là do hai nguyên nhân: Không gian bộ nhớ chính dành cho các chƣơng trình cùng với dữ liệu của nó thƣờng là không đủ, trong trƣờng hợp này, ngƣời lập trình phải tiến hành một thao tác phủ lắp Overlaying , theo đó chƣơng trình và dữ liệu đƣợc tổ chức thành các module khác nhau có thể đƣợc gán trong cùng một vùng của bộ nhớ, trong đó có một chƣơng trình chính chịu trách nhiệm chuyển các module vào và ra khi cần. Trong môi trƣờng đa chƣơng trình, ngƣời lập trình không thể biết tại một thời điểm xác định có bao nhiêu không gian nhớ còn trống hoặc khi nào thì không gian nhớ sẽ trống. Nhƣ vậy nhiệm vụ di chuyển thông tin giữa hai cấp bộ nhớ phải do hệ thống thực hiện. Đây cũng là nhiệm vụ cơ bản của thành phần quản lý bộ nhớ. Các giải pháp quản lý bộ nhớ phụ thuộc rất nhiều vào đặc tính phần cứng và trải qua nhiều giai đoạn cải tiến để trở thành những giảp pháp khá thỏa đáng nhƣ hiện nay. 3.3. KIẾN THỨC NỀN 3.3.1. Một chương trình qua nhiều ước xử lý Thông thƣờng, một chƣơng trình đƣợc lƣu trữ trên đĩa đĩa từ nhƣ một tập tin nhị phân có thể xử lý. Để thực hiện chƣơng trình, cần nạp chƣơng trình vào bộ nhớ chính, tạo lập tiến trình tƣơng ứng để xử lý. Trong quá trình thực thi, tiến trình có thể đƣợc di chuyển giữa đĩa và bộ nhớ. Tập hợp các chƣơng trình trên đĩa đang chờ đƣợc nạp vào bộ nhớ để tiến hành xử lý đƣợc gọi là hàng đợi nh p (input queue). Các địa chỉ trong chƣơng trình nguồn là địa chỉ danh biểu tƣợng trƣng, vì thế, một chƣơng trình phải trải qua nhiều giai đoạn xử lý để chuyển đổi các địa chỉ này thành các địa chỉ tuyệt đối trong bộ nhớ chính. Thủ tục thông thƣờng là chọn một trong những quá trình trong hàng đợi nhập và nạp quá trình đó vào bộ nhớ. Khi một quá trình đƣợc thực thi, nó truy xuất các chỉ thị và dữ liệu từ bộ nhớ. Cuối cùng, một quá trình 164 kết thúc và không gian bộ nhớ của nó đƣợc giải phóng. Hình 3.1. X nhiều bước của chương trình người d ng16 Hầu hết các hệ thống cho ph p một quá trình ngƣời dùng nằm ở bất cứ phần nào của bộ nhớ vật lý. Do đó, mặc dù không gian địa chỉ của máy tính bắt đầu tại 00000, nhƣng địa chỉ đầu tiên của quá trình ngƣời dùng không cần tại 00000. Sắp xếp này ảnh hƣởng đến địa chỉ mà chƣơng trình ngƣời dùng có thể dùng. Trong hầu hết các trƣờng hợp, một chƣơng trình ngƣời dùng sẽ đi qua một số bƣớc-một vài trong chúng có thể là 165 tuỳ chọn-trƣớc khi đƣợc thực thi hình 3.1 . Các địa chỉ có thể đƣợc hiện diện trong
16 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, Tr.138 những cách khác trong những bƣớc này. Các địa chỉ trong chƣơng trình nguồn thƣờng là những danh biểu. Một trình biên dịch sẽ gắn kết các địa chỉ danh biểu tới các địa chỉ có thể tái định vị chẳng hạn nhƣ 14 Bytes từ vị trí bắt đầu của module này . Bộ soạn thảo liên kết hay bộ nạp sẽ liên kết các địa chỉ có thể tái định vị tới địa chỉ tuyệt đối chẳng hạn 74014 . Mỗi liên kết là một ánh xạ từ một không gian địa chỉ này tới một không gian địa chỉ khác. Có thể thực hiện gắn kết các chỉ thị và dữ liệu tới các địa chỉ bộ nhớ có thể đƣợc thực hiện tại bất cứ bƣớc nào theo cách sau đây: Thời đi m bi n dịch: nếu tại thời điểm biên dịch, có thể biết vị trí mà tiến trình sẽ thƣờng trú trong bộ nhớ, trình biên dịch có thể phát sinh ngay m với các địa chỉ tuyệt đối. Tuy nhiên, nếu về sau có sự thay đổi vị trí thƣờng trú lúc đầu của chƣơng trình, cần phải biên dịch lại chƣơng trình. Thời đi m nạp: nếu tại thời điểm biên dịch, chƣa thể biết vị trí mà tiến trình sẽ thƣờng trú trong bộ nhớ, trình biên dịch cần phát sinh m tƣơng đối. Sự liên kết địa chỉ đƣợc trì ho n đến thời điểm chƣơng trình đƣợc nạp vào bộ nhớ, lúc này các địa chỉ tƣơng đối sẽ đƣợc chuyển thành địa chỉ tuyệt đối do đ biết vị trí bắt đầu lƣu trữ tiến trình. Khi có sự thay đổi vị trí lƣu trữ, chỉ cần nạp lại chƣơng trình để tính toán lại các địa chỉ tuyệt đối, mà không cần biên dịch lại. Thời đi m x : nếu có nhu cầu di chuyển tiến trình từ vùng nhớ này sang vùng nhớ khác trong quá trình tiến trình xử lý, thì thời điểm gắn kết địa chỉ phải trì hoãn đến tận thời điểm xử lý. Để thực hiện gắn kết địa chỉ vào thời điểm xử lý, cần sử dụng cơ chế phần cứng đặc biệt. 3.3.2. Không gian địa chỉ luận lý và không gian địa chỉ vật lý Một trong những hƣớng tiếp cận trung tâm nhằm tổ chức quản lý bộ nhớ một cách hiệu qủa là đƣa ra khái niệm không gian địa chỉ đƣợc xây dựng trên không gian nhớ vật lý, việc tách rời hai không gian này giúp hệ điều hành d dàng xây dựng các cơ chế và chiến lƣợc quản lý bộ nhớ hiệu quả: Địa chỉ ogic : c n gọi là luận lý hay địa chỉ ảo, là tất cả các địa chỉ do bộ xử lý tạo ra. Địa chỉ v t : là địa chỉ thực tế của bộ nhớ chính mà trình quản lý bộ nhớ nhìn 166 thấy và thao tác. Không gian địa chỉ u n : là tập hợp tất cả các địa chỉ ảo phát sinh bởi một chƣơng trình. Không gian v t : là tập hợp tất cả các địa chỉ vật lý tƣơng ứng với các địa chỉ ảo. Địa chỉ ảo và địa chỉ vật lý là nhƣ nhau trong phƣơng thức gắn kết địa chỉ tại thời điểm biên dịch cũng nhƣ thời điểm nạp. Nhƣng có sự khác biệt giữa địa chỉ ảo và địa chỉ vật lý trong phƣơng thức gắn kết tại thời điểm thực thi. 3.3.3. Bộ quản lý ộ nhớ MMU) MMU (memory-management unit) à một cơ chế phần cứng được s dụng đ thực hiện chuy n đ i địa chỉ o thành địa chỉ v t tại thời đi m thực thi Chƣơng trình của ngƣời dùng chỉ thao tác trên các địa chỉ ảo, không bao giờ nhìn thấy các địa chỉ vật lý. Địa chỉ thật sự ứng với vị trí của dữ liệu trong bộ nhớ chỉ đƣợc xác định khi thực hiện truy xuất đến dữ liệu. 3.3.4. Phủ lắp Overlay) Để cho ph p một quá trình có kích thƣớc lớn hơn không gian bộ nhớ đƣợc cấp phát cho nó, ngƣời lập trình sử dụng cơ chế phủ lắp Ý tư ng phủ p à giữ trong bộ nhớ những chỉ thị và dữ iệu được y u cầu tại b t ỳ thời đi m nào được cho Khi những chỉ thị đ được y u cầu, chúng được nạp vào hông gian được chiếm trước đ b i các chỉ thị mà chúng hông còn cần nữa Ví dụ, x t trình dịch hợp ngữ hai lần two-pass assembler . Trong suốt lần thứ 1, nó xây dựng bảng danh biểu; sau đó, trong lần thứ 2, nó tạo ra m máy. Chúng ta có thể phân chia trình dịch hợp ngữ thành m lần 1, m lần 2, bảng danh biểu, và những thủ tục hỗ trợ chung đƣợc dùng bởi lần 1 và lần 2. Giả sử kích thƣớc của các thành phần này nhƣ sau: Lần 1: 70 KB Lần 2: 80 KB Bảng danh biểu: 20 KB Các thủ tục chung: 30 KB Để nạp mọi thứ một lần, chúng ta cần 200KB bộ nhớ. Nếu bộ nhớ chỉ c n trống 167 150KB, đáng l chúng ta không thể chạy quá trình này. Tuy nhiên, chú ý rằng lần 1 và lần 2 không cần ở trong bộ nhớ cùng một lúc. Do đó, chúng ta định nghĩa hai phủ lắp. Phủ lắp A là bảng danh biểu, các thủ tục chung, lần 1, và phủ lắp B là bảng danh biểu, các thủ tục chung, lần 2. Chúng ta bổ sung trình điều khiển phủ lắp 10 KB và bắt đầu với phủ lắp A trong bộ nhớ. Khi chúng ta kết thúc lần 1, chúng ta nhảy tới trình điều khiển phủ lắp, trình điều khiển này sẽ đọc phủ lắp B vào trong bộ nhớ, viết chồng lên phủ lắp A và sau đó chuyển điều khiển tới lần 2. Phủ lắp A chỉ cần 120KB, ngƣợc lại phủ lắp B cần 130KB (Hình 3.2 . Bây giờ chúng ta có thể chạy trình hợp ngữ trong 150KB bộ nhớ. Nó sẽ nạp nhanh hơn vì rất ít dữ liệu cần đƣợc chuyển trƣớc khi việc thực thi bắt đầu. Tuy nhiên, nó sẽ chạy chậm hơn do nhập/xuất phụ đọc m cho phủ lắp A qua m cho phủ lắp B. Hình 3.2. Các phủ p cho một bộ hợp ngữ dịch hai ần M cho phủ lắp A và m cho phủ lắp B đƣợc giữ trên đĩa nhƣ những hình ảnh bộ nhớ tuyệt đối, và đƣợc đọc bởi trình điều khiển phủ lắp khi cần. Tái định vị đặc biệt và các giải thuật liên kết đƣợc yêu cầu để xây dựng các phủ lắp. 3.3.5. Hoán vị Một quá trình cần trong bộ nhớ đ được thực thi Tuy nhi n, một quá trình c th được hoán vị (swapped) tạm thời hỏi bộ nhớ tới v ng ưu trữ phụ (bac ing store) 168 Sau đ mang tr ại bộ nhớ đ việc thực thi được tiếp tục. Ví dụ, một môi trƣờng đa chƣơng với giải thuật điều phối RR Round Robin . Khi định mức thời gian hết hạn, bộ quản lý bộ nhớ sẽ bắt đầu hoán vị ra swap out vùng lƣu trữ phụ quá trình vừa bị hết hạn và hoán vị vào swap in một quá trình khác tới không gian bộ nhớ đƣợc trống (Hình 3.3). Hình 3.3. Hoán vị hai quá trình s dụng đĩa như à bac ing store Hoán vị yêu cầu một vùng lƣu trữ phụ backing store V ng ưu trữ phụ này thường à một đĩa tốc độ cao. Nó phải đủ lớn để chứa các bản sao của tất cả hình ảnh bộ nhớ cho tất cả ngƣời dùng, và nó phải cung cấp truy xuất trực tiếp tới các hình ảnh bộ nhớ này. Hệ thống này duy trì một hàng đợi sẵn sàng chứa tất cả quá trình mà các hình ảnh bộ nhớ của nó ở trong vùng lƣu trữ phụ hay trong bộ nhớ và sẵn sàng để thực thi. Bất cứ khi nào bộ định thời CPU quyết định thực thi một quá trình, nó gọi bộ phân phát dispatcher . Bộ phân phát kiểm tra để thấy quá trình tiếp theo trong hàng đợi ở trong bộ nhớ không. Nếu không, và không có vùng bộ nhớ trống, bộ phân phát hoán vị ra một quá trình hiện hành trong bộ nhớ và hoán vị vào một quá trình mong muốn. Sau đó, nó nạp lại các thanh ghi và chuyển điều khiển tới quá trình đƣợc chọn. Trong các hệ hoán vị, thời gian chuyển đổi giữa các công việc cần đƣợc quan tâm. Mỗi quá trình cần đƣợc phân chia một khoảng thời gian sử dụng CPU đủ lớn để không thấy rõ sự chậm tr do các thao tác hoán vị gây ra. Nếu không, hệ thống sẽ dùng phần lớn thời gian để hoán vị các quá trình vào ra bộ nhớ chính, CPU nhƣ vậy sẽ 169 không sử dụng hiệu quả. 3.4. QUẢN L BỘ NHỚ CHÍNH 3.4.1. Bộ nhớ cấp phát liên tục 3.4.1.1. Kỹ thuật phân vùng cố định Trong kỹ thuật này không gian địa chỉ của bộ nhớ chính đƣợc chia thành 2 phần cố định, phần nằm ở vùng địa chỉ thấp dùng để chứa chính hệ điều hành, phần c n lại, tạm gọi là phần user program, là sẵn sàng cho việc sử dụng của các tiến trình khi các tiến trình đƣợc nạp vào bộ nhớ chính. Hình 3.4. Hệ thống đơn chương với phân v ng cố định Trong các hệ thống đơn chƣơng, phần user program đƣợc dùng để cấp cho chỉ một chƣơng trình duy nhất, do đó nhiệm vụ quản lý bộ nhớ của hệ điều hành trong trƣờng hợp này sẽ đơn giản hơn, hệ điều hành chỉ kiểm soát sự truy xuất bộ nhớ của chƣơng trình ngƣời dùng, không cho nó truy xuất lên vùng nhớ của hệ điều hành. Để thực hiện việc này hệ điều hành sử dụng một thanh ghi giới hạn để ghi địa chỉ ranh giới giữa hệ điều hành và chƣơng trình của ngƣời dùng, theo đó khi chƣơng trình ngƣời dùng cần truy xuất một địa chỉ nào đó thì hệ điều hành sẽ so sánh địa chỉ này với giá trị địa chỉ đƣợc ghi trong thành ghi giới hạn, nếu nhỏ hơn thì từ chối không cho truy xuất, ngƣợc lại thì cho ph p truy xuất. Việc so sánh địa chỉ này cần phải có sự hỗ trợ của phần cứng và có thể làm giảm tốc độ truy xuất bộ nhớ của hệ thống nhƣng bảo vệ đƣợc hệ điều hành tránh việc chƣơng trình của ngƣời dùng làm hỏng hệ điều hành dẫn đến làm hỏng hệ thống. Trong các hệ thống đa chƣơng, chƣơng trình ngƣời dùng lại lại đƣợc phân ra thành nhiều phân vùng partition có kích thƣớc bằng hoặc khác nhau. Việc phân phân chia bộ nhớ thành những phần cố định đƣợc thực hiện bởi một bộ thao tác lúc khở 170 động máy. Trong trƣờng hợp này một tiến trình có thể đƣợc nạp vào bất kỳ phân vùng nào nếu kích thƣớc của nó nhỏ hơn hoặc bằng kích thƣớc của phân vùng và phân vùng này c n trống. Hình 3.5. Hệ thống đa chương với phân v ng c ích thước cố định Khi có một tiến trình cần đƣợc nạp vào bộ nhớ nhƣng tất cả các phân vùng đều đ chứa các tiến trình khác thì hệ điều hành có thể chuyển một tiến trình nào đó, mà hệ điều hành cho là hợp lệ kích thƣớc vừa đủ, không đang ở trạng thái ready hoặc running, không có quan hệ với các tiến trình running khác, ... , ra ngoài swap out , để lấy phân vùng trống đó nạp tiến trình vừa có yêu cầu. Đây là nhiệm vụ phức tạp của hệ điều hành, hệ điều hành phải tốn chi phí cao cho công việc này. Có hai trở ngại trong việc sử dụng các phân vùng cố định với kích thƣớc bằng nhau: Thứ nh t, khi kích thƣớc của một chƣơng trình là quá lớn so với kích thƣớc của một phân vùng thì ngƣời lập trình phải thiết kế chƣơng trình theo cấu trúc phủ lắp, theo đó chỉ những phần chia cần thiết của chƣơng trình mới đƣợc nạp vào bộ nhớ chính khi khởi tạo chƣơng trình, sau đó ngƣời lập trình phải nạp tiếp các module cần thiết khác vào đúng phân vùng của chƣơng trình và sẽ ghi đè lên bất kỳ chƣơng trình hoặc dữ liệu ở trong đó. Cấu trúc chƣơng trình phủ lắp tiết kiệm đƣợc bộ nhớ nhƣng yêu cầu trình độ ở ngƣời lập trình. Thứ hai, khi kích thƣớc của một chƣơng trình quá nhỏ so với kích thƣớc của một phân vùng nhƣng không phải là bội số của kích thƣớc một phân vùng thì d xảy ra hiện tƣợng phân mảnh bên trong internal fragmentation bộ nhớ, gây l ng phí bộ nhớ. Ví dụ, nếu có 2 không gian trống kích thƣớc bằng nhau 20K nằm r i rác trên 171 bộ nhớ, quá trình A đến yêu cầu 11K, B đến yêu cầu 23K, thì cũng sẽ không nạp đƣợc quá trình B cùng lúc với quá trình A, hiện tƣợng này đƣợc gọi là hiện tƣợng phân m nh b n trong. Phân mảnh trong là phần không gian bộ nhớ đ cấp thừa cho quá trình A nhƣng không thể lấy lại để cấp cho quá trình B tại thời điểm đó. Cả hai vấn đề trên có thể đƣợc khắc phục bằng cách sử dụng các phân vùng có kích thƣớc không bằng nhau. Việc đƣa một tiến trình vào phân vùng trong hệ thống đa chƣơng với phân vùng cố định kích thƣớc không bằng nhau sẽ phức tạp hơn nhiều so với trƣờng hợp các phân vùng có kích thƣớc bằng nhau. Với các phân vùng có kích thƣớc không bằng nhau thì có hai cách để cài đặt khi đƣa một tiến trình vào phân vùng: Mỗi phân vùng có một hàng đợi tƣơng ứng, theo đó mỗi tiến trình khi cần đƣợc nạp vào bộ nhớ nó sẽ đƣợc đƣa đến hàng đợi của phân vùng có kích thƣớc vừa đủ để chứa nó. Mỗi khi phân vùng trống, tiến trình đợi sẽ đƣợc đƣa vào phân vùng đó để thực thi. Tuy nhiên cách tiếp cận này k m linh động vì có thể có một phân vùng đang trống với hàng đợi rỗng, trong khi đó có phân vùng khác đang bận với hàng đợi đầy, điều này gây l ng phí trong việc sử dụng bộ nhớ. Hơn nữa, tạo ra sự phân m nh bên trong của các phân vùng: vì kích thƣớc của các phân vùng là cố định nên cấp phát thừa cho quá trình gây l ng phí bộ nhớ. Cách khắc phục là nên chọn một hàng đợi chung. 172 Hình 3.6. Mỗi Phân vùng c hàng đợi tương ứng Hệ thống dùng một hàng đợi chung cho tất cả các phân vùng, theo đó tất cả các tiến trình muốn đƣợc nạp vào phân vùng nhƣng chƣa đƣợc vào sẽ đƣợc đƣa vào hàng đợi chung này. Sau đó nếu có một phân vùng trống thì hệ thống sẽ xem x t để đƣa một tiến trình có kích thƣớc vừa đủ vào phân vùng trống đó. Cách tiếp cận này linh động hơn so với việc sử dụng nhiều hàng đợi nhƣ ở trên, nhƣng việc chọn một tiến trình trong hàng đợi để đƣa vào phân vùng là một việc làm khá phức tạp của hệ điều hành vì nó phải dựa vào nhiều yếu tố khác nhau nhƣ: độ ƣu tiên của tiến trình, trạng thái hiện tại của tiến trình, các mối quan hệ của tiến trình,... Hình 3.7. Một hàng đợi chung cho t t c phân vùng 3.4.1.2. Kỹ thuật phân vùng động Dynamic Partitioning) Kỹ thuật phân vùng động khắc phục đƣợc một vài hạn chế của kỹ thuật phân vùng cố định. Kỹ thuật này thƣờng đƣợc sử dụng phổ biến trong hệ điều hành mainframe của IBM, hệ điều hành OS/MVT, ... Trong kỹ thuật phân vùng động, số lƣợng các phân vùng trên bộ nhớ và kích thƣớc của mỗi phân vùng là có thể thay đổi. Tức là phần user program trên bộ nhớ không đƣợc phân chia trƣớc. Ban đầu khi chƣa có quá trình nào trong bộ nhớ phần chƣơng trình ngƣời dùng chỉ có một phân vùng mà kích thƣớc của nó sẽ thay đổi mỗi khi có một tiến trình đƣợc nạp vào bộ nhớ chính. Khi có một tiến trình đƣợc nạp vào bộ nhớ, hệ điều hành cấp cho nó không gian vừa đủ để chứa tiến trình, phần c n lại để sẵn sàng cấp cho tiến trình khác sau này. Khi một tiến trình kết thúc, không gian bộ nhớ tƣơng ứng đƣợc giải phóng sẽ đƣợc hệ điều hành 173 cấp cho tiến trình khác có có yêu cầu kích thƣớc nhỏ hơn. Hình 3.8. Kỹ thu t phân v ng động trong hệ thống đa chương 3.4.1.2.1. Các vấn đề kỹ thuật phân vùng động trong hệ thống đa chương Kỹ thuật phân vùng động trong hệ thống đa chƣơng có ƣu điểm là sử dụng bộ nhớ có hiệu quả, tránh đƣợc sự phân m nh bên trong. Tuy nhiên, phức tạp trong các giải thuật cấp phát và thu hồi bộ nhớ, cũng nhƣ khó theo dõi các phần không gian trống. Bên cạnh đó, kỹ thuật này để lại bộ nhớ có nhiều không gian trống có kích thƣớc nhỏ nằm rải rác, mỗi không gian không đủ để cấp phát cho quá trình đến. Hiện tƣợng này đƣợc gọi là hiện thƣợng phân m nh b n ngoài external fragmentation . Để chống lại sự l ng phí bộ nhớ do phân mảnh ngoài, thỉnh thoảng hệ điều hành phải thực hiện việc sắp xếp lại bộ nhớ c n gọi là phƣơng pháp cô đ c bộ nhớ Memory compaction , bằng cách di chuyển các tiến trình về một phía và các không gian trống về một phía khác tạo thành một khối nhớ có kích thƣớc đủ lớn để chứa đƣợc một tiến trình mới. Công việc này làm chậm tốc độ của hệ thống, hệ điều hành phải tốn chi phí cao cho việc này, đặc biệt là việc tái định vị các tiến trình khi một tiến trình bị đƣa ra khỏi bộ nhớ và đƣợc nạp vào lại bộ nhớ để tiếp tục hoạt động. 174 Hình 3.9. Phân mãnh ngoài Trong trƣờng hợp quá trình có đoạn dữ liệu/stack phát triển trong khi thực thi, làm sao mở rộng không gian bộ nhớ đ cấp phát cho quá trình? Có hai cách giải quyết vấn đề này: Hình 3.10. M rộng hông gian cho quá trình Nếu, có sẵn một không gian trống liền kề với quá trình thì không gian đó sẽ đƣợc cấp phát cho quá trình phát triển. Ngƣợc lại, quá trình sẽ phải di dời đến một không gian trống lớn hơn đủ cho quá trình phát triển, hoặc một hay nhiều quá trình khác sẽ phải hoán vị ra đĩa để tạo ra một không gian trống đủ lớn cho quá trình phát triển. Nếu không có không gian trống đủ lớn và vùng đĩa hoán vị cũng đầy thì quá trình sẽ phải chờ đợi hoặc chấm dứt. 3.4.1.2.2. Phương pháp quản lý ộ nhớ với kỹ thuật phân vùng động trong hệ thống đa chương Trong kỹ thuật phân vùng động này hệ điều hành phải đƣa ra các cơ chế thích hợp để quản lý các khối nhớ đ cấp phát hay c n trống trên bộ nhớ. Hệ điều hành sử dụng hai cơ chế: B n đồ bit và danh sách i n ết. Trong cả hai cơ chế này hệ điều hành đều chia không gian nhớ thành các đơn vị cấp phát có kích thƣớc bằng nhau, các đơn vị cấp phát liên tiếp nhau tạo thành một khối nhớ block , hệ điều hành cấp phát các block này cho các tiến trình khi nạp tiến trình vào bộ nhớ. 175 3.4.1.2.2.1. Quản lý ằng ản đồ it Bộ nhớ đƣợc chia thành các đơn vị cấp phát, kích thƣớc từ vài Words đến vài Kbytes. Mỗi đơn vị đƣợc ánh xạ tới một bit trong bản đồ bit Hình 3.11 . Giá trị bit này xác định trạng thái của đơn vị bộ nhớ đó: bit 0 đang tự do, bit 1 đ đƣợc cấp phát cho tiến trình. Khi cần nạp một quá trình có kích thƣớc k đơn vị, hệ thống sẽ tìm trong bản đồ bit một d y k bit có giá trị 0. a) Hiện trạng bộ nhớ có 4 quá
trình A, B, C, D đ đƣợc cấp
phát và 5 khối tự do b) Bản đồ bit tƣơng ứng Hình 3.11. Qu n bộ nhớ b ng b n đồ bit Kích thƣớc của đơn vị cấp phát là vấn đề lớn trong thiết kế. Nếu kích thƣớc đơn vị cấp phát nhỏ sẽ làm tăng kích thƣớc của bản đồ bit. Ngƣợc lại, nếu kích thƣớc đơn vị cấp phát lớn có thể gây hao phí cho đơn vị cấp phát sau cùng. Đây là giải pháp đơn giản nhƣng thực hiện chậm nên ít đƣợc dùng. 3.4.1.2.2.2. Quản lý ằng danh sách liên kết Một danh sách liên kết để quản lý các khối Block bộ nhớ đ cấp phát và các khối tự do. Mỗi khối tƣơng ứng một phần tử trong danh sách liên kết. Phần tử có thể là một quá trình hay một vùng nhớ trống giữa hai quá trình. Mỗi phần tử gồm 1 bit đầu để xác định khối đó là lỗ trống H hay một quá trình P , sau đó là 3 từ word để chỉ địa chỉ bắt đầu, chiều dài và con trỏ chỉ tới phần tử kế tiếp. Việc sắp xếp các khối theo địa chỉ hay theo kích thƣớc tuỳ thuộc vào giải thuật quản lý bộ nhớ. Sơ đồ quản lý bằng danh sách liên kết tƣơng ứng với sơ đồ quản lý bằng bản đồ bit đƣợc minh họa trong 176 Hình 3.12. a) Hiện trạng bộ nhớ gồm 4 quá trình và 5 khối trống H 0 2 P 2 3 H 5 3 P 8 2 H 10 4 P 14 3 H 17 1 P 18 2 H 20 2 b) Quản lý bộ nhớ bằng danh sách liên kết Hình 3.12. Qu n bộ nhớ b ng danh sách i n ết Các chiến lƣợc first-fit, best-fit, worst-fit và next-fit là những chiến lƣợc phổ biến nhất đƣợc dùng để chọn một khối trống thích hợp từ tập hợp các khối trống trong bộ nhớ để cấp phát cho quá trình. Việc lựa chọn này sao cho dẫn đến việc sử dụng bộ nhớ chính là hiệu quả nhất. First-fit: trong trƣờng hợp này hệ điều hành sẽ bắt đầu qu t qua các khối nhớ trống bắt đầu từ khối nhớ trống đầu tiên trong bộ nhớ, và sẽ chọn hối nhớ trống đầu ti n c ích thước đủ ớn để nạp tiến trình. Best-fit: chọn hối nhớ trống c ích thước nhỏ nh t đủ ớn để cấp phát cho tiến trình. Hệ điều hành sẽ qu t toàn bộ danh sách khối trống. Ngoại trừ danh sách khối trống đƣợc xếp theo thứ tự kích thƣớc tăng dần. Worst-fit: chọn hối nhớ trống c ích thước ớn nh t để cấp phát cho tiến trình. Hệ điều hành sẽ qu t toàn bộ danh sách khối trống. Ngoại trừ danh sách khối trống đƣợc xếp theo thứ tự kích thƣớc giảm dần. Next-fit: tƣơng tự nhƣ First-fit nhƣng ở đây hệ điều hành bắt đầu qu t từ khối nhớ trống kế sau khối nhớ vừa đƣợc cấp phát trƣớc đó và chọn hối nhớ trống ế tiếp đầu ti n đủ ớn để nạp tiến trình. Khi một tiến trình kết thúc, một khối trống đƣợc tạo ra có thể kết hợp với các khối trống kế bên của nó nếu có để tạo ra khối trống lớn hơn. Một khối có hai láng 177 giềng, trừ khối đầu tiên và cuối cùng chỉ có một láng giềng. Ví dụ: Hiện trạng bộ nhớ có sẵn tập hợp các khối trống có kích thƣớc lần lƣợt 8k, 12k, 22k, 18k, 8k, 6k, 14k, 36k. Giả sử tiến trình đến yêu cầu 16k cần đƣợc nạp vào bộ nhớ, thì hệ điều hành sẽ nạp nó vào: Khối nhớ 22k nếu theo thuật toán First-fit, lãng phí 6k do phân mãnh trong và tốc độ cấp phát nhanh nhất. Khối nhớ 18k nếu theo thuật toán Best-fit, lãng phí 2k do phân mãnh trong, phải d tìm toàn bộ danh sách và tốc độ chậm nhất. Khối nhớ 36k nếu theo giải thuật worst-fit, phải d tìm toàn bộ danh sách nên tốc độ chấp phát chậm, phƣơng án này đƣợc xem là hiệu quả vì để lại khối nhớ trống 20k không thể gọi là phân m nh nhƣng nếu cứ tiếp tục nhƣ thế sẽ gây ra phân m nh lớn ở cuối bộ nhớ. Các hệ điều hành thƣờng không cài đặt cố định trƣớc một thuật toán nào, tuỳ vào trƣờng hợp cụ thể mà nó chọn cấp phát theo một thuật toán nào đó, sao cho chi phí về việc cấp phát là thấp nhất và hạn chế đƣợc sự phân mảnh bộ nhớ sau này. Việc chọn thuật toán nào thƣờng phụ thuộc vào thứ tự swap và kích thƣớc của tiến trình. Thuật toán First-fit đƣợc đánh giá là đơn giản, d cài đặt và mang lại hiệu quả cao nhất đặc biệt là về tốc độ cấp phát. Về hiệu quả thuật toán Next-fit không bằng First-fit, nhƣng nó thƣờng xuyên sử dụng đƣợc các khối nhớ trống ở cuối vùng nhớ, các khối nhớ ở vùng này thƣờng có kích thƣớc lớn nên có thể hạn chế đƣợc sự phân mảnh. Thuật toán Best-fit, không nhƣ tên gọi của nó, đây là một thuật toán có hiệu suất thấp nhất, trong trƣờng hợp này hệ điều hành phải duyệt qua tất các các khối nhớ trống để tìm ra một khối nhớ có kích thƣớc vừa đủ lớn để chứa tiến trình yêu cầu, điều này làm giảm tốc độ cấp phát của hệ điều hành. Mặt khác với việc chọn kích thƣớc vừa đủ lớn có thể dẫn đến sự phân mảnh lớn trên bộ nhớ, tức là có quá nhiều khối nhớ có kích thƣớc quá nhỏ trên bộ nhớ, nhƣng nếu x t về mặt l ng phí bộ nhớ tại thời điểm cấp phát thì thuật toán này làm l ng phí ít nhất. Tóm lại, khó có thể đánh giá về hiệu quả sử dụng của các thuật toán này, vì hiệu quả của nó đƣợc x t trong “tƣơng lai” và trên nhiều khía cạnh khác nhau chứ không phải chỉ x t tại thời điểm cấp phát. Và hơn nữa trong bản thân các thuật toán này đ có các mâu thuẫn với nhau về hiệu quả sử dụng của nó. Nhƣ vậy khi cần nạp một tiến trình vào bộ nhớ thì hệ điều hành phải dựa vào bản đồ bit hoặc danh sách liên kết để tìm ra một khối thích hợp để nạp tiến trình. Sau khi 178 thực hiện một thao tác cấp phát hoặc sau khi đƣa một tiến trình ra khỏi bộ nhớ thì hệ điều hành phải cập nhật lại bản đồ bit hoặc danh sách liên kết, điều này có thể làm giảm tốc độ thực hiện của hệ thống. Danh sách liên kết có thể đƣợc sắp xếp theo thứ tự tăng dần hoặc giảm dần của kích thƣớc hoặc địa chỉ, điều này giúp cho việc tìm khối nhớ trống có kích thƣớc vừa đủ để nạp các tiến trình theo các thuật toán dƣới đây sẽ đạt tốc độ nhanh hơn và hiệu quả cao hơn. Một số hệ điều hành tổ chức 2 danh sách liên kết riêng để theo dõi các đơn vị cấp phát trên bộ nhớ, một danh sách để theo dõi các block đ cấp phát và một danh dách để theo dõi các block c n trống. Cách này giúp việc tìm các khối nhớ trống nhanh hơn, chỉ tìm trên danh sách các khối nhớ trống, nhƣng tốn thời gian nhiều hơn cho việc cập nhật danh sách sau mỗi thao tác cấp phát, vì phải thực hiện trên cả hai danh sách. 3.4.1.2.2.3. Quản lý ằng hệ thống ạn thân (Buddy System) Việc quản lý danh sách các không gian trống đƣợc sắp xếp theo kích thƣớc làm cho cấp phát bộ nhớ rất nhanh, nhƣng lại làm chậm cho việc thu hồi bộ nhớ bởi vì ta phải chú ý đến các láng giềng. Hệ thống bạn thân Buddy System là một giải thuật quản lý bộ nhớ tận dụng thuận lợi của việc máy tính dùng những số nhị phân cho việc đánh địa chỉ để tăng tốc độ kết hợp những không gian trống sát nhau khi một quá trình kết thúc. Với phương pháp này, bộ qu n bộ nhớ sẽ c một b ng iệt những hối
còn tự do c ích thước 1, 2, 4, 16 Bytes, tức à c ích thước b ng 2n Khi c một quá
trình cần c p phát bộ nhớ, một hông gian trống c ích thước b ng 2n nhỏ nh t đủ
ớn sẽ được c p phát cho quá trình Nếu hông gian trống quá ớn sẽ được phân đôi cho đến hi c được hông gian trống cần thiết Khi một quá trình chấm dứt, các hối trống ế nhau c ích thước b ng nhau sẽ đƣợc nhập lại để tạo thành khối trống lớn hơn. Do đó, giải thuật này đƣợc gọi là hệ thống bạn thân. 179 Ví dụ: với bộ nhớ 1M, cần phải có 21 bảng liệt kê sắp xếp từ 1 Byte (20 đến
20Bytes (220 . Khởi đầu toàn bộ nhớ c n tự do và bảng liệt kê chỉ có một mục từ chứa
một khối trống kích thƣớc 1M, tất cả các bảng liệt kê khác đều rỗng. Quá trình đến 1M = 1024 KBytes 1 lỗ trống yêu cầu A yêu cầu 70K A 128 256 512 3 B yêu cầu 35K A B 64 256 512 3 C yêu cầu 80K A B 64 C 128 512 3 A kết thúc 128 B 64 C 128 512 4 D yêu cầu 60K 128 B D C 128 512 3 B kết thúc 128 64 D C 128 512 4 D kết thúc 256 C 128 512 3 C kết thúc 1024 1 Bản 3 . Qu n bộ nhớ b ng hệ thống bạn thân Hệ thống bạn thân có sự thuận lợi so với những giải thuật cùng sắp xếp theo kích thƣớc của khối. Sự thuận lợi này là khi có một khối 2k Bytes tự do, bộ quản lý bộ nhớ chỉ cần tìm trong bảng liệt kê khối trống có kích thƣớc 2k để xem chúng có khả năng kết hợp đƣợc hay không. Với những giải thuật khác mà trong đó cho ph p các khối bộ nhớ đƣợc phân chia một cách tùy ý, việc tìm kiếm phải di n ra trên tất cả các bảng liệt kê. Do dó, hệ thống bạn thân làm việc nhanh hơn. Đáng tiếc, nó lại cực kỳ k m hiệu quả trong việc sử dụng bộ nhớ. Một quá trình 35K phải đƣợc cấp phát đến 64K, hao phí đến 29K. Sự hao phí này đƣợc gọi là sự phân mảnh trong internal fragmentation), bởi vì phần bộ nhớ hao phí nằm bên trong đoạn đƣợc cấp phát. 3.4.1.3. Tái định vị ộ nhớ và ảo vệ ộ nhớ Khi bộ nhớ trở nên khan hiếm, một tiến trình đang ở trên bộ nhớ có thể bị đƣa ra ngoài (swap out để dành chỗ nạp một tiến trình mới có yêu cầu, và tiến trình này sẽ đƣợc nạp vào lại swap in bộ nhớ tại một thời điểm thích hợp sau này. Vấn đề đáng 180 quan tâm ở đây là tiến trình có thể đƣợc nạp vào lại phân vùng khác với phân vùng mà nó đƣợc nạp vào lần đầu tiên. Có một lý do khác khiến các tiến trình phải thay đổi vị trí nạp so với ban đầu là khi có sự liên kết giữa các module tiến trình của một chƣơng trình thì các tiến trình phải dịch chuyển ngay cả khi chúng đ nằm trên bộ nhớ chính. Sự thay đổi vị trị/địa chỉ nạp này sẽ ảnh hƣởng đến các thao tác truy xuất dữ liệu của chƣơng trình vì nó sẽ khác với các địa chỉ tƣơng đối mà ngƣời lập trình đ sử dụng trong m lệnh của chƣơng trình. Ngoài ra khi một tiến trình đƣợc nạp vào bộ nhớ lần đầu tiên thì tất cả các địa chỉ tƣơng đối đƣợc tham chiếu trong m lệnh chƣơng trình đƣợc thay thế bằng địa chỉ tuyệt đối trong bộ nhớ chính. Ví dụ trong chƣơng trình có m lệnh truy xuất đến địa chỉ tƣơng đối 100k, nếu chƣơng trình này đƣợc nạp vào phân vùng 1 có địa chỉ bắt đầu là 100k thì địa chỉ truy xuất là 200k, nhƣng nếu chƣơng trình đƣợc nạp vào phân vùng 2 có địa chỉ bắt đầu là 200k, thì địa chỉ truy xuất sẽ là 300k. Để giải quyết vấn đề này hệ điều hành phải thực hiện các yêu cầu cần thiết của công tác tái định vị một tiến trình vào lại bộ nhớ. Ngoài ra ở đây hệ điều hành cũng phải tính đến việc b o vệ các tiến trình trên bộ nhớ tránh tình trạng một tiến trình truy xuất đến vùng nhớ của tiến trình khác. Giải pháp chung cho vấn đề tái định vị và bảo vệ bộ nhớ là hệ điều hành sử dụng hai thanh ghi đặc biệt: Thanh ghi nền (base): lƣu địa chỉ bắt đầu của phân vùng chứa tiến trình Thanh ghi giới hạn ( imit): lƣu chiều dài của phân vùng chứa tiến trình 181 Hình 3.13. Phần cứng hỗ trợ tái định vị và b o vệ Khi một tiến trình đƣợc nạp vào bộ nhớ thì hệ điều hành sẽ ghi địa chỉ bắt đầu của phân vùng đƣợc cấp phát cho tiến trình vào thanh ghi nền và địa chỉ cuối cùng của tiến trình vào thanh ghi giới hạn. Việc thiết lập giá trị của các thanh ghi này đƣợc thực hiện cả khi tiến trình lần đầu tiên đƣợc nạp vào bộ nhớ và khi tiến trình đƣợc swap in vào lại bộ nhớ. Theo đó mỗi khi tiến trình thực hiện một thao tác truy xuất bộ nhớ thì hệ thống phải thực hiện hai bƣớc: Thứ nh t, cộng địa chỉ logic với giá trị địa chỉ trong thanh ghi nền để có đƣợc địa chỉ tuyệt đối của ô nhớ cần truy xuất sẽ giải quyết đƣợc vấn đề tái định vị. Thứ hai, địa chỉ kết quả ở trên sẽ đƣợc so sánh với giá trị địa chỉ trong thành ghi giới hạn để giải quyết vấn đề bảo vệ. Nếu địa chỉ nằm trong phạm vi giới hạn thì hệ điều hành cho ph p tiến trình truy xuất bộ nhớ, ngƣợc lại thì có một ngắt về lỗi truy xuất bộ nhớ đƣợc phát sinh và hệ điều hành sẽ cấm tiến trình truy xuất vào địa chỉ này. Giải pháp này có nhiều thuận lợi là d dàng di dời tiến trình trong bộ nhớ – vì chỉ cần thay đổi giá trị của hai thanh ghi nền và giới hạn. Trong hệ thống đa chƣơng sử dụng sự phân vùng động, nếu có một tiến trình mới cần đƣợc nạp vào bộ nhớ, trong khi bộ nhớ không c n chỗ trống và tất cả các tiến trình phải đợi trên bộ nhớ ở trạng thái khoá blocked nhƣng vẫn chiếm dụng bộ nhớ. Việc đợi này cho đến khi có một tiến trình kết thúc, bị đƣa ra khỏi bộ nhớ chính tạo điều kiện cho hệ thống nạp tiến trình vừa có yêu cầu. Sự chờ đợi này làm l ng phí thời gian xử lý của CPU. Để tiết kiệm thời gian xử lý của CPU trong trƣờng hợp này hệ điều hành chọn ngay một tiến trình đang ở trạng thái khoá để đƣa ra ngoài cơ chế suspend lấy không gian nhớ trống đó cấp cho tiến trình vừa có yêu cầu mà không phải đợi nhƣ ở trên. Hệ điều hành sử dụng nhiều thuật toán khác nhau cho việc chọn một tiến trình để thay thế trong trƣờng hợp này, tất cả các thuật toán này đều hƣớng tới mục đích: tiết kiệm thời gian xử lý của CPU, tốc độ thay thế cao, sử dụng bộ nhớ hiệu quả nhất và đặc biệt là không để dẫn đến sự trì trệ hệ thống. Chúng ta sẽ thảo luận rõ hơn về vấn đề này ở phần kế tiếp của chƣơng này. Một nhƣợc điểm lớn của các kỹ thuật ở trên là dẫn đến hiện tƣợng phân mảnh trong và phân mảnh ngoài gây l ng phí bộ nhớ nên hiệu quả sử dụng bộ nhớ k m. Để khắc phục hệ điều hành sử dụng các kỹ thuật phân trang hoặc phân đoạn bộ nhớ. 3.4.2. Cấp phát không liên tục 182 3.4.2.1. Phân trang (Paging) Bộ nhớ v t được chia thành các hối (b oc ) c ích thước cố định và b ng nhau, gọi à khung trang (page frame). Không gian địa chỉ u n cũng được chia thành các hối c c ng ích thước với hung trang, và được gọi à trang (page). Khi cần nạp một tiến trình để xử lý, các trang của tiến trình sẽ đƣợc nạp vào những khung trang c n trống. Một tiến trình kích thƣớc N trang sẽ yêu cầu N khung trang tự do. Hình 3.14. Mô hình bộ nhớ phân trang Kích thƣớc của trang do phần cứng qui định. Để d phân tích địa chỉ ảo thành số hiệu trang và địa chỉ tƣơng đối, kích thƣớc của một trang thông thƣờng là một lũy thừa của 2 biến đổi trong phạm vi 512 Bytes và 8192 Bytes . Mỗi tiến trình đƣợc nạp vào bộ nhớ sẽ sở hữu một số khung trang nhất định. Nếu kích thƣớc của tiến trình không phải là bội số của kích thƣớc một khung trang thì sẽ xảy ra hiện tƣợng phân mảnh nội ở khung trang chứa trang cuối cùng của tiến trình. Ở đây không xảy ra hiện tƣợng phân mảnh ngoài. Trên bộ nhớ có thể tồn tại các trang của nhiều tiến trình khác nhau. Khi một tiến trình bị swap out thì các khung trang mà tiến trình này chiếm giữ sẽ đƣợc giải phóng để hệ điều hành có thể nạp các trang của tiến trình khác. Trong kỹ thuật này hệ điều hành phải đƣa ra các cơ chế thích hợp để theo dõi trạng thái của các khung trang c n trống hay đ cấp phát trên bộ nhớ và các khung trang đang chứa các trang của các tiến trình khác nhau trên bộ nhớ. Hệ điều hành sử dụng một danh sách để ghi số hiệu của các khung trang c n trống trên bộ nhớ, hệ điều 183 hành dựa vào danh sách này để tìm các khung trang trống trƣớc khi quyết định nạp một tiến trình vào bộ nhớ, danh sách này đƣợc cập nhật ngay sau khi hệ điều hành nạp một tiến trình vào bộ nhớ, đƣợc kết thúc hoặc bị swap out ra bên ngoài. Hệ điều hành sử dụng các b ng trang PCT: page control table để theo dõi vị trí các trang tiến trình trên bộ nhớ, mỗi tiến trình có một bảng trang riêng. Bảng trang bao gồm nhiều phần tử, thƣờng là bằng số lƣợng trang của một tiến trình mà bảng trang này theo dõi, các phần tử đƣợc đánh số bắt đầu từ 0. Phần tử 0 chứa số hiệu của khung trang đang chứa trang 0 của tiến trình, phần tử 1 chứa số hiệu của khung trang đang a Các trang của các
tiến trình trên bộ nhớ
luận lý b ánh xạ vào các khung trang trong bộ nhớ
vật lý và cập nhật bảng trang, cập nhật danh
sách khung trống chứa trang 1 của tiến trình, … Hình 3.15. Ánh xạ các trang vào các hung trang 3.4.2.1.1. Cơ chế quản lý ộ nhớ trong kỹ thuật phân trang Cơ chế phần cứng hỗ trợ thực hiện chuyển đổi địa chỉ trong cơ chế phân trang là b ng trang (pages table . Mỗi phần tử trong bảng trang cho biết các địa chỉ bắt đầu của vị trí lƣu trữ trang tƣơng ứng trong bộ nhớ vật lý tức số hiệu khung trang trong bộ nhớ 184 vật lý đang chứa trang . 3.4.2.1.2. Chuyển đổi địa chỉ luận lý sang địa chỉ vật lý Mỗi tiến trình có một không gian địa chỉ riêng. Không gian này gọi là không gian địa chỉ luận lý, gồm tập hợp các địa chỉ luận lý địa chỉ ảo do CPU sinh ra tại thời điểm biên dịch. Mỗi địa chỉ u n đƣợc phát sinh bởi CPU đƣợc chia thành hai phần: P: d P (Page): số hiệu trang, số thứ tự trang cần truy xuất d (offset) : địa chỉ tương đối trong trang hay độ dời trong trang đƣợc xác định từ địa chỉ bắt đầu của trang đến vị trí ô nhớ cần tìm trong trang. Số hiệu trang p sẽ đƣợc tra trong bảng trang để xác định số thứ tự khung trang f . f kết hợp với độ dời d sẽ xác định đƣợc địa chỉ vật lý. Nói cách khác, địa chỉ v t có dạng f:d. Địa chỉ này cũng đƣợc tính bằng số thứ tự khung trang nhân với kích thƣớc trang và cộng thêm độ dời. Hình 3.16. Chuy n đ i địa chỉ u n sang địa chỉ v t Nếu kích thƣớc của không gian địa chỉ luận lý là 2m và kích thƣớc trang là 2 n,
thì m-n bits cao của địa chỉ ảo sẽ biểu di n số hiệu trang P , và n bits thấp cho biết địa 185 chỉ tƣơng đối trong trang d . Ví dụ: Nếu một địa chỉ logic gồm 16 bit, kích thƣớc của mỗi trang là 1K =
1024Byte (210), thì có 6 bit dành cho số hiệu trang, nhƣ vậy một chƣơng trình có thể có
tối đa 26 = 64 trang mỗi trang 1KB. Một quá trình A yêu cầu 3500Bytes sẽ cấp phát
tƣơng ứng 4 trang. Trong trƣờng hợp này nếu CPU phát ra một giá trị địa chỉ 16 bit là: 0000010111011110 = 1502, thì thành phần số hiệu trang là 000001 = 1, thành phần offset là 0111011110 = 478. Free list 5 6 25 7 19 …. 186 Hình 3.17. xác định địa chỉ v t 3.4.2.1.3. Cài đặt ảng trang Trong trƣờng hợp đơn giản nhất, một tập hợp các thanh ghi đƣợc sử dụng để cài đặt bảng trang. Tuy nhiên việc sử dụng thanh ghi chỉ phù hợp với các bảng trang có kích thƣớc nhỏ, nếu bảng trang có kích thƣớc lớn, nó phải đƣợc lƣu trữ trong bộ nhớ chính, và sử dụng một thanh ghi để lƣu trữ địa chỉ bắt đầu nơi lƣu trữ bảng trang, thanh ghi này đƣợc gọi là thanh ghi PTBR page table base register . Theo cách tổ chức này, mỗi truy xuất đến dữ liệu hay chỉ thị đều đ i hỏi hai lần truy xuất bộ nhớ: một cho truy xuất đến bảng trang và một cho bản thân dữ liệu. Hình 3.18. S dụng thanh ghi nền trỏ đến b ng trang Có thể n tránh bớt việc truy xuất bộ nhớ hai lần bằng cách sử dụng thêm một vùng nhớ đặc biệt, với tốc độ truy xuất nhanh và cho ph p tìm kiếm song song, vùng nhớ cache nhỏ này thƣờng đƣợc gọi là bộ nhớ kết hợp TLBs Translation Look-aside Buffers . Mỗi thanh ghi trong bộ nhớ kết hợp gồm một từ khóa và một giá trị, khi đƣa đến bộ nhớ kết hợp một đối tƣợng cần tìm, đối tƣợng này sẽ đƣợc so sánh cùng lúc với các từ khóa trong bộ nhớ kết hợp để tìm ra phần tử tƣơng ứng. Nhờ đặc tính này mà việc tìm kiếm trên bộ nhớ kết hợp đƣợc thực hiện rất nhanh, nhƣng chi phí 187 phần cứng lại cao. Hình 3.19. Phần cứng hỗ trợ phân trang với TLBs Trong kỹ thuật phân trang TLBs đƣợc sử dụng để lƣu trữ các trang bộ nhớ đƣợc truy cập gần hiện tại nhất. Khi CPU phát sinh một địa chỉ, số hiệu trang của địa chỉ sẽ đƣợc so sánh với các phần tử trong TLBs, nếu có trang tƣơng ứng trong TLBs, thì sẽ xác định đƣợc ngay số hiệu khung trang tƣơng ứng, nếu không mới cần thực hiện thao tác tìm kiếm trong bảng trang. 3.4.2.1.4. Tổ chức ảng trang Mỗi hệ điều hành có một phƣơng pháp riêng để tổ chức lƣu trữ bảng trang. Đa số các hệ điều hành cấp cho mỗi tiến trình một bảng trang. Tuy nhiên phƣơng pháp này 188 không thể chấp nhận đƣợc nếu hệ điều hành cho ph p quản lý một không gian địa chỉ
có dung lƣợng quá 232, 264 : trong các hệ thống nhƣ thế, bản thân bảng trang đ i hỏi
một vùng nhớ qúa lớn! Có hai giải pháp cho vấn đề này: Hình 3.20. B ng trang hai c p 189 Hình 3.21. Sơ đồ dịch địa chỉ b ng trang hai c p Phân trang đa c p: phân chia bảng trang thành các phần nhỏ, bản thân bảng trang cũng sẽ đƣợc phân trang. B ng trang nghịch đ o: sử dụng duy nhất một b ng trang nghịch đ o cho tất cả các tiến trình. Mỗi phần tử trong b ng trang nghịch đ o phản ánh một khung trang trong bộ nhớ bao gồm địa chỉ logic của một trang đang đƣợc lƣu trữ trong bộ nhớ vật lý tại khung trang này, cùng với thông tin về tiến trình đang đƣợc sở hữu trang. Mỗi địa chỉ ảo khi đó là một bộ ba Trong đó : idp : là định danh của tiến trình p : là số hiệu trang d : là địa chỉ tƣơng đối trong trang Mỗi phần tử trong bảng trang nghịch đảo là một cặp khảo đến bộ nhớ đƣợc phát sinh, một phần địa chỉ ảo là trình quản lý bộ nhớ để tìm phần tử tƣơng ứng trong bảng trang nghịch đảo, nếu tìm thấy, địa chỉ vật lý sẽ đƣợc phát sinh. Trong các trƣờng hợp khác, xem nhƣ tham khảo bộ nhớ đ truy xuất một địa chỉ bất hợp lệ. 190 Hình 3.22. B ng trang đ o 3.4.2.1.5. Bảo vệ Cơ chế bảo vệ trong hệ thống phân trang đƣợc thực hiện với các bit bảo vệ đƣợc gắn với mỗi khung trang. Thông thƣờng, các bit này đƣợc lƣu trong bảng trang, vì mỗi truy xuất đến bộ nhớ đều phải tham khảo đến bảng trang để phát sinh địa chỉ vật lý. Khi đó, hệ thống có thể kiểm tra các thao tác truy xuất trên khung trang tƣơng ứng có hợp lệ với thuộc tính bảo vệ của nó không. Ngoài ra, một bit phụ trội đƣợc thêm vào trong cấu trúc một phần tử của bảng trang: bit hợp lệ - không hợp lệ. Hợp ệ (valid) : trang tƣơng ứng thuộc về không gian địa chỉ của tiến trình. Không hợp ệ (invalid): trang tƣơng ứng không nằm trong không gian địa chỉ của tiến trình, điều này có nghĩa tiến trình đ truy xuất đến một địa chỉ không đƣợc phép. Hình 3.23. Cơ chế b o vệ trang 191 3.4.2.1.6. Chia s ộ nhớ trong cơ chế phân trang Một ƣu điểm của cơ chế phân trang là cho ph p chia s các trang giữa các tiến trình. Trong trƣờng hợp này, sự chia s đƣợc thực hiện bằng cách ánh xạ nhiều địa chỉ logic vào một địa chỉ vật lý duy nhất. Có thể áp dụng kỹ thuật này để cho ph p có tiến trình chia s một vùng m lệnh chung: nếu có nhiều tiến trình của cùng một chƣơng trình, chỉ cần lƣu trữ một đoạn m lệnh của chƣơng trình này trong bộ nhớ, các tiến trình sẽ có thể cùng truy xuất đến các trang chứa m lệnh chung này. Lƣu ý để có thể chia s một đoạn m lệnh, đoạn m lệnh này phải có thuộc tính reenterable (cho phép một bản sao của chƣơng trình đƣợc sử dụng đồng thời bởi nhiều công việc). Hình 3.24. Cơ chế chia sẻ trang17 Nhận xét: Kỹ thuật phân trang loại bỏ đƣợc hiện tƣợng phân mảnh ngoài. Tuy nhiên 17 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, Tr.165 192 hiện tƣợng phân mảnh trong vẫn có thể xảy ra khi kích thƣớc của tiến trình không đúng bằng bội số của kích thƣớc một trang. khi đó, trang cuối cùng sẽ không đƣợc sử dụng hết. Khi cần truy xuất đến dữ liệu hay chỉ thị trên bộ nhớ thì hệ thống phải cần một lần truy xuất đến bảng trang, điều này có thể làm giảm tốc độ truy xuất bộ nhớ. Để khắc phục hệ điều hành sử dụng thêm một bảng trang cache, để lƣu trữ các trang bộ nhớ vừa đƣợc truy cập gần đây nhất. Bảng trang cache này sẽ đƣợc sử dụng mỗi khi CPU phát ra một địa chỉ cần truy xuất. Mỗi hệ điều hành có một cơ chế tổ chức bảng trang riêng, đa số các hệ điều
hành đều tạo cho mỗi tiến trình một bảng trang riêng khi nó đƣợc nạp vào bộ nhớ chính. Bảng trang lớn sẽ tốn bộ nhớ để chứa nó. Để bảo vệ các khung trang hệ điều hành đƣa thêm một bit bảo vệ vào bảng trang. Theo đó mỗi khi tham khảo vào bảng trang để truy xuất bộ nhớ hệ thống sẽ kiểm tra các thao tác truy xuất trên khung trang tƣơng ứng có hợp lệ với thuộc tính bảo vệ của nó hay không. Một khía cạnh tích cực rất quan trọng khác của kỹ thuật phân trang là sự phân biệt rạch r i góc nhìn của ngƣời dùng và của bộ phận quản lý bộ nhớ vật lý: G c nhìn của người d ng: một tiến trình của ngƣời dùng nhìn thấy bộ nhớ nhƣ là một không gian liên tục, đồng nhất và chỉ chứa duy nhất bản thân tiến trình này. G c nhìn của bộ nhớ v t : một tiến trình của ngƣời dùng đƣợc lƣu trữ phân tán khắp bộ nhớ vật lý, trong bộ nhớ vật lý đồng thời cũng chứa những tiến trình khác. Phần cứng đảm nhiệm việc chuyển đổi địa chỉ logic thành địa chỉ vật lý. Sự chuyển đổi này là trong suốt đối với ngƣời dùng. Để lƣu trữ các thông tin chi tiết về quá trình cấp phát bộ nhớ, hệ điều hành sử dụng một bảng khung trang, mà mỗi phần tử mô tả tình trạng của một khung trang vật lý: tự do hay đƣợc cấp phát cho một tiến trình nào đó . Sự phân trang không phản ánh đúng cách thức ngƣời dùng cảm nhận về bộ nhớ. Ngƣời dùng nhìn thấy bộ nhớ nhƣ một tập các đối tƣợng của chƣơng trình segments, các thƣ viện... và một tập các đối tƣợng dữ liệu biến toàn cục, stack, vùng nhớ chia 193 s ... . Vấn đề đặt ra là tìm một cách thức biểu di n bộ nhớ sao cho nó gần với cách nhìn nhận của ngƣời dùng hơn. Kỹ thuật phân đoạn bộ nhớ có thể thực hiện đƣợc mục tiêu này. 3.4.2.2. Phân đoạn Segmentation) Trong kỹ thuật này không gian địa chỉ bộ nhớ vật lý đƣợc chia thành các phần cố định có kích thƣớc không bằng nhau, đƣợc đánh số bắt đầu từ 0, đƣợc gọi là các phân đoạn segment . Mỗi phân đoạn bao gồm số hiệu phân đoạn và kích thƣớc của nó. Mỗi tiến trình có một không gian địa chỉ riêng gọi là không gian địa chỉ luận lý gồm tập hợp các địa chỉ luận lý địa chỉ ảo do CPU sinh ra tại thời điểm biên dịch. Không gian địa chỉ của các tiến trình kể cả các dữ liệu liên quan cũng đƣợc chia thành các đoạn khác nhau và không nhất thiết phải có kích thƣớc bằng nhau, thông thƣờng mỗi thành phần của một chƣơng trình/tiến trình nhƣ: code, data, stack, subprogram, ..., là các đoạn riêng và chúng c i n hệ ogic với nhau Hình 3.25. Tầm nhìn người d ng về chương trình Khi một tiến trình đƣợc nạp vào bộ nhớ thì tất cả các đoạn của nó sẽ đƣợc nạp vào các phân đoạn c n trống khác nhau trên bộ nhớ vật lý. Các phân đoạn này có thể 194 không liên tiếp nhau hình 3.26 . Hình 3.26. Mô hình bộ nhớ phân đoạn 3.4.2.2.1. Cơ chế quản lý ộ nhớ trong kỹ thuật phân đoạn Để theo dõi các đoạn của các tiến trình khác nhau trên bộ nhớ, hệ điều hành sử dụng các b ng phân đoạn SCT: Segment control Table tiến trình, thông thƣờng một tiến trình có một bảng phân đoạn riêng. Mỗi phần tử trong bảng phân đoạn gồm tối thiểu 2 trƣờng: trƣờng thứ nhất cho biết địa chỉ nền địa chỉ cơ sở -base của phân đoạn mà đoạn chƣơng trình tƣơng ứng đƣợc nạp, trƣờng thứ hai cho biết độ dài/giới hạn (length/limit) của phân đoạn, trƣờng này c n có tác dụng dùng để kiểm soát sự truy xuất bất hợp lệ của các tiến trình. 3.4.2.2.2. Chuyển đổi địa chỉ luận lý sang địa chỉ vật lý Mỗi địa chỉ ảo là một bộ s (segment): số hiệu phân đoạn cho biết số hiệu đoạn tƣơng ứng cần truy xuất. d (offset): độ dời có giá trị trong khoảng từ 0 đến giới hạn chiều dài của phân đoạn. Nếu có một địa chỉ logic gồm n + m bit, thì n bit trái nhất là số hiệu phân đoạn, m 195 bit phải nhất c n lại là độ dời. Trong ví dụ minh hoạ sau đây thì n = 4 và m = 12, nhƣ vậy kích thƣớc tối đa của một đoạn là 212 = 4096 Byte. Sau đây là các bƣớc cần thiết
của việc chuyển đổi địa chỉ: Trích ra n bit trái nhất của địa chỉ logic để xác định số hiệu của phân đoạn cần truy xuất. Sử dụng số hiệu phân đoạn ở trên để tham chiếu đến phần tử trong bảng phân đoạn của tiến trình, để tìm địa chỉ vật lý bắt đầu của phân đoạn. So sánh thành phần offset của địa chỉ logic, đƣợc trích ra từ m bit phải nhất của địa chỉ logic, với thành phần length của phân đoạn. Nếu offset > length thì địa chỉ truy xuất là không hợp lệ. Địa chỉ vật lý mong muốn là địa chỉ vật lý bắt đầu của phân đoạn cộng với giá trị offset. Ví dụ 1: Ta có địa chỉ logic là: 0001001011110000, Với n=4, m=12. Vậy số hiệu segment là 1, offset là 752, giả định segment này thƣờng trú trong bộ nhớ chính tại địa chỉ vật lý là 0010000000100000, thì địa chỉ vật lý tƣơng ứng với địa chỉ logic ở trên là: 0010001100010000 Địa chỉ bắt đầu của đoạn 1 là 0010000000100000 Độ dời 752 = 001011110000 Địa chỉ vật lý = 0010000000100000 + 001011110000 = 0010001100010000 196 Hình 3.27. Cơ chế phần cứng hỗ trợ ĩ thu t phân đoạn Ví dụ 2: Địa chỉ logic có dạng 2,300. Địa chỉ vật lý là 4300 + 300 = 4600. Địa chỉ này hợp lệ vì d=300 nhỏ hơn chiều dài giới hạn của đoạn 2 là limit = 400. Hình 3.28. Hệ thống phân đoạn 3.4.2.2.3. Cài đặt ảng phân đoạn Các bảng phân đoạn có thể đƣợc chứa trong các thanh ghi nếu có kích thƣớc nhỏ, nếu kích thƣớc bảng phân đoạn lớn thì nó đƣợc chứa trong bộ nhớ chính, khi đó hệ điều hành sẽ dùng một thanh ghi để lƣu trữ địa chỉ bắt đầu nơi lƣu trữ bảng phân đoạn, thanh ghi này đƣợc gọi là thanh ghi STBR: Segment table base register. Ngoài ra vì số lƣợng các đoạn của một chƣơng trình/tiến trình có thể thay đổi nên hệ điều hành dùng thêm thanh ghi STLR:Segment table length register, để ghi kích thƣớc hiện tại của bảng phân đoạn. Hệ điều hành cũng tổ chức một danh sách riêng để theo dõi các 197 segment c n trống trên bộ nhớ. Với một địa chỉ logic bảng phân đoạn STBR+s). Điạ chỉ vật lý cuối cùng là STBR+s + d). Hình 3.29. S dụng STBR, STLR và b ng phân đoạn 3.4.2.2.4. Bảo vệ Một ƣu điểm đặc biệt của cơ chế phân đoạn là khả năng đặc tả thuộc tính bảo vệ cho mỗi phân đoạn. Vì mỗi phân đoạn biểu di n cho một phần của chƣơng trình với ngữ nghĩa đƣợc ngƣời dùng xác định, ngƣời dùng có thể biết đƣợc một phân đoạn chứa đựng những gì bên trong. Do vậy họ có thể đặc tả các thuộc tính bảo vệ thích hợp cho từng phân đoạn. Cơ chế phần cứng phụ trách chuyển đổi địa chỉ bộ nhớ sẽ kiểm tra các bit bảo vệ đƣợc gán với mỗi phần tử trong bảng phân đoạn để ngăn chặn các thao tác truy xuất bất hợp lệ đến phân đoạn tƣơng ứng. 3.4.2.2.5. Chia s phân đoạn Một ƣu điểm khác của kỹ thuật phân đoạn là khả năng chia s ở mức độ phân đoạn. Nhờ khả năng này, các tiến trình có thể chia s với nhau từng phần chƣơng trình 198 thủ tục, hàm không nhất thiết phải chia s toàn bộ chƣơng trình nhƣ trƣờng hợp phân trang. Mỗi tiến trình có một bảng phân đoạn riêng, một phân đoạn đƣợc chia s khi các phần tử trong bảng phân đoạn của hai tiến trình khác nhau cùng chỉ đến một vị trí vật lý duy nhất. Hình 3.30. Chia sẻ segment 0 Nhận xét Tƣơng tự nhƣ trong kỹ thuật phân vùng động, kỹ thuật này cũng phải giải quyết vấn đề cấp phát động: làm thế nào để thỏa m n một yêu cầu vùng nhớ kích thƣớc N? Cần phải chọn vùng nhớ nào trong danh sách vùng nhớ tự do để cấp phát? Nhƣ vậy cần phải ghi nhớ hiện trạng bộ nhớ để có thể cấp phát đúng. Ở đây hệ điều hành thƣờng dùng thuật toán best-fit hay first-fit. Vì các đoạn có kích thƣớc không bằng nhau nên sự phân đoạn tƣơng tự nhƣ sự phân vùng động. Sự khác nhau là với sự phân đoạn một chƣơng trình có thể chiếm giữ hơn một phân vùng, và các phân vùng này có thể không liền kề với nhau. Sự phân vùng loại trừ đƣợc sự phân mảnh nội vi, nhƣng nhƣ sự phân vùng động nó vẫn xuất hiện hiện tƣợng phân mảnh ngoại vi. Sự phân trang là không tƣờng minh đối với ngƣời lập trình, trong khi đó sự phân đoạn là tƣờng minh đối với ngƣời lập trình, và nó cung cấp một sự 199 thuận lợi để ngƣời lập trình tổ chức chƣơng trình và dữ liệu. Ngƣời lập trình hoặc trình biên dịch có thể gán các chƣơng trình và dữ liệu đến các đoạn nhớ khác nhau. Trong hệ thống sử dụng kỹ thuật phân đoạn, hiện tƣợng phân mảnh ngoài lại xuất hiện khi các khối nhớ tự do đều quá nhỏ, không đủ để chứa một phân đoạn. Kỹ thuật phân đoạn thể hiện đƣợc cấu trúc logic của chƣơng trình, nhƣng nó phải cấp phát các khối nhớ có kích thƣớc khác nhau cho các phân đoạn của chƣơng trình trên bộ nhớ vật lý, điều này phức tạp hơn nhiều so với việc cấp phát các khung trang. Để dung h a vấn đề này các hệ điều hành có thể kết hợp cả phân trang và phân đoạn. 3.4.2.3. Phân đoạn kết hợp phân trang Paged segmentation) Cả hai kỹ thuật phân trang và phân đoạn đều có những thế mạnh của nó. Sự phân trang, là trong suốt đối với ngƣời lập trình, loại bỏ đƣợc hiện tƣợng phân mảnh trong. Sự phân đoạn, là thấy đƣợc đối với ngƣời lập trình, có khả năng điều khiển các cấu trúc dữ liệu lớn dần và hỗ trợ chia s và bảo vệ bộ nhớ. Để kết hợp những thuận lợi của cả hai kỹ thuật phân trang và phân đoạn, một số hệ thống đƣợc trang bị sự hỗ trợ của cả phần cứng CPU và phần mềm hệ điều hành để cài đặt kết hợp cả hai kỹ thuật này. Trong các hệ thống kết hợp phân trang và phân đoạn, không gian địa chỉ bộ nhớ của ngƣời dùng đƣợc chia thành các đoạn theo ý muốn của ngƣời lập trình, sau đó mỗi đoạn lại đƣợc chia thành các trang có kích thƣớc cố định bằng nhau. Theo cách nhìn của ngƣời lập trình thì địa chỉ logic bao gồm một segment number và một segment offset. Theo cách nhìn của hệ thống thì segment offset đƣợc xem nhƣ một page number và page offser cho một trang trong phạm vi một segment đƣợc chỉ ra. Không gian địa chỉ luận lý là một tập các phân đoạn, mỗi phân đoạn đƣợc chia thành nhiều trang. Khi một tiến trình đƣợc đƣa vào hệ thống, hệ điều hành sẽ c p phát cho tiến trình các trang cần thiết đ chứa đủ các phân đoạn của tiến trình. Cơ chế MMU trong kỹ thuật phân đoạn kết hợp phân trang Để hỗ trợ kỹ thuật phân đoạn, cần có một b ng phân đoạn, nhƣng giờ đây mỗi 200 phân đoạn cần có một b ng trang phân biệt. Hình 3.31. Mô hình phân đoạn ế hợp phân trang Chuyển đổi địa chỉ: Mỗi địa chỉ logic là một bộ ba: số hiệu phân đoạn (s): sử dụng nhƣ chỉ mục đến phần tử tƣơng ứng trong bảng phân đoạn. số hiệu trang (p): sử dụng nhƣ chỉ mục đến phần tử tƣơng ứng trong bảng trang của phân đoạn. địa chỉ tương đối trong trang (d): ết hợp với địa chỉ b t đầu của trang đ 201 tạo ra địa chỉ vật lý mà trình quản lý bộ nhớ sử dụng. Hình 3.32. Hỗ trợ phần cứng của phân đoạn ết hợp phân trang Tất cả các mô hình tổ chức bộ nhớ trên đây đều có khuynh hƣớng cấp phát cho tiến trình toàn bộ các trang yêu cầu trƣớc khi thật sự xử lý. Vì bộ nhớ vật lý có kích thƣớc rất giới hạn, điều này dẫn đến hai khuyết điểm: Kích thƣớc tiến trình bị giới hạn bởi kích thƣớc của bộ nhớ vật lý. Khó có thể bảo trì nhiều tiến trình cùng lúc trong bộ nhớ, và nhƣ vậy khó nâng cao mức độ đa chƣơng của hệ thống. 3.5. QUẢN L BỘ NHỚ ẢO Nếu đặt toàn bộ không gian địa chỉ luận lý vào bộ nhớ vật lý, thì kích thƣớc của chƣơng trình bị giới hạn bởi kích thƣớc bộ nhớ vật lý. Thực tế, trong nhiều trƣờng hợp, chúng ta không cần phải nạp toàn bộ chƣơng trình vào bộ nhớ vật lý cùng một lúc, vì tại một thời điểm chỉ có một chỉ thị của tiến trình đƣợc xử lý. Ví dụ, các chƣơng trình đều có một đoạn m lệnh xử lý lỗi, nhƣng đoạn m lệnh này hầu nhƣ rất ít khi đƣợc sử dụng vì hiếm khi xảy ra lỗi, trong trƣờng hợp này, không cần thiết phải nạp đoạn m lệnh xử lý lỗi từ đầu. Từ nhận x t trên, một giải pháp đƣợc đề xuất là cho ph p thực hiện một chƣơng 202 trình chỉ đƣợc nạp từng phần vào bộ nhớ vật lý. Ý tư ng chính của gi i pháp này à tại mỗi thời đi m chỉ ưu trữ trong bộ nhớ v t các chỉ thị và dữ iệu của chương trình cần thiết cho việc thi hành tại thời đi m đ Khi cần đến các chỉ thị hác, những chỉ thị mới sẽ được nạp vào bộ nhớ, tại vị trí trước đ bị chiếm giữ b i các chỉ thị nay hông còn cần đến nữa Với gi i pháp này, một chương trình c th ớn hơn ích thước của v ng nhớ c p phát cho n Một cách để thực hiện ý tƣởng của giải pháp trên đây là sử dụng kỹ thuật phủ lắp. Kỹ thuật phủ lắp không đ i hỏi bất kỳ sự trợ giúp đặc biệt nào của hệ điều hành, nhƣng trái lại, lập trình viên phải biết cách lập trình theo cấu trúc phủ lắp, và điều này đ i hỏi khá nhiều công sức. Để giải phóng lập trình viên khỏi các suy nghỉ về giới hạn của bộ nhớ, mà cũng không tăng thêm khó khăn cho công việc lập trình của họ, ngƣời ta nghĩ đến các kỹ thuật tự động, cho ph p xử lý một chƣơng trình có kích thƣớc lớn chỉ với một vùng nhớ có kích thƣớc nhỏ. Giải pháp đƣợc tìm thấy với khái niệm bộ nhớ o (Virtual Memory). 3.5.1. Khái niệm ộ nhớ ảo Bộ nhớ o à một ỹ thu t cho phép x một tiến trình hông được nạp toàn bộ vào bộ nhớ v t . Bộ nhớ ảo mô hình hóa bộ nhớ chính nhƣ một bảng lƣu trữ rất lớn và đồng nhất, tách biệt hẳn khái niệm không gian địa chỉ luận lý và không gian địa chỉ vật lý. Ngƣời dùng chỉ nhìn thấy và làm việc trong không gian địa chỉ ảo luận lý , việc chuyển đổi sang không gian địa chỉ vật lý đƣợc thực hiện tự động tại thời điểm thực thi chƣơng trình. Ưu điểm: Nhờ việc tách biệt bộ nhớ ảo và bộ nhớ vật lý, có thể tổ chức một bộ nhớ ảo có kích thƣớc lớn hơn bộ nhớ vật lý. Bộ nhớ ảo cho ph p giảm nhẹ công việc của lập trình viên vì họ không cần bận tâm đến giới hạn của vùng nhớ vật lý, cũng nhƣ không cần tổ chức chƣơng trình theo cấu trúc phủ lắp. Ngƣời dùng có thể viết chƣơng trình có không gian địa chỉ ảo rất lớn, đơn giản hoá công việc lập trình. Vì mỗi chƣơng trình ngƣời dùng có thể lấy ít hơn bộ nhớ vật lý nên nhiều chƣơng trình hơn có thể đƣợc thực thi tại một thời điểm. Điều này giúp gia 203 tăng việc sử dụng CPU và thông lƣợng nhƣng không tăng thời gian đáp ứng. Yêu cầu ít nhập/xuất hơn để nạp hay hoán vị mỗi chƣơng trình ngƣời dùng trong bộ nhớ vì thế mỗi chƣơng trình ngƣời dùng sẽ chạy nhanh hơn. Các quá trình d dàng chia s tập tin và không gian địa chỉ, cung cấp cơ chế hữu hiệu cho việc tạo lập quá trình. Do đó, chạy một chƣơng trình mà nó không nằm hoàn toàn nằm trong bộ nhớ có lợi cho cả ngƣời dùng và hệ thống. Khuyết điểm: Cần kết hợp kỹ thuật hoán vị để chuyển các phần của chƣơng trình vào/ra giữa bộ nhớ chính và bộ nhớ phụ khi cần thiết. Bộ nhớ ảo không d cài đặt và về thực chất có thể giảm năng lực nếu nó đƣợc dùng thiếu thận trọng. Trong chƣơng này, chúng ta thảo luận bộ nhớ ảo đƣợc quản lý theo ỹ thu t phân trang theo y u cầu và xem xét độ phức tạp và chi phí. Hình 3.33. Mô hình bộ nhớ o 3.5.2. Cài đặt ộ nhớ ảo Nguyên lý cơ bản của bộ nhớ ảo là vẫn dựa trên 2 kỹ thuật phân trang và phân đoạn, nhƣng trong kỹ thuật bộ nhớ ảo: Bộ phận quản lý bộ nhớ không nạp tất cả các trang/đoạn của một tiến trình vào bộ nhớ để nó hoạt động, mà chỉ nạp các trang/đoạn cần thiết tại thời điểm khởi tạo. Sau đó, khi cần bộ phận quản lý bộ nhớ sẽ dựa vào PCT hoặc SCT 204 của mỗi tiến trình để nạp các trang/đoạn tiếp theo. Nếu có một trang/đoạn của một tiến trình cần đƣợc nạp vào bộ nhớ trong tình trạng trên bộ nhớ không c n khung trang/phân đoạn trống thì bộ phận quản lý bộ nhớ sẽ đƣa một trang/đoạn không cần thiết tại thời điểm hiện tại ra bộ bộ nhớ ngoài (swap out , để lấy không gian nhớ trống đó nạp trang/đoạn vừa có yêu cầu. Trang/đoạn bị swap out sẽ đƣợc đƣa vào tại thời điểm thích hợp hoặc cần thiết sau này swap in). Cơ chế này gọi là kỹ thuật phân trang/đoạn theo yêu cầu. Vì vậy hệ điều hành có thể cài đặt bộ nhớ ảo theo 2 kỹ thuật: Phân trang theo y u cầu: Tức à phân trang ết hợp với swap Phân đoạn theo y u cầu: Tức à phân đoạn ết hợp với swap Cả hai kỹ thuật trên đều phải có sự hỗ trợ của phần cứng máy tính, cụ thể là CPU. Đa số các hệ điều hành đều chọn kỹ thuật phân trang theo yêu cầu, vì nó đơn giản, d cài đặt và chi phí thấp hơn. Hình 3.34. Phân biệt phân trang đơn và phân trang trang theo y u cầu Trƣờng hợp a, là trƣờng hợp phân trang đơn: trong trƣờng hợp này nếu bộ nhớ 205 chỉ c n 3 frame trống thì tiến trình cũng sẽ không nạp vào bộ nhớ đƣợc. Vì phân trang đơn đ i hỏi tất cả 4 page của tiến trình đều đƣợc nạp vào bộ nhớ. Rõ ràng sẽ là l ng phí bộ nhớ nếu biết rằng tiến trình này chỉ cần nạp vào bộ nhớ 2 trang P0, P2 là tiến trình có
thể khởi tạo và bắt đầu hoạt động đƣợc. Trƣờng hợp b, là trƣờng hợp bộ nhớ ảo sử dụng kỹ thuật phân trang theo yêu cầu: trong trƣờng hợp này hệ điều hành không nạp tất cả các page của tiến trình vào bộ nhớ mà chỉ nạp 2 page cần thiết ban đầu để tiến trình có thể khởi tạo và bắt đầu hoạt động đƣợc, mặc dầu trên bộ nhớ chính c n một vài frame c n trống. Rõ ràng trong trƣờng hợp này hệ điều hành đ tiết kiệm đƣợc không gian bộ nhớ chính và nhờ đó mà hệ điều hành có thể nạp vào bộ nhớ nhiều tiến trình hơn và cho ph p các tiến trình này hoạt động đồng thời với nhau. Bộ nhớ ảo là một kỹ thuật cho ph p xử lý một tiến trình mà không cần nạp tất cả tiến trình vào bộ nhớ. Các trang/đoạn của một tiến trình, đang ở trên bộ nhớ phụ, mà chƣa đƣợc nạp vào bộ nhớ chính sẽ đƣợc định vị tại một không gian nhớ đặc biệt trên bộ nhớ phụ đĩa HDD , có thể gọi không gian nhớ này là bộ nhớ o của tiến trình. Với sự hỗ trợ của phần cứng hệ điều hành đ đƣa ra các cơ chế thích hợp để nhận biết một trang/đoạn của tiến trình đang thực hiện là đang ở trên bộ nhớ chính hay trên bộ nhớ phụ. Nhƣ vậy bộ nhớ ảo đ mở rộng ảo đƣợc không gian bộ nhớ vật lý của hệ thống. Chƣơng trình của ngƣời dùng chỉ nhìn thấy và làm việc trên không gian địa chỉ ảo, việc chuyển đổi từ địa chỉ ảo sang địa chỉ vật lý do bộ phận quản lý bộ nhớ MMU của hệ điều hành và CPU thực hiện. Đ cài đ t được bộ nhớ o hệ điều hành cần ph i c : Một lƣợng không gian bộ nhớ phụ đĩa HDD cần thiết đủ để chứa các trang/đoạn bị swap out, không gian đĩa này đƣợc gọi là không gian hoán vị. Có cơ chế để theo dõi các trang/đoạn của tất cả các tiến trình đang hoạt động trên bộ nhớ chính, là đang ở trên bộ nhớ chính hay ở trên bộ nhớ phụ. Trong trƣờng hợp này hệ điều hành thƣờng đƣa thêm một bit trạng thái (bit present) vào các phần tử trong PCT hoặc SCT. Dựa vào các tiêu chuẩn cụ thể để chọn một trang nào đó trong số các trang đang ở trên bộ nhớ chính để swap out trong trƣờng hợp cần thiết. Các hệ điều hành đ đƣa ra các thuật toán cụ thể Thuật toán thay thế trang ở cuối 206 chƣơng để phục vụ cho mục đích này. Sự khác biệt giữa các kỹ thuật phân trang, phân đoạn trong các kỹ thuật bộ nhớ ảo thông qua bảng sau đây: Phân trang đơn Phân đoạn đơn Phân trang theo Phân đoạn theo yêu yêu cầu cầu Bộ nhớ chính đƣợc Bộ nhớ chính không Bộ nhớ chính đƣợc Bộ nhớ chính không đƣợc phân vùng chia thành các phần đƣợc phân vùng chia thành các phần trƣớc. nhỏ có kích thƣớc cố trƣớc nhỏ có kích thƣớc định, đƣợc gọi là các cố định, đƣợc gọi khung trang là các khung trang. Chƣơng trình của Các đoạn của Chƣơng trình của Các đoạn của ngƣời dùng đƣợc chia chƣơng trình đƣợc ngƣời dùng đƣợc chƣơng trình đƣợc thành các trang bởi chỉ ra bởi ngƣời lập chia thành các trang chỉ ra bởi ngƣời lập trình biên dịch hoặc trình và đƣợc gởi bởi trình biên dịch trình và đƣợc gởi hệ thống quản lý bộ đến cho trình biên hoặc hệ thống quản đến cho trình biên nhớ. dịch. lý bộ nhớ. dịch. Có thể xảy ra phân Không xảy ra phân Có thể xảy ra phân Không xảy ra phân mảnh trong, nhƣng mảnh trong trong mảnh trong, nhƣng mảnh trong trong có thể xảy ra phân phạm vi các frame . có thể xảy ra phân phạm vi các frame . mảnh ngoài. Không xảy ra phân mảnh ngoài. Không xảy ra phân mảnh ngoài. mảnh ngoài. Hệ điều hành phải Hệ điều hành phải Hệ điều hành phải Hệ điều hành phải duy trì một bảng duy trì một bảng duy trì một bảng duy trì một bảng trang cho mỗi tiến đoạn cho mỗi tiến trang cho mỗi tiến đoạn cho mỗi tiến trình để theo dõi các trình để theo dõi các trình để theo dõi các trình để theo dõi các trang đƣợc nạp vào đoạn của tiến trình trang của tiến trình đoạn của tiến trình các khung trang trên bộ nhớ đƣợc trên bộ nhớ đƣợc trên bộ nhớ đƣợc nạp vào địa chỉ nào nạp vào các khung nạp vào địa chỉ nào 207 và độ dài của đoạn trang nào) và độ dài của đoạn Hệ điều hành phải Hệ điều hành phải Hệ điều hành phải Hệ điều hành phải duy trì một danh sách duy trì một danh duy trì một danh duy trì một danh để theo dõi các khung sách để theo dõi các sách để theo dõi các sách để theo dõi các trang c n trống trên phần c n trống trên khung trang còn phần c n trống trên bộ nhớ chính. bộ nhớ chính. trống trên bộ nhớ bộ nhớ chính. chính. CPU sử dụng CPU sử dụng CPU sử dụng CPU sử dụng (page number và (segment number (page number và (segment number và offset để tính địa offset để tính địa và offset để tính offset để tính địa chỉ tuyệt đối. chỉ tuyệt đối. địa chỉ tuyệt đối. chỉ tuyệt đối. Tất cả các trang Tất cả các đoạn Không phải nạp tất Không phải nạp tất cả các đoạn của tiến của tiến trình phải của tiến trình phải cả các trang của tiến trình vào các khung trình vào các khung đƣợc nạp vào bộ đƣợc nạp vào bộ trang trên bộ nhớ trang trên bộ nhớ nhớ chính để chạy nhớ chính để chạy chính khi tiến trình chính khi tiến trình chạy. Các trang có trừ khi khi sử dụng trừ khi khi sử chạy. Các trang có thể đƣợc đọc khi thể đƣợc đọc khi các kỹthuật phủ lắp. dụng các kỹ thuật cần. cần. phủ lắp. Đọc một trang vào Đọc một trang vào bộ nhớ chính có thể bộ nhớ chính có thể cần phải đƣa một cần phải đƣa một hoặc đoạn ra đĩa. trang ra đĩa. Bản 3.2. Phân biệt giữa ỹ thu t phân trang và phân đoạn trong ỹ thu t bộ nhớ o 3.5.3. Kỹ thuật ộ nhớ ảo 208 3.5.3.1. Phân trang theo yêu cầu Demand Paging) Một hệ thống phân trang theo y u cầu à hệ thống s dụng ỹ thu t phân trang ết hợp với ỹ thu t hoán vị. Một tiến trình đƣợc xem nhƣ một tập các trang, thƣờng trú trên bộ nhớ phụ thƣờng là đĩa . Khi cần xử lý, tiến trình sẽ đƣợc nạp vào bộ nhớ chính. Nhƣng thay vì nạp toàn bộ chƣơng trình, chỉ những trang cần thiết trong thời điểm hiện tại mới đƣợc nạp vào bộ nhớ. Nhƣ vậy một trang chỉ được nạp vào bộ nhớ chính hi c y u cầu. Với mô hình này, cần cung cấp một cơ chế phần cứng giúp phân biệt các trang đang ở trong bộ nhớ chính và các trang trên đĩa. Có thể sử dụng lại bit valid-invalid nhƣng với ngữ nghĩa mới: valid : trang tƣơng ứng là hợp lệ và đang ở trong bộ nhớ chính. invalid : hoặc trang không hợp lệ không thuộc về không gian địa chỉ của tiến trình hoặc trang hợp lệ nhƣng đang đƣợc lƣu trên bộ nhớ phụ. Một phần tử trong bảng trang mô tả cho một trang không nằm trong bộ nhớ 209 chính, sẽ đƣợc đánh dấu invalid và chứa địa chỉ của trang trên bộ nhớ phụ. Hình 3.35. B ng trang với một số trang tr n bộ nhớ phụ 3.5.3.2. Cấu tr c ảng trang Cấu trúc bảng trang phải cho ph p phản ánh tình trạng của một trang là đang nằm trong bộ nhớ chính hay bộ nhớ phụ. Bộ nhớ phụ lƣu trữ những trang không đƣợc nạp vào bộ nhớ chính. Bộ nhớ phụ thƣờng đƣợc sử dụng là đĩa, và vùng không gian đĩa dùng để lƣu trữ tạm các trang trong kỹ thuật hoán vị đƣợc gọi là không gian hoán vị. Một bảng trang có nhiều mục từ. Mỗi mục từ là một phần tử trong bảng trang. Trong kỹ thuật bộ nhớ ảo một phần tử trong bảng trang sẽ chứa nhiều thông tin phức 210 tạp hơn nhƣ sau: Hình 3.36. C u trúc một phần t của b ng trang Page frame number - chỉ số khung trang là trƣờng quan trọng nhất cho biết số thứ tự khung trang nơi mà trang này đƣợc định vị trong bộ nhớ vật lý. Referenced: Khi một quá trình đƣợc nạp vào bộ nhớ bit này = 0. Khi có sự tham chiếu trên trang này thì bit Referenced đƣợc đặt lại =1. Modified: Khi một quá trình đƣợc nạp vào bộ nhớ bit này = 0. Khi có sửa đổi nội dung trên trang này thì bit Modified đƣợc đặt lại =1. Protection: chỉ ra kiểu truy xuất cho phép, Protection = 1: chỉ đọc ; Protection = 0: đọc/viết. Present/absent: giá trị 1thì mục từ hợp lệ và có thể dùng; giá trị 0 thì trang không hợp lệ vì đây là trang ảo tức là mục từ này hiện không có trong bộ nhớ vật lý. Nếu CPU cố gắng truy xuất đến mục từ này sẽ gây ỗi về trang. Dựa vào 2 bit Modified và Referenced sẽ giúp hệ điều hành quyết định lựa chọn trang nào sẽ hoán vị ra hông gian hoán vị và dành không gian bộ nhớ vật lý nạp cho một yêu cầu khác. Ngoài ra kích thƣớc của trang c n ảnh hƣởng đến tỉ lệ xảy ra lỗi trang. Ví dụ: khi kích thƣớc của trang là rất nhỏ thì sẽ có một lƣợng lớn các trang của tiến trình trên bộ nhớ chính, sau một thời gian thì tất cả các trang của bộ nhớ sẽ chứa các tiến trình đƣợc tham chiếu gần đây, vì thế tốc độ xảy ra lỗi trang đƣợc giảm xuống. 3.5.3.3. Lỗi trang Mỗi một truy cập của CPU đến dữ liệu/chỉ thị phải thực hiện hai truy cập bộ nhớ: một truy cập đến bảng trang và một truy cập đến dữ liệu/chỉ thị trong bộ nhớ. Khi Truy xuất đến một trang đƣợc đánh dấu không hợp lệ trong bảng trang sẽ làm phát sinh một ỗi trang (page fault). Cơ chế phần cứng sẽ phát sinh một ngắt để báo (trap) cho hệ 211 điều hành biết. Hệ điều hành sẽ xử lý lỗi trang nhƣ sau: Hình 3.37. Các giai đoạn x ỗi trang Bước 1: Kiểm tra truy xuất đến bộ nhớ là hợp lệ hay không hợp lệ đúng là không gian địa chỉ của tiến trình không? Bước 2: Nếu truy xuất không hợp lệ truy xuất trái ph p : sẽ kết thúc tiến trình Ngƣợc lại : đến bƣớc 3 xử lý lỗi trang Bước 3 : Tìm vị trí chứa trang muốn truy xuất trên đĩa không gian hoán vị Bước 4 : Tìm một khung trang trống trong bộ nhớ chính: Nếu tìm thấy : đến bƣớc 5. Nếu không c n khung trang trống, chọn một khung trang « nạn nhân » và chuyển trang « nạn nhân » ra bộ nhớ phụ swap out , cập nhật bảng trang tƣơng ứng trang vừa hoán vị ra sẽ trở nên không hợp lệ rồi đến bƣớc 5. Bước 5: Chuyển trang muốn truy xuất từ bộ nhớ phụ vào bộ nhớ chính: nạp trang cần truy xuất vào khung trang trống đ chọn (swap in); cập nhật nội dung 212 bảng trang tƣơng ứng trang vừa hoán vị vào là hợp lệ . Bước 6: Tái kích hoạt tiến trình ngƣời dùng. 3.5.3.4. Thay thế trang Khi xảy ra một lỗi trang, cần phải mang trang vắng mặt vào bộ nhớ. Nếu không có một khung trang nào trống, hệ điều hành cần thực hiện công việc thay thế trang – chọn một trang đang nằm trong bộ nhớ mà không đƣợc sử dụng tại thời điểm hiện tại và chuyển nó ra không gian hoán vị trên đĩa để giải phóng một khung trang dành chỗ nạp trang cần truy xuất vào bộ nhớ. Nhƣ vậy nếu không có khung trang trống, thì mỗi khi xảy ra lỗi trang cần phải thực hiện hai thao tác chuyển trang: chuyển một trang từ bộ nhớ chính ra bộ nhớ phụ (swap out) và nạp một trang khác từ bộ nhớ phụ vào bộ nhớ chính (swap in). Có thể giảm bớt số lần chuyển trang bằng cách sử dụng bit M (Modified bit). Bit này đƣợc gắn với mỗi trang để phản ánh tình trạng trang có bị cập nhật hay không: giá trị của bit đƣợc cơ chế phần cứng đặt là 1 mỗi lần có một từ đƣợc ghi vào trang, để ghi nhận nội dung trang có bị sửa đổi. Khi cần thay thế một trang, nếu bit cập nhật có giá trị là 1 thì trang cần đƣợc lƣu lại trên đĩa, ngƣợc lại, nếu bit cập nhật là 0, nghĩa là trang không bị thay đổi, thì không cần lƣu trữ trang trở lại đĩa bỏ qua thao tác swap out . Sự thay thế trang là cần thiết cho kỹ thuật phân trang theo yêu cầu. Nhờ cơ chế này, hệ thống có thể hoàn toàn tách rời bộ nhớ ảo và bộ nhớ vật lý, cung cấp cho lập trình viên một bộ nhớ ảo rất lớn so với bộ nhớ vật lý có kích thƣớc nhỏ hơn rất nhiều. 3.5.3.4.1. Sự thi hành phân trang theo yêu cầu Việc áp dụng kỹ thuật phân trang theo yêu cầu có thể ảnh hƣởng mạnh đến tình hình hoạt động của hệ thống. Gỉa sử p là xác suất xảy ra một lỗi trang 0 ≤ p ≤ 1): p = 0 : không có lỗi trang nào p = 1 : mỗi truy xuất sẽ phát sinh một lỗi trang Thời gian thật sự cần để thực hiện một truy xuất bộ nhớ TEA là: 213 TEA = (1-p)ma + p tdp [+ swap out ] + swap in + tái kích hoạt Trong công thức này, ma là thời gian truy xuất bộ nhớ, tdp thời gian xử lý lỗi
trang. Có thể thấy rằng, để duy trì ở một mức độ chấp nhận đƣợc sự chậm tr trong hoạt động của hệ thống do phân trang, cần phải duy trì tỷ ệ phát sinh ỗi trang thấp. Hơn nữa, để cài đặt kỹ thuật phân trang theo yêu cầu, cần phải giải quyết hai vấn đề chủ yếu: xây dựng một thu t toán c p phát hung trang, và thu t toán thay thế trang. 3.5.3.4.2. Các thuật toán thay thế trang Vấn đề chính khi thay thế trang là chọn lựa một trang «nạn nhân» để chuyển ra bộ nhớ phụ. Có nhiều thuật toán thay thế trang khác nhau, nhƣng tất cả cùng chung một mục tiêu: chọn trang «nạn nhân» là trang mà sau khi thay thế sẽ gây ra ít ỗi trang nh t. Có thể đánh giá hiệu qủa của một thuật toán bằng cách xử lý trên cùng một chuỗi các địa chỉ cần truy xu t và tính toán số lƣợng lỗi trang phát sinh. Ví dụ: Xét chuỗi các trang cần truy xuất là : 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 Để xác định số các lỗi trang xảy ra khi sử dụng một thuật toán thay thế trang nào đó trên cùng một chuỗi truy xuất cụ thể, cần phải biết số lƣợng khung trang còn trống đang sử dụng trong hệ thống là bao nhiêu. 3.5.3.4.2.1. Thuật toán FIFO tưởng: Ghi nhận thời điểm một trang đƣợc mang vào bộ nhớ chính. Khi cần chọn trang để thay thế trang, trang vào bộ nhớ trƣớc nhất sẽ đƣợc chọn. Ví dụ : sử dụng 3 khung trang , ban đầu cả 3 khung đều trống : 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 7 7 7 2 2 2 2 4 4 4 0 0 0 0 0 0 0 7 7 7 0 0 0 0 3 3 3 2 2 2 2 2 1 1 1 1 1 0 0 1 1 1 1 0 0 0 3 3 3 3 3 2 2 2 2 2 1 * * * * * * * * * * * * * * * Ghi chú : * : có lỗi trang 214 Tổng số lỗi trang : 15 lỗi Nhận xét: Để áp dụng thuật toán FIFO, thực tế không nhất thiết phải ghi nhận thời điểm mỗi trang đƣợc nạp vào bộ nhớ, mà chỉ cần tổ chức quản lý các trang trong bộ nhớ dạng một danh sách FIFO, khi đó trang đầu danh sách sẽ đƣợc chọn để thay thế. Thuật toán thay thế trang FIFO d hiểu, d cài đặt. Tuy nhiên thuật toán không lƣờng trƣớc trƣờng hợp: trang đƣợc chọn để thay thế có thể là trang mà CPU đang cần. Vì vậy sau khi thay thế sẽ tiếp tục gây ra lỗi trang. Số lƣợng lỗi trang xảy ra sẽ tăng lên khi số lƣợng khung trang sử dụng tăng. Hiện tƣợng này gọi là nghịch Be ady. Ví dụ: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 Sử dụng 3 khung trang, sẽ có 9 lỗi trang phát sinh 1 2 3 4 1 2 5 1 2 3 4 5 1 1 1 4 4 4 5 5 5 5 5 5 2 2 2 1 1 1 1 1 3 3 3 3 3 3 2 2 2 2 2 4 4 * * * * * * * * * Sử dụng 4 khung trang , sẽ có 10 lỗi trang phát sinh 1 2 3 4 1 2 5 1 2 3 4 5 1 1 1 1 1 1 5 5 5 5 4 4 2 2 2 2 2 2 1 1 1 1 5 3 3 3 3 3 3 2 2 2 2 4 4 4 4 4 4 3 3 3 * * * * * * * * * * 3.5.3.4.2 2 T uật to n tố ưu (OPTIMAL) tưởng: Thay thế trang sẽ lâu đƣợc sử dụng nhất trong tƣơng lai. 215 Ví dụ: sử dụng 3 khung trang, khởi đầu đều trống: 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 7 7 7 2 2 2 2 2 2 2 2 2 2 2 2 2 2 7 7 7 0 0 0 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 * * * * * * * * * Tổng số lỗi trang : 9 lỗi Nhận xét: Thuật toán này bảo đảm số lƣợng lỗi trang phát sinh là thấp nhất , nó cũng không gánh chịu nghịch lý Belady. Tuy nhiên, khó khăn ở chổ hệ thống không thể biết trƣớc chuỗi truy xuất của tiến trình trong tƣơng lai. 3.5.3.4.2.3. T uật to n «Lâu n ất c ưa sử dụn » (Least-recently-used LRU) tưởng: Với mỗi trang, ghi nhận thời điểm cuối cùng trang đƣợc truy cập, trang đƣợc chọn để thay thế sẽ là trang lâu nhất chƣa đƣợc truy xuất. Ví dụ: sử dụng 3 khung trang, khởi đầu đều trống: 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1 7 7 7 2 2 2 2 4 4 4 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 3 3 3 3 3 3 0 0 0 0 0 1 1 1 3 3 3 2 2 2 2 2 2 2 2 2 7 7 7 * * * * * * * * * * * * Tổng số lỗi trang: 12 lỗi Nhận xét: Thuật toán này đ i hỏi phải đƣợc cơ chế phần cứng hỗ trợ để xác định một thứ tự cho các trang theo thời điểm truy xuất cuối cùng. Có thể cài đặt theo một trong hai cách: S dụng bộ đếm: thêm vào cấu trúc của mỗi phần tử trong bảng trang một trƣờng ghi nhận thời điểm truy xuất mới nhất, và thêm vào cấu trúc của CPU 216 một bộ đếm. Mỗi lần có sự truy xuất bộ nhớ, giá trị của bộ đếm tƣơng ứng tăng lên 1. Mỗi lần thực hiện truy xuất đến một trang, giá trị của bộ đếm đƣợc ghi nhận vào trƣờng thời điểm truy xuất mới nhất của phần tử tƣơng ứng với trang trong bảng trang. Thay thế trang có giá trị trƣờng thời điểm truy xuất mới nhất là nhỏ nhất. S dụng stac : Tổ chức một stack lƣu trữ các số hiệu trang. Mỗi khi thực hiện một truy xuất đến một trang, số hiệu của trang sẽ đƣợc xóa khỏi vị trí hiện hành trong stack và đƣa lên đầu stack. Trang ở đỉnh stack là trang đƣợc truy xuất gần nhất, và trang ở đáy stack là trang lâu nhất chƣa đƣợc sử dụng. 3.5.3.4.2.4. Các thuật toán xấp xỉ LRU Có ít hệ thống đƣợc cung cấp đầy đủ các hỗ trợ phần cứng để cài đặt đƣợc thuật toán LRU thật sự. Tuy nhiên, nhiều hệ thống đƣợc trang bị thêm một bit tham h o (Reference): Bit Reference, đƣợc khởi tạo là 0 cho mỗi phần tử trong bảng trang. Bit Reference này có giá trị 1 mỗi lần trang tƣơng ứng đƣợc truy cập, và đƣợc phần cứng gán trở về 0 sau từng chu kỳ qui định trƣớc. Sau từng chu kỳ qui định trƣớc, kiểm tra giá trị của các bit Reference, có thể xác định đƣợc trang nào đ đƣợc truy xuất đến và trang nào không, sau khi đ kiểm tra xong, các bit Reference đƣợc phần cứng gán trở về 0. Với bit Reference, có thể biết đƣợc trang nào đ đƣợc truy xuất, nhƣng không biết đƣợc thứ tự truy xuất. Thông tin không đầy đủ này dẫn đến nhiều thuật toán xấp xỉ LRU khác nhau. Thuật toán với các it tham khảo phụ tưởng: Có thể thu thập thêm nhiều thông tin về thứ tự truy xuất hơn bằng cách lƣu trữ các bit References sau từng khoảng thời gian đều đặn: Với mỗi trang, sử dụng thêm 8 bit lịch sử history trong bảng trang Sau từng khoảng thời gian nhất định thƣờng là100 millisecondes , một ngắt đồng hồ đƣợc phát sinh, và quyền điều khiển đƣợc chuyển cho hệ điều hành. Hệ điều hành đặt bit Reference của mỗi trang vào bit cao nhất trong 8 bit phụ trợ của trang đó bằng cách đẩy các bit khác sang phải 1 vị trí, bỏ luôn 217 bit thấp nhất. Nhƣ vậy 8 bit thêm vào này sẽ lƣu trữ tình hình truy xuất đến trang trong 8 chu kỳ cuối cùng. Nếu gía trị của 8 bit là 00000000, thì trang tƣơng ứng đ không đƣợc dùng đến suốt 8 chu kỳ cuối cùng, ngƣợc lại nếu nó đƣợc dùng đến ít nhất 1 lần trong mỗi chu kỳ, thì 8 bit phụ trợ sẽ là 11111111. Một trang mà 8 bit phụ trợ có giá trị 11000100 sẽ đƣợc truy xuất gần thời điểm hiện tại hơn trang có 8 bit phụ trợ là 01110111. Nếu x t 8 bit phụ trợ này nhƣ một số nguyên không dấu, thì trang LRU là trang có số phụ trợ nhỏ nhất. Nhận xét: Số lƣợng các bit lịch sử có thể thay đổi tùy theo phần cứng, và phải đƣợc chọn sao cho việc cập nhật là nhanh nhất có thể. Thuật toán «cơ hội thứ hai » tưởng: Sử dụng một bit Reference duy nhất. Thuật toán cơ sở vẫn là FIFO, tuy nhiên khi chọn đƣợc một trang theo tiêu chuẩn FIFO, kiểm tra bit Reference của trang đó: Nếu giá trị của bit Reference là 0, thay thế trang này. Ngƣợc lại, cho trang này một cơ hội thứ hai, và chọn trang FIFO tiếp theo. Khi một trang đƣợc cho cơ hội thứ hai, giá trị của bit Reference đƣợc đặt lại là 0, và thời điểm vào Ready List đƣợc cập nhật lại là thời điểm hiện tại. Một trang đ đƣợc cho cơ hội thứ hai sẽ không bị thay thế trƣớc khi hệ thống đ thay thế hết những trang khác. Hơn nữa, nếu trang thƣờng xuyên đƣợc sử dụng, bit Reference của nó sẽ duy trì đƣợc giá trị 1, và trang hầu nhƣ không bao giờ bị thay thế. 218 Nhận x t: Có thể cài đặt thuật toán «cơ hội thứ hai » với một xâu vòng. Hình 3.38. Thu t toán thay thế trang cơ hội thứ hai Thuật toán «cơ hội thứ hai» nâng cao Not Recently Used - NRU) tưởng : xem các bit Reference và bit Modified nhƣ một cặp có thứ tự . Với hai bit này, có thể có 4 tổ hợp tƣơng đƣơng 4 lớp sau: Lớp 1: 0,0 không truy xuất, không sửa đổi: đây là trang tốt nhất để thay thế. Lớp 2: 0,1 không truy xuất gần đây, nhƣng đ bị sửa đổi: trƣờng hợp này không thật tốt, vì trang cần đƣợc lƣu trữ lại trƣớc khi thay thế. Lớp 3: (1,0) đƣợc truy xuất gần đây, nhƣng không bị sửa đổi: trang có thể nhanh 219 chóng đƣợc tiếp tục đƣợc sử dụng. Lớp 4: (1,1) đƣợc truy xuất gần đây, và bị sửa đổi: trang có thể nhanh chóng đƣợc tiếp tục đƣợc sử dụng, và trƣớc khi thay thế cần phải đƣợc lƣu trữ lại. Lớp 1 có độ ƣu tiên thấp nhất, và lớp 4 có độ ƣu tiên cao nhất. Một trang sẽ thuộc về một trong bốn lớp trên, tùy vào bit Reference và bit Modified của trang đó. Trang đƣợc chọn để thay thế là trang đầu tiên tìm thấy trong lớp có độ ƣu tiên thấp nhất và khác rỗng. Các thuật toán thống kê tưởng: sử dụng một biến đếm lƣu trữ số lần truy xuất đến một trang, và phát triển hai thuật toán sau: Thu t toán LFU (The Least Frequent y Used): thay thế trang có giá trị biến đếm nhỏ nhất, nghĩa là trang ít đƣợc dùng thƣờng xuyên nhất. Thu t toán MFU (The Most Frequently Used): thay thế trang có giá trị biến đếm lớn nhất, nghĩa là trang đƣợc sử dụng nhiều nhất. 3.5.3.4.3. Các giải thuật cấp phát khung trang Có 2 chiến lƣợc Cấp phát cố định: C p phát công b ng: nếu có m khung trang và n quá trình, mỗi quá trình đƣợc cấp m/n khung trang. C p phát tương xứng: dựa vào kích thƣớc của tiến trình để cấp phát số khung trang tƣơng xứng: Bƣớc 1: Gọi si = kích thƣớc của bộ nhớ ảo cho quá trình pi Bƣớc 2: S = ∑ si Bƣớc 3: m = tổng số khung trang có thể sử dụng Bƣớc 4: Cấp phát ai khung trang tới quá trình pi : ai = (si / S) m Cấp phát theo độ ưu tiên Sử dụng ý tƣởng cấp phát tƣơng xứng, nhƣng thay vì sử dụng kích cỡ của quá trình, ta dùng độ ƣu tiên. Nếu quá trình pi phát sinh lỗi trang, chọn một trong các khung
trang của nó để thay thế, hoặc chọn một khung trang của quá trình khác với độ ƣu tiên 220 thấp hơn để thay thế. K xử lý lỗ tran , tron trườn ợp t ốn k ôn còn k un trốn u n p ả c ú ý ến c c vấn sau: N n chọn trang nào trong số các trang tr n bộ nhớ chính đ swap out: Về vấn đề này chúng ta đ biết hệ điều hành sẽ áp dụng một thuật toán thay thay thế cụ thể nào đó, nhƣng ở đây cần chú ý thêm rằng đối tƣợng của các thuật toán thay thế trang là chỉ các trang của tiến trình xảy ra lỗi trang, hay tất cả các trang của các tiến trình đang có trên bộ nhớ chính. Tức là, nên chọn trang của tiến trình xảy ra lỗi trang để thay thế thay thế cục bộ , hay chọn một trang của tiến trình khác để thay thế thay thế toàn cục . Nếu chọn trang của tiến trình xảy ra lỗi trang thì sẽ đơn giản hơn với hệ điều hành và không ảnh hƣởng đến các tiến trình khác, nhƣng cách này có thể làm cho tiến trình hiện tại lại tiếp tục xảy ra lỗi trang ngay sau khi hệ điều hành vừa xử lý lỗi trang cho nó, vì trang mà hệ điều hành vừa chọn để đƣa ra swap out lại là trang cần truy xuất ở thời điểm tiếp theo. Nếu chọn trang của tiến trình khác thì tiến trình hiện tại sẽ ít có nguy cơ xảy ra lỗi trang ngay sau đó hơn, nhƣng cách này sẽ phức tạp hơn cho hệ điều hành, vì hệ điều hành phải kiểm soát lỗi trang của nhiều tiến trình khác trong hệ thống, và hệ điều hành khó có thể dự đoán đƣợc nguy cơ xảy ra lỗi trang của các tiến trình trong hệ thống. Trong trƣờng hợp này có thể lỗi trang sẽ lan truyền đến nhiều tiến trình khác trong hệ thống, khi đó việc xử lý lỗi trang của hệ điều hành sẽ phức tạp hơn rất nhiều. Đa số các hệ điều hành đều chọn cách thứ nhất vì nó đơn giản và không ảnh hƣởng đến các tiến trình khác trong hệ thống. “Neo” một số trang: Trên bộ nhớ chính tồn tại các trang của các tiến trình đặc biệt quan trọng đối với hệ thống, nếu các tiến trình này bị tạm dừng thì sẽ ảnh hƣởng rất lớn đến hệ thống và có thể làm cho hệ thống ngừng hoạt động, nên hệ điều hành không đƣợc đƣa các trang này ra đĩa trong bất kỳ trƣờng hợp nào. Để tránh các thuật toán thay thế trang chọn các trang này hệ điều hành tổ chức đánh dấu các trang này, bằng cách đƣa thêm một bit mới vào các phần tử trong các PCT, bit này đƣợc gọi là bit neo. Nhƣ vậy, các thuật toán thay thế trang sẽ không xem x t đến các trang đƣợc đánh dấu neo khi cần phải đƣa một trang nào đó ra đĩa. Phải tránh đƣợc trƣờng hợp hệ thống xảy ra hiện tƣợng “trì trệ hệ thống”: Trì trệ 221 hệ thống là hiện tƣợng lỗi trang xảy ra liên tục làm cho hệ thống luôn ở trong tình trạng xử lý lỗi trang, tức là đa phần thời gian xử lý của CPU đều dành cho việc xử lý lỗi trang của hệ điều hành. Đánh d u các trang bị thay đ i: Khi xử lý lỗi trang, ta thấy hệ điều hành thƣờng phải thực hiện thao tác swap out. Tức là, hệ điều hành phải tốn thời gian cho thao tác swap out, điều này sẽ làm giảm tốc độ của hệ thống và có thể gây l ng phí thời gian xử lý của CPU. Hệ điều hành có thể hạn chế đƣợc điều này bằng cách: hệ điều hành chỉ thực sự swap out một trang hi trang đ đã bị thay đ i từ ần n được nạp vào bộ nhớ gần đây nh t. Khi quyết định swap out một trang để lấy khung trang trống để nạp một trang mới vào bộ nhớ, mà trang cần swap này không bị thay đổi kể từ lần nạp gần đây nhất, hệ điều hành sẽ không swap out nó mà hệ điều hành chỉ nạp trang mới vào bộ nhớ và ghi đè lên nó, điều này có nghĩa là hệ điều hành đ tiết kiện đƣợc thời gian swap out một trang ra đĩa. Để làm đƣợc điều này hệ điều hành phải giải quyết hai vấn đề sau: Thứ nhất, làm thế nào để xác định đƣợc một trang là đ bị thay đổi hay chƣa kể từ lần nạp vào bộ nhớ gần đây nhất. Thứ hai, nếu không swap out một trang thì khi cần hệ điều hành sẽ swap in nó từ đâu. Đối với v n đề thứ nh t: hệ điều hành chỉ cần x t bit modified của trang này trong bảng trang bằng 1thì nội dung của trang này đ bị thay đổi so với lần nạp vào bộ nhớ gần đây nhất. Đối với v n đề thứ hai: hệ điều hành có thể swap in một trang mà ví trí ban đầu của nó trên đĩa, hoặc tại không gian hoán vị của nó. Trong một số hệ điều hành khi một tiến trình đƣợc tạo thì lập tức hệ điều hành sẽ cấp cho nó một không gian hoán vị trên đĩa, bất kỳ khi nào tiến trình bị swap out nó đều đƣợc chuyển nó đến không gian hoán vị của nó, khi tiến trình kết thúc thì không gian hoán vị của nó sẽ đƣợc giải phóng. Nhƣ vậy để chuẩn bị cho việc swap in sau này, khi nạp một trang của tiến trình vào bộ nhớ hệ điều hành sẽ ghi nội dung của trang này vào không gian hoán vị của nó. 3.6. TÓM TẮT Có nhiều cách tiếp cận khác nhau để tổ chức quản lý bộ nhớ, nhƣng nhìn chung đều đạt đến các mục tiêu sau : Cấp phát kịp thời và đầy đủ đáp ứng yêu cầu của quá tiến trình. Quá trình chuyển đổi địa chỉ, tổ chức cấp phát bộ nhớ là trong suốt với ngƣời Tận dụng hiệu quả bộ nhớ ít có vùng nhớ không sử dụng đƣợc 222 dùng, và có khả năng tái định vị. Bộ nhớ đƣợc bảo vệ tốt Có khả năng chia s bộ nhớ giữa các tiến trình Tổ chức bộ nhớ chính có thể cấp phát liên tục hoặc cấp phát không liên tục. Khi không gian bộ nhớ chính cạn kiệt ngƣời dùng vẫn có thể chạy chƣơng trình của mình với kích thƣớc lớn vì nhờ sự có mặt của bộ nhớ ảo. Bộ nhớ ảo là một kỹ thuật cho ph p không gian địa chỉ luận lý đƣợc ánh xạ vào bộ nhớ vật lý nhỏ hơn. Bộ nhớ ảo cũng cho ph p cấp độ đa chƣơng đƣợc gia tăng, tăng khả năng sử dụng CPU. Ngoài ra, ngƣời lập 223 trình không phải bận tâm về không gian giới hạn của bộ nhớ. Câu hỏi ôn tập 1. Chức năng bộ quản lý bộ nhớ là gì? 2. Quản lý bộ nhớ thực hiện nhiệm vụ gì? Giai đoạn nào do hệ điều hành thực hiện, giai đoạn nào cần sự trợ giúp của phần cứng? 3. Phân biệt địa chỉ luận lý và địa chỉ vật lý? 4. Phân biệt phân mảnh trong, phân mảnh ngoài. Các giải thuật cấp phát bộ nhớ nào thì gặp phải các vấn đề này? Cho ví dụ? 5. Phân tích ƣu điểm, khuyết điểm của tổ chức bộ nhớ theo cơ chế phân trang và phân đoạn? 6. Tìm hiểu bộ nhớ Ram của MS-DOS. 7. Tìm hiểu sự phân trang/đoạn trong Windows NT. 8. Tìm hiểu quản lý bộ nhớ trong Windows 2000.
9. X t một hệ thống trong đó một chƣơng trình khi đƣợc nạp vào bộ nhớ sẽ phân biệt hoàn toàn phân đoạn m lệnh và phân đoạn dữ liệu. Giả sử CPU sẽ xác định đƣợc khi nào cần truy xuất lệnh hay dữ liệu, và phải truy xuất ở đâu. Khi đó mỗi chƣơng trình sẽ đƣợc cung cấp 2 bộ thanh ghi base-limit: một cho phân đoạn m lệnh, và một cho phân đoạn dữ liệu. Bộ thanh ghi base-limit của phân đoạn m lệnh tự động đƣợc đặt thuộc tính read-only. Thảo luận các ƣu và khuyết điểm của hệ thống này. 10. Tại sao kích thƣớc trang luôn là lũy thừa của 2 ? 11. Tại sao trong hệ thống sử dụng kỹ thuật phân trang, một tiến trình không thể truy xuất đến vùng nhớ không đƣợc cấp cho nó? Làm cách nào hệ điều hành có thể cho ph p sự truy xuất này xảy ra? Hệ điều hành có nên cho phép điều đó không ? Tại sao? 12. Nếu cho ph p hai phần tử trong bảng trang cùng lƣu trữ một số hiệu khung trang trong bộ nhớ thì sẽ có hiệu quả gì ?Giải thích làm cách nào hiệu quả này có thể đƣợc sử dụng để giảm thời gian cần khi sao ch p một khối lƣợng lớn vùng nhớ từ vị trí này sang vị trí khác. Khi đó nếu sửa nội dung một trang thì sẽ tác động đến trang c n lại thế nào? 224 13. Vì sao đôi lúc ngƣời ta kết hợp hai kỹ thuật phân trang và phân đoạn? 14. Mô tả cơ chế cho ph p một phân đoạn có thể thuộc về không gian điạ chỉ của hai tiến trình. 15. Giải thích vì sao chia s một module trong kỹ thuật phân đoạn lại d hơn trong kỹ thuật phân trang? Bài Tập Bài 1: Hệ thống bộ nhớ dùng cơ chế phân khu động, kích thƣớc ban đầu 1024M. Các tiến trình đến lần lƣợc theo thứ tự sau. H y cấp phát bộ nhớ cho các tiến trình? Request A 130K Request B 100K Return A Request C 50K Return B Request D 80K Return C Request E 60K Returrn D Request F 80K Retrun E Request G 80K Retrun F Retrun G Bài 2: Cho hiện trạng các tiến trình nằm trong bộ nhớ chính nhƣ sau: a) Giả sử tiến trình mới F yêu cầu 3 đơn vị cấp phát. H y vẽ lại hiện trạng bộ nhớ sau khi dùng giải thuật Best – fit để cấp phát bộ nhớ cho tiến trình F trên. b) Vẽ lại hiện trạng bộ nhớ dùng bảng đồ bit sau khi thực hiện câu a và tiến trình E kết thúc. Bài 3: Giả sử bộ nhớ chính gồm các phân vùng trống có kích thƣớc theo thứ tự là 225 600K, 500K, 200K, 300K. Các tiến trình đến theo thứ tự yêu cầu kích thƣớc tƣơng ứng P1(250K) , P2(400K) , P3(150K) và P4(250K sẽ đƣợc cấp phát bộ nhớ nhƣ thế nào, nếu sử dụng: a Thuật toán First fit b Thuật toán Best fit c Thuật toán Worst fit Thuật toán nào cho ph p sử dụng bộ nhớ hiệu quả nhất trong các trƣờng hợp trên? Bài 4: Bộ nhớ chính kích thƣớc 2M. H y cấp phát bộ nhớ theo hệ thống bạn thân cho các tiến trình đến theo thứ tự sau: P1 100K , P2 60K , P3 120K , P4 76K , RETURN (P3) , P5 (50K) , RETURN (P1), RETURN (P2) , RETURN (P4) , RETURN (P5). Bài 5: Bộ nhớ gồm 4 quá trình và 4 lỗ trống nhƣ sau. Mỗi đvcp là 4KB. Qúa trình A B C D Địa chỉ 0 3 7 12 15 18 20 24 Tổng số đvcp 3 4 5 3 3 2 4 10 a) Vẽ bản đồ bit để quản lý hiện trạng bộ nhớ trên. b) Vẽ lại hiện trạng bộ nhớ sau khi thực hiện các yêu cầu sau các câu sau là độc lập nhau : Quá trình A yêu cầu 2 đvcp theo giải thuật First-fit Quá trình F yêu cầu 5KB theo giải thuật Best-fit và D kết thúc. G yêu cầu 7KB theo giải thuật worst-fit và C kết thúc. H yêu cầu 10KB theo First-fit. Và yêu cầu của I(2KB), J(5KB), K(1KB) theo Next-fit. Bài 6: X t một không gian địa chỉ có 8 trang, mỗi trang có kích thƣớc 1K. ánh xạ vào bộ nhớ vật lý có 32 khung trang. a) Địa chỉ ảo gồm bao nhiêu bit? b) Địa chỉ thật gồm bao nhiêu bit? 226 c) Địa chỉ độ dời bao nhiêu bit? Bài 7: Một hệ thống bộ nhớ dùng cơ chế phân trang theo yêu cầu, sử dụng địa chỉ luận lý 8bit, dung lƣợng bộ nhớ chính 64M, hệ điều hành sử dụng 4bit để làm địa chỉ độ dời. a) Tính tổng số trang luận lý, tổng số trang vật lý? b) Tính kích thƣớc trang? c) Dùng bao nhiêu bit để đánh địa chỉ cho bộ nhớ thật, bao nhiêu bit để đánh địa chỉ cho trang và bao nhiêu bit để đánh địa chỉ cho khung trang? Bài 8: X t một hệ thống sử dụng kỹ thuật phân trang, với bảng trang đƣợc lƣu trữ trong bộ nhớ chính. a) Nếu thời gian cho một lần truy xuất bộ nhớ bình thƣờng là 200 nanoseconds, thì mất bao nhiêu thời gian cho một thao tác truy xuất bộ nhớ trong hệ thống này? b) Nếu sử dụng TLBs với hit-ratio (tỉ lệ tìm thấy là 75%, thời gian để tìm trong TLBs xem nhƣ bằng 0, tính thời gian truy xuất bộ nhớ trong hệ thống? Bài 9: Giả sử bộ nhớ chính có 4 khung trang trống. Tƣơng ứng mỗi giải thuật sau đây, hãy tính tổng số lỗi trang và vẽ lại khung trang ở từng trƣờng hợp phát sinh lỗi ứng với chuỗi tham khảo sau: 9 1 4 5 2 8 1 3 2 1 8 9 4 3 3 6 5 a) Giải thuật thay thế trang FIFO. b) Giải thuật thay thế trang OPT. c) Giải thuật thay thế trang LRU. Giải thuật nào đƣợc xem là tối ƣu nhất trong các trƣờng hợp trên? Bài 10: Hệ thống bộ nhớ theo cơ chế phân trang gồm bộ nhớ chính 32KB, bộ nhớ ảo 64KB, kích thƣớc trang và khung trang là 4KB, bảng trang đƣợc cho nhƣ sau. Xác định địa chỉ vật lý khi biết các địa chỉ luận lý sau: 227 a. 2798
b. 3:300
c. 2,5
d. 16A0H
e. 0011 0000 0000 1011 Bài 11: Các tiến trình P1,P2,P3 cùng tồn tại trong bộ nhớ, tại thời điểm biên dịch các tiến trình đƣợc cấp phát các trang nhƣ sau: page P1
0
1
2 Symbol table
common routines
data1 P2
Symbol table
common routines
data2 P3
Symbol table
common routines
data2 Với danh sách các khung trang trống sau. H y định vị các trang vào các khung trang trống trong bộ nhớ vật lý và vẽ bảng trang PCT)? 12 20 18 16 4 15 5 2 30 11 7 228 Danh sách
khung trang
trống Bài 12: Một tiến trình đƣợc nạp vào bộ nhớ theo mô hình phân trang với kích thƣớc trang là 1024 byte. Bảng trang nhƣ sau. H y chuyển các địa chỉ logic sau thành địa chỉ vật lý? a) 1225 1 b) 3255 5 c) 3:1000 3 d) 96721 6 Bài 13: Một bộ nhớ quản lý theo cơ chế phân đoạn, có bảng phân đoạn sau đây: Segment Base Length 600 0 219 14 1 2300 100 2 90 580 3 1327 96 4 1952 Hãy tìm địa chỉ vật lý tƣơng ứng với các địa chỉ logic sau đây và vẽ hình minh họa. d. 3,400 a. 0,430 e. 4,112 b. 1,10 229 f. 1,15 c. 2,500 TÀI LIỆU TH M KHẢO [1] Trần Hạnh Nhi, Giáo trình hệ điều hành nâng cao, Đại học Khoa học Tự nhiên TP.HCM, 2004. [2] [Lê Khắc Nhiên n, Hoàng Kiếm], Giáo trình Nh p môn hệ điều hành, Đại học Khoa học Tự nhiên, TP.HCM 2004. [3] Nguyễn Kim Tuấn, Giáo trình Hệ điều hành, Đại học Huế, 2004. 230 [4] Nguyễn Ph Trường, Giáo trình Hệ điều hành, Đại học Cần Thơ, 2005 4.1. MỤC TIÊU Trong hầu hết các ứng dụng, tập tin là thành phần chủ yếu. Cho dù mục tiêu của ứng dụng là gì nó cũng phải bao gồm phát sinh và sử dụng thông tin. Thông thƣờng đầu vào của các ứng dụng là tập tin và đầu ra cũng là tập tin cho việc truy xuất của ngƣời dùng và các chƣơng trình khác sau này. Bài học này này xoay quanh các vấn đề: Hiểu đƣợc khái niệm về tập tin? Hiểu cách thức tổ chức và quản lý tập tin nhƣ thế nào? Hiểu các cơ chế cài đặt hệ thống tập tin trên các hệ điều hành. Biết các thao tác với tập tin, một số tính chất của tập tin. Biết cấu trúc và tổ chức lƣu trữ của đĩa. Vận dụng cấu trúc dữ liệu và kiến trúc máy tính để cài đặt hệ thống tập tin. Trong khi một tiến trình đang chạy nó có thể lƣu trữ một lƣợng giới hạn thông tin trong phạm vị không gian địa chỉ sở hữu của nó. Tuy nhiên khả năng lƣu trữ này bị giới hạn bởi kích thƣớc không gian địa chỉ ảo của hệ thống. Đối với một vài ứng dụng thì không gian này là vừa đủ, nhƣng đối với một số ứng dụng khác thì nó là quá nhỏ. M t hác, nếu lƣu giữ thông tin trong không gian địa chỉ của tiến trình thì thông tin này sẽ bị mất khi tiến trình kết thúc. Vấn đề thứ ba là phải đáp ứng việc truy cập thông tin đồng thời giữa các tiến trình trong môi trƣờng hệ điều hành đa nhiệm. Những vấn đề trên chúng ta đ biết trong các chƣơng Quản lý tiến trình và Quản lý bộ nhớ của tài liệu này. Để giải quyết những vấn đề trên hệ điều hành phải thiết kế một hệ thống lƣu trữ thông tin sao cho: Thứ nh t à ph i ưu trữ được một hối ượng ớn thông tin Thứ hai à thông tin ph i được b o toàn hi tiến trình s dụng n ết thúc Và cuối cùng là có th c nhiều tiến trình truy xu t thông tin đồng thời. Giải pháp cho tất cả vấn đề trên là lƣu trữ thông tin trên đĩa và các thiết bị media 231 khác trong các đơn vị dữ liệu, đƣợc gọi là các tập tin (file). Các tiến trình có thể đọc thông tin của tập tin và rồi ghi mới thông tin vào tập tin nếu cần thiết. Thông tin đƣợc lƣu trữ trong tập tin phải không bị tác động bởi việc tạo và kết thúc tiến trình. Các tập tin đƣợc quản lý bởi hệ điều hành. Thành phần hệ điều hành tham gia trực tiếp vào quá trình quản lý các tập tin trên đĩa đƣợc gọi là hệ thống t p tin. Hệ điều hành phải xây dựng cấu trúc và tổ chức hoạt động của hệ thống tập tin. Một trong những nhiệm vụ quan trọng của hệ thống tập tin là theo dõi việc lƣu trữ tập tin trên đĩa, theo dõi và điều hành việc truy cập tập tin của các tiến trình, bảo vệ tập tin và nội dung của tập tin, …Cấu trúc, tổ chức hoạt động và những nhiệm vụ của hệ thống tập tin của hệ điều hành, của các hệ điều hành cụ thể, sẽ đƣợc chúng ta xem x t trong chƣơng này. 4.2. TỔNG QU N VỀ QUẢN L TẬP TIN VÀ ĐĨ 4.2.1. Tập tin và hệ thống quản lý tập tin 4.2.1.1. Tập tin file) - Tập tin: là đơn vị logic đƣợc lƣu trữ và xử lý bởi thành phần quản lý tập tin của hệ điều hành. - Nội dung của tập tin: có thể là một chƣơng trình, một tập các thủ tục hoặc một khối dữ liệu. Nó có thể là một d y tuần tự các Byte không cấu trúc, hệ điều hành không biết nội dung của tập tin. Một d y các record có chiều dài cố định. Hay là một cấu trúc cây, gồm cây của những record có thể không có cùng độ dài, mỗi record có một trƣờng khoá để giúp cho việc tìm kiếm nó đƣợc nhanh hơn. - Các kiểu tập tin: T p tin thường: là tập tin văn bản hay tập tin nhị phân chứa thông tin của ngƣời dùng. T p tin thư mục: là những tập tin hệ thống dùng để lƣu giữ cấu trúc của hệ thống tập tin. T p tin c tự đ c biệt: liên quan đến nhập xuất thông qua các thiết bị nhập xuất tuần tự nhƣ màn hình, máy in, mạng. T p tin hối: dùng để truy xuất trên các thiết bị lƣu trữ khối đĩa là thiết bị lƣu 232 trữ khối . - Thiết ị lưu trữ tập tin: thƣờng đƣợc chia thành các block có kích thƣớc cố định bằng nhau, các block đƣợc đánh địa chỉ để phân biệt. Thành phần quản lý tập tin của hệ điều hành có nhiệm vụ cấp phát và thu hồi các block cho các tập tin khi cần thiết. Vì kích thƣớc tập tin có thể thay đổi, nên các hệ điều hành thƣờng tổ chức cấp phát động các block cho các tập tin. Hệ điều hành có thể tổ chức cấp phát tĩnh block cho các tập tin có kích thƣớc không thay đổi nhƣ các tập tin thực thi, các tập tin thƣ viện, … Cấp phát tĩnh sẽ nhanh và đơn giản hơn nhiều so với cấp phát động. - Các hệ điều hành cho phép truy xuất tập tin theo 2 cách tuần tự và ngẫu nhiên: Truy xu t tuần tự: Các tiến trình có thể đọc tất cả các Byte hoặc các record trong tập tin, theo thứ tự, từ một vị trí bắt đầu nào đó mà không thể bỏ qua một Byte hay một record nào. Truy c p ngẫu nhi n: Thì ngƣợc lại, các tiến trình có thể truy xuất tại bất kỳ một Byte hay một record nào đó trong tập tin. Trong cả hai cách trên đều phải chỉ ra vị trí bắt đầu đọc. Trong cách thứ nh t, mỗi thao tác đọc cần phải xác định ví trí bắt đầu đọc trong tập tin. Trong cách thứ 2, trƣớc khi đọc hệ thống phải tìm đến SEEK vị trí bắt đầu đọc, sau đó tiến hành đọc tuần tự nhƣ cách thứ nhất. 4.2.1.2. Hệ thống quản lý tập tin (File management System) Hệ thống quản lý tập tin, hay gọi ngắn gọn là hệ thống tập tin, là một tập các dịch vụ mà hệ điều hành cung cấp cho ngƣời dùng và chƣơng trình ngƣời dùng để các đối tƣợng này sử dụng các tập tin trên hệ thống. Ngƣời dùng và chƣơng trình của ngƣời dùng chỉ có thể truy xuất các tập tin thông qua hệ thống tập tin. Hệ thống quản lý tập tin của hệ điều hành phải đáp ứng các mục tiêu cơ bản sau đây: Đáp ứng các yêu cầu về lưu trữ dữ liệu của người dùng, ao gồm: Khả năng lƣu trữ, độ tin cậy và hiệu suất. Cực tiểu hay loại bỏ các nguy cơ có thể dẫn đến hỏng hoặc mất dữ liệu. Cung cấp sự hỗ trợ vào/ra cho nhiều loại thiết bị lƣu trữ khác nhau. Cung cấp sự hỗ trợ vào/ra cho nhiều ngƣời dùng trong các hệ thống đa ngƣời dùng. 233 Cung cấp một tập chuẩn các thủ tục giao diện vào/ra. Đối với người dùng thì hệ thống quản lý tập tin của một hệ điều hành phải đáp ứng các yêu cầu tối thiểu sau đây: Mỗi ngƣời dùng phải có thể tạo create , xoá delete và thay đổi change các tập tin. Mỗi ngƣời dùng có thể đƣợc điều khiển để truy cập đến các tập tin của ngƣời dùng khác. Mỗi ngƣời dùng phải có thể di chuyển dữ liệu giữa các tập tin. Mỗi ngƣời dùng phải có thể truy cập đến các tập tin của họ thông qua tên tƣợng trƣng của tập tin. Mỗi ngƣời dùng phải có thể dự ph ng và khôi phục lại các tập tin của họ trong trƣờng hợp hệ thống bị hỏng. 4.2.1.3. Kiến tr c hệ thống tập tin (File System Architecture): Các hệ điều hành khác nhau có cách tổ chức hay kiến trúc của hệ thống tập tin khác nhau. Hình vẽ sau đây trình bày một kiến trúc hệ thống tập tin chung nhất mà các hệ điều hành thƣờng sử dụng. Hình 4.1. Kiến trúc hệ thống qu n t p tin Cấp thấp nhất: device driver à các điều hi n thiết bị truyền thông trực tiếp với các thiết bị ngoại vi. Device driver chịu trách nhiệm khởi tạo một thao tác vào/ra trên thiết bị và xử lý các yêu cầu vào/ra. Các device driver trong hệ 234 thống tập tin thƣờng là các điều khiển đĩa. Basic file system: hệ thống tập tin cơ sở hoặc cấp vào/ra vật lý, đó là giao diện chính giữa môi trƣờng bên ngoài với hệ thống máy tính. Nó giao tiếp với các block dữ liệu trao đổi giữa các đĩa với hệ thống. Vì thế nó đƣợc kết nối với các block trên đĩa và các buffer trên bộ nhớ chính. Nó không hiểu các dữ liệu cũng nhƣ các cấu trúc tập tin phức tạp. Basic I/O supervisor: chịu trách nhiệm khởi tạo và kết thúc tất cả các thao tác vào/ra tập tin. Tại cấp này, các cấu trúc điều khiển đƣợc duy trì, các cấu trúc điều khiển này giao tiếp với thiết bị vào/ra, bộ phận lập lịch đọc đĩa và bộ phận quản lý trạng thái tập tin. Basic I/O supervisor kết hợp với các bộ phận lập lịch đọc đĩa để tối ƣu các thao tác đọc đĩa, nhằm góp phần tăng tốc độ truy xuất tập tin của các chƣơng trình ngƣời dùng. Logical I/O: Cấp vào/ra logic là thành phần quan trọng của hệ thống tập tin, nó cho phép ngƣời dùng và chƣơng trình ngƣời dùng truy cập đến các record. Trong khi hệ thống tập tin cơ sở giao tiếp với các block dữ liệu, thì logical I/O giao tiếp với các record file. Logical I/O cung cấp các công cụ chung nhất để thực hiện các thao tác vào/ra tập tin dựa trên record. Cấp trên cùng của kiến trúc hệ thống tập tin kết hợp chặt chẽ với ngƣời dùng. Nó cung cấp một giao diên chuẩn giữa chƣơng trình ngƣời dùng, hệ thống tập tin và thiết bị lƣu trữ dữ liệu. Các phƣơng pháp truy cập dữ liệu khác nhau phản ánh các cấu trúc tập tin khác nhau và các cách khác nhau để truy cập và xử lý dữ liệu. Các phƣơng pháp truy cập đó là: Pile, Sequential file, Indexed- sequential file, Indexed file, Hashed, vv. 4.2.2. Bảng danh mục và tập tin chia s 4.2.2.1. Bảng danh mục (Directory Table): Các hệ điều hành phải tổ chức bảng danh mục, để lƣu trữ các thông tin liên quan đến các tập tin và các thƣ mục đang tồn tại trên đĩa hoặc thiết bị lƣu trữ khác , đặc biệt là thông tin cho biết vị trí lƣu trữ nội dung của một tập tin trên đĩa. Để truy xuất đến một tập tin hệ điều hành cần phải thông qua bảng danh mục này. Bảng danh mục gồm nhiều Entry phần tử/mục vào , mỗi phần tử dùng để chứa thông tin của một tập tin hay thƣ mục trên đĩa. Khi có một tập tin/ thƣ mục đƣợc tạo ra 235 thì hệ điều hành sẽ dùng một phần tử trong bảng danh mục để chứa các thông tin của nó. Khi một tập tin/ thƣ mục bị xoá khỏi đĩa thì hệ điều hành sẽ giải phóng phần tử của nó trong bảng danh mục. Có thể xem một phần tử trong bảng danh mục là một sự tƣơng ứng giữa tập tin và vị trí lƣu trữ của tập tin tên đĩa. Số lƣợng phần tử trong bảng danh mục có thể bị giới hạn cố định trƣớc hoặc không có giới hạn và có thể tăng/giảm nếu cần. Bảng danh mục có thể đƣợc chứa tại một không gian đặc biệt nào đó trên đĩa, hoặc có thể chứa trong một tập tin metadata (tập tin dạng dữ liệu đặc biệt dùng cho hệ thống quản lý tập tin nào đó trên đĩa. Trong quá trình hoạt động của hệ thống bảng danh mục thƣờng đƣợc hệ điều hành nạp từ đĩa vào bộ nhớ, để sẵn sàng cho việc truy xuất tập tin của hệ điều hành sau này. Một phần t trong danh mục phải chứa các thông tin tối thiểu sau đây: Tên của tập tin Kiểu của tập tin Địa chỉ vật lý của tập tin trên đĩa. Các thông tin kiểm tra truy nhập tập tin Các thông tin quản trị tập tin; vv. Các hệ điều hành thƣờng thiết kế và sử dụng bảng danh mục hai mức: Mức 1: đƣợc gọi là bảng danh mục chủ, bao gồm các con trỏ trỏ tới bảng danh mục ngƣời dùng. Mức 2: đƣợc gọi là bảng danh mục ngƣời dùng, bao gồm tên tập tin và địa chỉ vật lý của tập tin trên đĩa,… Tổ chức bảng thƣ mục gốc và bảng thƣ mục con là sự cài đặt cụ thể cấu trúc bảng danh mục hai mức của hệ điều hành MS-DOS. Muốn truy xuất đến tập tin thì ngƣời dùng và chƣơng trình của ngƣời dùng phải thông qua danh mục chủ và danh mục ngƣời dùng hay thông qua thƣ mục gốc và thƣ mục con trong hệ điều hành MS-DOS. Để thực hiện bất kỳ một thao tác nào trên nội dung của tập tin thì trƣớc hết tập tin phải đƣợc mở. Khi nhận đƣợc yêu cầu mở tập tin thì hệ điều hành sử dụng đƣờng dẫn đƣợc chỉ ra bởi ngƣời dùng hay chƣơng trình của ngƣời dùng để tìm đến một mục vào tƣơng ứng với tập tin cần mở trong bảng danh mục. Phần tử trong bảng danh mục sẽ cung cấp các thông tin cần thiết để hệ điều hành tìm đến các block đĩa chứa nội dung của tập tin. Tùy vào từng hệ điều hành mà thông tin này có thể là địa chỉ của tất cả 236 block đĩa chứa nội dung tập tin trong chiến lƣợc cấp phát liên tục , địa chỉ của block đĩa đầu tiên chứa nội dung tập tin trong chiến lƣợc danh sách liên kết và danh sách kiên kết chỉ mục , hoặc số hiệu của I-node trong chiến lƣợc I-node . Các chiến lƣợc này đƣợc trình bày trong phần quản lý các block chứa tập tin trên đĩa ngay sau đây. Tổ chức bảng thƣ mục gốc của MS-DOS, Windows98 và MFT (Master File Table của Windowsnt/2000 là các sự cài đặt cụ thể về cấu trúc của bảng danh mục của các hệ điều hành. Tổ chức của bảng thƣ mục gốc của MS-DOS, Windows98, Windowsnt/2000 sẽ đƣợc xem x t ở phần sau của chƣơng này. 4.2.2.2. Tập tin chia s (Shared File) Tập tin chia s xuất hiện trong các môi trƣờng nhiều ngƣời dùng, đây là một kỹ thuật của hệ điều hành, nhằm giúp nhiều ngƣời dùng trên hệ thống có thể cùng nhau sử dụng một tập tin nào đó. Đối với ngƣời dùng, tập tin chia s là tập tin đƣợc xuất hiện đồng thời trong các thƣ mục khác nhau của các ngƣời dùng khác nhau. - Kỹ thuật chia s tập tin thƣờng đƣợc các hệ điều hành sử dụng nhất là, cho ph p các phần tử trong các bảng danh mục ngƣời dùng khác nhau chứa thông tin của cùng một tập tin chia s nào đó, đặc biệt là thông tin về địa chỉ của các block đĩa chứa nội dung của tập tin chia s . Khi có một liên kết chia s mới đƣợc thiết lập đến một ngƣời dùng nào đó, hệ điều hành chỉ cần sao ch p danh sách các block đĩa của tập tin chia s đến phần tử tƣơng ứng trong bảng danh mục ngƣời dùng của ngƣời dùng đó. + Ưu đi m : Kỹ thuật này đơn giản d cài đặt + Khuyết đi m: nếu tập tin đƣợc cập nhật bởi một ngƣời dùng nào đó thì sự cập nhật này sẽ không đƣợc nhìn thấy bởi các ngƣời dùng khác điều này sẽ vi phạm mục đích của việc chia s tập tin . Vì khi tập tin đƣợc cập nhật thì hệ điều hành phải cung cấp thêm một vài block đĩa cho nó, địa chỉ của các block đĩa mới này chỉ đƣợc liệt kê thêm trong phần tử tƣơng ứng trong bảng danh mục của ngƣời dùng thực hiện sự cập nhật tập tin mà không đƣợc liệt kê trong các bảng danh mục của ngƣời dùng khác. + Gi i pháp: danh sách địa chỉ các block đĩa chứa tập tin chia s không đƣợc liệt kê trong phần tử bảng danh mục, mà đƣợc chứa trong một khối dữ liệu có cấu trúc nào đó, tạm gọi là khối dữ liệu mô tả lƣu trữ tập tin hay nói gọn hơn là khối mô tả lƣu trữ. Khối mô tả lƣu trữ này có thể đƣợc gắn vào chính tập tin chia s nếu kích thƣớc nhỏ, hoặc đƣợc đặt ở một vị trí nào đó trên đĩa, nếu kích thƣớc lớn trƣờng hợp này có thể 237 dùng chung cho nhiều tập tin chia s . Mọi sƣ thay đổi về danh sách địa chỉ các block đĩa chứa tập tin chia s đều đƣợc phản ánh ở khối mô tả lƣu trữ của nó. Các phần tử trong bảng danh mục bây giờ chỉ đóng vai tr nhƣ một con trỏ trỏ đến khối mô tả lƣu trữ của các tập tin chia s , nhờ vậy mà một sự thay đổi tập tin chia s từ bất kỳ một ngƣời dùng nào trong số những ngƣời dùng đƣợc chia s tâp tin đều đƣợc nhìn thấy từ tất cả những ngƣời dùng c n lại. Trong môi trƣờng nhiều ngƣời dùng, việc chia s một tập tin cho nhiều ngƣời dùng là rất cần thiết và nó đ mang lại nhiều thuận lợi. Nhƣng nó cũng phát sinh nhiều lỗi trong quá trình sử dụng tập tin chia s giữa nhiều ngƣời dùng và chƣơng trình ngƣời dùng, mà nếu hệ điều hành không tổ chức giám sát tốt thì có thể dẫn đến tình trạng hỏng tập tin chia s hoặc nội dung của tâp tin chia s . Chúng ta đ biết hệ điều hành giải quyết vấn đề này nhƣ thế nào trong chƣơng Quản lý tiến trình của tài liệu này. Đây là một vấn đề lớn đối với các hệ điều hành đa nhiệm đặc biệt là các hệ điều hành mạng. Các hệ điều hành này cung cấp đầy đủ các công cụ để ngƣời dùng và chƣơng trình của ngƣời dùng kết hợp cùng với hệ điều hành khai thác, sử dụng tốt các tập tin chia s nhƣng hạn chế thấp nhất các lỗi có thể xảy ra. Trong phần sau của chƣơng này chúng ta sẽ xem x t những thao tác mà hệ điều hành phải thực hiện để đáp ứng yêu cầu mở tập tin từ ngƣời dùng trong môi trƣờng nhiều ngƣời dùng. 4.2.3. Quản lý không gian đĩa 4.2.3.1. Kích thước lock Đ t chức ưu trữ nội dung các t p tin tr n đĩa, các hệ điều hành đều chia hông gian ưu trữ của đĩa thành các phần c ích thước b ng nhau được gọi à hối (b oc ) ưu trữ Nội dung của t p tin cũng được chia thành các b oc c ích thước b ng nhau, trừ b oc cuối c ng, và b ng với ích thước các b oc đĩa Khi cần ưu trữ t p tin tr n đĩa hệ điều hành c p cho mỗi t p tin một số ượng b oc vừa đủ đ chứa hết nội dung của t p tin Kích thước của một b oc phụ thuộc vào qui định của vi x và hệ điều hành, thường à 128 Byte, 256 Byte, ho c 512 Byte, vv. Khi chọn kích thước của lock hệ điều hành phải xem xét các vấn đề sau: Nếu kích thƣớc block lớn thì d l ng phí đĩa, trong trƣờng hợp kích thƣớc của tập tin không phải là bội số của kích thƣớc block. Nếu kích thƣớc block nhỏ thì đĩa đƣợc chia thành nhiều block, dẫn đến kích 238 thƣớc danh sách quản lý block của đĩa, danh sách quản lý block của một tập tin, bảng các block, .v.v, sẽ tăng lên do đó dung lƣợng bộ nhớ chứa nó sẽ tăng lên. Kích thƣớc của block phải là bội của kích thƣớc khối dữ liệu mà hệ thống dùng khi thực hiện truyền dữ liệu giữa bộ nhớ chính và bộ nhớ phụ. 4.2.3.2. Theo dõi các lock tự do Khi cần lƣu trữ nội dung của các tập tin lên đĩa, hệ điều hành cấp cho tập tin một số lƣợng block đĩa nhất định để chứa hết nội dung của nó, các block đĩa này có thể nằm tại các vị trí bất kỳ trên đĩa. Trong quá trình sử dụng tập tin kích thƣớc của tập tin có thể thay đổi, tăng lên hay giảm xuống, do đó hệ điều hành phải tổ chức c p phát động các block đĩa cho các tập tin. Khi kích thƣớc của tập tin tăng lên thì hệ điều hành phải cấp phát thêm block cho nó, khi kích thƣớc tập tin giảm xuống hoặc khi tập tin bị xoá khỏi đĩa thì hệ điều hành phải thu hồi lại các block đĩa đ cấp cho nó để có thể cấp cho các tập tin khác sau này. Để tổ chức cấp phát động các block đĩa cho tập tin hệ điều hành phải qu n được trạng thái của các b oc , còn tự do hay đã c p phát, trên đĩa. Trong trƣờng hợp này các hệ điều hành có thể sử dụng 2 kỹ thuật: D ng b ng bit và/ho c d ng danh sách i n ết. Trong ảng bit: mỗi bit cho biết trạng thái của một block tƣơng ứng trên bộ nhớ phụ, bit 0 thì block tƣơng ứng c n tự do, bit 1 thì block tƣơng ứng đ cấp phát cho một tập tin nào đó. Nhƣ vậy, để tìm N block tự do hệ điều hành chỉ cần tìm N bit 0 trong bảng bit, do đó tốc độ tìm và cấp phát block cho các tập tin sẽ tăng lên rất nhiều. Trong danh sách liên kết: để quản lý các block c n tự do hệ điều hành dùng một danh sách liên kết. Mỗi phần tử trong danh sách cho biết địa chỉ của một block tự do trên đĩa. Nhƣ vậy khi cần cấp phát block cho cho một tập tin nào đó thì hệ điều hành sẽ dựa vào danh sách các block tự do này. Sau khi cấp phát hoặc thu hồi block hệ điều hành phải tiến hành cập nhật lại danh sách liên kết hay bảng bit. Trong trƣờng hợp bảng bit hoặc danh sách liên kết lớn, hệ điều hành sẽ chứa nó ở đĩa và chỉ nạp phần cần thiết vào bộ nhớ chính. Khi lựa chọn 239 các block trong tập các block tự do để cấp phát cho một tập tin hệ điều hành phải chọn sao cho việc cấp phát đƣợc thực hiện nhanh và việc đọc sau này là tối ƣu với một thuật toán đọc đĩa cụ thể nào đó. 4.2.3.3. Cấp hạn ngạch đĩa (Disk Quotas) Để ngăn chặn ngƣời dùng sử dụng quá nhiều không gian đĩa, các hệ điều hành đa ngƣời dùng thƣờng cung cấp một chiến lƣợc để ngƣời quản trị hệ thống giới hạn số lƣợng không gian đĩa tối đa block mà mỗi ngƣời dùng đƣợc ph p sử dụng và hệ điều hành phải đảm bảo rằng ngƣời dùng không thể sử dụng quá không gian đĩa mà hệ điều hành cấp cho họ, chiến lƣợc này đƣợc gọi là c p hạn ngạch đĩa. Khi ngƣời dùng mở tập tin, thì các thuộc tính và các địa chỉ block đĩa mà hệ điều hành cấp cho tập tin đƣợc ghi vào b ng m t p tin trong bộ nhớ chính, trong đó có cả thuộc tính cho biết ngƣời dùng nào sở hữu tập tin đƣợc mở. Bất kỳ một sự thay đổi nào
về kích thƣớc tập tin cũng thay đổi đến hạn ngạch của ngƣời dùng sở hữu tập tin18. Một bảng thứ hai chứa record quota, cho mỗi ngƣời dùng mở tập tin hiện tại, thậm chí nếu tập tin đƣợc mở bởi một ngƣời nào đó, bảng này đƣợc trình bày ở hình sau. Hình 4.2 cho thấy một phần của tập tin quota trên đĩa, cho biết tập tin của ngƣời dùng nào là đang đƣợc mở. Khi tất cả các tập tin đều đƣợc đóng, record sẽ ghi trở lại 18 Nguy n Kim Tuấn, Giáo trình lý thuyết hệ điều hành, ĐH Huế, 2004,Tr.154 240 tập tin quota. Khi có một Entry mới đƣợc tạo ra trong bảng mở tập tin thì một con trỏ (quota pointer trỏ tới record quota của ngƣời sở hữu tập tin, là đƣợc nhập vào nó. Mỗi khi có một block đƣợc thêm vào một tập tin thì tổng số block của ngƣời dùng đƣợc tăng lên và một check đƣợc gán đến cả Hard block limit và Soft block limit. Soft limit có thể đƣợc vƣợt quá, nhƣng hard limit thì không thể. Một sự cố gắng thêm vào cuối tập tin khi hard block limit bị vƣợt quá giới hạn sẽ trả về thông báo lỗi. Khi một ngƣời dùng cố gắng login, hệ thống sẽ kiểm tra tập tin quota để xem ngƣời dùng đ vƣợt quá soft limit của block hoặc tập tin hay chƣa soft block limit hoặc soft file limit . Nếu cả hai limit đều bị vi phạm, thì một cảnh báo sẽ xuất hiện, và bộ đếm count tƣơng ứng với cảnh báo sẽ giảm xuống một đơn vị. Nếu bộ đếm nhận đƣợc giá trị zero thì ngƣời dùng sẽ không đƣợc ph p login. 4.2.4. Quản lý các lock chứa tập tin trên đĩa Trong phần này chúng ta xem x t các phƣơng pháp khác nhau mà các hệ điều hành sử dụng để theo dõi danh sách các block đĩa mà hệ điều hành đ cấp phát cho một tập tin, để chứa hết các block của một tập tin, của tất cả các tập tin đang đƣợc lƣu trữ tên đĩa. 4.2.4.1. Cấp phát liên tục (contiguous allocation) - tưởng: Các block tập tin đƣợc lƣu trữ tại các block đĩa liên tục nhau. - Ví dụ: Nếu 1 block đĩa là 1K thì một tập tin 50K sẽ đƣợc lƣu trữ tại 50 block liên tiếp nhau trên đĩa. - Ưu điểm: Đơn giản, d cài đặt, thời gian đọc tập tin giảm xuống đáng kể. Vì hệ điều hành chỉ cần biết block đĩa đầu tiên chứa các block tập tin và tổng số block đĩa chứa tập tin là có thể tiến hành đọc nội dung của tập tin mà không cần d tìm danh sách các block đĩa chứa nội dung của tập tin nên thời gian đọc tập tin giảm xuống đáng kể. - Nhược điểm: L ng phí trong việc sử dụng block đĩa, xảy ra hiện tƣợng phân mảnh trên đĩa. Chiến lƣợc này chỉ có thể đƣợc sử dụng với các tập tin có kích thƣớc cố định, không thay đổi so với thời điểm tạo ra tập tin, hoặc với các tập tin mà hệ điều hành biết trƣớc đƣợc kích thƣớc tối đa của tập tin, trong trƣờng hợp này hệ điều hành phải dự trữ 241 block đĩa cho tập tin, điều này d dẫn đến tình trạng l ng phí trong việc sử dụng block đĩa. Chiến lƣợc này có thể dẫn đến hiện tƣợng phân mảnh trên đĩa, tức là trên đĩa có thể xuất hiện các đoạn block trống nhỏ, không đủ để chứa một tập tin có kích thƣớc tối thiểu, nằm giữa các đoạn block chứa tập tin, các đoạn block trống này có thể là nơi lƣu trữ của một tập tin nào đó mà tập tin này đ bị xoá khỏi đĩa. Hiện tƣợng phân mảnh đĩa sẽ làm chậm tốc độ đọc tập tin của hệ điều hành. - Giải pháp: Các block tập tin đƣợc lƣu trữ tại block đĩa rời rạc nhau. Với việc cải tiến này, hệ điều hành có thể đọc tập tin nhanh hơn, ít xảy ra phân mảnh hơn nhƣng việc tổ chức lƣu trữ sẽ phức tạp hơn. Chúng ta sẽ thấy cách tổ chức này trong hệ thống tập tin của hệ điều hành WindowsNT/2000 trong phần sau của chƣơng này. 4.2.4.2. Cấp phát theo danh sách liên kết linked list allocation) - tưởng: Các block tập tin đƣợc lƣu trữ tại một danh sách liên kết các block đĩa. Word đầu tiên của mỗi block đĩa đƣợc sử dụng nhƣ một con trỏ để trỏ đến block kế tiếp, trừ word của block cuối cùng đƣợc sử dụng để chứa tín hiệu báo kết thúc danh sách của một tập tin, phần c n lại của block đĩa dùng để chứa nội dung của tập tin. Trong trƣờng hợp này kích thƣớc của block đĩa phải lớn hơn kích thƣớc của block tập tin 1 word. - Ví dụ: Tập tin A đƣợc chia thành 4 block: block 0, block 1, block 2, block 3 đƣợc lƣu trữ tại các block đĩa, lần lƣợt là 3, 7, 5, 10. Với tập tin B đƣợc chia thành 3 242 block: block 0, block 1, block 2, đƣợc lƣu trữ tại các block đĩa, lần lƣợt là 4, 8, 6. Hình 4.3 C p phát b oc theo danh sách i n ết - Ưu điểm: Không xảy ra hiện tƣợng phân mảnh đĩa và khai thác tối đa không gian đĩa. - Nhược điểm: Tốc độ đọc tập tin rất chậm và tốn một word để chứa con trỏ đến block kế tiếp. - Giải pháp: Cấp phát theo danh sách liên kết sử dụng chỉ mục. Cấp phát theo danh sách liên kết sử dụng chỉ mục (linked list allocation using an index): - tưởng: Lƣu các word con trỏ vào trong một bảng chỉ mục và nạp bảng chỉ mục này vào bộ nhớ khi hệ điều hành cần đọc nội dung của tập tin trên đĩa. Hình 4.4. C p phát b oc theo danh sách i n ết c chỉ mục - Ví dụ: tập tin A đƣợc chia thành 4 block: A1, A2, A3, A4 đƣợc lƣu trữ tại các block đĩa, lần lƣợt là 4, 10, 7, 14 cuối cùng . Với tập tin B đƣợc chia thành 4 block: B1, B2, B3, B4 đƣợc lƣu trữ tại các block đĩa, lần lƣợt là 6, 9, 12, 15 cuối cùng . - Ưu điểm: Tốc độ đọc tập tin nhanh và không tốn một word để chứa con trỏ đến block kế tiếp. - Nhược điểm: Tốn thời gian nạp bảng chỉ mục và làm l ng phí không gian bộ 243 nhớ. - Giải pháp: Chỉ nạp phần bảng chỉ mục liên quan đến các tập tin đang mở trên bộ nhớ tại một thời điểm cụ thể nào đó. + Với cách tổ chức này thì toàn bộ block đĩa đƣợc sử dụng để lƣu trữ tập tin và việc truy cập ngẫu nhiên trong trƣờng hợp này sẽ d dàng hơn. Tuy nhiên cũng phải tồn tại một móc xích để tìm ra tất cả các block đĩa chứa nội dung của một tập tin và móc xích này phải đƣợc nạp vào bộ nhớ để hệ điều hành có thể tìm đọc tập tin khi cần. Cũng nhƣ chiến lƣợc trên block đầu tiên của một tập tin phải đƣợc chứa trong phần tử bảng danh mục tƣơng ứng với mỗi tập tin, trong trƣờng hợp này nó đƣợc xem nhƣ một con trỏ trỏ đến bảng chỉ mục để bắt đầu d tìm d y các block đĩa chứa nội dung của tập tin, mỗi khi hệ điều hành cần đọc tập tin. + Hệ điều hành MS-DOS tổ chức quản lý tập tin trên đĩa dựa theo chiến lƣợc này. + Khái niệm cửa sổ bảng FAT trong hệ thống tập tin của hệ điều hành Windows98 là một ví dụ của trƣờng hợp này. Chúng ta sẽ đƣợc nhắc đến điều này trong phần sau của chƣơng này. I-nodes (index-node): - tưởng: hệ điều hành thiết kế một bảng nhỏ để theo dõi các blocks của một tập tin, đƣợc gọi là I-node. I-node liệt kê các thuộc tính và các địa chỉ đĩa của các block 244 của tập tin. Hình sau đây minh hoạ cho chiến lƣợc này. Đầu tiên một phần địa chỉ đĩa các block đĩa đƣợc lƣu trữ trong chính I-node. Sau đó, đối với các tập tin nhỏ thì tất cả các thông tin cần thiết là phải chứa trong chính I-node, đó là các thông tin đƣợc nhận từ đĩa vào bộ nhớ chính khi tập tin đƣợc mở. Đối với các tập tin lớn, gồm nhiều block, thì một trong các địa chỉ trong I-node là địa chỉ của một block đĩa, đƣợc gọi là block gián tiếp đơn. Block này chứa các địa chỉ đĩa đƣợc thêm vào. Nếu vẫn c n không đủ thì một địa chỉ khác trong I-node, đƣợc gọi là block gián tiếp đôi, sẽ chứa địa chỉ của một block mà nó chứa một danh sách các block gián tiếp đơn. Mỗi block gián tiếp đơn trỏ đến khoảng 100 block dữ liệu. Nếu vẫn c n không đủ thì có thể một block gián tiếp ba đƣợc sử dụng. Nhìn hình vẽ trên ta dẽ dàng phân biệt đƣợc sự khác nhau giữa: block gián tiếp đơn, block gián tiếp đôi và block gián tiếp ba. Chiến lƣợc này đƣợc Windows 2000 cải tiến và sử dụng trong cấu trúc MFT trong hệ thống tập tin của nó. Chúng ta sẽ thấy điều này khi tìm hiểu hệ thống tập tin của Windows 2000 trong phần sau của chƣơng này. Cấp phát không liên tục với lock chỉ mục: Cả hai chiến lƣợc cấp phát, theo danh sách liên kết và theo liên kết chỉ mục đều tồn tại hạn chế là phải phân tích danh sách liên kết hay bảng chỉ mục để d tìm ra danh sách các block đĩa chứa nội dung của tập tin cần đọc, khi đọc tập tin, dẫn đến làm chậm tốc độ đọc tập tin trên đĩa. 19 Nguy n Kim Tuấn, Giáo trình lý thuyết hệ điều hành, ĐH Huế 2004, Tr.158 245 Hình 4.6. C p phát hông i n tục với b oc chỉ mục19 Để khắc phục điều này các hệ điều hành có thể cài đặt chiến lƣợc cấp phát không liên tục với block chỉ số. - Block chỉ mục: Là một block đĩa chứa danh sách các block đĩa chứa nội dung của một tập tin nào đó. - tưởng: Hệ điều hành chỉ cần thiết kế một con trỏ, tại phần tử trong bảng chỉ mục, trỏ tới block chỉ mục của tập tin trên đĩa là hệ điều hành có thể quản lý đƣợc danh sách các block đĩa chứa nội dung của một tập tin. - Ví dụ: File A đƣợc chia thành 4 block: A1, A2, A3, A4 đƣợc lƣu trữ tại các block đĩa lần lƣợt là 4, 10, 7, 14 cuối cùng . File B đƣợc chia thành 4 block: B1, B2, B3, B4 đƣợc lƣu trữ tại các block đĩa lần lƣợt là 6, 9, 12, 15 cuối cùng . - Ưu điểm: Tốc độ đọc tập tin nhanh đối với các tập tin nhỏ. - Nhược điểm: Tập tin lớn thì một block có thể không chứa đủ danh sách các block đĩa chứa nội dung của một tập tin. Nếu block chỉ mục của tập tin bị hỏng thì hệ điều hành không thể đọc đƣợc tập tin, mặc dù nội dung của tập tin vẫn còn tồn tại trên các block đĩa. Trong hình trên block 11 là chỉ mục của file A, block 8 là chỉ mục của file B. Nhƣ vậy chỉ cần thiết kế một con trỏ, tại phần tử trong bảng chỉ mục, trỏ tới block chỉ mục của tập tin trên đĩa là hệ điều hành có thể quản lý đƣợc danh sách các block đĩa chứa nội dung của một tập tin. 4.2.5. n toàn trong quản lý tập tin 4.2.5.1. Bảo toàn dữ liệu tập tin Một hệ quản trị tập tin phải cung cấp những cơ chế thích hợp để phục hồi nội dung của tập tin trong trƣờng hợp hệ thống gặp sự cố về phần mềm hoặc phần cứng. Để thực hiện đƣợc điều này hệ điều hành phải luôn tạo bản sao của các tập tin đang mở trên hệ thống, để có thể phục hồi lại khi cần thiết. Có hai kỹ thuật đƣợc sử dụng trong 246 cơ chế này: DUMP c chu ỳ: Sau một khoảng thời gian nhất định nội dung của các tập tin đang mở trên bộ nhớ chính sẽ đƣợc đổ Dum/backup ra lại đĩa. Nếu hệ thống gặp sự cố thì tất cả các tập tin đang mở sẽ đƣợc tái tạo lại kể từ trạng thái mà chúng đƣợc DUMP ra lần cuối cùng. Rõ ràng việc DUM này sẽ làm tốn thời gian thực hiện của hệ thống. DUMP Incremental: Trong cách này, hệ thống chỉ lƣu trữ các thông tin đƣợc sửa đổi kể từ lần Dump sau cùng, tức là chỉ có các tập tin đƣợc tạo lập hoặc sửa đổi so với lần đổ ra cuối cùng mới đƣợc Dump ra. Với kỹ thuật này thông tin cần lƣu trữ ít hơn do đó hệ thống có thể thực hiện Dump thƣờng xuyên hơn. Để biết đƣợc trong số những tập tin đang mở tập tin nào có sự cập nhật dữ liệu hoặc có sự thay đổi so với lần Dump ra trƣớc đó hệ thống đƣa thêm vào danh mục ngƣời dùng một trƣờng mới, dài 2 bit, tạm gọi là trƣờng kiểm tra cập nhật KTCN . Nếu KTCN = 00: mở không cập nhật KTCN = 01: mở có cập nhật KTCN = 10: không có thay đổi so với lần Dump trƣớc KTCN = 11: có thay đổi so với lần Dump trƣớc. Với cách này hệ thống phải luôn kiểm tra bảng danh mục và phải cập nhật lại trƣờng KTCN sau mỗi lần Dump, dẫn đến làm chậm tốc độ thực hiện của hệ thống. Để hệ thống không phải khảo sát tất cả các điểm vào của danh mục, hệ điều hành cài đặt thêm một bảng danh mục mới để ghi nhận thông tin của các tập tin đang đƣợc truy xuất ghi/đọc trên hệ thống và chỉ có Dump sử dụng bảng danh mục này, do đó hệ thống Dump có thể hoạt động song song với các thao tác khác của hệ thống. Dump Incremental là một tiến trình có độ ƣu tiên thấp, thƣờng trú trong bộ nhớ phân tích các bảng danh mục để tìm ra các tập tin cần phải thực hiện Dump. 4.2.5.2. Danh sách các quyền truy cập ccess Right) Trong phần tập tin chia s ở trên, chúng tôi đ trình bày về kỹ thuật tạo ra tập tin chia s của hệ điều hành, kỹ thuật này hoàn toàn trong suốt với ngƣời dùng. Trong phần này chúng tôi sẽ giới thiệu quyền truy c p, quyền truy c p và qu n truy c p đồng thời là các công cụ cơ bản mà hệ điều hành dùng để quản lý và bảo vệ các tập tin 247 chia s trong các hệ thống nhiều ngƣời dùng (multiuser systems). Quyền truy c p có thể đƣợc gán cho một ngƣời dùng User cụ thể, một nhóm ngƣời dùng User Group hay tất cả ngƣời dùng All User có trong các hệ thống multiuser. Một user group chứa nhiều user, khi một group đƣợc gán quyền nào đó thì tất cả các uer thành viên trong group này cũng đều đƣợc gán quyền truy cập đó. Sau đây là các quyền truy cập mà hệ điều hành thƣờng dùng để gán cho một ngƣời dùng cụ thể đến một tập tin cụ thể nào đó: None: Ngƣời dùng không biết đƣợc là tập tin có tồn tại hay không. Với giới hạn của quyền này, ngƣời dùng không đƣợc ph p đọc thƣ mục chứa tập tin này. Knowledge: Ngƣời dùng có thể xác định đƣợc là tập tin đang tồn tại và ai là ngƣời sở hữu tập tin. Excution: Ngƣời dùng có thể nạp và thực hiện một chƣơng trình nhƣng không thể copy nó. Các chƣơng trình thuộc dạng độc quyền của một nhà sản xuất nào đó thƣờng đƣợc tạo với sự giới hạn với quyền này. Reading: Ngƣời dùng có thể đọc tập tin cho bất kỳ mục đích nào, bao gồm cả copy và execution. Một vài hệ thống cho ph p có sự khác nhau giữa xem và copy tập tin. Trong trƣờng hợp này nội dung của tập tin có thể đƣợc hiển thị để ngƣời dùng xem, nhƣng họ không đƣợc cung cấp công cụ để copy nội dung này. Appending: Ngƣời dùng có thể thêm dữ liệu vào tập tin, thƣờng là ở cuối tập tin, nhƣng không thể thay đổi hoặc xoá bất kỳ một nội dung nào trong tập tin. Updating: Ngƣời dùng có thể thay đổi, xoá và thêm dữ liệu vào tập tin. Changing protection: Ngƣời dùng có thể thay đổi các quyền truy cập đƣợc gán đến ngƣời dùng khác. Quyền này thƣờng chỉ đƣợc gán cho ngƣời sở hữu tập tin. Deletion: Ngƣời dùng có thể xoá đƣợc tập tin từ hệ thống tập tin. Ví dụ: Người dùng A đƣợc gán quyền đọc read tập tin tailieu.doc, nhƣng không đƣợc gán quyền xoá delete tập tin tailieu.doc thì ngƣời dùng A này chỉ có thể thực hiện thao tác mở tập tin tailieu.doc ra để đọc nội dung của tập tin, chứ không thể thay xóa hay thay đổi nội dung của tập tin vì không đƣợc gán 248 quyền thay đổi modify nội dung tập tin . Ngƣời dùng có thể đƣợc gán nhiều quyền truy cập đến một tập tin, khi đó họ sẽ có đầy đủ các sự cho ph p và sự giới hạn tƣơng ứng với các quyền đ đƣợc gán. Tuy nhiên quyền truy cập có tính kế thừa, nên chỉ cần gán một quyền truy cập cao nhất thì họ có đủ các sự cho ph p và sự giới hạn của các quyền khác. Ví dụ: Nếu ngƣời dùng đƣợc gán quyền Updating với một tập tin nào đó, thì xem nhƣ họ đ đƣợc gán các quyền Knowledge, execution, reading và appending đối với tập tin này. 4.2.5.3. Mở và đóng tập tin Hệ điều hành cho rằng các tập tin đƣợc lƣu trữ trên đĩa đều ở trạng thái đóng, để thực hiện bất kỳ một thao tác đọc/ghi/thay đổi nội dung của tập tin thì trƣớc hết chƣơng trình, tiến trình của ngƣời dùng phải thực hiện thao tác mở tập tin. Khi nhận đƣợc yêu cầu mở tập tin bộ phận quản lý tập tin của hệ điều hành sẽ đọc nội dung của tập tin từ đĩa và nạp nó vào bộ nhớ chính, sau đó trả về cho chƣơng trình, tiến trình của ngƣời dùng một th tập tin file handle hoặc một biến tƣơng ứng với tập tin này để chƣơng trình, tiến trình theo dõi và thao tác trên tập tin này. Sau khi thực hiện xong một thao tác nào đó trên nội dung của tập tin thì chƣơng trình, tiến trình và cả ngƣời dùng phải thực hiện thao tác đóng tập tin lại. Đối tƣợng yêu cầu đóng tập tin phải cung cấp đúng th tập tin của tập tin cần đóng cho hệ điều hành. Một số hệ điều hành cho ph p thực các thao tác trên tập tin mở/cập nhật/đóng bằng chính tên của tập tin. Các hệ điều hành đều cung cấp hai thủ tục chính để chƣơng trình của ngƣời dùng thực hiện các thao tác mở/đóng tập tin: Open (t n t p tin cần m , chế độ m : dùng để mở tập tin chế độ: Đọc/ Viết/Tạo lập Close (t n t p tin cần đ ng): dùng để đóng tập tin khi mở. Thao tác mở/đóng tập tin sẽ đơn giảm trong môi trƣờng hệ điều hành đơn nhiệm và sẽ phức tạp hơn trong môi trƣờng hệ điều hành đa nhiệm. Trong môi trƣờng đa nhiệm, hệ điều hành chỉ thực sự đóng tập tin theo yêu cầu của một tiến trình từ một ngƣời dùng nào đó khi tất cả các thao tác ghi/đọc tập tin này từ các tiến trình ngƣời dùng khác đều đ kết thúc. Trong trƣờng hợp này hệ điều hành phải luôn theo dõi các tiến trình ngƣời dùng tham gia vào việc mở tập tin này. Để đáp ứng yêu cầu mở tập tin 249 từ một chƣơng trình, tiến trình của ngƣời dùng trong môi trƣờng đa nhiệm hệ điều hành phải thực hiện các bƣớc cơ bản sau đây để đảm bảo việc truy xuất tập tin sau này là hợp lệ: Kiểm tra tên của tập tin cần mở, tại các Entry, trong bảng danh mục tập tin của hệ thống đó là bảng thƣ mục trong hệ điều hành DOS và Windows9x). Kiểm tra tiến trình gọi tới từ một ngƣời dùng hay chƣơng trình ngƣời dùng có đƣợc quyền truy cập tập tin ở chế độ đ đƣợc chỉ ra hay không. Kiểm tra nếu tập tin đ đƣợc mở để đọc bởi một tiến trình trƣớc đó thì tiến trình hiện tại không thể mở để ghi vào tập tin, mặc dầu tiến trình này đƣợc quyền ghi tập tin. Ngƣợc lại tiến trình hiện tại không thể mở tập tin để đọc khi đ có một tiến trình nào đó đang ghi vào tập tin. Đảm bảo sự sẵn sàng của các thiết bị lƣu trữ, đĩa chẳng hạn, và vật mang liên quan đến tập tin cần mở. Để mô tả đầy đủ các thông tin về một tập tin thì một phần tử trong bảng danh mục cần phải chứa các trƣờng sau: Tên tập tin; Mô tả của đơn vị của lƣu trữ tập tin; Địa chỉ của Block đầu tiên trong d y các block trên đĩa chứa tập tin; Địa chỉ của các block kế tiếp trong d y các block chứa tập tin; Chế độ truy cập tập tin; vv. Trong môi trƣờng hệ điều hành đa nhiệm có thể có các tiến trình song song cùng đọc nội dung của một tập tin, đối với các tập tin chia s , nhƣng không thể xảy ra trƣờng hợp có hai tiến trình cùng ghi vào một tập tin hoặc có một tiến trình ghi vào tập tin trong khi có một hoặc nhiều tiến trình khác đang đọc nội dung của tập tin. Hệ điều hành phải kiểm soát chặt chẽ các trƣờng hợp này. Để tránh hiện tƣợng này hệ điều hành phải tạo một cơ chế thích hợp để loại trừ lẫn nhau trong thao tác đọc/ghi tập tin giữa các tập tin đồng thời. Để thực hiện loại trừ lẫn nhau này hệ điều hành đƣa thêm hai trƣờng vào các Entry trong bảng danh mục ngƣời dùng: Trƣờng thứ nhất, Bit ghi = 1 đang có một tiến trình ghi vào tập tin, Bit ghi = 0 không có tiến trình nào ghi vào tập tin. Trƣờng thứ hai, Bộ đếm, = mở tập tin để đọc khi Bit ghi = 0, mở tập tin để ghi khi Bit ghi = 1 và Bộ đếm = 0. Nhƣ vậy, ngay sau khi chấp nhận yêu cầu mở tập tin để ghi từ một tiến trình thì hệ điều hành phải gán Bit ghi = 1, ngay sau khi chấp nhận yêu cầu mở tập tin để đọc từ một tiến trình thì hệ điều hành phải tăng Bộ đếm lên 1 đơn vị, Bộ đếm = bộ đếm + 1. Khi một tiến trình đọc tập tin đóng tập tin thì Bộ đếm = bộ đếm - 1, khi một tiến trình ghi 250 tập tin đóng tập tin thì Bit ghi đƣợc gán = 0. Rõ ràng kỹ thuật này có thể dẫn đến lỗi khi hệ thống không giám sát tốt việc thay đổi giá trị trên các trƣờng Bit ghi và Bộ đếm, điều này chúng ta đ thấy trong chƣơng Quản lý tiến trình của tài liệu này. 4.2.6. Hiệu suất hệ thống tập tin Nhƣ đ biết, tốc độ truy xuất dữ liệu trên đĩa chậm hơn rất nhiều so với tốc độ truy xuất dữ liệu trên bộ nhớ, tốc độ truy xuất dữ liệu trên đĩa tính bằng đơn vị milliseconds, trong khi đó tốc độ truy xuất dữ liệu trên bộ nhớ chỉ tính bằng đơn vị nanoseconds. Do đó, để tạo ra sự đồng bộ trong việc trao đổi dữ liệu trên bộ nhớ và trên đĩa, cũng nhƣ tăng tốc độ truy xuất dữ liệu trên bộ nhớ, các hệ điều hành phải thiết kế hệ thống tập tin của nó sao cho tốc độ đọc dữ liệu là nhanh nhất và giảm số lần truy cập đĩa mỗi khi truy xuất tập tin xuống mức thấp nhất. Một trong những kỹ thuật đƣợc hệ điều hành sử dụng ở đây là tạo ra các block cache hoặc buffer cache. Trong ngữ cảnh này, cache là một tập các block logic trên đĩa, nhƣng đƣợc tạo ra và đƣợc giữ trong bộ nhớ chỉ để phục vụ cho mục đích cải thiện hiệu suất của hệ thống. Có nhiều thuật toán khác nhau đƣợc sử dụng để quản lý cache, nhƣng tất cả đều hƣớng tới mục đích của việc sử dụng cache và nguyên lý hoạt động của cache: Khi nhận đƣợc một yêu cầu đọc dữ liệu từ tiến trình của ngƣời dùng thì bộ phận quản lý cache sẽ kiểm tra block dữ liệu cần đọc đ có trong cache hay chƣa, nếu có trong cache thì đọc trực tiếp trong cache mà không cần truy cập đĩa, nếu không có trong cache thì dữ liệu cần đọc sẽ đƣợc đọc và ghi vào trong cache trƣớc rồi sau đó đƣợc ch p đến bất cứ nơi nào cần thiết. Việc ghi vào cache này nhằm chuẩn bị cho các lần đọc dữ liệu sau này. Tức là, nếu sau này có một yêu cầu đọc cùng một block dữ liệu nhƣ trên thì nó sẽ đƣợc đọc trực tiếp từ cache mà không cần truy cập đĩa. Khi cache bị đầy các block thì một vài block trong đó phải bị xoá hoặc bị xoá và ghi trở lại về đĩa nếu block này có sự thay đổi kể từ khi nó đƣợc mang vào bộ nhớ kể từ lần đƣợc mang vào gần đây nhất. Trong trƣờng hợp này hệ điều hành cũng sử dụng các thuật toán thay trang trong quản lý bộ nhớ nhƣ FIFO, LRU, … để chọn một block trong cache để đƣa ra đĩa. Tuy nhiên cache đƣợc truy xuất ít thƣờng xuyên hơn, nên hệ điều hành có thể tổ chức một danh sách liên kết để theo dõi việc truy xuất các block 251 trong cache, danh sách liên kết này đƣợc sử dụng cho thuật toán thay block: LRU. 4.3. MỘT SỐ KHÁI NIỆM DÙNG TRONG QUẢN L ĐĨ - Track: Là các v ng tr n đồng tâm đƣợc tạo ra trên bề mặt đĩa, đây sẽ là nơi chứa dữ liệu sau này. Các track đƣợc đánh số bắt đầu từ 0. Số track trên mỗi mặt đĩa phụ thuộc vào từng loại đĩa. - Sector: Các track đƣợc chia thành các khối có kích thƣớc cố định bằng nhau và đƣợc đánh địa chỉ, các khối này đƣợc gọi là các sector. Các sector đƣợc đánh địa chỉ bắt đầu từ 1 trên mỗi track, nhƣ vậy trên đĩa sẽ tồn tại nhiều sector có cùng số hiệu địa chỉ, cách đánh địa chỉ này gây khó khăn nhiều ngƣời lập trình. Kích thƣớc của sector, số Byte dữ liệu có thể chứa trên một sector, phụ thuộc vào phần cứng. Trên các họ CPU x86, kích thƣớc sector trên đĩa cứng thƣờng là 512 Byte, kích thƣớc sector trên đĩa CD_ROM thƣờng là 2048 Byte. Các sector đƣợc đánh địa chỉ theo kiểu trên đƣợc gọi là sector vật lý. Trong thực tế lập trình các hệ điều hành chỉ sử dụng sector logic, theo đó thì địa chỉ các sector đƣợc đánh bắt đầu từ 0 kể từ track 0 của mặt 0 trên đĩa thứ nhất. Nhƣ vậy trên đĩa không có các sector có cùng số hiệu địa chỉ. Bảng sau đây cho thấy sự tƣơng ứng giữa các sector vật lý với sector logic trên một đĩa mềm: Bản 4 Tương ứng giữa sector v t và sector ogic tr n đĩa mềm Trên bề mặt đĩa tồn tại các sector mà hệ điều hành không thể ghi dữ liệu vào đó hoặc không thể đọc dữ liệu từ đó. Các sector này đƣợc gọi là bad sector. Trong quá trình định dạng đĩa hệ điều hành đánh dấu loại bỏ các bad sector này. - Cluster: Một nhóm gồm 2, 4 hoặc 6 sector liên tiếp nhau tạo thành một Cluster. 252 Kích thƣớc của Cluster thƣờng là bội số kích thƣớc của một sector. Các Cluster đƣợc đánh địa chỉ bắt đầu từ 0. Số sector trên một Cluster phụ thuộc vào từng loại đĩa. Một số hệ điều hành cho ph p ngƣời dùng quy định số sector trên một Cluster. Các hệ điều hành thƣờng tổ chức lƣu trữ dữ liệu, nội dung các tập tin, trên đĩa theo từng Cluster. Trên bề mặt đĩa cũng tồn tại các bad Cluster, đó là các Cluster có chứa bad sector. Một số hệ điều hành có thể khôi phục lại đƣợc dữ liệu chứa trên các bad-sector hay bad Cluster và ghi nó vào lại một Cluster mới. Hệ điều hành có thể chỉ khôi phục và thay thế dữ liệu tại sector bị bad hoặc phải khôi phục và thay thế toàn bộ dữ liệu trên Cluster có chứa bad-sector. Hệ thống tập tin NTFS của WindowsNT/2000 tham chiếu đến các vị trí vật lý trên đĩa bằng số hiệu Cluster logic (LCNs: logical Cluster numbers . LCN là kết quả của việc đánh số tất cả các Cluster trên volume từ vị trí bắt đầu volume đến kết thúc volume. Để chuyển một LCN thành địa chỉ vật lý trên đĩa, NTFS nhân LCN với thừa số Cluster số sector trên một Cluster để có đƣợc Byte offset vật lý trên volume. NTFS tham chiếu đến dữ liệu trong phạm vi một tập tin bằng số hiệu Cluster ảo VCNs: Virtual Cluster numbers), VCN đánh số các Cluster dựa vào một tập tin cụ thể và đánh số từ 0 đến m. Các VCN không cần phải liên tục về mặt vật lý, tuy nhiên nó có thể ánh xạ đến bất kỳ một LCN nào trên volume. - Cylinder: Các track có cùng số hiệu trên các mặt đĩa khác nhau của một hệ thống đĩa tạo thành một cylinder. Nhƣ vậy mặt đĩa có bao nhiều track thì đĩa có bấy nhiêu cylinder. Cylinder chỉ có trên các ổ đĩa cứng. - Partition: phân vùng là một tập các sector liền kề trên một đĩa. Mỗi phân vùng có một bảng phân vùng hoặc một cơ sở dữ liệu quản lý đĩa riêng, dùng để lƣu trữ sector đầu tiên, kích thƣớc và các đặc tính khác của phân vùng. - Volume: Một volume tƣơng tự một phân vùng logic trên một đĩa, và nó đƣợc tạo khi ta định dạng một đĩa hoặc một phần của đĩa theo hệ thống tập tin NTFS. Trong hệ điều hành WindowsNT/2000 ta có thể tạo ra một volume tr i dài trên nhiều đĩa vật lý khác nhau. Một đĩa có thể có một hoặc nhiều volume. NTFS điều khiển mỗi volume sao cho không phụ thuộc vào các volume khác. Một volume bao gồm một tập các tập tin cùng với bất kỳ một không gian chƣa đƣợc cấp phát nào c n lại trên phân vùng đĩa. Trong hệ thống tập tin FAT, một volume cũng chứa các vùng đặc biệt đƣợc định dạng 253 cho việc sử dụng của hệ thống tập tin. Trong các volume NTFS thì ngƣợc lại nó lƣu trữ tất cả dữ liệu của hệ thống tập tin, nhƣ là bitmap, directory và cả system bootstrap, trên các tập tin. Simple volume: là các đối tƣợng đại diện cho các sector từ một phân vùng đơn, mà các trình điều khiển hệ thống tập tin, quản lý nó nhƣ một đơn vị đơn. Multipartition volume: là các đối tƣợng đại diện cho các sector từ nhiều phân vùng khác nhau, mà các trình điều khiển hệ thống tập tin quản lý nó nhƣ một đơn vị đơn. Các multipartition volume có các đặc tính mà các simple volume không có đƣợc nhƣ: hiệu suất cao, độ tin cậy cao và khả năng mở rộng kích thƣớc. - Metadata: là một dạng dữ liệu đặc biệt, đƣợc lƣu trữ trên đĩa, nó hỗ trợ cho các thành phần quản lý các dạng thức hệ thống tập tin khác nhau, dữ liệu của nó có thể là vị trí của các tập tin/ thƣ mục trên các ổ đĩa. Metadata không đƣợc sử dụng trong các ứng dụng. - File system hệ thống tập tin): Các dạng thức hệ thống tập tin định nghĩa cách mà dữ liệu tập tin đƣợc lƣu trữ trên thiết bị lƣu trữ và sự tác động của hệ thống tập tin đến các tập tin. Một dạng thức hệ thống tập tin cũng có thể đƣa ra các giới hạn về kích thƣớc của các tập tin và các thiết bị lƣu trữ mà hệ thống tập tin hỗ trợ. Một vài hệ thống tập tin hỗ trợ cho cả các tập tin lớn hoặc nhỏ, hoặc cả các đĩa lớn và nhỏ. Một hệ thống t p tin thường bao gồm các thành phần: Sector h i động (Boot sector), b ng định vị t p tin (FAT: Fi e A ocation Tab e), b ng thư mục gốc (Root Directory), một t p các t p tin các thư mục và các công cụ qu n các thành phần này Các thành phần này c th c c u trúc ho c phương thức t chức hác nhau tr n các dạng thức hệ thống t p tin hác nhau Người ta thường d ng t n của FAT trong hệ
thống t p tin đ gọi t n của hệ thống t p tin đ 20. Hệ điều hành MS-DOS sử dụng hệ thống tập tin FAT12 và FAT16, hệ điều hành Windows9x sử dụng hệ thống tập tin FAT32 và CDFS, hệ điều hành Windows NT và Windows 2000 sử dụng các hệ thống tập tin FAT12, FAT16, FAT32, CDFS (CD_ROM File System, UDF (Universal Disk Format) và NTFS (New Technology 20 Nguy n Kim Tuấn, Giáo trình lý thuyết hệ điều hành, ĐH Huế, 2004,Tr.164 254 File System). 4.4. CÁC ĐIỀU KHIỂN HỆ THỐNG TẬP TIN Các điều khiển hệ thống tập tin FSD: File system driver quản lý các dạng thức hệ thống tập tin khác nhau. FSD chính thức xuất hiện từ WindowsNT/2000. Trong Windows 2000 có 2 loại FSD: Local FSD và Network/ Remote FSD. Local FSD: quản lý các volume đƣợc nối trực tiếp với máy tính. Network/ Remote FSD: cho ph p ngƣời dùng và chƣơng trình của ngƣời dùng truy cập dữ liệu trên các volume đƣợc nối với một máy tính ở xa. Local FSD FSD cục bộ : Các Local FSD bao gồm các tập tin: Ntfs.sys, Fastfat.sys, Cdfs.sys và Raw FSD đƣợc tích hợp trong Ntoskrnl.exe . Hình sau đây cho thấy cách local FSD tƣơng tác với quản lý I/O và các thiết bị lƣu trữ. Các local FSD chịu trách nhiệm đăng ký với bộ phận quản lý I/O, khi FSD đ đăng ký thì bộ phận quản lý I/O có thể gọi nó để thực hiện việc xác nhận volume khi các ứng dụng hoặc các hệ thống khởi tạo truy cập đến volume. Hình 4.7.a. FSD cục bộ Việc xác nhận volume bao hàm việc kiểm tra boot sector của volume và các thông tin hệ thống khác. Sector đầu tiên của mọi dạng thức hệ thống tập tin đƣợc hỗ trợ bởi Windows 2000 đều đƣợc dành riêng cho boot sector của volume. Boot sector chứa đầy đủ thông tin cần thiết để local FSD vừa nhận biết mà sector trên đó đang chứa một dạng thức mà FSD quản lý và tìm kiếm bất kỳ một metadata khác đƣợc lƣu trữ trên đĩa. Để cải tiến hiệu suất, các local FSD thƣờng sử dụng hệ thống quản lý cache để cache 255 dữ liệu của hệ thống tập tin bao gồm cả metadata. Các Network/Remote FSD FSD mạng/từ xa : Các Remote FSD bao gồm 2 thành phần: Một Client và một Server. Các client remote FSD cho ph p các ứng dụng truy cập đến các tập tin và các thƣ mục ở xa. Client FSD chấp nhận các yêu cầu I/O từ các ứng dụng và chuyển nó thành các lệnh trong các giao thức về hệ thống tập tin của mạng để thông qua mạng nó đƣợc chuyển đến server remote FSD. Server FSD lắng chờ các lệnh đƣợc đƣa đến từ kết nối mạng và thực hiện chúng bằng cách đƣa ra yêu cầu I/O đến bộ phận quản lý local FSD Local FSD manages của volume chứa các tập tin và các thƣ mục mà lệnh có ý định xử lý nó. Hình dƣới đây cho thấy một tƣơng tác giữa Client và server trong hệ thống remote FSD. Cũng giống nhƣ các local FSD, các Client remote FSD thƣờng sử dụng những dịch vụ của bộ phận quản lý cache để che dấu dữ liệu của các tập tin cục bộ và các thƣ mục ở xa. Các server remote FSD tham gia vào việc duy trì các kết nối đến cache thông qua các Client remote FSD. 256 Hình 4.7.b. FSD mạng 4.5. CÁC HỆ THỐNG TẬP TIN ĐƯỢC S DỤNG TRÊN CÁC HỆ ĐIỀU HÀNH
HIỆN N Y 4.5.1. FAT12, FAT16, FAT32 Hệ thống tập tin FAT12 và FAT16 đƣợc Microsoft đƣa ra sử dụng từ hệ điều hành DOS, hệ thống tập tin FAT32 đƣợc Microsoft đƣa ra sử dụng từ hệ điều hành Windows98. Hệ điều hành WindowsNT/2000 vẫn sử dụng các hệ thống tập tin FAT này nhƣng linh hoạt hơn. Mỗi loại FAT có một con số để chỉ ra số lƣợng bit mà hệ thống tập tin sử dụng để nhận dạng các Cluster trên đĩa. FAT12 sử dụng 12 bit để định danh các Cluster trên đĩa, do đó với FAT12 hệ thống tập tin chỉ quản lý đƣợc 4096 212 = 4096) Cluster trên đĩa. Hệ điều hành Windows 2000 cho phép các Cluster có kích thƣớc từ 512 Byte đến 8Kb, vậy với FAT12 Windows 2000 có thể quản lý đƣợc 32Mb đĩa, điều này có nghĩa Windows 2000 chỉ dùng FAT12 để quản lý các đĩa mềm. Bản 4 2. Kích thước Cluster phụ thuộc vào ích thước vo ume Trên các hệ thống tập tin FAT16, Windows 2000 cho ph p kích thƣớc Cluster đi từ 512 Byte đến 64Kb, nên với FAT16 Windows 2000 có thể quản lý một không gian đĩa lên đến 4Gb. Khi ngƣời dùng format đĩa, tùy theo dung lƣợng đĩa mà Windows 257 2000 quyết định sử dụng hệ thống tập tin nào: FAT12, FAT16 hay FAT32. Trong Windows 2000 kích thƣớc Cluster đƣợc chọn phụ thuộc vào dung lƣợng của ổ đĩa. Bảng 4.2 cho thấy kích thƣớc Cluster đƣợc chọn, phụ thuộc vào dung lƣợng volume, trên hệ thống tập tin FAT16. Hệ thống tập tin FAT32 đƣợc định nghĩa dựa trên các hệ thống tập tin FAT. Trong thực tế FAT32 sử dụng chỉ sử dụng 28 bit, thay vì 32 bit, để định danh các Cluster trên đĩa, vì đ dành riêng 4 bit cao cho mục đích khác. Kích thƣớc của 1 Cluster trên hệ thống FAT32 có thể lên đến 32Kb, nên theo lý thuyết thì FAT32 có thể quản lý đến 8Tb dung lƣợng phân vùng/đĩa. Nhƣng trong thực tế Windows 2000 chỉ dùng FAT32 trên các phân vùng/đĩa có kích thƣớc nhỏ hơn 32Gb. Sau đây là một số thuận lợi của F T32 so với F T12 và F T16: Số phần tử/ mục vào Entry trên thƣ mục gốc không có giới hạn. Thƣ mục gốc không cần lƣu trữ tại một vị trí xác định trƣớc. Kích thƣớc của một Cluster có thể lên đến 32Kb nên nó có thể quản lý đƣợc 8Tb, nhƣng trong thức tế Windows 2000 chỉ dùng FAT32 để quản lý có phân vùng/đĩa có kích thƣớc nhỏ hơn 32Mb. Chỉ dùng 28 bit để định danh các Cluster, dùng 4 bit cao cho mục đích khác. Lƣu trữ một bản copy của boot sector. Có hai bảng FAT trên một Volume nhƣng cả hai đều có vai tr nhƣ nhau. Kích thƣớc của tập tin có thể lên đến 4Gb. Hệ thống tập tin FAT32 không đƣợc các hệ điều hành sử dụng để định dạng đĩa mềm. 4.5.2. NTFS Là hệ thống tập tin dành riêng cho WindowsNT/2000. NTFS dùng 64 bit để định danh các Cluster, nên nó có thể quản lý đƣợc các ổ đĩa có dung lƣơng lên đến 16 Exabyte 16 tỉ Gb . Trong thực tế WindowsNT/2000 chỉ sử dụng 32 bitđể định danh Cluster, kích thƣớc Cluster là 64Kb, nên NTFS chỉ có thể quản lý đƣợc các ổ đĩa có dung lƣợng lên đến 128TB. NTFS có một số tính năng cao cấp nhƣ bảo mật các file/directory, cấp hạn ngạch cho đĩa, n n tập tin, mã hoá tập tin, … Một trong những tính năng quan trọng của NTFS à khả năng phục hồi lỗi. Nếu hệ thống bị dừng một 258 cách đột ngột, thì metadata của ổ đĩa FAT sẽ rơi vào tình trạng xung khắc dẫn đến làm sai lệch một lƣợng lớn dữ liệu tập tin và thƣ mục. Nhƣng trên NTFS thì điều này không thể xảy ra, tức là cấu trúc của file/ Directory không bị thay đổi. Tên tập tin trong NTFS có độ dài không quá 255 ký tự, đƣờng dẫn đầy đủ đến tập tin dài không quá 32.567 ký tự. Tên tập tin sử dụng m UniCode. Tên tập tin trong NTFS có sự phân biệt giữa chữ hoa và chữ thƣờng 4.5.3. CDFS Là hệ thống tập tin đƣợc đƣa ra để quản lý các tập tin, thƣ mục trên các đĩa CD_ROM. CDFS đƣợc ISO đƣa ra vào năm 1998 theo chuẩn ISO9660, sau đó Microsoft phát triển theo đặc thù của nó để sử dụng trên Windows98 và sau đó là WindowsNT/2000. Dạng thức hệ thống tập tin CDFS c n một số hạn chế nhƣ: Tên tập tin và thƣ mục dài không quá 32 ký tự, cây thƣ mục không sâu quá 8 mức. 4.5.4. UDF Đƣợc Windows 2000 phát triển dựa theo chuẩn ISO 13346 để thay thế cho CDFS, và dùng để quản lý các đĩa từ-quang, chủ yếu là các đĩa DVD_ROM. UDF bao gồm cả các đặc tả DVD và có các điểm tiêu biểu sau: Tên tập tin có thể dài đến 255 ký tự, đƣờng dẫn có thể dài đến 1023 ký tự, tên tập tin có thể đƣợc viết hoa hay viết thƣờng. 4.6. TỔ CHỨC ĐĨ CỦ MS-DOS 4.6.1. FDISK Chƣơng trình FDISK của hệ điều hành cho ph p chia không gian lƣu trữ của đĩa cứng đĩa cơ bản thành các phần khác nhau, có thể có kích thƣớc không bằng nhau, đƣợc gọi là các phân vùng đĩa. - Hệ điều hành DOS cho phép tạo ra 3 loại phân khu: Phân khu DOS chính (primary DOS) Phân khu DOS mở rộng Extended DOS Phân khu phi DOS (non DOS). Muốn cài đặt nhiều hệ điều hành trên một máy tính, hay chính xác hơn là trên một ổ đĩa cơ bản, thì trƣớc hết phải chia đĩa thành các phân khu, sau đó trên các phân khu khác nhau sẽ cài đặt các hệ điều hành khác nhau, thƣờng là MS-DOS hoặc 259 Windows. - Thông thường ổ đĩa cứng được chia thành 2 phân khu: DOS chính và DOS m rộng, cũng có thể chỉ tạo thành một phân khu DOS chính. DOS chính: Theo quy định của hệ điều hành, đĩa C: đƣợc hình thành trên phân khu DOS chính một cách tự động và chiếm toàn bộ kích thƣớc của phân khu. DOS mở rộng: Ngƣời dùng phải thực hiện việc tạo ra các đĩa logic D:, E:, … trên phân khu DOS mở rộng trong quá trình FDISK đĩa. Nếu không, phân khu DOS mở rộng sẽ không đƣợc sử dụng sau này. Ta có thể tạo ra 1, 2, 3, … đĩa logic trên phân khu DOS mở rộng và có thể tổng kích thƣớc của các đĩa logic trên phân khu mở rộng nhỏ hơn kích thƣớc của phân khu này để lại một phần cho mục đích khác sau này . Hệ điều hành chịu trách nhiệm boot hệ thống MS-DOS hoặc Windows thƣờng đƣợc cài đặt trên đĩa C: (trên phân khu DOS chính). Quá trình FDISK đĩa chỉ tạo ra các phân khu và các đĩa logic C:, D:, E:, vv, sau đó ngƣời dùng phải thực hiện việc định dạng format các ổ đĩa này thì mới có thể sử dụng đƣợc. Đĩa C: Primary Dos : lệnh định dạng là format/s . Sau Các ổ đĩa logic Extended Dos : lệnh định dạng là format Sau đó cài đặt hệ điều hành boot chính vào đĩa C:. Hình sau đây cho thấy một ổ đĩa cứng vật lý đƣợc chia thành 2 phân khu và các đĩa logic đƣợc tạo ra trên các phân khu: 260 Hình 4.8. HDD trước và sau FDISK Trong số các phân vùng đ tạo phải có 1 chỉ 1) phân vùng đƣợc chọn là partition active chủ động . Partition Active là phân vùng mà sau này đƣợc chọn là partition boot hệ thống. Partition DOS chính thƣờng đƣợc chọn là partition active. 4.6.2. Tổ chức logic của đĩa Các phân vùng khác nhau trên đĩa, có các thông tin sau đây khác nhau: Loại của phân vùng; Phân vùng có phải là Active hay không; Kích thƣớc của phân vùng; Vị trí bắt đầu và kết thúc của phân vùng; Hệ điều hành đƣợc cài đặt trên phân vùng nào; … Để lƣu trữ thông tin khác nhau của các phân vùng, hệ điều hành DOS dùng một khối dữ liệu đặc biệt, đƣợc gọi là sector phân khu/vùng (partition sector), sector này nằm tại sector vật lý đầu tiên của đĩa cứng head 0, track 0, sector 1 và nó không thuộc về bất kỳ một phân vùng nào trên đĩa. Sector này thƣờng đƣợc gọi là bảng phân vùng. Hình vẽ sau đây minh hoạ cho điều này: Hình 4.9. T chức ogic của FDD (a) và HDD (b) Nhận xét: Hình trên cũng cho thấy sự tƣơng ứng về mặt logic giữa một đĩa mềm a với một phân vùng/đĩa logic trên đĩa cứng b : Thứ nh t: chúng ta thấy là master boot record chỉ có trên đĩa cứng, nó đƣợc tạo ra 261 trong quá trình FDISK đĩa. Thứ hai: Boot sector của đĩa mềm đƣợc định vị tại sector 0 của đĩa, trong khi đó boot sector của các đĩa logic trên các phân vùng đƣợc định vị tại sector đầu tiên của phân vùng và số hiệu của sector này đƣợc tìm thấy trong các phần tử trong bảng phân vùng của master boot record bởi boot code ở đầu master boot record. Thứ ba: Master boot record không thuộc bất kỳ một phân vùng nào và partition đầu tiên là một vùng trống, có thể DOS dự trữ cho các mục đích khác sau này. Vùng trống này là một kẽ hở của DOS, các đoạn m lệnh của Virus có thể đƣợc lƣu trữ ở vùng này mà hệ điều hành không thể phát hiện đƣợc. Khi master boot record trên đĩa cứng bị xoá hoặc bị nhi m virus thì máy tính không thể khởi động đƣợc. Để khôi phục lỗi này ta chỉ có thể thực hiện nhƣ sau: Khởi động máy từ đĩa mềm/USB, trên đĩa mềm/USB có chứa tập tin FDISK.EXE, rồi sau đó thực hiện lại thao tác FDISK đĩa cứng với tham số MBR Tên ổ đĩa :\FDISK /MBR). FDISK /MBR là làm mới lại master boot record mà không làm hỏng dữ liệu trên các đĩa logic. - Master oot record gồm có 3 thành phần: Boot code, bảng partition và chữ kí hệ điều hành. Hình 4.8 sau đây cho thấy các thành phần trong master boot record. Boot code: là một đoạn chƣơng trình đặc biệt, đƣợc hệ điều hành ghi vào trong quá trình FDISK đĩa. Đoạn chƣơng trình này có nhiệm vụ kiểm tra bảng partition để xác định xem trên đĩa có partition active hay không, nếu có thì đó là partition nào và bắt đầu tại sector nào, rồi sau đó nạp boot sector của đĩa trên partition active vào RAM và chuyển quyền điều khiển về cho boot sector. Bảng partition (64 Byte: bắt đầu từ Byte 1BE h : gồm 4 phần tử, đánh số từ 1 đến 4, mỗi phần tử dài 16 Byte dùng để lƣu thông tin của một partition. Các thông tin trong một phần tử trong bảng partition cho biết: Phân khu có phải là active hay không; Vị trí bắt đầu phân khu head, sector, cylinder ; Vị trí kết thúc phân khu head, sector, cylinder ; Có bao nhiêu sector nằm trong phần khu; Kích thƣớc của một phân khu tính theo sector; Phân khu đƣợc định dạng 262 nhƣ thế nào và đƣợc cài đặt hệ điều hành nào? Hình 4.10. Các thành phần trong master boot record Vì bảng partition chỉ có 4 phần tử nên DOS chỉ cho ph p tạo ra tối đa là 4 partition. Đây là một hạn chế. Để khắc phục điều này hệ điều hành DOS cho ph p tạo ra nhiều đĩa logic trên một partition mở rộng, tức là có thể tạo ra đƣợc nhiều đĩa logic trên một ổ đĩa cơ sở. Hệ điều hành WindowsNT/2000 cho ph p tạo ra nhiều hơn 4 partition trên một ổ đĩa và số lƣợng các phần tử trong bảng partition có thể thay đổi. Chữ ký hệ điều hành (2 Byte: bắt đầu từ Byte 1FEh : thƣờng chứa giá trị 55AAh. Hệ điều hành DOS kiểm tra giá trị tại vùng này để biết đĩa này có phải đƣợc định dạng bởi nó hay không. Một phần tử trong bảng partition chứa các thông tin sau: Offset Nội dung Kích thước 00 h 0: partition không phải là active 1Byte 80h: partition là active 01h số hiệu head bắt đầu phân khu 1Byte 02h sector và cylinde bắt đầu của boot sector 2Byte 04h m hệ thống: 0: Non Dos; 1: FAT_12; 1Byte 4: FAT_16; 5: phân khu Dos mở rộng; 6: phân khu Dos lớn hơn 32 Mb 263 05h số hiệu head kết thúc phân khu 1Byte 06 sector và cylinde kết thúc 2Byte 08h số hiệu sector tƣơng đối bắt đầu 4Byte 0Ch tổng số sector trong phân khu 4Byte Bản 4 3. Các trường một phần t trong b ng partition Ví dụ 1: Để kiểm tra partition nào là active ta thực hiện nhƣ sau: Đọc sector đầu tiên của đĩa cứng lƣu vào biến masterboot Kiểm tra offset 00 của 4 phân tử partition trong bảng partition MOV CX, 4 MOV SI, 1BE h Locate_active: AL, masterboot[SI] MOV AL, 80 h CMP Active JE SI, 16 ADD Locate_active LOOP No_active: … Active: … Ví dụ 2: Để đọc nội dụng boot sector của đĩa cứng C ghi vào biến BootDat ta phải thực hiện lần lƣợt các bƣợc sau đây: Đọc sector đầu tiên của đĩa cứng lƣu vào biến masterboot Tìm partition active phần tử trong bảng partition có offset 00 bằng 80h Đọc Byte tại offset 01h và word tại offset 02 của phần tử partition tƣơng ứng ở trên head, sector và cylinde , để xác định số hiệu sector bắt đầu của partition active, đây chính là boot sector của đĩa cứng. Đọc nội dung của sector xác định đƣợc ở trên lƣu vào BootDat. Active: MOV AX, 0201H ; đọc 1 sector 264 MOV CX, WORD PTR MASTORBOOT [SI+2] ; sector & cylinder DH, BYTE PTR MASTORBOOT[SI+1] ; head MOV DL, 80H ; đĩa cứng MOV ES,CS ; trỏ es:bx về MOV BX, BOOTDAT ; đầu vùng bootdat lƣu LEA INT 13H Nếu PC đƣợc khởi động bằng đĩa mềm FDD khởi động thì sau quá trình POST hệ thống sẽ nạp boot sector trên đĩa mềm vào bộ nhớ tại địa chỉ 0:7C00h sau đó quyền điều khiển đƣợc trao cho cho boot sector, để nó tiếp tục điều khiển quá trình khởi động. Nếu PC đƣợc khởi động bằng đĩa cứng khởi động HDD/C: thì sau quá trình POST hệ thống sẽ nạp sector phân khu của đĩa cứng vào bộ nhớ tại địa chỉ 0:7C00h, sau đó boot code trong sector phân khu thực hiện việc xác định partition active và nạp boot sector trên partition active vào bộ nhớ cũng tại địa chỉ 0:7C00h, sau đó quyền điều khiển đƣợc trao cho cho boot sector, để nó tiếp tục điều khiển quá trình khởi động tƣơng tự nhƣ trong trƣờng hợp đĩa mềm. Chính vì vậy sector phân khu thƣờng đƣợc gọi là Master Boot Record, nó cũng đƣợc gọi là bảng partition. 4.7. QUẢN L TẬP TIN TRÊN ĐĨ CỦ MS-DOS Trong quá trình định dạng một đĩa mềm, hoặc một đĩa logic trên các phân khu trên đĩa cứng, hệ điều hành chia không gian lƣu trữ của đĩa thành 2 vùng: v ng dữ iệu (Data Area) và v ng hệ thống System Area , đồng thời ghi những thông tin cần thiết vào vùng hệ thống để chuẩn bị cho việc quản lý lƣu trữ sau này. Vùng dữ liệu: bao gồm các bolck có kích thƣớc bằng nhau và đƣợc đánh địa chỉ 12 bit hoặc 16 bit để phân biệt, đây chính là các Cluster trên đĩa mà chúng ta đ nói đến ở trên. Nội dung của các tập tin cũng đƣợc chia thành các bolck có kích thƣớc bằng kích thƣớc của một Cluster. Các Cluster trên đĩa dùng để chứa nội dung của các tập tin trên đĩa. Các thông tin liên quan đến một tập tin trên đĩa đƣợc chứa ở vùng hệ thống. Vùng hệ thống: bao gồm các đoạn chƣơng trình, các thông tin hệ thống, các thông tin liên quan đến các tập tin/thƣ mục trên đĩa mà hệ điều hành dùng để quản lý việc lƣu trữ tập tin/thƣ mục trên đĩa sau này. Cụ thể nó bao gồm các 265 thành phần sau đây: Boot sector, FAT1, FAT2 và Root Directory. Sau đây chúng ta sẽ khảo sát các thành phần trong vùng hệ thống, để thấy đƣợc cách mà DOS quản lý các tập tin và các thƣ mục đƣợc lƣu trữ trên đĩa. Hình 4.11. Phân v ng tr n một đĩa ogic 4.7.1. Boot sector C n đƣợc gọi là boot record bản ghi khởi động , dài 512 Byte (1 sector đƣợc đặt tại sector logic 0 trên đĩa mềm hay sector logic đầu tiên của partition đĩa logic trên ổ đĩa cứng. Tất cả các đĩa FDD và đĩa logic trên đĩa cứng sau khi đƣợc định dạng đều có boot record và đều chứa các thông tin liên quan về đĩa trong đó, nhƣng chỉ có đĩa đƣợc định dạng là đĩa khởi động mới có chứa một đọan m lệnh Bootstrap Loader. Bootstrap Loader thực hiện việc nạp thành phần cốt lõi của DOS nhƣ io.sys, msdos.sys, command.com vào bộ nhớ RAM chính xác hơn là chỉ nạp IO.SYS vào RAM sau đó IO.SYS sẽ tìm nạp các tập tin tiếp theo trong quá trình khởi động máy tính. Chính vì vậy bootstrap loader c n đƣợc gọi là chƣơng trình mồi khởi động. Bảng sau đây cho thấy vị trí, độ lớn và nội dung của các trƣờng trong boot sector. Offset Nội dung Size 00 h Lệnh JUMP, nhảy về Bootstrap Loader 3 Byte 03 h Tên nhà sản xuất và số phiên bản 8 Byte 0B h Số Byte trên một sector 2 Byte 0D h Số sector trên một Cluster 1 Byte 0E h Số sector dành cho boot sector 2 Byte 10 h Số bảng FAT 1 Byte 266 11 h Số phần tử Entry) trong Root directory 2 Byte 13 h Tổng số sector trên một tập đĩa (volume) 2 Byte 15 h M nhận diện đĩa 1 Byte 16 h Số sector dành cho bản FAT 2 Byte 18 h Số sector trên một track 2 Byte 1A h Số mặt đầu từ 2 Byte 1C h Số sector dữ trữ 4 Byte 1E h Số sector nếu kích thƣớc lơn hơn 32Mb 4 Byte 22 h Số hiệu ổ đĩa: 0:ổ mềm; 80h: ổ cứng 1 Byte 23 h Dự trữ 1 Byte 24 h Chữ ký boot sector mở rộng 1 Byte 25 h Số Serial của đĩa, đƣợc tạo ra lúc format 4 Byte 29 h Tên tập đĩa nh n đĩa 11 Byte 34 h Loại FAT: “FAT12” hoặc “FAT16” 8 Byte 3Ch- 200h M lệnh của chƣơng trình bootstrap loader 452 Byte Bản 4 4 Các trường trong boot sector21 Nhƣ vậy, ngay sau khi quyền điều khiển đƣợc trả về cho boot sector thì hệ thống sẽ thực hiện lệnh nhảy Jmp ở đầu boot sector offset 00 , để nhảy đến thực hiện đoạn m lệnh bootstrap loader ở cuối boot sector từ offset 3Ch đến offset 200h . Và bootstrap loader sẽ thực hiện nhiệm vụ của nó. Dựa vào boot sector ta biết đƣợc nhiều thông tin về đĩa nhƣ: loại FAT, nh n đĩa, số sector trên một Cluster, số Byte trên một sector, … Và từ đó ta cũng có thể tính đƣợc dung lƣợng của đĩa tính theo Byte: Tổng số sector trên một tập đĩa * số Byte trên một sector. Ví dụ: Để in ra loại FAT đang sử dụng trên đĩa mềm hoặc trên một volume trên đĩa cứng ta thực hiện nhƣ sau: Đọc nội dung của boot sector lƣu vào biến bootdat In ra 8 kí tự bắt đầu tại offset 34h của bootdat MOV CX, 8 21 Nguy n Kim Tuấn, Giáo trình lý thuyết hệ điều hành, ĐH Huế, 2004,Tr.173 267 MOV SI, 34H MOV AH, 02 ; hàm 02h/21h in kí tự trong dl LOAI_FAT: MOV DL, BYTE PTR BOOTDAT[SI] INT 21H LOOP LOAI_FAT 4.7.2. File Allocation Table (FAT) Nội dung của một tập tin cần lƣu trữ trên đĩa đƣợc chia thành các phần có kích thƣớc bằng nhau và bằng kích thƣớc của một Cluster, đƣợc gọi là các block tập tin. Các block tập tin của các tập tin đƣợc lƣu trữ tại các Cluster xác định trên đĩa, các Cluster chứa nội dung của một tập tin có thể không nằm kề nhau. Để theo dõi danh sách các Cluster đang chứa nội dung của một tập tin của tất cả các tập tin đang lƣu trữ trên đĩa hệ điều hành DOS dùng bảng FAT, hay c n gọi là bảng định vị tập tin. Bảng FAT còn dùng để ghi nhận trạng thái của các Cluster trên đĩa: c n trống, đ cấp phát cho các tập tin, bị bad không thể sử dụng hay dành riêng cho hệ điều hành. Trong quá trình khởi động máy tính hệ điều hành nạp bảng FAT vào bộ nhớ để chuẩn bị cho việc đọc/ghi các tập tin sau này. Khi cần ghi nội dung của một tập tin vào đĩa hoặc khi cần đọc nội dung của một tập tin trên đĩa hệ điều hành phải dựa vào bảng FAT, nếu bảng FAT bị hỏng thì hệ điều hành không thể ghi/đọc các tập tin trên đĩa. Do đó, hệ điều hành DOS tạo ra hai bảng FAT hoàn toàn giống nhau là FAT1 và FAT2, DOS sử dụng FAT1 và dự ph ng FAT2, nếu FAT1 bị hỏng thì DOS sẽ sử dụng FAT2 để khôi phục lại FAT1. Điều không đúng với hệ thống tập tin FAT32, FAT32 vẫn tạo ra 2 FAT nhƣ của DOS, nhƣng nếu FAT1 bị hỏng thì hệ điều hành sẽ chuyển sang sử dụng FAT2, sau đó mới khôi phục FAT1, và ngƣợc lại. Hệ điều hành DOS tổ chức cấp phát động các Cluster cho các tập tin trên đĩa, sau mỗi thao tác cấp phát/ thu hồi Cluster thì hệ điều hành phải cập nhật lại nội dung cho cả FAT1 và FAT2. Có thể hệ điều hành chỉ thực hiện cấp phát động Cluster cho các tập tin dữ liệu có kích thƣớc thay đổi , c n đối với các tập tin chƣơng trình, tập tin thƣ viện, tập tin liên kết động, … có kích thƣớc không thay đổi thì hệ điều hành sẽ thực 268 hiện cấp tĩnh Cluster cho nó. Bảng FAT bao gồm nhiều phần tử điểm nhập/ mục vào , các phần tử đƣợc đánh địa chỉ bắt đầu từ 0 để phân biệt, địa chỉ Cluster cũng có thể gọi là số hiệu của Cluster. Giá trị dữ liệu tại một phần tử trong bảng FAT cho biết trạng thái của một Cluster tƣơng ứng trên vùng dữ liệu. Ví dụ, phần tử thứ 7 trong bảng FAT chứa giá trị 000h, giá trị này cho biết Cluster thứ 7 trên vùng dữ liệu c n trống, có thể dùng để cấp phát cho một tập tin. Phần tử thứ 5 trong bảng FAT chứa giá trị FF7h, giá trị này cho biết Cluster thứ 5 trên vùng dữ liệu bị bad, không thể cấp phát đƣợc, … Hệ điều hành DOS có thể định dạng hệ thống tập tin theo một trong 2 loại FAT là FAT12 và FAT16. Mỗi phần tử trong FAT12 rộng 12 bit(1.5 Byte , mỗi phần tử trong FAT16 rộng 16 bit(2 Byte . Các đĩa hiện nay thƣờng đƣợc DOS định dạng theo hệ thống tập tin với FAT16. Sau đây là danh sách các giá trị dữ liệu đƣợc chứa tại các phần tử trong bảng FAT số trong ngoặc dùng trong FAT16 và ý nghĩa của nó. 000h (0000h): Cluster tƣơng ứng c n để trống. FF7h (FFF7h): Cluster tƣơng ứng bị bad. Trong quá trình định dạng đĩa hệ điều hành đánh dấu loại bỏ các Cluster bị bad bằng cách ghi giá trị này và phần tử tƣơng ứng trong bảng FAT. FF0h (FFF0h) - FF6h (FFF6h): Cluster tƣơng ứng dành riêng cho hệ điều hành. FF8h (FFF8h) - FFFh (FFFFh): Cluster tƣơng ứng là Cluster cuối cùng trong dãy các Cluster chứa nội dung của một tập tin. 002h (0002h) – FFEh (FFFEh): đây là số hiệu của Cluster trong bảng FAT, nó cho biết Cluster tiếp theo trong d y các Cluster chứa nội dung của một tập tin. Trong bảng FAT, hai phần tử đầu tiên 00 và 01 không dùng cho việc theo dõi trạng thái Cluster và ghi nhận bảng đồ cấp phát tập tin, mà nó đƣợc sử dụng để chứa một giá trị nhận biết khuôn dạng đĩa, đƣợc gọi là Byte định danh Byte ID của đĩa, đây là Byte đầu tiên của bảng FAT. Đối với đĩa cứng thì Byte ID = F8h. Nhƣ vậy để đọc đƣợc nội dung của một tập tin trên đĩa thì trƣớc hết hệ điều hành phải tìm đƣợc d y các Cluster chứa nội dung của một tập tin. Nhƣng bảng FAT chỉ cho biết số hiệu các Cluster từ Cluster thứ hai đến Cluster cuối cùng trong d y nói trên. Cluster đầu tiên trong dãy các Cluster chứa nội dung của một tập tin trên đĩa đƣợc tìm 269 thấy trong bảng thƣ mục gốc. Để thấy đƣợc cách mà hệ điều hành DOS dùng bảng FAT để quản lý việc lƣu trữ các tập tin trên đĩa cũng nhƣ theo dõi trạng thái các Cluster trên vùng dữ liệu, ta xem hình minh hoạ sau đây. Hình 4.12. Các t p tin Fi eA và Fi eB (a) được ưu tr n các Cluster của đĩa ogic (b) và sơ đồ định vị của n tr n b ng FAT (c) Hình a ở trên cho thấy: có hai tập tin, FileA và FileB, FileA có kích thƣớc vừa đủ 4 Cluster và đƣợc chia thành 4 block, FileB có kích thƣớc nhỏ hơn 4 Cluster cũng đƣợc chia thành 4 block, trong đó block B4 mặc dù chƣa đủ một Cluster nhƣng vẫn đƣợc chứa vào một Cluster. Tức là, hệ điều hành cũng phải dùng đủ 8 Cluster để 270 lƣu trữ nội dung của hai tập tin FileA va FileB vào đĩa hình b . Bảng FAT trong hình c ở trên cho biết các thông tin sau đây: Các Cluster bị bad, không thể sử dụng: Cluster 11 và Cluster 13. Các Cluster c n trống, chƣa cấp phát: Cluster 2, Cluster 3, Cluster 5, Cluster 8. FileA đƣợc lƣu tại các Cluster: 4, 10, 7, 14 chứa block cuối cùng FileB đƣợc lƣu tại các Cluster: 6, 9, 12, 15 (chứa block cuối cùng Nhƣ vậy bảng thƣ mục gốc cho biết Cluster đầu tiên chứa FileA là Cluster 4, phần tử thứ 4 trong bảng FAT chứa giá trị 10, điều này chứng tỏ Cluster 10 là Cluster tiếp theo chứa nội dụng FileA, phần tử thứ 10 trong bảng FAT chứa giá trị 7, điều này chứng tỏ Cluster 7 là Cluster tiếp theo chứa nội dụng FileA, phần tử thứ 7 trong bảng FAT chứa giá trị FFFh, điều này chứng tỏ Cluster 7 là Cluster chứa block cuối cùng của FileA. Nhận xét: Các Cluster chứa nội dung của một tập tin có thể không liên tiếp nhau, nhƣng nó thƣờng nằm rải rác trong một phạm vi hẹp nào đó trên đĩa. Điều này giúp hệ điều hành đọc tập tin đƣợc nhanh hơn nhờ tiết kiệm đƣợc thời gian duyệt và đọc qua các Byte từ đầu đến cuối bảng FAT để d tìm d y các Cluster chứa nội dung của tập tin. Mặt khác, việc phân bố tập trung các Cluster của một tập tin rất phù hợp với các thuật toán đọc đĩa của hệ điều hành. Đối với các tập tin dữ liệu, sau một thời gian kích thƣớc của nó có thể tăng lên, hệ điều hành phải cấp phát thêm các Cluster cho nó, các Cluster mới này có thể nằm tại các vị trí tách xa các Cluster trƣớc đó, dẫn đến các Cluster chứa nội dung của một tập tin phân bố rải rác khắp bề mặt đĩa, điều này sẽ làm chậm tốc độ đọc tập tin của hệ điều hành. Các tập tin dữ liệu bị mở, thay đổi, ghi và đóng lại nhiều lần cũng có thể dẫn đến hiện tƣợng trên. Trên đĩa có thể xuất hiện hiện tƣợng có nhiều tập tin bị phân bố rải rác khắc bề mặt đĩa, hiện tƣợng này đƣợc gọi là hiện tƣợng đĩa bị phân mảnh fragmentary . Các đĩa bị phân mảnh sẽ làm cho tốc độ đọc tập tin trên nó chậm đi rất nhiều. Trong trƣờng hợp này ngƣời dùng phải thực hiện việc sắp xếp lại các Cluster trên đĩa, để các Cluster chứa nội dung của một tập tin của tất cả các tập tin trên đĩa đƣợc phân bố tập trung hơn, thao tác này đƣợc gọi là chống phân mảnh cho đĩa. Hệ điều hành DOS cung cấp nhiều công cụ để ngƣời dùng thực hiện việc chống phân 271 mảnh đĩa cả ở mức ứng dụng và mức lập trình. Để đọc nội dung của một tập tin trên đĩa dựa vào ảng thư mục gốc và ảng F T, hệ điều hành thực hiện theo các ước sau đây: Tìm phần tử trong bảng thƣ mục gốc chứa thông tin của tập tin cần đọc. Tại phần tử này, xác định số hiệu của Cluster đầu tiên trong d y các Cluster chứa nội dung của tập tin giả sử Cluster 4 , giá trị này đƣợc xem nhƣ con trỏ trỏ tới bảng FAT để bắt đầu d tìm các Cluster từ thứ 2 đến cuối cùng trong dãy các Cluster chứa nội dung của tập tin cần đọc. Sau đó đọc block dữ liệu đầu tiên của tập tin tại Cluster 4 trên vùng dữ liệu của đĩa. Xác định Byte tƣơng ứng với phần tử 4 trong bảng FAT. Đọc giá trị dữ liệu tại phần tử 4 này, giả sử giá trị đọc đƣợc là 10. Sau đó đọc block dữ liệu tiếp theo của tập tin tại Cluster 10 trên vùng dữ liệu của đĩa. Xác định Byte tƣơng ứng với phần tử 4 trong bảng FAT. Đọc giá trị dữ liệu tại phần tử 4 này, giả sử giá trị đọc đƣợc là 17. Sau đó đọc block dữ liệu tiếp theo của tập tin tại Cluster 17 trên vùng dữ liệu của đĩa. Xác định Byte tƣơng ứng với phần tử 17 trong bảng FAT, sau đó thực hiện hoàn toàn tƣơng tự nhƣ bƣớc 4 cho đến khi đọc đƣợc giá trị FFFh với FAT12) hoặc FFFFh với FAT16 tại một phần tử nào đó giả sử phần tử 43 trong bảng FAT thì đọc block dữ liệu cuối cùng của tập tin tại Cluster 43 trên vùng dữ liệu của đĩa, sau đó dừng lại. Tới đây kết thúc quá trình đọc tập tin. Thao tác đọc tập tin của DOS nhƣ trên là k m hiệu quả, vì ngoài việc đọc nội dung của tập tin tại các Cluster trên vùng dữ liệu của đĩa hệ điều hành c n phải đọc và phân tích bảng FAT để d tìm ra d y các Cluster chứa nội dung của một tập tin. Hệ thống tập tin NTFS trong WindowsNT/2000 khắc phục điều này bằng cách lƣu danh sách các Cluster chứa nội dung của một tập tin vào một vị trí cố định nào đó, nên khi đọc tập tin hệ điều hành chỉ cần đọc nội dung của các Cluster trên đĩa theo danh sách ở trên, mà không phải tốn thời gian cho việc dò tìm dãy các Cluster chứa nội dung của tập tin của hệ thống tập tin FAT trong DOS. Ngoài ra, nếu DOS có một cơ chế nào đó ghi lại đƣợc danh sách các Cluster còn trống trên đĩa, thì tốc độ ghi tập tin của hệ điều hành sẽ tăng lên vì hệ điều hành không tốn thời gian cho việc đọc bảng FAT để xác định Cluster c n trống. Các hệ thống tập tin của các hệ điều hành sau này nhƣ Windows98, WindowsNT/2000 đ thực hiện 272 đƣợc điều này. Độ rộng của một phần tử trong bảng FAT 12 bit hay 16 bit , quyết định dung lƣợng đĩa tối đa mà hệ điều hành có thể quản lý đƣợc. Nếu hệ điều hành sử dụng
FAT12 thì mỗi phần tử trong FAT12 có thể chứa một giá trị lên đến 212, đa số trong số
này là số hiệu các Cluster trên vùng dữ liệu của đĩa, điều này có nghĩa là trên vùng dữ
liệu của đĩa có tối đa là 212 Cluster. Từ đây ta có thể tính đƣợc dung lƣợng đĩa tối đa
(Byte mà hệ thống tập tin FAT12 có thể quản lý đƣợc là: 212 Cluster * 4 sector/1 Cluster * 512 Byte/1 sector (a) Tƣơng tự, dung lƣợng đĩa tối đa Byte mà hệ thống tập tin FAT16 có thể quản lý đƣợc là: 216 Cluster * 4 sector/1 Cluster * 512 Byte/1 sector (b) Rõ ràng với hệ thống tập tin FAT16 thì DOS sẽ quản lý đƣợc một không gian đĩa lớn hơn so với FAT12. Windows98 sử dụng hệ thống tập tin FAT32 và nó cho ph p có tới 6 sector trên
một Cluster, nên nó có thể quản lý đƣợc một không gian đĩa lớn hơn nhiều lần 232
Cluster * 6 sector/1 Cluster * 512 Byte/1 sector so với DOS. Nếu một tập tin có kích thƣớc là 50 sector, thì trong DOS tập tin đƣợc chia thành 13 block có 4 sector trong 1 block ≡ Cluster) còn trong Windows98 tập tin đƣợc chia thành 9 block có 6 sector trong 1 block ≡ Cluster . Tức là, trong DOS tập tin này đƣợc chứa ở 13 Cluster trên đĩa (dãy các Cluster chứa tập tin gồm 13 phần tử c n trong Windows98 tập tin này đƣợc chứa trong 9 Cluster (dãy các Cluster chứa tập tin gồm 9 phần tử . Điều này cho thấy tập tin này sẽ đƣợc đọc nhanh hơn trong Windows98, vì chỉ cần đọc 9 lần thay vì phải đọc 13 lần nhƣ trong DOS. Chƣa kể, để đọc tập tin các hệ điều hành phải phân tích bảng FAT để d ra d y các Cluster chứa nội dung của tập tin. Nhƣ vậy, hệ thống tập tin của Windows98 quản lý đƣợc một không gian đĩa lớn hơn và có tốc độ đọc tập tin nhanh hơn, so với hệ thống tập tin của DOS. Để ghi một tập tin vào đĩa: Hệ điều hành phải thực hiện việc đọc nội dung của các phần tử trong bảng FAT để tìm phần tử chứa giá trị 0, để ghi một block tập tin vào Cluster tƣơng ứng trên vùng dữ liệu. Trong khi đọc giá trị của các phần tử trong bảng FAT hệ điều hành có thể đọc đƣợc giá trị FF7h hoặc FFF7h, dấu hiệu của bad Cluster, trong trƣờng hợp này hệ điều 273 hành sẽ không ghi tập tin vào Cluster tƣơng ứng với phần tử này, và hệ điều hành sẽ tìm đọc một phần tử khác. Nhƣ vậy các bad Cluster trên đĩa sẽ làm chậm tốc độ ghi tập tin của hệ điều hành. Đây là một trong các hạn chế của các hệ thống tập tin FAT. Các hệ thống tập tin khác, NTFS chẳng hạn, khắc phục điều này bằng cách tạo ra một danh sách riêng để theo dõi các Cluster bị bad và khi tìm Cluster trống để ghi tập tin hệ điều hành sẽ không đọc các phần tử trong bảng FAT tƣơng ứng với các Cluster này. Việc đọc nội dung của một phần tử trong FAT16 chỉ đơn giản là đọc nội dung của 2 Byte 1 word , trong khi đó việc đọc nội dung của một phần tử trong FAT12 sẽ phức tạp hơn vì 1.5 Byte không phải là kiểu dữ liệu chuẩn của ngôn ngữ máy và DOS. Do đó, DOS phải gộp 2 phần tử liên tiếp để có đƣợc 3 Byte sau đó đọc hết 3 Byte và phân tích để có đƣợc nội dung của 2 phần tử liên tiếp trong FAT12. Để quản lý thông tin của các tập tin và các thư mục thƣ mục con của thƣ mục gốc đang đƣợc lƣu trữ trên thƣ mục gốc của đĩa mềm hoặc đĩa logic trên đĩa cứng, hệ điều hành DOS sử dụng bảng thƣ mục gốc Root Directory). 4.7.3. Root Directory Bảng thư mục gốc) Bảng thƣ mục gốc gồm nhiều phần tử Entry/mục vào , số lƣợng phần tử trong bảng thƣ mục gốc đƣợc DOS quy định trƣớc trong quá trình Format đĩa và đƣợc ghi tại offset 11h trong boot sector, giá trị này không thể thay đổi. Do đó, tổng số tập tin và thƣ mục con mà ngƣời dùng có thể chứa trên thƣ mục gốc của đĩa là có giới hạn. Đây là một hạn chế của DOS. Trong hệ thống tập tin FAT32 và NTFS số phần tử trong bảng thƣ mục gốc không bị giới hạn, có thể thay đổi đƣợc và có thể đƣợc định vi tại một vị trí bất kỳ trên đĩa hoặc chứa trong một tập tin nào đó. Mỗi phần tử trong bảng thƣ mục gốc dùng để chứa thông tin về một tập tin hay thƣ mục nào đó đang đƣợc lƣu trên thƣ mục gốc của đĩa. Khi có một tập tin hoặc một thƣ mục nào đó đƣợc tạo ra trên thƣ mục gốc của đĩa thì hệ điều hành dùng một phần tử trong bảng thƣ mục gốc để chứa các thông tin liên quan của nó. Khi một tập tin hoặc thƣ mục bị xoá/ di chuyển khỏi thƣ mục gốc thì hệ điều hành sẽ thu hồi lại phần tử này để chuẩn bị cấp cho các tập tin thƣ mục khác sau này. Một phần tử trong thƣ mục gốc dài 32 Byte, chứa các thông tin sau: 274 Offset Nội dung Độ lớn Tên chính của tập tin filename 8 Byte 00h Phần mở rộng của tên Tập tin .Ext 3 Byte 08h Thuộc tính tập tin attribute 1 Byte 0Bh Dự trữ, chưa được sử dụng Unused) 10 Byte 0Ch Giờ thay đổi tập tin cuối cùng time 2 Byte 16h Ngày thay đổi tập tin cuối cùng date 2 Byte 18h Cluster đầu tiên của Flie start Cluster) 2 Byte 1Ah Kích thƣớc của Tập tin filesize 4 Byte 1Ch Bản 4 5 Các trường trong một Entry của b ng thư mục gốc22 Sở dĩ DOS qui định tên tập tin/tên thƣ mục dài không quá 8 kí tự và phần mở rộng tên tập tin dài không quá 3 kí tự vì DOS chỉ dùng 8 Byte cho trƣờng tên tập tin (filename) và 3 Byte cho trƣờng tên mở rộng .ext . Nếu ngƣời dùng tạo tập tin/ thƣ mục với tên không đủ 8 kí tự thì DOS tự động thêm vào các kí tự trắng để cho đủ 8 kí tự, ngƣợc lại DOS tự động bỏ bớt các kí tự cuối chỉ giữ lại 8 kí tự đầu. Điều này cũng đúng cho phần mở rộng của tên tập tin. Hình 4.13. Một phần t trong b ng thư mục gốc (a) và Byte thuộc tính (b) Byte đầu tiên offset 00 của một phần tử trong thƣ mục gốc c n đƣợc gọi là Byte trạng thái, Byte này có thể chứa một trong các giá trị đặc biệt sau đây: 0: cho biết phần tử này chƣa đƣợc sử dụng. 22 Nguy n Kim Tuấn, Giáo trình lý thuyết hệ điều hành, ĐH Huế, 2004,Tr.179 275 E5h: cho biết phần tử này là của một tập tin đ đƣợc tạo nhƣng đ bị xóa. 05h: cho biết kí tự đầu tiên của tên tập tin này thực tế là E5h. Nếu ngƣời dùng cố tình tạo ra một tập tin có tên bắt đầu là kí tự có m ASCII là E5h thì hệ điều hành sẽ tự động thay bằng kí tự có m là 05h, để phân biệt tập tin này với các tập tin đ bị xoá. 2Eh kí tự dấu chấm “.” : cho biết phần tử này chứa thông tin của một thƣ mục con, nếu Byte thứ 2 cũng chứa giá trị 2Eh hai dấu chấm liên tiếp “..” thì trƣờng start Cluster sẽ chứa số hiệu Cluster đầu tiên của thƣ mục cha, nếu là thƣ mục gốc thì là 0000h. Nếu bằng cách nào đó ngƣời lập trình đƣa đƣợc một giá trị 1 Byte không thuộc một trong các giá trị trên và không phải là các chữ cái tên tập tin thông thƣờng, vào Byte đầu tiên của phần tử trong bảng thƣ mục gốc đang cấp phát cho một tập tin/thƣ mục nào đó, thì DOS và các tiện ích trên DOS không thể nhận biết các tập tin/thƣ mục này, và không thể thực hiện các thao tác Dir, Del, vv trên nó. Đây là một cách để bảo vệ các tập tin/thƣ mục của ngƣời dùng trên đĩa. filename: tên tâp tin (8Byte) .ext: phần mở rộng 3Byte) attribute: thuộc tính tập tin 1Byte). Tuy nhiên DOS chỉ dùng 6 bit từ 0 đến 5 của Byte này để ghi 6 thuộc tính lần lƣợt là: chỉ đọc, ẩn, hệ thống, nh n đĩa, thƣ mục con và lƣu trữ trong Hình 4.11 ở trên 2 bit chƣa sử dụng đƣợc đánh dấu x : Thuộc tính chỉ đọc (r: read on y): Nếu bit 0 của Byte thuộc tính bằng 1, thì tập tin tƣơng ứng có thuộc tính chỉ đọc. Một tập tin có thuộc tính chỉ đọc sẽ không bị thay đổi nội dung và không bị xóa. Thuộc tính ẩn (h: hidden): Nếu bit 1 của Byte thuộc tính bằng 1, thì tập tin tƣơng ứng có thuộc tính ẩn. Một tập tin có thuộc tính ẩn thì các lệnh DOS thông thƣờng nhƣ Edit, Del, Dir, Tree, … sẽ không tác động đƣợc đến nó. Thuộc tính hệ thống (s: system): Nếu bit 2 của Byte thuộc tính bằng 1, thì tập tin tƣơng ứng có thuộc tính hệ thống. Một tập tin có thuộc tính hệ thống tƣơng tự nhƣ tập tin có thuộc tính ẩn hoặc vừa ẩn vừa hệ thống. Thuộc tính hệ thống chỉ có ý nghĩa kế thừa, nó không có ý nghĩa trong hệ điều hành DOS. Thuộc tính nhãn đĩa (v: vo ume): Nếu bit 3 của Byte thuộc tính bằng 1, thì phần tử này chứa nh n nhận dạng đĩa, đƣợc lƣu tại trƣờng filename và trƣờng 276 ext. Phần tử này chỉ đƣợc DOS nhận biết nếu nó nằm trên thƣ mục gốc. Trong trƣờng hợp này chỉ có trƣờng Date và Time là đƣợc sử dụng. Trƣờng start Cluster và trƣờng filesize chứa giá trị 0. Thuộc tính thư mục con (d: subdirectory): Nếu bit 4 của Byte thuộc tính bằng 1, thì phần tử này chứa các thông tin về thƣ mục con của thƣ mục gốc trên đĩa. Đối với DOS thƣ mục con là một tập tin chứa dữ liệu thông thƣờng, nó có một thuộc tính đặc biệt, đó là thuộc tính d. Thuộc tính ưu trữ (a:archive): thuộc tính này dùng để trợ giúp cho việc tạo backup của các tập tin trên đĩa cứng. Bit này = 0 đối với tất cả các tập tin chƣa bị sửa đổi kể từ lần backup gần đây nhất. Nhƣ vậy trong lần tạo Backup sau DOS chỉ cần cập nhật cho các tập tin có bit này bằng 1. Tóm lại, lúc đầu bit a = 0, sau đó nếu có bất kỳ sự thay đổi nào trong nội dung của tập tin thì bit này sẽ đƣợc thay bằng 1. 10 Byte bắt đầu từ offset 0Ch chƣa đƣợc DOS sử dụng, Microsoft dự trữ vùng này cho các mục đích khác sau này. Hệ điều hành Windows98 sử dụng tất cả 10Byte này. Việc dự trữ 10 Byte này tạo thành một kẽ hở của DOS, các đoạn m lệnh Virus có thể định vị ở vùng này mà hệ điều hành không thể phát hiện đƣợc. Trƣờng Date và trƣờng Time kết hợp với nhau để lƣu chính xác ngày giờ tạo ra tập tin/ thƣ mục hay ngày giờ tập tin/ thƣ mục đƣợc thay đổi gần đây nhất. Trƣờng Start Cluster quan trọng nhất của một phần tử trong bảng thƣ mục gốc, dài 2 Byte, bắt đầu tại Offset 1Ah. Nó chứa số hiệu của Cluster đầu tiên trong d y các Cluster chứa nội dung của tập tin tƣơng ứng với phần tử này. Do đó trong các thao tác đọc tập tin của hệ điều hành, trƣờng này đƣợc xem nhƣ một con trỏ trỏ tới bảng FAT để d tìm d y các Cluster chứa nội dụng của một tập tin. Trƣờng Filesize cho biết kích thƣớc của tập tin tính theo Byte. Nếu một phần tử trong bảng thƣ mục gốc đƣợc dùng cho một thƣ mục con nào đó thì trƣờng Filesize này chứa giá trị 0. Kích thƣớc của thƣ mục con chỉ đƣợc biết nhờ lần theo chuỗi số hiệu Cluster tƣơng ứng trong bảng FAT. Khi người d ng x a một t p tin tr n đĩa hệ điều hành hông x a nội dung của t p tin tại các Cluster trên vùng dữ iệu, không xóa dãy các Cluster chứa t p tin trong b ng FAT, th m chí hông x a Cluster đầu ti n trong dãy các Cluster chứa t p tin tại phần t tương ứng với t p tin trong b ng thư mục gốc mà hệ điều hành chỉ thay í tự 277 đầu ti n của t n t p tin tại phần t trong b ng thư mục gốc b ng giá trị E5h. Do đó, sau khi đ xóa một tập tin thì hệ điều hành có thể khôi phục lại đƣợc tập tin này, bằng các thay kí tự m E5h ở Byte đầu tiên của tên tập tin bằng một kí tự khác. Trƣờng hợp không khôi phục đƣợc là do sau một thời gian, hệ điều hành đ sử dụng phần tử trong thƣ mục gốc, các phần tử trong bảng FAT và các Cluster trên vùng dữ liệu của tập tin đ bị xóa, cấp phát cho các tập tin mới sau này. Khi duyệt bảng thƣ mục gốc gặp các phần tử có Byte đầu bàng E5h hệ điều hành biết đây là phần tử của tập tin đ bị xóa nên không in ra màn hình. Điều vừa trình bày trên đây hoàn toàn đúng với trƣờng hợp của các thƣ mục con trên đĩa logic. Để ghi một tập tin vào thư mục gốc của đĩa thông tin của tập tin chứa trong một phần tử trong ảng thư mục gốc) hệ điều hành DOS thực hiện các ước sau đây: 1. Tìm một phần tử trong bảng thƣ mục gốc chƣa sử dụng, đó là phần tử mà Byte đầu tiên của nó chứa gia trị 00. Giả sử tìm đƣợc phần tử thứ 105. 2. Ghi tên tập tin, phần mở rộng, thuộc tính của tập tin, ngày giờ tạo tập tin vào các trƣờng tƣơng ứng tại phần tử 105 trong bảng thƣ mục gốc 3. Tìm một Entry trong bảng FAT chứa giá trị 000h, giả sử tìm đƣợc Entry 207, điều này có nghĩa Cluster 207 trên vùng dữ liệu c n trống 4. Ghi số hiệu của Entry này, Entry 207, vào trƣờng start Cluster tại offset 1Ah của phần tử 107 trong bảng thƣ mục gốc. 5. Ghi block đầu tiên của tập tin vào Cluster 107 trên vùng dữ liệu. Nếu nội dung của tập tin chứa vừa đủ trong 1 Cluster, thì DOS sẽ thực hiện bƣớc cuối cùng bƣớc 9 , ngƣợc lại DOS tiếp tục thực hiện bƣớc 6. 6. Tiếp tục tìm một Entry trong bảng FAT chứa giá trị 000h, giả sử tìm đƣợc Entry 215, điều này có nghĩa Cluster 215 trên vùng dữ liệu c n trống. 7. Ghi giá trị 215 vào Entry 207 trong bảng FAT và ghi block thứ hai của tập tin vào Cluster 215 trên vùng dữ liệu. 8. Lặp lại các bƣớc 6 và 7 cho đến khi ghi hết các block của tập tin vào các Cluster trên vùng dữ liệu. Giả sử block cuối cùng của tập tin đƣợc ghi vào Cluster 302 trên vùng dữ liệu, tức là Entry cuối cùng đƣợc tìm thấy chứa giá trị 00h là Entry 302. 278 9. Bƣớc cuối cùng: ghi giá trị FFFh vào Entry 107 hoặc vào Entry 302. 10. Tính kích thƣớc của tập tin và ghi vào trƣờng filesize của phần tử 105 trong bảng thƣ mục gốc. 4.7.4. Thư mục con Subdirectory) Nhƣ đ biết, bảng thƣ mục gốc của DOS định vị tại một vị trí cố định trên đĩa logic, sau 2 bảng FAT, số lƣợng phần tử trong bảng thƣ mục gốc là cố định, không thể mở rộng đƣợc, và đƣợc DOS quy định trong quá trình định dạng đĩa. Đó là những hạn chế về cấu trúc và tổ chức bảng thƣ mục gốc của DOS. Cụ thể là ngƣời dùng không thể chứa quá nhiều tập tin, thƣ mục trên thƣ mục gốc và bảng thƣ mục gốc d bị Virus tấn công. Hệ điều hành DOS đƣa ra khái niệm thƣ mục con để khắc phục một phần những hạn chế trên. Đối với ngƣời dùng, thƣ mục con là những thƣ mục nằm trên thƣ mục gốc của đĩa, trên đĩa chỉ có một thƣ mục gốc nhƣng có thể có nhiều thƣ mục con, trong thƣ mục con có thể chứa nhiều không giới hạn tập tin và thƣ mục con khác, gắn liền với thƣ mục con là thƣ mục cha của nó, thƣ mục cha có thể là thƣ mục gốc hoặc một thƣ mục con khác. Nhƣng đối với DOS, thƣ mục con là một tập tin đặc biệt, tập tin này có thuộc tính thƣ mục con, Byte thuộc tính có giá trị 00010000 16 , và có trƣờng Filesize = 0. Về mặt hệ thống, thư mục con có các điểm khác sau đây so với thư mục gốc: Hệ điều hành lƣu trữ nó giống nhƣ lƣu trữ các tập tin khác trên đĩa. Tức là, muốn đọc đƣợc thƣ mục con hệ điều hành phải lần theo dấu vết của nó trong bảng FAT. Bảng thƣ mục của nó có số lƣợng phần tử không giới hạn, có thể tăng lên hay giảm xuống tùy thuộc vào số lƣợng tập tin và thƣ mục chứa trong nó. Nhờ vậy mà ngƣời dùng có thể chứa nhiều tập tin thƣ mục trong một thƣ mục con trên đĩa. Số lƣợng phần tử trong bảng thƣ mục của các thƣ mục con chỉ bị giới hạn bởi dung lƣợng đĩa và kích thƣớc các tập tin thƣ mục chứa trong nó. Bảng thƣ mục của nó có thể định vị tại một vị trí bất kỳ trên vùng dữ liệu của đĩa. Có thể xem đây là một hạn chế của thƣ mục con, vì nếu tạo quá nhiều thƣ mục con trên đĩa thì bảng thƣ mục của các thƣ muc con sẽ chiếm hết nhiều không gian đĩa trên vùng dữ liệu. Do đó hệ điều hành không khuyến khích tạo quá nhiều thƣ mục con trên các đĩa mềm. Virus khó có thể tấn công bảng thƣ mục của thƣ mục con vì 279 nó không cố định. Muốn biết đƣợc kích thƣớc của thƣ mục con hệ điều hành phải tính toán từ kích thƣớc của tất cả các tập tin trong thƣ mục con, hệ điều hành dựa vào bảng thƣ mục của thƣ mục con và bảng FAT để thực hiện việc tính toán này. Cấu trúc của một phần tử trong bảng thƣ mục của thƣ mục con tƣơng tự cấu trúc của một phần tử trong bảng thƣ mục gốc. Đa số các phần tử trong bảng thƣ mục gốc của đĩa hay phần tử trong bảng thƣ mục của thƣ mục con, chứa thông tin của một thƣ mục con , đều có trƣờng Filename là tên của thƣ mục con , trƣờng Attribute = 16, trƣờng Start Cluster = Cluster đầu tiên của thƣ mục con , trƣờng Filesize = 0, … Chỉ có hai phần tử đầu tiên trong bảng thƣ mục của các thƣ mục con là có chứa các giá trị đặc biệt. Ngay sau khi có một thƣ mục con đƣợc tạo ra, hệ điều hành tạo ngay bảng thƣ mục cho nó và khởi tạo 2 phần tử đầu tiên trong bảng thƣ mục này: Phần t thứ nh t, chứa m ascii của kí tự dấu chấm . ở Byte đầu tiên của trƣờng filename, phần tử này chỉ đến chính thƣ mục hiện hành. Trƣờng Start Cluster cho biết Cluster bắt đầu của thƣ mục này. Phần t thứ hai, chứa 2 m ascii của 2 kí tự dấu chấm .. ở 2 Byte đầu tiên của trƣờng filename, phần tử này chỉ đến thƣ mục cha của nó. Trƣờng Start Cluster cho biết Cluster bắt đầu của thƣ mục cha của nó. Nhƣng nếu cha của nó là thƣ mục gốc 280 thì trƣờng này chứa giá trị 0. Hình 4.14 B ng thư mục gốc và b ng thư mục con Trong sơ đồ này ta giả sử: trên thƣ mục gốc có hai thƣ mục con là ASS và OS, trong thƣ mục ASS có hai thƣ mục con LT và TH, trong OS có chứa tập tin tailieu.txt và thƣ mục con LTOS, trong LT có chứa 2 tập tin ch1.txt và ch2.txt, trong TH có chứa 2 tập tin btap1.txt và btap2.txt. Nếu một tập tin bị giảm kích thƣớc thì DOS sẽ giải phóng ngay các Cluster đĩa mà tập tin không c n sử dụng nữa. Nhƣng các Cluster chứa thƣ mục con chỉ đƣợc giải phóng khi tất cả các tập tin thƣ mục trong thƣ mục con này đ bị xóa hết ra khỏi đĩa. 4.8. TỔ CHỨC LƯU TRỮ TẬP TIN TRÊN ĐĨ CD_ROM Về nguyên tắc hệ thống tập tin trên CD_ROM đơn giản hơn so với những hệ 281 thống tập tin khác, vì các đĩa CD_ROM chỉ đƣợc ghi một lần write-once media), do đó các tập tin ghi trên nó không thể xóa bỏ hay thay đổi sau khi đĩa đ đƣợc chế tạo, chính vì vậy thành phần quản lý File/đĩa của hệ điều hành sẽ không lo đến việc quản lý các Block c n tự do trên đĩa cũng nhƣ việc cấp phát và thu hồi các Block cho các tập tin, trong trƣờng hợp các tập tin đƣợc lƣu trữ trên đĩa CD_ROM. Sau đây chúng ta xem x t hệ thống tập tin chính trên CD_ROM và 2 hệ thống mở rộng của chúng: 4.8.1. Hệ thống tập tin ISO 9660 Đây là chuẩn phổ biến nhất đối với các hệ thống tập tin CD_ROM và đ đƣợc chấp nhận nhƣ một chuẩn quốc tế vào năm 1988 với cái tên ISO 9660. Một trong những mục đích của chuẩn này là làm cho tất cả các CD_ROM đều có thể đọc đƣợc trên các máy tính khác nhau, nó không phụ thuộc vào thứ tự Byte cũng nhƣ hệ điều hành đang sử dụng, kể cả hệ điều hành yếu nhất nhƣ MS-DOS. Trên CD_ROM không có track, cylinder nhƣ trên các đĩa từ, nó chỉ có một đƣờng xoắn ốc đi từ tâm đĩa ra bên ngoài, đƣờng xoắn ốc này đƣợc chia thành các khối (block) logic có kích thƣớc bằng nhau và bằng 2352 Byte, đôi khi cũng đƣợc gọi là các sector logic. Một vài Byte trong khối dành cho phần mở đầu, sửa chữa lỗi, và những việc khác. Phần chính của mỗi khối logic c n lại khoảng 2048 Byte. ISO 9660 hỗ trợ cho một tập đĩa CD_ROM với một tập gồm 216-1 đĩa, một CD_ROM riêng lẽ có thể đƣợc chia thành nhiều partition. Trong phần này chúng ta chỉ tìm hiểu chuẩn ISO 9660 với một CD_ROM và không đƣợc chia thành các Partition. Mỗi CD_ROM đều có phần đầu của đĩa, dài 16 block, chức năng của phần này không đƣợc định nghĩa trong chuẩn ISO 9600. Các nhà sản xuất CD_ROM có thể sử dụng phần đầu này để ghi vào đó chƣơng trình BootStrap cho ph p máy tính có thể khởi động đƣợc từ đĩa CD_ROM, hoặc dùng cho những mục đích khác. Phần tiếp theo là 1 block chứa bộ mô tả Volume chính, bộ mô tả này chứa một số thông tin chung về CD_ROM, bao gồm: định danh hệ thống 32Byte , định danh volume (32Byte , định danh nhà sản xuất 128Byte và định danh dữ liệu (128Byte . Khi chế tạo có thể lấp đầy những trƣờng trên theo ý muốn. Trong phần này c n chứa phần giới thiệu, bản quyền tác giả, thông tin thƣ mục, kích 282 thƣớc của một khối logic 2048, 4096, 8192, ... , số các block trên CD_ROM, và thời gian tạo và kết thúc của CD_ROM. Cuối cùng, trong bộ mô tả Volume chính c n chứa một tập các mục vào directory Entry cho thƣ mục gốc, tại đây chứa địa chỉ của block bắt đầu của thƣ mục gốc trên CD_ROM. Trên CD_ROM có 2 bộ mô tả volume chính, có nội dung hoàn toàn giống nhau, sử dụng một bộ và một bộ để dự ph ng. Sau các phần trên là phần bắt đầu của CD_ROM dùng để chứa các tập tin đang đƣợc ghi trên đĩa. Thƣ mục gốc và tất cả các thƣ mục khác, chỉ gồm một số mục vào, phần cuối của chúng chứa một bit đánh dấu mark . Mỗi mục vào chứa từ 10 đến 12 trƣờng, trong đó có một số thuộc ASCII và số khác là những trƣờng số thuộc số nhị phân. 4.8.2. Mở rộng Rock Ridge Các chuyên viên thiết kế của UNIX nhận thấy ISO 9660 c n một vài hạn chế, do đó họ đ mở rộng ISO 9660 với mục đích là cho nó có thể thay thế cho hệ thống tập tin của UNIX trên các đĩa CD_ROM và các tập tin đƣợc tạo từ UNIX có thể đƣợc sao ch p sang CD_ROM và ngƣợc lại, chuẩn mở rộng này đƣợc gọi là Rock Ridge. Rock Ridge giữ lại tất cả các trƣờng của ISO 9660, và sử dụng trƣờng System để đƣa thêm vào các trƣờng mới, các hệ thống tập tin khác không nhận biết các trƣờng này và xem CD_ROM nhƣ một đĩa CD_ROM thông thƣờng. Rock Ridge bổ sung thêm các trƣờng, theo thứ tự là: PX: Posix Attributes, PN: Major and miror device number, SL:Symbolic link, NM: Alternative name, CL: Child location, PL: Parent location, RE:Relocaltion, TF: Times stamps, trong đó trƣờng quan trọng nhất là NM, trƣờng này cho ph p sử dụng 2 tên tập tin cho một tập tin, một tên tập tin trong mục vào của thƣ mục và một tên tập tin kết hợp, tên này không phụ vào tập kí tự hoặc giới hạn chiều dài của chuẩn ISO 9660. 4.8.3. Mở rộng Joliet Cũng nhƣ các chuyên viên thiết kế của UNIX, các chuyên viên thiết kế của Microsoft muốn mở rộng ISO 9660 sao cho các tập tin đƣợc tạo từ Windows có thể đƣợc sao ch p sang CD_ROM và ngƣợc lại và họ đ thành công với mở rộng Joliet. Mở rộng Joliet cho ph p: Tên tập tin dài đến 64 kí tự; Sử dụng tập kí tự Unicode nên tên tập tin có thể dài đến 128 kí tự; Có nhiều hơn 8 cấp thƣ mục lồng nhau; Sử dụng 283 tên thƣ mục với phần mở rộng. 4.9. TÓM TẮT Một tập tin là một kiểu dữ liệu trừu tƣợng đƣợc định nghĩa và đƣợc cài đặt bởi hệ điều hành. Mỗi thiết bị trong một tập tin giữ một bảng volume nội dung hay thƣ mục thiết bị liệt kê vị trí các tập tin trên thiết bị. Ngoài ra, nó có ích để tạo các thƣ mục cho ph p các tập tin đƣợc tổ chức trong thƣ mục đó. Một thƣ mục đơn cấp trong hệ thống đơn ngƣời dùng gây ra các vấn đề đặt tên vì mỗi tập tin phải có tên duy nhất. Thƣ mục hai cấp giải quyết vấn đề này bằng cách tạo một thƣ mục riêng cho mỗi ngƣời dùng. Mỗi ngƣời dùng có thƣ mục riêng, chứa tập tin riêng. Thƣ mục liệt kê các tập tin bằng tên và chứa những thông tin nhƣ vị trí tập tin trên đĩa, chiều dài, kiểu, ngƣời sở hữu, thời gian tạo, thời điểm dùng gần nhất,… Tổng quát hóa tính tự nhiên của thƣ mục hai cấp là thƣ mục có cấu trúc cây. Thƣ mục có cấu trúc cây cho ph p một ngƣời dùng tạo thƣ mục con để tổ chức các tập tin. Cấu trúc thƣ mục đồ thị không chứa chu trình cho ph p các thƣ mục con và tập tin đƣợc chia s nhƣng tìm kiếm và xóa phức tạp. Một cấu trúc đồ thị tổng quát linh động hơn trong việc chia s tập tin và thƣ mục, nhƣng yêu cầu thu dọn rác để phục hồi không gian đĩa không đƣợc dùng. Chia s tập tin phụ thuộc vào ngữ nghĩa đƣợc cung cấp bởi hệ thống. Các tập tin có nhiều ngƣời đọc, viết hay bị giới hạn việc chia s . Hệ thống tập tin phân tán cho ph p máy khách hàng gắn các phân khu hay thƣ mục vào từ nhiều server. Với điều kiện chúng có thể truy xuất nhau qua mạng. Các hệ thống tập tin ở xa có những thách thức về khả năng tin cậy, năng lực và bảo mật. Vì các tập tin là cơ chế lƣu trữ thông tin quan trọng trong hầu hết các hệ thống máy tính nên bảo vệ tập tin là cần thiết. Truy xuất tới các tập tin đƣợc kiểm soát riêng cho mỗi loại truy xuất -đọc, viết, thực thi, chèn cuối, xóa, liệt kê thƣ mục,.. Bảo vệ tập tin có thể đƣợc cung cấp bởi mật khẩu, bởi danh sách truy xuất hay bởi những kỹ thuật phức tạp. Hệ thống tập tin định vị không đổi trên thiết bị lƣu trữ phụ đƣợc thiết kế để quản lý một lƣợng lớn dữ liệu không đổi. Phƣơng tiện lƣu trữ phụ phổ biến nhất là đĩa. Đĩa vật lý đƣợc phân chia thành một hay nhiều phân khu, mỗi phân khu chứa một hệ thống tập tin. Hệ thống tập tin này đƣợc gán vào cấu trúc đặt tên của hệ thống để 284 làm cho chúng sẵn dùng. Cơ chế đặt tên khác nhau bởi các hệ điều hành khác nhau. Một khi đƣợc gán vào, các tập tin trong phân khu là sẵn dùng. Các hệ thống tập tin có thể đƣợc gỡ ra unmount để vô hiệu hóa truy xuất hay để bảo trì. Những tập tin khác nhau có thể đƣợc cấp phát không gian trên đĩa trong 3 cách: liên tục, liên kết hay chỉ mục. Cấp phát liên tục có thể gặp phải sự phân m nh ngoài. Truy xuất trực tiếp là k m hiệu quả với cấp phát liên kết. Cấp phát chỉ mục yêu cầu chi phí đáng kể cho khối chỉ mục của nó. Các giải thuật này có thể tối ƣu trong nhiều cách. Không gian liên tục có thể lớn lên thông qua đoạn mở rộng để tăng khả năng linh hoạt và giảm phân m nh ngoài. Cấp phát chỉ mục có thể đƣợc thực hiện trong việc nhóm nhiều khối để tăng thông lƣợng và giảm số lƣợng các mục từ chỉ mục đƣợc yêu cầu. 285 Lập chỉ mục trong các nhóm là tƣơng tự nhƣ cấp phát liên tục với các đoạn mở rộng. Câu hỏi ôn tập 1. Tập tin là gì? Thƣ mục là gì? Tại sao phải quản lý tập tin và thƣ mục? 2. Tập tin có những đặc tính gì? Những đặc tính nào là quan trọng? Tại sao? 3. Nêu các chức năng của tập tin và thƣ mục? 4. So sánh các chiến lƣợc cấp phát đĩa để lƣu trữ nội dung tập tin? 5. Vai tr của bảng thƣ mục gốc trong hệ điều hành DOS? 6. Tập tin chia s là gì? 7. Tổ chức đĩa của MS-DOS và Windows 2000? 8. Phân biệt đĩa luận lý và đĩa vật lý? 9. Tìm hiểu tổ chức bảng thƣ mục gốc của Windows98 10. Quản lý lƣu trữ tập tin trên đĩa của WindowsNT/2000 11. Một số kỹ thuật đƣợc hỗ trợ bởi hệ thống tập tin NTFS Bài tập 1. Giả sử một đĩa mềm có 2 side, mỗi side có 128 track, mỗi track có 18 sector. Thƣ mục gốc của đĩa có tối đa là 251 tập tin hoặc thƣ mục , mỗi Entry có kích thƣớc 32 Bytes. Một Cluster = 2 sector. Đĩa sử dụng phƣơng pháp định bằng bảng chỉ mục mỗi phần tử trong bảng có kích thƣớc 12 bits. Hỏi muốn truy xuất Cluster 10 thì phải đọc những sector nào? 2. Cho dãy Byte của FAT12 nhƣ sau bắt đầu từ đầu : 240 255 255 0 64 0 9 112 255 255 143 0 255 255 255 Cho biết những phần tử nào của FAT có giá trị đặc biệt, ý nghĩa của phần tử đó. Nếu sửa lại phần tử 5 là FF0 thì d y Byte của FAT12 này có nội dung nhƣ thế nào ? 3. Biết giá trị dƣới dạng thập phân trong một buffer mỗi phần tử 1 Byte lƣu nội dung của FAT12 nhƣ sau bắt đầu từ phần tử 0 : 240 255 255 255 79 0 5 240 255 247 255 255 286 Cho biết giá trị của từng phần tử trong FAT dƣới dạng số thập phân 4. Ch p 1 tập tin kích thƣớc là 3220 Bytes lên một đĩa 1.44Mb c n trống nhƣng bị hỏng ở sector logic 33. Cho biết giá trị từng Byte của Fat thập phân từ Byte 0 đến Byte 14 . 5. Hiện trạng của FAT12 và RDET mỗi Entry chỉ gồm tên tập tin và Cluster đầu tiên của một đĩa nhƣ sau: 240 255 255 247 79 0 6 0 0 255 159 0 10 240 255 255 127 255 VD TXT 3 LT DOC 7 THO DAT 8 Cho biết hiện trạng của FAT12 và RDET sau khi xoá tập tin VD.TXT và ch p vào tập tin BT.CPP có kích thƣớc 1025 Bytes (giả sử 1 Cluster = 1 sector) 6. Một tập tin đƣợc lƣu trên đĩa tại những khối theo thứ tự sau : 20, 32, 34, 39, 52, 63, 75, 29, 37, 38, 47, 49, 56, 68, 79, 81, 92, 106, 157, 159, 160, 162, 163, 267, 269, 271, 277, 278, 279, 380, 381, 482, 489, 490, 499. Vẽ I_node của tập tin này, giả sử mỗi khối chỉ chứa đƣợc 3 phần tử. 7. Một ổ đĩa C: đƣợc định dạng dƣới dạng FAT16 gồm có 15 cluster. Kích thƣớc của mỗi cluster là 512 byte, giả sử có bảng FAT sau: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 -1 0 5 6 8 7 -1 -1 -1 -1 12 -1 10 0 Thƣ mục gốc bắt đầu tại cluster 0, tại cluster 0 và cluster 9 xem đƣợc các entry nhƣ sau: attrib Start cluster Filename Ext
doc
Hdh
HinhAnh
doc
pascal D size
800
1200 11
9
4 attrib Start cluster 287 Filename Ext
Jpg
Hoguom
Jpg
Halong size
1200
700 3
13 H y vẽ cây thƣ mục và cho biết các số liệu cluster của từng file và thƣ mục? 8. Một ổ đĩa có 17 cluster, kích thƣớc của mỗi cluster là 1024 byte. Giả sử 17 phần tử đầu của bảng FAT có giá trị cho ở bảng sau: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 -1 0 0 13 8 9 -1 0 12 -1 14 16 0 -1 Và 3 entry đầu của Root Dir có giá trị sau: Filename Ext attrib Start cluster size music D 11 autoexec bat 6 4032 vidu txt R 7 3018 a) Cho biết các cluster dữ liệu của thƣ mục music, tập tin autoxec.bat và vidu.txt b) Cho biết nội dung 17 phần tử đầu bảng FAT và 3 entry đầu của Root dir nếu tập tin autoexec.bat và thêm vào tập tin boot.ini có kích thƣớc 4318 byte. 9. Một ổ đĩa C: đƣợc đƣợc định dạng dƣới dạng FAT 16 gồm có 15 cluster. Kích thƣớc của mỗi cluster là 512 byte. Giả sử có cây thƣ mục sau trong ngoặc là kích thƣớc mới file): Amnhac Hanoi.cpp (1721) Hello.cpp(824)
) Ntmien.mp3 (1320) Tcson.mp3 (1489) 288 Một entry trong bảng thƣ mục chiếm 32 byte. H y lập một phƣơng án lƣu trữ cây thƣ mục trên bằng cách: a) Cho biết nội dung 15 phần tử của bảng FAT. b) Cho biết nội dung 5 thuộc tính: filename, ext, attribute, start cluster, size của entry trong thƣ mục gốc và thƣ mục Amnhac. 10. Một ổ đĩa C: đƣợc đƣợc định dạng dƣới dạng FAT 16 gồm có 15 cluster. Kích thƣớc của mỗi cluster là 512 byte. Giả sử có cây thƣ mục sau trong ngoặc là kích thƣớc mới file): Hanoi.cpp (1421) PhimAnh Hello.cpp (1324) Kkong.avi (900) 007.avi (1789) Một entry trong bảng thƣ mục chiếm 32 byte. H y lập một phƣơng án lƣu trữ cây thƣ mục trên bằng cách: a) Cho biết nội dung 15 phần tử của bảng FAT trong phƣơng án của bạn b) Cho biết nội dung 5 thuộc tính: filename, ext, attribute, start cluster, size của 289 entry trong thƣ mục gốc và thƣ mục PhimAnh. TÀI LIỆU TH M KHẢO [1] Nguyễn Kim Tuấn, Giáo trình Hệ điều hành, Đại học Huế, 2004 290 [2] Nguyễn Ph Trường, Giáo trình Hệ điều hành, Đại học Cần Thơ, 2005 5.1. MỤC TIÊU Vai tr của hệ điều hành đối với nhập/xuất trong hệ thống máy tính là quản lý và điều khiển các thao tác nhập/xuất và các thiết bị nhập/xuất. Trong chƣơng này chúng ta sẽ tìm hiểu các kiến thức sau: Hiểu các cơ sở của phần cứng nhập/xuất. Hiểu các dịch vụ nhập/xuất đƣợc cung cấp bởi hệ điều hành. Hiểu cách hệ điều hành làm cầu nối giữa giao diện phần cứng và giao diện ứng dụng. Biết các khía cạnh năng lực của nhập/xuất và các nguyên lý thiết kế hệ điều hành để cải tiến năng lực nhập/xuất. 5.2. CÁC KHÁI NIỆM C BẢN Điều khiển các thiết bị đƣợc nối kết tới máy tính là mối quan tâm chủ yếu của ngƣời thiết kế hệ điều hành. Vì các thiết bị nhập/xuất rất khác nhau về chức năng và tốc độ chuột, đĩa cứng, và CD-ROM nên sự đa dạng về phƣơng pháp là cần thiết để điều khiển chúng. Các phƣơng pháp này hình thành một hệ thống nhập/xuất con I/O subsystem của nhân, tách rời phần c n lại của nhân từ sự phức tạp của việc quản lý các thiết bị nhập/xuất. Công nghệ thiết bị nhập/xuất thể hiện hai xu hƣớng trái ngƣợc nhau. Xu hƣớng thứ nh t, chúng ta tăng sự chuẩn hoá phần mềm và giao diện phần cứng. Xu hƣớng này giúp chúng ta hợp tác những thế hệ thiết bị đƣợc cải tiến vào các máy tính và hệ điều hành đ có. Xu hƣớng thứ hai, chúng ta tăng sự đa dạng của các thiết bị nhập/xuất. Thiết bị mới là rất khác với các thiết bị trƣớc đó đ tạo ra nên rất trở ngại để hợp nhất chúng vào máy tính và hệ điều hành của chúng ta. Trở ngại này đƣợc giải quyết bởi sự kết hợp kỹ thuật phần cứng và phần mềm. Các thành phần phần cứng nh p/xu t cơ b n như c ng, bus và bộ điều hi n thiết bị chứa trong một dãy rộng các thiết bị nh p/xu t Để đóng gói các chi tiết và sự khác biệt của các thiết bị khác nhau, nhân của 291 hệ điều hành đƣợc chỉ dẫn để dùng các modules trình điều khiển thiết bị. Các trình điều khiển thiết bị device driver hiện diện một giao diện truy xuất thiết bị đồng nhất tới hệ thống con nhập/xuất, nhƣ các lời gọi hệ thống cung cấp một giao diện chuẩn giữa ứng dụng và hệ điều hành. 5.3. PHẦN CỨNG NHẬP/XUẤT Có nhiều cách nhìn khác nhau về phần cứng nhập/xuất. Các kỹ sƣ điện tử thì nhìn dƣới góc độ là các thiết bị nhƣ IC, dây dẫn, bộ nguồn, motor v.v….Các lập trình viên thì nhìn chúng dƣới góc độ phần mềm - những lệnh nào thiết bị chấp nhận, chúng sẽ thực hiện những chức năng nào, và thông báo lỗi của chúng bao gồm những gì, nghĩa là chúng ta quan tâm đến p trình thiết bị chứ không phải các thiết bị này hoạt động nhƣ thế nào mặc dù khía cạnh này có liên quan mật thiết với các thao tác bên trong của chúng. Phần này chúng ta đề c p đến một số hái niệm về phần cứng I/O i n quan đến hía cạnh p trình. 5.3.1. Thiết ị I/O Các thiết ị nhập xuầt có thể chia tương đối thành hai loại là thiết ị khối và thiết ị tuần tự. Thiết bị hối là thiết bị mà thông tin đƣợc lƣu trữ trong những khối có kích thƣớc cố định và đƣợc định vị bởi địa chỉ. Kích thƣớc thông thƣờng của một khối là khoảng từ 128 Bytes đến 1024 Bytes. Đặc điểm của thiết bị khối là chúng có thể đƣợc truy xuất đọc hoặc ghi từng khối riêng biệt, và chƣơng trình có thể truy xuất một khối bất kỳ nào đó. Ví dụ đĩa từ là một loại thiết bị khối. Thiết bị tuần tự, dạng thiết bị này, việc gửi và nhận thông tin dựa trên chuỗi các bits, không có xác định địa chỉ và không thể thực hiện thao tác tìm kiếm đƣợc. Ví dụ: màn hình, bàn phím, máy in, card mạng, chuột,… là thiết bị tuần tự. Việc phân chia các lớp nhƣ trên không hoàn toàn tối ƣu, một số các thiết bị không phù hợp với hai loại trên. Ví dụ: đồng hồ, bộ nhớ màn hình,... không thực hiện theo cơ chế tuần tự các bits. Ngoài ra, người ta còn phân loại các thiết ị I/O dưới một tiêu chuẩn khác: Thiết bị tương tác được với con người: dùng để giao tiếp giữa ngƣời và máy. 292 Ví dụ: màn hình, bàn phím, chuột, máy in ... Thiết bị tương tác trong hệ thống máy tính: là các thiết bị giao tiếp với nhau. Ví dụ: đĩa, băng từ, card giao tiếp... Thiết bị truyền thồng: nhƣ modem... Những điểm khác nhau giữa các thiết ị I/O gồm : Tốc độ truyền dữ liệu , ví dụ bàn phím : 0.01 KB/s, chuột 0.02 KB/s ... Công dụng. Đơn vị truyền dữ liệu khối hoặc ký tự . Biểu di n dữ liệu, điều này tùy thuộc vào từng thiết bị cụ thể. Tình trạng lỗi: nguyên nhân gây ra lỗi, cách mà chúng báo về... 5.3.2. Tổ chức của chức năng I/O Một thiết bị giao tiếp với một hệ thống máy tính b ng cách g i các tín hiệu qua
dây cáp hay th m chí qua hông hí23. Các thiết bị giao tiếp với máy bằng một điểm
nối kết cổng-port nhƣ cổng tuần tự. Một hay nhiều thiết bị dùng một tập hợp dây dẫn, nối kết đƣợc gọi là bus. Bus là một tập hợp các dây dẫn tín hiệu và giao thức đƣợc định nghĩa chặt chẽ để xác định tập hợp thông điệp có thể đƣợc gởi qua dây. Khi thiết bị A có một cáp gán vào thiết bị B, thiết bị B có một cáp gán vào thiết bị C và thiết bị C gán vào một cổng máy tính, sự sắp xếp này đƣợc gọi là chuỗi nối tiếp. Một chuỗi nối tiếp thƣờng điều hành nhƣ một bus. Có ba phương pháp để thực hiện I/O ằng phần cứng: Thăm dò Ng t DMA 5.3.2.1. Thăm dò Giao thức hoàn chỉnh cho việc giao tiếp giữa máy tính và bộ điều khiển rất phức tạp nhƣng ký hiệu ắt tay handshaking) là đơn giản. Chúng ta giải thích bắt tay bằng ví dụ sau. Chúng ta giả sử rằng 2 bits đƣợc dùng để hợp tác trong mối quan hệ ngƣời sản xuất-ngƣời tiêu thụ giữa bộ điều khiển và máy chủ. Bộ điều khiển hiển thị trạng thái của nó thông qua bit bận busy bit trong thanh ghi trạng thái. Bộ điều khiển đặt bit 23 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, tr.243 293 bận khi nó đang làm việc và xoá bit bận khi nó sẵn sàng nhận lệnh tiếp theo. Máy tính ra tín hiệu mong muốn bằng bit sẵn sàng nhận lệnh command-ready bit) trong thanh ghi lệnh. Máy tính thiết lập bit sẵn sàng nhận lệnh khi một lệnh sẵn dùng cho bộ điều khiển thực thi. Ví dụ, máy tính viết dữ liệu xuất thông qua một cổng, hợp tác với bộ điều khiển bằng cách bắt tay nhƣ sau: Máy tính lặp lại việc đọc bit bận cho tới khi bit này bị xoá Máy tính thiết lập bit viết trong thanh ghi lệnh và viết một Byte vào thanh ghi dữ liệu xuất. Máy tính đặt bit sẵn sàng nhận lệnh Khi bộ điều khiển nhận thấy rằng bit sẵn sàng nhận lệnh đƣợc đặt, nó đặt bit bận Bộ điều khiển đọc thanh ghi lệnh và thấy lệnh viết. Nó đọc thanh ghi xuất dữ liệu để lấy một Byte và thực hiện nhập/xuất tới thiết bị. Bộ điều khiển xoá bit sẵn sàng nhận lệnh, xoá bit lỗi trong thanh ghi trạng thái để hiển thị rằng thiết bị nhập/xuất thành công, và xoá bit bận để hiển thị rằng nó đƣợc kết thúc. Thao tác thăm d cơ bản là đủ. Nhƣng thăm d trở nên không đủ khi đƣợc lặp lại nhiều lần, hiếm khi tìm một thiết bị sẵn sàng phục vụ trong lần thăm d đầu tiên, trong khi cần dùng CPU để xử lý cho các công việc khác. Trong trƣờng hợp nhƣ thế, sẽ hiệu quả hơn để sắp xếp bộ điều khiển phần cứng thông báo cho CPU khi nào thiết bị sẵn sàng phục vụ hơn là yêu cầu CPU lặp lại việc thăm d cho việc hoàn thành nhập/xuất. Cơ chế phần cứng cho ph p một thiết bị thông báo tới CPU đƣợc gọi là ngắt (interrupt). 294 5.3.2.2. Ngắt Hình 5.1. Chu ỳ nh p/xu t hướng ng t24 Ngắt là một tín hiệu đƣợc d ng yêu cầu ngắt interrup-request line) trong máy tính gởi tới bộ xử lý yêu cầu chú ý ngay lập tức tới nó. Hình 5.2. mô tả chuỗi các sự kiện trong quá trình xảy ra một ngắt: bộ xử lý dừng công việc đang làm và chạy một chƣơng trình phụ có trong bộ nhớ gọi là chƣơng trình phục vụ ngắt Interrupt handler hoặc Interrupt service routine . Sau khi thực hiện xong, bộ xử lý quay lại đúng điểm 24 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, Tr.244 295 mà nó tạm ngừng lúc nảy để tiếp tiếp tục thực hiện công việc của mình. Hình 5.2. Các bước thực hiện hi c một ng t x y ra Phƣơng pháp vào/ra theo ngắt mang tính không đồng bộ vì các ngoại vi đƣợc phục vụ theo yêu cầu của chúng không theo trình tự định trƣớc . Nhờ đó ngắt là một xử lý rất linh hoạt và đƣợc dùng trong nhiều trƣờng hợp đặc biệt nhƣ: trong hệ thống báo động với các cảm biến, ngắt mạch, báo mất nguồn nuôi trong PC, trong hệ thống console bàn phím, màn hình có cách thức truy cập ngẫu nhiên theo thời gian và không gian, các thông báo lỗi nghiêm trọng về phần cứng... Tuy nhiên, ngắt cũng có những hạn chế nhƣ việc phát hiện lỗi trong phần mềm phức tạp hơn ngắt phần cứng, phải mất một thời gian nhất định để cất giữ các thanh ghi và cờ trạng thái bằng các lệnh PUSH trƣớc khi phục vụ ngắt. 5.3.2.3 Truy xuất ộ nhớ trực tiếp Direct Memory ccess-DMA) Đối với một thiết bị thực hiện việc truyền lớn nhƣ ổ đĩa, nó sẽ l ng phí khi dùng bộ vi xử lý để theo dõi các bit trạng thái và đẩy dữ liệu vào thanh ghi điều khiển từng Byte một. Nhiều máy tính muốn giảm đi gánh nặng cho CPU bằng cách chuyển một số công việc này tới một bộ điều khiển có mục đích đặc biệt đƣợc gọi là bộ điều khiển 296 truy xuất bộ nhớ trực tiếp. Hình 5.3. Các bước trong việc truyền dữ iệu của DMA25 Để khởi tạo một thao tác chuyển dữ liệu theo kiểu DMA, máy tính viết một khối lệnh DMA vào bộ nhớ. Khối này chứa một con trỏ chỉ tới nguồn chuyển, một con trỏ chỉ tới đích chuyển và đếm số lƣợng Byte đƣợc chuyển. CPU viết địa chỉ của khối lệnh này tới bộ điều khiển DMA, sau đó CPU tiếp tục làm công việc khác. Bộ điều khiển DMA xử lý để điều hành bus bộ nhớ trực tiếp, đặt các địa chỉ trên bus để thực hiện việc chuyển mà không có sự trợ giúp của CPU. Một bộ điều khiển DMA đơn giản là một thành phần chuẩn trong PCs, và bảng nhập/xuất bus chính để PC thƣờng chứa phần cứng DMA tốc độ cao. 5.3.3. Bộ điều khiển thiết ị (Device Driver) Một đơn vị bị nhập xuất thƣờng đƣợc chia làm hai thành phần chính là thành phần cơ và thành phần điện t . 25 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, Tr.245 297 Thành phần cơ: là bản thân thiết bị. Thành phần điện t : à bộ ph n điều hi n thiết bị hay bộ tương thích, trong các máy vi tính thƣờng đƣợc gọi là card giao tiếp. Một bộ phận điều khiển thƣờng có bộ phận kết nối trên chúng để có thể gắn thiết bị lên đó. Một bộ phận điều khiển có thể quản lý đƣợc hai, bốn hay thậm chí tám thiết bị khác nhau. Nếu giao tiếp giữa thiết bị và bộ phận điều khiển là các chuẩn nhƣ ANSI, IEEE hay ISO thì nhà sản xuất thiết bị và bộ điều khiển phải tuân theo chuẩn đó, ví dụ : bộ điều khiển đĩa đƣợc theo chuẩn giao tiếp của IBM. Giao tiếp giữa bộ điều khiển và thiết bị là giao tiếp ở mức thấp. Hình 5.4. Sự ết nối giữa CPU, bộ nhớ, bộ điều hi n với thiết bị nh p/xu t Chức năng của bộ điều khiển là giao tiếp với hệ điều hành vì hệ điều hành không thể truy xuất trực tiếp với thiết bị. Việc thông tin thông qua hệ thống đƣờng truyền gọi là bus. Công việc của bộ điều khiển là chuyển đổi d y các bit tuần tự trong một khối các Byte và thực hiện sửa chửa nếu cần thiết. Thông thƣờng khối các Byte đƣợc tổ chức thành từng bit và đặt trong buffer của bộ điều khiển. Sau khi thực hiện kiểm tra tổng thể nội dung của buffer sẽ đƣợc chuyển vào bộ nhớ chính. Ví dụ: bộ điều khiển cho màn hình đọc các Byte ký tự trong bộ nhớ và tổ chức các tín hiệu để điều khiển các tia của CRT để xuất trên màn ảnh bằng cách qu t các tia dọc và ngang. Nếu không có bộ điều khiển, lập trình viên phải tạo thêm chƣơng 298 trình điều khiển tín hiệu analog cho đèn hình. Với bộ điều khiển, hệ điều hành chỉ cần khởi động chúng với một số tham số nhƣ số ký tự trên một d ng, số d ng trên màn hình và bộ điều khiển sẽ thực hiện điều khiển các tia. Mỗi bộ điều khiển có một số thanh ghi để liên lạc với CPU. Trên một số máy tính, các thanh ghi này là một phần của bộ nhớ chính tại một địa chỉ xác định gọi là ánh xạ bộ nhớ nhập/xuất. Hệ máy PC dành ra một vùng địa chỉ đặc biệt gọi là địa chỉ nhập xuất và trong đó đƣợc chia làm nhiều đoạn, mỗi đoạn cho một loại thiết bị nhƣ sau : Bộ điều khiển nhập/xuất Địa chỉ nhập/xuất Vectơ ngắt Đồng hồ 040 - 043 8 Bàn phím 060 - 063 9 RS232 phụ 2F8 - 2FF 11 Đĩa cứng 320 - 32F 13 Máy in 378 - 37F 15 Màn hình mono 380 - 3BF - Màn hình màu 3D0 - 3DF - Đĩa mềm 3F0 - 3F7 14 RS232 chính 3F8 - 3FF 12 Bản 5.1. Địa chỉ nh p xu t của thiết bị trong máy tính PC Hệ điều hành thực hiện nhập/xuất bằng cách ghi lệnh lên các thanh ghi của bộ điều khiển. Ví dụ: bộ điều khiển đĩa mềm của IBM PC chấp nhận 15 lệnh khác nhau nhƣ: READ, WRITE, SEEK, FORMAT, RECALIBRATE, một số lệnh có tham số và các tham số cũng đƣợc nạp vào thanh ghi. Khi một lệnh đ đƣợc chấp nhận, CPU sẽ rời bộ điều khiển để thực hiện công việc khác. Sau khi thực hiện xong, bộ điều khiển phát sinh một ngắt để báo hiệu cho CPU biết và đến lấy kết quả đƣợc lƣu giữ trong các thanh ghi. 5.4. GI O DIỆN NHẬP/XUẤT ỨNG DỤNG Trong phần này, chúng ta thảo luận các kỹ thuật cấu trúc và các giao diện cho hệ điều hành cho ph p các thiết bị nhập/xuất đƣợc đối xử trong cách chuẩn, không đổi. Ví 299 dụ, chúng ta giải thích một ứng dụng có thể mở một tập tin trên đĩa mà không biết loại đĩa đó là gì và các đĩa mới và các thiết bị khác có thể đƣợc thêm tới máy tính nhƣ thế nào mà không làm hệ điều hành bị gián đoạn. Nhƣ những vấn đề công nghệ phần mềm phức tạp khác, tiếp cận ở đây liên quan đến tính trừu tƣợng, bao gói và phân tầng phần mềm. Đặc biệt, chúng ta có thể trừu tƣợng sự khác nhau chi tiết trong các thiết bị nhập/xuất bằng cách xác định một vài loại thông dụng. Mỗi loại thông dụng đƣợc truy xuất thông qua một tập hợp hàm chuẩn- một giao diện. Sự khác biệt này đƣợc bao gói trong module nhân đƣợc gọi là trình điều hi n thiết bị device driver đƣợc qui định bên trong đƣợc áp đặt cho mỗi thiết bị, nhƣng đƣợc nhập vào một trong những giao diện chuẩn. Hình 5.5 hiển thị cách các thành phần liên quan nhập/xuất của nhân đƣợc cấu trúc trong các tầng phần mềm. 26 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, Tr.246 300 Hình 5.5 C u trúc của nhân nh p/xu t26 Mục đích của tầng chứa trình điều hi n thiết bị à che đ y sự hác biệt giữa các bộ điều hi n thiết bị từ hệ con nh p/xu t của nhân, nhiều lời gọi hệ thống nhập/xuất đóng gói các hành vi của thiết bị trong một vài lớp phát sinh để che đậy sự khác biệt từ các ứng dụng. Thực hiện hệ thống con nhập/xuất độc lập với phần cứng đơn giản hóa công việc của ngƣời phát triển hệ điều hành. Nó cũng đem lại sự thuận lợi cho các nhà sản xuất phần cứng. Họ thiết kế các thiết bị mới tƣơng thích với giao diện bộ điều khiển chủ đ có nhƣ SCSI-2 hoặc họ viết các trình điều hi n thiết bị đ giao tiếp phần cứng mới đối với các hệ điều hành ph biến. Do đó, các thiết bị ngoại vi mới có thể đƣợc gán tới một máy tính mà không phải chờ nhà cung cấp hệ điều hành phát triển thêm mã. Tuy nhiên, đối với một số nhà sản xuất thiết bị phần cứng, mỗi loại hệ điều hành có chuẩn riêng của nó cho giao diện trình điều khiển thiết bị. Một thiết bị đƣợc cho có thể mang nhiều trình điều khiển-thí dụ, trình điều khiển cho MS-DOS, Windows 95/98, Windows NT/2000 và Solaris. Các thiết bị khác nhau trong nhiều hƣớng nhƣ đƣợc hiển thị trong Bảng 5.2. 27 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, Tr.246 301 Bản 5 2 Các đ c đi m của các thiết bị nh p/xu t27 Phương thức chuyển dữ liệu dòng ký tự hay khối Character/ lock): các thiết bị d ng ký tự chuyển từng Byte một, ngƣợc lại một thiết bị khối chuyển đơn vị là khối Byte. Truy xuất tuần tự hay ngẫu nhiên Sequential/random): thiết bị tuần tự chuyển dữ liệu theo một thứ tự cố định đƣợc định nghĩa bởi thiết bị, ngƣợc lại ngƣời dùng của một thiết bị truy xuất ngẫu nhiên có thể chỉ dẫn thiết bị để tìm bất cứ vị trí lƣu trữ dữ liệu sẵn có. Đồng ộ và ất đồng ộ Synchronous/áynchronous): một thiết bị đồng bộ là một thiết bị thực hiện việc chuyển dữ liệu với số lần đáp ứng có thể đoán trƣớc. Một thiết bị bất đồng bộ hiển thị số lần đáp ứng không đều đặn hay không thể đoán trƣớc. Có thể chia s hay tận hiến dedicated/shara le): một thiết bị có thể chia s đƣợc dùng đồng hành bởi nhiều quá trình hay luồng; một thiết bị tận hiến thì không thể. Tốc độ thao tác device speed): tốc độ thiết bị trải dài từ một vài Byte trên giây tới một vài Gigabyte trên giây. Hướng nhập/xuất I/O direction): Đọc-viết, chỉ đọc, hay chỉ viết: một số thiết bị thực hiện cả hai nhập/xuất, nhƣng một số thiết bị khác hỗ trợ chỉ một hƣớng dữ liệu. 5.5. HỆ THỐNG CON NHẬP/XUẤT CỦ NH N KERNEL I/O SUBSYTEM) Nhân cung cấp nhiều dịch vụ liên quan đến nhập/xuất. Một vài dịch vụ: định thời biểu, vùng đệm buffering , vùng lƣu trữ cache , đặt trƣớc thiết bị, quản lý lỗi,…đƣợc cung cấp bởi hệ thống con nhập/xuất của nhân và xây dựng trên phần cứng và cơ sở hạ tầng trình điều khiển thiết bị. 5.5.1. Định thời iểu nhập/xuất Định thời biểu cho tập hợp các yêu cầu nhập/xuất có nghĩa là xác định một thứ tự tốt để thực thi chúng. Thứ tự các ứng dụng phát ra lời gọi hệ thống rất hiếm khi là một chọn lựa tốt nhất. Định thời biểu có thể cải tiến năng toàn bộ lực hệ thống, có thể chia s truy xuất thiết bị đồng đều giữa các quá trình và có thể giảm thời gian chờ đợitrung 302 bình cho nhập/xuất hoàn thành. Ngƣời phát triển hệ điều hành cài đặt bộ định thời biểu bằng cách duy trì một hàng đợi cho mỗi thiết bị. Khi một ứng dụng phát ra một lời gọi hệ thống nhập/xuất nghẽn, yêu cầu đƣợc đặt vào hàng đợi cho thiết bị đó. Bộ định thời biểu nhập/xuất sắp xếp lại thứ tự của hàng đợi để cải tiến toàn bộ tính hiệu quả hệ thống và thời gian đáp ứng trung bình dựa theo kinh nghiệm bởi ứng dụng. Hệ điều hành cũng cố gắng giữ bình đẳng để mà không ứng dụng nào nhận đƣợc dịch vụ nghèo nàn hay nó cho dịch vụ ƣu tiên đối với các yêu cầu trì ho n nhạy cảm. Thí dụ, các yêu cầu từ hệ thống con bộ nhớ ảo có thể lấy độ ƣu tiên qua các yêu cầu của ứng dụng. Một cách mà hệ thống con nhập/xuất cải tiến tính hiệu quả của máy tính là bằng cách định thời biểu các hoạt động nhập/xuất. Một cách khác là dùng không gian lƣu trữ trong bộ nhớ chính hay trên đĩa, với các kỹ thuật đƣợc gọi là vùng đệm, vùng lƣu trữ và vùng chứa. 5.5.2. Vùng đệm Vùng đệm là một vùng bộ nhớ lƣu trữ dữ liệu trong khi chúng đƣợc chuyển giữa hai thiết bị hay giữa thiết bị và ứng dụng. Vùng đệm đƣợc thực hiện với 3 lý do. Thứ nh t là đối phó với việc không tƣơng thích về tốc độ giữa ngƣời sản xuất và ngƣời tiêu dùng của d ng dữ liệu. Thứ hai cho việc sử dụng vùng là làm thích ứng giữa các thiết bị có kích thƣớc truyền dữ liệu khác nhau. Thứ ba cho việc dùng vùng đệm là hỗ trợ ngữ nghĩa sao ch p cho nhập/xuất ứng dụng. 5.5.3. Vùng lưu trữ Vùng lƣu trữ cache là một vùng bộ nhớ nhanh quản lý các bản sao dữ liệu. Truy xuất tới một bản sao đƣợc lƣu trữ hiệu quả hơn truy xuất tới bản gốc. Ví dụ, các chỉ thị của quá trình hiện đang chạy đƣợc lƣu trên đĩa, đƣợc lƣu trữ trong bộ nhớ vật lý và đƣợc sao ch p một lần nữa trong vùng lƣu trữ phụ và chính. Sự khác nhau giữa vùng đệm là vùng lƣu trữ là vùng đệm có thể giữ chỉ bản sao của thành phần dữ liệu đ có, ngƣợc lại một vùng lƣu trữ giữ vừa đủ một bản sao trên thiết bị lƣu trữ nhanh hơn của một thành phần nằm ở một nơi nào khác.Vùng lƣu trữ và vùng đệm có chức năng khác 303 nhau nhƣng đôi khi một vùng bộ nhớ có thể đƣợc dùng cho cả hai mục đích. 5.5.4. Vùng chứa Một vùng chứa spool là một vùng đệm giữ dữ liệu xuất cho một thiết bị nhƣ máy in mà không thể chấp nhận các d ng dữ liệu đan xen nhau. Mặc dù một máy in có thể phục vụ chỉ một công việc tại một thời điểm, nhƣng nhiều ứng dụng muốn in đồng thời mà không có dữ liệu xuất của chúng đan xen với nhau. Hệ điều hành giải quyết vấn đề này bằng cách ngăn chặn tất cả dữ liệu xuất tới máy in. Dữ liệu xuất của mỗi ứng dụng đƣợc chứa trong một tập tin riêng. Khi một ứng dụng kết thúc việc in, hệ thống vùng chứa xếp tập tin chứa tƣơng ứng cho dữ liệu xuất tới máy in. Hệ thống vùng chứa ch p các tập tin đƣợc xếp hàng tới máy in một tập tin tại một thời điểm. Trong một hệ điều hành, vùng chứa đƣợc quản lý bởi một quá trình hệ thống chạy ở chế độ nền. Trong một số hệ điều hành khác, nó đƣợc quản lý bởi luồng nhân. Trong mỗi trƣờng hợp, hệ điều hành cung cấp một giao diện điều khiển cho ph p ngƣời dùng và ngƣời quản trị hệ thống hiển thị hàng đợi để xóa các công việc không mong muốn trƣớc khi các công việc đó in, để tạm dừng việc in trong khi máy in đƣợc phục vụ,.. 5.5.5. Quản lý lỗi Một hệ điều hành sử dụng bộ nhớ bảo vệ có thể chống lại nhiều lỗi phần cứng và ứng dụng vì thế một lỗi toàn hệ thống không là kết quả của mỗi sự trục trặc cơ học thứ yếu. Các thiết bị và truyền nhập/xuất có thể bị lỗi trong nhiều cách, có thể là các lý do tạm thời nhƣ mạng trở nên quá tải, hay các lý do thƣờng xuyên nhƣ trình điều khiển đĩa bị lỗi. Các hệ điều hành thƣờng trả giá cho tính hiệu quả vì các lỗi tạm thời. Ví dụ, lỗi đọc đĩa read dẫn đến cố gắng làm lại read và lỗi gởi dữ liệu trên mạng send dẫn tới việc gởi lại resend nếu giao thức đƣợc xác định rõ. Tuy nhiên, nếu một thành phần quan trọng bị lỗi thƣờng xuyên thì hệ điều hành không nghĩ đến việc phục hồi. Nhƣ một qui tắc thông thƣờng, một lời gọi hệ thống nhập/xuất trả về 1 bit của thông tin về trạng thái của lời gọi, biểu thị thành công hay thất bại. Trong hệ điều hành UNIX, một biến nguyên có tên errno đƣợc dùng để trả về một m lỗi-một trong 100 giá trị-hiển thị tính tự nhiên của lỗi ví dụ: đối số vƣợt quá giới hạn, lỗi con trỏ, tập tin không thể mở,.. . Ngƣợc lại, một số phần cứng cung cấp thông tin lỗi đƣợc mô tả chi tiết mặc dù nhiều hệ điều hành hiện tại không đƣợc thiết kế để truyền đạt thông tin này 304 tới ứng dụng. 5.5.6. Cấu tr c dữ liệu nhân Nhân cần giữ thông tin trạng thái về việc dùng các thành phần nhập/xuất. Nó thực hiện nhƣ thế thông qua một d y các cấu trúc dữ liệu trong nhân nhƣ bảng tập tin đang mở. Nhân dùng nhiều cấu trúc tƣơng tự để ghi vết các nối kết mạng, giao tiếp thiết bị dạng ký tự và các hoạt động nhập/xuất khác. Tóm lại, hệ thống con nhập/xuất điều phối tập hợp dịch vụ mở rộng sẵn có đối với ứng dụng và những phần khác của nhân. Hệ thống con nhập/xuất điều khiển: Quản lý không gian tên cho các tập tin và các thiết bị Điều khiển truy xuất tới các tập tin và các thiết bị Điều khiển hoạt động ví dụ, một modem không thể tìm seek Cấp phát không gian hệ thống tập tin Cấp phát thiết bị Vùng đệm, vùng lƣu trữ và vùng chứa Định thời biểu nhập/xuất Điều khiển trạng thái thiết bị, quản lý lỗi, và phục hồi lỗi Cấu hình và khởi tạo trình điều khiển thiết bị Cấp cao hơn của hệ thống con nhập/xuất truy xuất thiết bị qua giao diện đồng nhất đƣợc cung cấp bởi các trình điều khiển thiết bị. 5.6. CHUYỂN NHẬP/XUẤT TỚI HOẠT ĐỘNG PHẦN CỨNG Phần trƣớc chúng ta mô tả việc bắt tay giữa một trình điều khiển thiết bị và bộ điều khiển thiết bị, nhƣng chúng ta không giải thích cách hệ điều hành nối kết yêu cầu ứng dụng tới tập hợp dây mạng hay một sector đĩa xác định nhƣ thế nào. Ví dụ: Một ứng dụng muốn đọc một tập tin từ đĩa. Nó tham chiếu tới dữ liệu bằng tên tập tin. Trong một đĩa, hệ thống tập tin ánh xạ từ tên tập tin thông qua các thƣ mục hệ thống tập tin để lấy không gian cấp phát của tập tin. Các hệ điều hành hiện đại đạt đƣợc khả năng linh hoạt cao từ nhiều giai đoạn của bảng tra cứu trong đƣờng dẫn giữa yêu cầu và bộ điều khiển thiết bị vật lý. Các cơ chế truyền yêu cầu giữa ứng dụng và trình điều khiển là phổ biến. Do đó, chúng ta có thể giới thiệu các thiết bị mới và trình điều khiển vào máy tính mà không biên dịch lại nhân. Thật vậy, một số hệ điều hành có khả năng nạp trình điều khiển thiết bị theo yêu 305 cầu. Tại thời điểm khởi động, hệ thống đầu tiên thăm d các bus phần cứng để xác định thiết bị nào hiện diện và sau đó hệ thống nạp các trình điều khiển cần thiết ngay lập tức hay khi đƣợc yêu cầu bởi một yêu cầu nhập/xuất đầu tiên. Bây giờ chúng ta mô tả chu trình sống điển hình của một yêu cầu đọc bị nghẽn, nhƣ trong Hình 5.6. Hình này đề nghị rằng một thao tác nhập/xuất yêu cầu nhiều bƣớc và tiêu tốn số lƣợng lớn chu kỳ CPU. 1) Một quá trình phát ra một lời gọi hệ thống read tới bộ mô tả tập tin đ đƣợc mở trƣớc đó. 2) M lời gọi hệ thống trong nhân kiểm tra tính đúng đắn của các tham số. Trong trƣờng hợp nhập, nếu dữ liệu đ có sẵn trong vùng đệm thì dữ liệu đƣợc trả về tới quá trình và yêu cầu nhập/xuất đƣợc hoàn thành. 3) Ngƣợc lại, nhập/xuất vật lý cần đƣợc thực hiện để mà quá trình đƣợc xóa từ hàng đợi thực thi và đƣợc đặt vào hàng đợi chờ thiết bị, và yêu cầu nhập/xuất đƣợc lập thời biểu. Cuối cùng, hệ con nhập/xuất gởi yêu cầu tới trình điều khiển thiết bị. Phụ thuộc vào hệ điều hành, yêu cầu đƣợc gởi bằng lời gọi thủ tục con hay bằng thông điệp trong nhân. 4) Trình điều khiển thiết bị cấp phát vùng đệm nhân để nhận dữ liệu và lập thời biểu nhập/xuất. Cuối cùng, trình điều khiển gởi lệnh tới bộ điều khiển thiết bị bằng cách viết vào thanh ghi điều khiển của thiết bị. 5) Trình điều khiển thiết bị thao tác trên phần cứng thiết bị để thực hiện truyền dữ liệu. 6) Trình điều khiển có thể thăm d trạng thái và dữ liệu hay thiết lập truyền DMA vào bộ nhớ nhân. Chúng ta thừa nhận rằng truyền đƣợc quản lý bởi bộ điều khiển DMA sinh ra một ngắt khi việc truyền hoàn thành. 7) Bộ quản lý ngắt tƣơng ứng nhận ngắt bằng bằng vector ngắt, lƣu bất cứ dữ liệu cần thiết, báo hiệu trình điều khiển thiết bị và trả về từ ngắt. 8) Trình điều khiển thiết bị nhận tín hiệu, xác định yêu cầu nhập/xuất hoàn thành, xác định trạng thái yêu cầu và báo hiệu cho hệ con nhập/xuất nhân rằng yêu cầu đ hoàn thành. 9) Nhân truyền dữ liệu hay trả về m tới không gian địa chỉ của quá trình đƣợc yêu cầu và di chuyển quá trình từ hàng đợi chờ tới hàng đợi sẵn sàng. Di chuyển 306 quá trình tới hàng đợi sẵn sàng không làm nghẽn quá trình. Khi bộ định thời biểu gán quá trình tới CPU, quá trình tiếp tục thực thi tại thời điểm hoàn thành của lời gọi hệ thống. 28 Nguy n Phú Trƣờng, Giáo trình hệ điều hành, ĐH Cần Thơ, 2005, Tr.251 307 Hình 5.6. Chu trình sống của y u cầu nh p/xu t28 5.7. N NG LỰC Nhập/xuất là một yếu tố quan trọng trong năng lực hệ thống. Nó đặt nhiều yêu cầu trên CPU để thực thi m trình điều khiển thiết bị và định thời biểu quá trình công bằng và hiệu quả khi các quá trình này nghẽn và không nghẽn. Chuyển đổi ngữ cảnh chú trọng đến CPU và vùng lƣu trữ phần cứng. Nhập/xuất cũng hiển thị tính không hiệu quả trong các cơ chế quản lý ngắt trong nhân, và nhập/xuất tải xuống bus bộ nhớ trong suốt thời gian sao ch p giữa vùng đệm nhân và không gian dữ liệu ứng dụng. Ch p một cách hợp lý tất cả yêu cầu này là một trong những quan tâm chính của kiến trúc máy tính. Mặc dù các máy tính hiện đại có thể quản lý hàng ngàn ngắt trên giây, quản lý ngắt là một công việc tƣơng đối đắt: mỗi ngắt gây cho hệ thống thực hiện một thay đổi trạng thái, để thực thi bộ quản lý ngắt và sau đó phục hồi trạng thái. Nhập/xuất đƣợc lập trình có thể hiệu quả hơn nhập/xuất hƣớng ngắt nếu số chu kỳ tiêu tốn cho việc chờ đợi bận là không quá mức. Hoàn thành một thao tác nhập/xuất không nghẽn một quá trình dẫn đến toàn bộ chi phí của việc chuyển đổi ngữ cảnh. Có nhiều nguyên tắc để cải tiến tính hiệu quả của nhập/xuất: Cắt giảm số lƣợng chuyển ngữ cảnh Cắt giảm số lần dữ liệu phải đƣợc ch p vào bộ nhớ trong khi truyền giữa thiết bị và ứng dụng. Cắt giảm tần số xuất hiện ngắt bằng cách dùng sự truyền lớn, bộ điều khiển thông tin và vùng chứa nếu chờ đợi bận có thể là nhỏ nhất . Gia tăng tính đồng hành dùng các bộ điều khiển tri thức DMA hay các kênh để giảm gánh nặng ch p dữ liệu đơn giản từ CPU. Di chuyển các hàm xử lý cơ bản vào phần cứng, để cho ph p họat động của chúng trong các bộ điều khiển thiết bị đồng hành với các thao tác CPU và bus. Cân bằng CPU, hệ con bộ nhớ, bus và năng lực nhập/xuất vì quá tải trong một vùng bất kỳ sẽ gây rảnh rỗi trong vùng khác. Ở đây các chức năng nhập/xuất nên đƣợc cài đặt: trong phần cứng thiết bị, trong trình điều khiển thiết bị hay trong phần mềm ứng dụng? Chúng ta quan sát tiến trình 308 đƣợc mô tả trong Hình 5.7. Hình 5.7. Tiến trình mô t chức năng thiết bị Khởi đầu, chúng ta cài đặt giải thuật nhập/xuất thử nghiệm tại cấp ứng dụng vì m ứng dụng là linh hoạt và những lỗi ứng dụng là chƣa chắc gây ra sự sụp đổ hệ thống. Ngoài ra, bằng phát triển m tại cấp ứng dụng, chúng ta tránh yêu cầu khởi động hay nạp lại trình điều khiển thiết bị sau mọi thay đổi tới m . Tuy nhiên, cài đặt cấp ứng dụng có thể không đủ vì chi phí chuyển ngữ cảnh và vì ứng dụng không thể lấy lợi điểm của những cấu trúc dữ liệu nhân bên trong và chức năng nhân nhƣ truyền thông điệp hữu hiệu trong nhân, luồng và khóa . Khi một giải thuật cấp ứng dụng chứng minh tính giá trị của nó, chúng ta có thể cài đặt lại nó trong nhân. Điều này có thể cải tiến năng lực nhƣng nỗ lực phát triển có thử thách nhiều hơn vì nhân hệ điều hành lớn, phần mềm hệ thống phức tạp. Ngoài ra, việc cài đặt trong nhân phải đƣợc gỡ rối toàn bộ để tránh hƣ hỏng dữ liệu và sụp đổ hệ thống. Năng lực cao nhất có thể đạt đƣợc bởi cài đặt chuyên dụng trong phần cứng, 309 trong thiết bị hay trong bộ điều khiển. Sự bất lợi của việc cài đặt phần cứng gồm khó khăn và chi phí của việc tạo những cải tiến xa hơn hay sửa lỗi, thời gian phát triển tăng và khả năng linh hoạt giảm. 5.8. TÓM TẮT Các thành phần phần cứng cơ bản đƣợc nạp vào nhập/xuất là các bus, các bộ điều khiển thiết bị, và chính các thiết bị. Công việc chuyển dữ liệu giữa thiết bị và bộ nhớ chính đƣợc thực hiện bởi CPU khi nhập/xuất đƣợc lập trình, hay đƣợc chuyển tải tới bộ điều khiển DMA. Module nhân điều khiển một thiết bị là một trình điều khiển thiết bị. Giao diện lời gọi hệ thống cung cấp tới ứng dụng đƣợc thiết kế để quản lý nhiều chủng loại cơ bản của phần cứng, sockets mạng và bộ đếm thời gian đến đƣợc lập trình. Hệ con nhập/xuất của nhân cung cấp nhiều dịch vụ. Các dịch vụ này là định thời biểu nhập/xuất, vùng đệm, vùng chứa, quản lý lỗi và đặt trƣớc thiết bị. Một dịch vụ khác là dịch tên, để tạo nối kết giữa các thiết bị phần cứng và tên tập tin tƣợng trƣng đƣợc dùng bởi ứng dụng. Nó liên quan nhiều cấp ánh xạ mà dịch từ tên chuỗi ký tự tới một trình điều khiển thiết bị xác định và địa chỉ thiết bị và sau đó tới địa chỉ vật lý của cổng nhập/xuất hay bộ điều khiển bus Các lời gọi hệ thống nhập/xuất tính chi phí theo thuật ngữ tiêu tốn CPU vì nhiều lớp phần mềm giữa thiết bị vật lý và ứng dụng. Các lớp này ngụ ý chi phí chuyển ngữ cảnh để đi qua phạm vi bảo vệ của nhân, của tín hiệu và bộ quản lý ngắt để phục vụ các thiết bị nhập/xuất, và của tải trên CPU và hệ thống bộ nhớ để ch p dữ liệu giữa vùng 310 đệm nhân và không gian ứng dụng. Câu hỏi ôn tập 1. Tổ chức của hệ thống quản lý I/O nhƣ thế nào ? 2. Có bao nhiêu loại thiết bị I/O? Với mỗi loại cho ví dụ cụ thể. 3. Vai tr của bộ điều khiển thiết bị là gì? 4. Cơ chế hoạt động DMA nhƣ thế nào? 5. Có thể thực hiện I/O mà không sử dụng điều khiển thiết bị không? Tại sao? Câu hỏi trắc nghiệm 1. t ốn quản lý I/O của u n l : a. Một cơ chế trên mọi thiết bị tin học c. Bàn phím b. Một phần của hệ điều hành d. Máy in 2. t ốn quản lý I/O của một u n bao ồm : a. Phần cứng I/O và phần mềm I/O c. Kiểm soát ngắt b. DMA d. a, b, c đều sai. 3. DMA l v ết tắt của : a. Direct Management Access c. Direct Memory Access b. Direct Memory Application d. Direct Mainboard Access TÀI LIỆU TH M KHẢO [1] Nguyễn Kim Tuấn, Giáo trình Hệ điều hành, Đại học Huế, 2004. 311 [2] Nguyễn Ph Trường, Giáo trình Hệ điều hành, Đại học Cần Thơ, 2005. [1] Trần Hạnh Nhi, Giáo trình hệ điều hành nâng cao, Đại học Khoa học Tự nhiên TP.HCM, 2004. [2] [Lê Khắc Nhiên n, Hoàng Kiếm], Giáo trình Nh p môn hệ điều hành, Đại học Khoa học Tự nhiên, TP.HCM 2004. [3] Nguyễn Kim Tuấn, Giáo trình Hệ điều hành, Đại học Huế, 2004. [4] Nguyễn Ph Trường, Giáo trình Hệ điều hành, Đại học Cần Thơ, 2005. [5] Jean Bacon & Tim Harris, Operating Systems, Addison-Wesley, 2003. [6] Silberschatz, Galvin, Gagne, Operating System Concepts, John Wiley & Sons, 312 2003.CHƯ NG 3: QUẢN L BỘ NHỚ
, trƣớc tiên số hiệu phân đoạn s đƣợc kiểm tra tính hợp lệ (sCHƯ NG 4: QUẢN L TẬP TIN VÀ ĐĨ
. Theo đó một tiến trình chỉ có thể\
\
CHƯ NG 5: QUẢN L HỆ THỐNG NHẬP/XUẤT
TÀI LIỆU TH M KHẢO