Giáo trình Hệ điều hành - Chương 4: Hệ thống vào ra - Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
Chương 4
HỆ THỐNG VÀO RA
13. Hệ thống vào ra
13.1. Tổng quan
Một trong những chức năng chính của hệ điều hành là quản lý tất
cả những thiết bị nhập/xuất của máy tính. Hệ điều hành phải ra các chỉ thị
điều khiển thiết bị, kiểm soát các ngắt và lỗi. Hệ điều hành phải cung cấp
một cách giao tiếp đơn giản và tiện dụng giữa các thiết bị và phần còn lại
của hệ thống và giao tiếp này phải độc lập với thiết bị.
Điều khiển các thiết bị kết nối đến máy tính là một mối quan tâm
lớn trong thiết kế hệ điều hành.
13.2. Phần cứng I/O
Các thiết bị nhập xuất có thể chia tương đối thành hai loại là thiết
bị khối và thiết bị tuần tự.
Thiết bị khố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 đó. Đĩa là một ví dụ
cho loại thiết bị khối.
Một dạng thiết bị thứ hai là 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 là chuỗi các bits, không có xác định
địa chỉ và không thể thực hiện thao tác seek được. Màn hình, bàn phím,
máy in, card mạng, chuột, và các loại thiết bị khác không phải dạng đĩa 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 lớp trên, ví dụ : đồng hồ, bộ nhớ màn hình
v.v...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 bị I/O dưới một tiêu chuẩn khác :
Phạm Ngọc Hưng
129
Hệ thống vào ra
-
-
-
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. 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 bị 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ề...
Một số bộ điều khiển điển hình:
-
-
-
-
-
-
-
-
Bộ điều khiển đĩa IDE
Giao diện mở rộng
Bàn phím
Cổng nối tiếp
Cổng song song
Điều khiển đồ hoạ
Bộ nhớ
Điều khiển SCSI
Các ngắt điều khiển
Là các ngắt cứng được dánh riêng cho các thiết bị vào ra. Để nhận
được sự chú ý và đáp ứng yêu cầu của CPU, mỗi thiết bị vào ra phải sử
dụng một ngắt để tác động đến CPU, yêu cầu CPU phục vụ. Hình 13.1 liệt
kê một số ngắt đã được định nghĩa.
Địa chỉ cổng
Quá trình truyền thông tin qua lại giữa CPU và các thiết bị vào ra
được thực hiện thông qua các cổng vào ra. Mỗi cổng vào ra có một địa chỉ
riêng và một số đã được dành riêng cho các thiết bị vào ra cụ thể. Hình
13.1 liệt kê một số cổng dành sẵn.
130
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
Bộ điều khiển
nhập/xuất
Đồng hồ
Vectơ ngắt
Địa chỉ nhập/xuất
8
9
040 - 043
060 - 063
2F8 - 2FF
320 - 32F
378 - 37F
380 - 3BF
3D0 - 3DF
3F0 - 3F7
3F8 - 3FF
Bàn phím
RS232 phụ
Đĩa cứng
11
13
15
-
Máy in
Màn hình mono
Màn hình màu
Đĩa mềm
-
14
12
RS232 chính
Hình 13.1: Bảng ngắt và cổng một số thiết bị vào ra
Truy cập bộ nhớ trực tiếp bằng cơ chế DMA
Đa số các loại thiết bị, đặc biệt là các thiết bị dạng khối, hỗ trợ cơ
chế DMA (Direct Memory Access). Để hiểu về cơ chế này, trước hết phải
xem xét quá trình đọc đĩa mà không có DMA. Trước tiên, bộ điều khiển
đọc tuần tự các khối trên đĩa, từng bit từng bit cho tới khi toàn bộ khối
được đưa vào buffer của bộ điều khiển. Sau đó máy tính thực hiện kiểm
tra (checksum) để đảm bảo không có lỗi xảy ra. Tiếp theo bộ điều khiển
tạo ra một ngắt để báo cho CPU biết. CPU đến lấy dữ liệu trong buffer
chuyển về bộ nhớ chính bằng cách tạo một vòng lặp đọc lần lượt từng
byte. Thao tác này làm lãng phí thời gian của CPU. Do đó để tối ưu, người
ta đưa ra cơ chế DMA.
Cơ chế DMA giúp cho CPU không bị lãng phí thời gian. Khi sử
dụng, CPU gửi cho bộ điều khiển một số các thông số như địa chỉ trên đĩa
của khối, địa chỉ trong bộ nhớ nơi định vị khối, số lượng byte dữ liệu để
chuyển.
Phạm Ngọc Hưng
131
Hệ thống vào ra
Sau khi bộ điều khiển đã đọc toàn bộ dữ liệu từ thiết bị vào
buffer của nó và kiểm tra checksum. Bộ điều khiển chuyển byte đầu tiên
vào bộ nhớ chính tại địa chỉ được mô tả bởi địa chỉ bộ nhớ DMA. Sau đó
nó tăng địa chỉ DMA và giảm số bytes phải chuyển. Quá trình này lặp đi
lặp lại cho tới khi số bytes phải chuyển bằng 0, và bộ điều khiển tạo một
ngắt. Như vậy không cần phải copy khối vào trong bộ nhớ, nó đã hiện
hữu trong bộ nhớ. Quá trình chuyển dữ liệu không cần phải chuyển qua
CPU do vậy tốc độ cao hơn.
13.3. Giao diện I/O các ứng dụng
Hệ điều hành cần phải tạo ra một giao diện đồng nhất, tiêu chuẩn,
cho phép các chương trình ứng dụng có thể truy cập đến các thiết bị vào
ra mà không cần phải quan tâm đến cấu trúc vật lý, cách điều khiển của
từng thiết bị.
Một chương trình có thể sử dụng cùng một phương pháp để mở file
trên đĩa cho dù file được quản lý theo FAT (trên DOS, Windows 9X) hay
NTFS của Windows NT, Windows 2000. Mặc dù hai hệ thống file này là
hoàn toàn khác nhau.
Một hệ thống vào ra thường được quản lý theo kiểu phân lớp.
Tương ứng với mỗi thiết bị phần cứng có một bộ điều khiển riêng. Bộ điều
khiển này có thể làm việc một cách độc lập và giao tiếp với CPU thông
qua hệ thống ngắt và các cổng vào ra. Bản thân hệ điều hành phải có
phần mềm điều khiển thiết bị riêng biệt cho từng thiết bị và tạo ra giao
diện thuần nhất, chuẩn chung cho các chương trình ứng dụng.
Phần cứng điều khiển thiết bị vào ra thường được thiết kế sẵn và đi
cùng với thiết bị vào ra.
Phần mềm điều khiển thiết bị được cung cấp bởi hệ điều hành. Một
mặt phần mềm điều khiển thiết bị phải giao tiếp với thiết bị theo những
giao thức làm việc riêng của thiết bị, mặt khác nó phải tạo ra một giao
diện chuẩn cho các chức năng khác của hệ điều hành, cho các chương
trình ứng dụng và trực tiếp là người sử dụng thông qua đó để điểu khiển,
khai thác các thiết bị.
132
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
Nhân hệ thống
Nhân hệ thống vào ra
Bộ điều khiển
Điều
khiển
thiết bị
SCSI
Điều
khiển
bàn
điều
khiển
chuột
...
Điều
khiển khiển
PCI
Bus
điều
điều
khiển
ATAPI
đĩa
mềm
phím
SCSI
Bàn
phím
chuột
...
PCI
bus
Ổ đĩa
mềm
ATAPI
Hình 13.2: Một cấu trúc nhân của hệ thống vào ra
Trong máy tồn tại nhiều loại thiết bị khác nhau. Các thiết bị này
đều có những nét đặc trưng và có thể phân biệt dựa trên một số đặc điểm
như:
-
Truyền dữ liệu theo luồng ký tự hay khối: hệ thống làm việc
theo luồng ký tự sẽ tiến hành truyền dữ liệu từng byte một.
Trong khi đó, hệ thống làm việc theo khối sẽ truyền dữ liệu theo
từng khối dữ liệu.
-
Truy cập tuần tự hay ngẫu nhiên: Hệ thống truy cập tuần tự đòi
hỏi dữ liệu phải được truy cập theo một trình tự xác định,
thường theo một chiều nhất đinh. Với hệ thống truy cập ngẫu
nhiên, dữ liệu có thể truy cập bất xứ khi nào và ở vị trí bất kỳ.
Đồng bộ hay không đồng bộ: hệ thống đống bộ sẽ tiến hành
truyền dữ liệu với các thời điểm trả lời xác định trước. Hệ thống
không đồng bộ sẽ truyền dữ liệu ở thời điểm bất kỳ.
Chia sẻ được hay không: có hệ thống có khả năng chia sẻ, cho
phép nhiều người dùng có thể truy cập trong cùng một thời
điểm. Có thiết bị chỉ cho phép một truy cập trong một thời
điểm.
-
-
Phạm Ngọc Hưng
133
Hệ thống vào ra
-
-
Tốc độ xử lý: có thiết bị có tốc độ xử lý, chuyển dữ liệu cao như
ổ cứng nhưng cũng có thiết bị có tốc độ rất thấp như ổ mềm.
Khả năng ghi đọc: thiết bị cho phép cả ghi lẫn đọc hay chỉ cho
phép ghi hoặc đọc dữ liệu.
Hinh 13.3 thể hiện đặc tính của một số thiết bị vào ra.
Đặc tính
Giá trị
Ví dụ
thiết bị đầu cuối
đĩa
chế độ chuyển dữ liệu ký tự
khối
phương pháp truy cập tuần tự
băng từ
ngẫu nhiên
đồng bộ
đĩa từ
kiểu truyền dữ liệu
khả năng chia sẻ
tốc độ
băng từ
không đồng bộ
có thể chia sẻ
không thể chia sẻ
thời gian tìm, định vị
dữ liệu, thời gian
truyền, khoảng trễ
giữa các lệnh
chỉ đọc
bàn phím
bàn phím
băng từ
chiều truy cập dữ liệu
đĩa CD
chỉ ghi
cả ghi lẫn đọc
màn hình
đĩa mềm
Hình 13.3: Đặc tính của hiết bị vào ra
13.4. Nhân hệ thống I/O
Nhân hệ thống cung cấp rất nhiều các dịch vụ liên quan đến hoạt
động vào ra. Một số dịch vụ như lập lịch, đệm dữ liệu, tạo cache, xử lý lỗi
được cung cấp bởi một hệ thống nhân con vào ra (I/O subsystem kernel)
được thiết kế ngay trên phần cứng và ở cấu trúc bên trong của bộ điều
khiển thiết bị.
Sự lập lịch vào ra (I/O Scheduling)
Là việc sắp lịch một tập các yêu cầu vào ra (I/O requests) nghĩa là
xác định một thứ tự thực hiện tốt nhất các yêu cầu vào ra. Trật tự mà các
ứng dụng sử dụng đến lời gọi hệ thống gần như là một lựa chọn tốt nhất.
134
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
Lập lịch có thể cải tiến khả năng thực hiện của hệ thống, có thể chia sẻ
hoạt động truy nhập thiết bị giữa các tiến trình và giảm thời gian chờ đợi
hoạt động vào ra được hoàn tất.
Các nhà phát triển hệ thống có thể cài đặt lập lịch bằng việc duy trì
một hàng đợi các yêu cầu vào ra cho mỗi thiết bị. Khi một ứng dụng dùng
đến một lời gọi hệ thống vào ra, yêu cầu đó sẽ được đưa vào hàng đợi
cho thiết bị tương ứng. Bộ lập lịch có thể sắp xếp lại hàng đợi này để cải
tiến và nâng cao hiệu quả làm việc của toàn bộ hệ thống.
Đệm dữ liệu
Bộ đệm (buffer) là một vùng nhớ dùng để lưu dữ liệu trung gian
trong quá trình chuyển dữ liệu giữa hai hay nhiều các thiết bị với một ứng
dụng. Bộ đệm được sử dụng trong quá trình chuyển dữ liệu giữa thiết bị
vào ra và chương trình là vì các lý do sau:
-
Tốc độ xử lý và chuyển dữ liệu của các thiết bị khác nhau. Hay
thiết bị với tốc độ làm việc khác nhau sẽ không thể thực hiện
công việc một cách đồng bộ. Để thiết bị có tốc độ chậm hơn có
thể tiếp nhận và xử lý được đủ các dữ liệu thì dữ liệu đó cần
phải được lưu lại và chuyển dần cho thiết bị có tốc độ chậm.
Cho phép các thiết bị có phạm vi (kích thước) truyền dữ liệu
khác nhau có thể làm việc được với nhau.
-
-
Tăng tốc độ truy cập dữ liệu trên các thiết bị có tốc độ thấp.
14. Cấu trúc lưu trữ khối
14.1. Cấu trúc của đĩa
Đĩa (đĩa cứng, đĩa mềm, đĩa CD,...) là các thiết bị lưu trữ thứ cấp
được sử dụng chủ yếu cho các hoạt động lưu trữ dữ liệu trên các máy tính
hiện đại. Trước kia, dữ liệu được lưu trữ trên băng từ. Do tốc độ truy cập
quá thấp, thê vào đó là nhược điểm chỉ cho phép truy cập tuần tự nên
hiện nay băng từ không còn được sử dụng như một thiết bị lưu trữ chính
nữa mà nó chỉ được dùng để sao lưu dự phòng.
Phạm Ngọc Hưng
135
Hệ thống vào ra
Cấu trúc vật lý đĩa cứng bao gồm các bộ phận:
- Vỏ đĩa
- Đĩa từ
- Đầu ghi đọc
- Hệ thống truyền động
- Động cơ quay đĩa
- Vỉ mạch điều khiển
Nguyên tắc ghi dữ liệu trên đĩa cứng:
Một đĩa cứng có thể có nhiều mặt đĩa. Mặt đĩa được chia thành
nhiều rãnh đồng tâm được gọi là tracks. Mỗi track chia thành nhiều các
cung gọi là sector. Số lượng sector trên các tracks là như nhau mặc dù
đường kính track là khác nhau. Dữ liệu được ghi trên các sector. Mỗi
sector có thể chứa được nhiều bytes dữ liệu (thường 512 bytes). Khả
năng lưu thông tin của một sector thường là lớn hơn 512 bytes nhưng
phải đề dành một vùng cho việc mã hoá và lưu các thông tin để giúp cho
việc kiểm tra và sửa lỗi.
Tập hợp các tracks có cùng bán kính trên các mặt đĩa của các đĩa
tạo thành một trụ từ (cylinder).
Nhóm các sector liên tục (một cách logic) tạo thành các liên cung
(cluster). Dữ liệu thường được ghi theo liên cung.
Một track
Chồng đĩa
Đầu ghi đọc
Một sector
Hình 14.1: Cấu trúc đĩa cứng
136
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
14.2. Lập lịch cho đĩa
Một trong các yêu cầu quan trọng đối với một hệ điều hành là sử
dụng một cách hiệu quả các thiết bị phần cứng. Đĩa là loại thiết bị có tốc
độ truy cập cao và băng thông rộng. Thời gian truy cập bao gồm hai loại
thời gian là là thời gian tìm (seek time) và thời gian chờ đĩa quay đến
đúng vị trí yêu cầu (rotational latency). Seek time là thời gian mà đầu từ
cần sử dụng để di chuyển đến track cần tìm. Độ rộng của băng thông
(bandwidth) là tổng số bytes có thể chuyển chia cho tổng thời gian tính từ
lúc phát ra yêu cầu đầu tiên cho đến khi hoàn tất việc chuyển dữ liệu. Ta
có thể cải thiện thời gian truy cập và băng thông bằng cách lập lịch đáp
ứng các yêu cầu vào ra đĩa theo một trình tự tốt nhất có thể.
Chế độ FCFS
Đây là kiểu lập lịch đĩa đơn giản nhất. Yêu cầu vào ra nào xuất hiện
trước thì nó được phục vụ trước. Phương pháp này có một nhược điểm
lớn là thời gian truy cập thường cao mà lẽ ra có thể cải thiện được bằng
cách đổi trật tự phục vụ các yêu cầu.
Giả sử hiện tại đầu đọc đang ở cylinder số 10, bầy giờ cần phải đọc
một chỗi các cylinder theo trật tự xuất hiện sau:
98, 183, 37, 122, 14, 65, 67
Trước hết đầu từ phải vượt quá 88 cylinder để đến được cylinder
198 rồi 85 cylinder tiếp theo để đến cylinder 183 và cứ như vậy cho đến
khi đến cylinder 76 cuối danh sách, đầu từ phải vượt qua 565 cylinder.
Nếu đổi lại trật tự phục vụ là 14, 37, 65, 67, 98, 122, 183 thì tổng số
cylinder đầu từ phải di chuyển qua chỉ còn 173 cylinder. Rõ ràng là nếu
sắp xếp lại thì thời gian truy cập sẽ ngắn hơn nhiều.
Chế độ SSTF
Theo chế độ này, tiến trình có yêu cầu mà thời gian tìm kiếm ngắn
nhất (shortest-seek-time-first) sẽ được ưu tiên phục vụ trước. Thuật toán
này sẽ giảm thời gian tìm kiếm tính từ vị trí hiện hành của đầu đọc. Với
chỗi các cylinder theo trật tự xuất hiện là 98, 183, 37, 122, 14, 65, 67 sẽ
được phục vụ theo trật tự 14, 37, 65, 67, 98, 122, 183 nếu đầu đọc hiện
ở cylinder số 10.
Phạm Ngọc Hưng
137
Hệ thống vào ra
0
10
14
37
65
67
98
122
183
Chuỗi cylinder cần đọc: 98, 183, 37, 122, 14, 65, 67
Vị trí đầu đọc hiện tại: 10
Đầu đọc phải di chuyển qua 565 cylinder
Hình 14.2: Lập lịch đĩa theo FCFS
0
10
14
37
65
67
98
122
183
Chuỗi cylinder cần đọc: 98, 183, 37, 122, 14, 65, 67
Vị trí đầu đọc hiện tại: 10
Đầu đọc chỉ phải di chuyển qua 173 cylinder
Hình 14.2: Lập lịch đĩa theo SSTF
138
Phạm Ngọc Hưng
HỆ ĐIỀU HÀNH
14.3. Quản lý đĩa
Định dạng đĩa (Disk Formatting)
Một đĩa từ trước khi có thể sử dụng, nó cần phải được định dạng.
Công việc định dạng nhằm tạo nên các khuôn mẫu để ghi đọc dữ liệu trên
đĩa. Thông tin về khuôn mẫu định dạng thường được lưu trên một khối
đặc biệt đầu đĩa (thường là boot sector và master boot trên đĩa cứng).
Thông tin định dạng thường bao gồm: số track trên đĩa, số sector trên
một track, kích thước một sector (số bytes trên một sector), cách mã hoá,
thông tin về sự phân vùng,...
Khối khởi động (Boot block)
Đây là một khối có chức năng đặc biệt trên đĩa, thường nằm ở vị trí
đầu đĩa. Boot block thường chứa một phần hay toàn bộ thông tin về định
dạng đĩa. Đặc biệt, trên đó còn chứa một chương trình mồi (bootstrap
program) dùng để khởi động hệ điều hành. Chương trình này sẽ được
chạy ngay sau khi khởi động và kiểm tra xong phần cứng. Chương trình
mồi sẽ giúp khởi tạo và nạp toàn bộ hệ điều hành.
Khối hỏng (Bad block)
Trong quá trình hoạt động, do tiếp xúc có khí nên bề mặt đĩa đến
một lúc nào đó sẽ bị hỏng dẫn đến dữ liệu không lưu lại được hoặc là đọc
ra không đúng. Bề mặc đĩa có thể bị hỏng trên từng phần. Một khối dữ
liệu trên đĩa có thể rơi vào đúng một ví trí hỏng nào đó và để tránh mất
dữ liệu, hệ điều hành sẽ đánh dấu khối chứa vùng dữ liệu bị hỏng đó.
Khối này được gọi là Bad block. Trong quá trình ghi dữ liệu xuồng đĩa, hệ
điều hành sẽ bỏ qua các khối được đánh dấu là bad.
Phân vùng đĩa (Partition)
Một đĩa có dung lượng lớn thường được chia thành các vùng nhỏ
để thuận tiện trong quản lý cũng như khai thác đĩa. Mỗi vùng được chia ra
gọi là một partition. Mỗi một đĩa cứng thường chứa các bảng partition trên
đó cho biết đĩa được chia thành bao nhiêu vùng. Kích thước, vị trí mỗi
vùng. Cách quản lý dữ liệu trên mỗi vùng. Các thông tin này thường được
lưu trong sector vật lý đầu tiên của đĩa được gọi là Master boot.
Phạm Ngọc Hưng
139
Hệ thống vào ra
14.4. Cấu trúc RAID
Để đảm bảo an toàn cho dữ liệu ghi trên đĩa, hệ điều hành cần
phải có cơ chế bảo vệ. Một trong các giải pháp đảm bảo an toàn là sử
dụng một mảng các đĩa với các kỹ thuật ghi dữ liệu trên các đĩa này được
gọi là RAID (Redundant Arrays of Inexpensive Disk).
Các mức RAID:
-
Mức 0: tham chiếu đến một mảng các đĩa ghi dữ liệu ở mức
khối và không có bất cứ kỹ thuật đảm bảo an toàn nào.
Mức 1: các đĩa sẽ được ghi song song (disk mirroring)
Mức 2: sử dụng bit kiểm tra chẵn lẻ cho từng byte. Trong số các
đĩa được dùng, phải để riêng ra một số đĩa chứa các bit kiểm tra
này.
-
-
-
-
Mức 3: sử dụng bit kiểm tra để phát hiện và sửa sai cho cả khối.
Mức này cần ít đĩa phục vụ cho kiểm tra và sửa sai hơn so với
mức 2.
Mức 4: sử dụng khối kiểm tra chẵn lẻ. Nếu một trong số các đĩa
bị lỗi thì khối kiểm tra chẵn lẻ sẽ được sử dụng để khôi phục lại
đĩa bị lỗi từ các đĩa khác.
-
-
Mức 5: sử dụng các bit kiểm tra chẵn lẻ được ghi phân tán trên
các đĩa.
Mức 6: gần giống như mức 5. Thay vì dùng kiểm tra chẵn lẻ thì
mức 6 sử dụng kỹ thuật mã hoá theo Reed-Solomon Code để
mã hoá dữ liệu giúp cho phát hiện và sửa sai.
14.5. Bài tập
1. Nêu cấu tạo của ổ cứng.
2. Phân tích cấu trúc logic của ổ cứng.
3. Nêu nguyên tắc ghi dữ liệu trên ổ ứng.
4. Trình bày các chế độ lập lịch cho đĩa.
5. Nêu đặc điểm các mức RAID.
140
Phạm Ngọc Hưng
Bạn đang xem tài liệu "Giáo trình Hệ điều hành - Chương 4: Hệ thống vào ra - Phạm Ngọc Hưng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
- giao_trinh_he_dieu_hanh_chuong_4_he_thong_vao_ra_pham_ngoc_h.pdf