Tải bản đầy đủ (.pdf) (13 trang)

Giáo Trình Kiến Trúc Máy Tính - Nguyễn Hữu Lộ phần 9 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (172.52 KB, 13 trang )

Cấn Trúc Máy Tính
-105-
(a) các thanh ghi nhanh hơn bộ nhớ chính
(b) bởi vì có quá ít thanh ghi nên chỉ cần ít bit để đòa chỉ hóa chúng.
Đáng tiếc là có 8 hoặc 16 thanh ghi cũng làm phức tạp cho việc lập trình do bởi
phải tạo ranhiều quyết đònh như : các toán hạng nào, các kết quả trung gian nào được
giữ trong số thanh ghi giới hạn đó và các toán hạng nào, các kết quả trung gian nào
được giữ trong bộ nhớ chính. W.L.vander Poel (1968) đã nhận xét một cách tinh tế, các
máy tính phải được cung lớp hoặc 0, 1 hoặc một số vô hạn cho mỗi đặc tính (vô hạn có
nghóa là nhiều đủ để người lập trình không cần phải tốn thời gian suy nghó phải làm gì
nếu điều gì đó đã được dùng hết ).
Cả 2 chip Intel và Motorola đều có một lượng lớn các lệnh lấy các toán hạng từ
các thanh ghi và đặt kết quả vào một thanh ghi.
4. Đònh đòa chỉ gián tiếp
Đònh đòa chỉ trực tiếp làsơ đ ừ nhớ nào hoặc thanh ghi
nào c
ồ trong đó đòa chỉ cho biết t
hứa toán hạng. Đònh đòa chỉ gián tiếp là sơ đồ trong đó đòa chỉ cho biệt từ nhớ nào
hoặc thanh ghi nào chứa đòa chỉ của toán hạng. Thí dụ xét một lệnh nâp một thanh ghi
(chúng ta sẽ gọi là thanh ghi R1 ) gián tiếp từ vò trí nhớ 1000, nội dung tại vò trí 1000 là
1510.

Hình 5.8: Đòa chỉ gián tiếp
ào 1 thanh ghi nội của CPU. Nội
dung it na ong R1, ta có
lệnh
a gọi là con trỏ (pointer).
Trước tiên nội dung tại vò trí 1000 được tìm nạp v
16 b øy (1510) không được đặt trong thanh ghi R1. Nếu 1510 có tr
đòa chỉ trực tiếp. Thay vào đó nội dung của vò trí 1510 được tìm nạp và đặt vào
R1. Nội dung ở vò trí 1000 không phải là toán hạng mà trỏ tới toán hạng và vì lý do


này, t
Các bộ xử lý của Intel đều có đònh đòa chỉ gián tiếp thông qua thanh ghi. Thí du
có thể đặt con trỏ trong SI và chỉ ra rằng toán hạng đặt trong bộ nhớ tại đòa chỉ được
trỏ tới bởi SI. Trên 8088 và 80286, chỉ có BX, BP, SI và DI được sử dụng trong kiểu
đòa chỉ gián tiếp, trên 80386 tất cả các thanh ghi đều có thể sử dụng được cho kiểu
đònh đòa chỉ này. Đònh đòa chỉ gián tiếp dùng con trỏ trong bộ nhớ không thực hiện
được trên bất kỳ thanh ghi nào.
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-106-
68000 cho phép đòng đòa chỉ gián tiếp thông qua các thanh ghi đòa chỉ và không
có da ònh án tiếp
còn c
n tiếp và đòa chỉ gián tiếp nhiều lớp biểu diễn một
sự tie
một tham chiếu
bộ nhớ để tìm nạp toán hạng. Đònh đòa chỉ gián tiếp cần 2 tham chiếu bộ nhớ, một cho
con trỏ và một cho toán hạng. Đònh đòa chỉ gián tiếp nhiều lớp cần ít nhất 3 tham chiếu
bộ nh
ïng đ đòa chỉ gián tiếp nào khác. Trên 68020 và 68030 đònh đòa chỉ gi
ó dạng thông qua bộ nhớ. Đây là một trong những khác nhau chính giữa 68000 và
các CPU sau này.
Một số máy cho phép đònh đòa chỉ gián tiếp nhiều lớp. Ở kiểu đònh vò đòa chỉ này,
người ta dùng một con trỏ để đònh vò một từ nhớ và chính từ nhớ này trỏ tới một từ nhớ
khác và vv…
Đòa chỉ tức thời, trực tiếp, giá
án triển trong việc đònh đòa chỉ. Đònh đòa chỉ tức thời không cần tham chiếu bộ nhớ
vì toán hạng được tìm nạp cùng lúc với lệnh. Đònh đòa chỉ trực tiếp cần
ớ, 2 hoặc nhiều tham chiếu cho con trỏ và một cho toán hạng. Các tham chiếu bộ
nhớ trong ngữ cảnh này gồm các tham chiếu thanh ghi.

5. Đònh chỉ số
Nhiều thuật toán cầøn thực hiện một thao tác nào đó trên một chuỗi cấu trúc dữ
liệu lưu giữ trong những vò trí nhớ liên tiếp. Thí dụ xét một khối n từ máy chiếm các vò
trí
A, A +1, A+2,…,A+n-1
Các từ này phải được chuyển đến các vò trí
B,B+1,B+2,…,B+n-1
Giả thuyết rằng máy có lệnh
MOVE A,B
Chuyển nội dung của vò trí A tới vò trí B, người ta có thể thực thi lệnh này và thay
đổi trên chính lệnh thành
MOVE A+1,B+1
Thực thi lệnh lần nữa, sau và lập lại cho tới khi tất
cả n
quyết bằng đònh đòa chỉ gián tiếp. Một
thanh
đó lại thay đổi lệnh lần nữa
từ được sao chép hết.
Mặc dù các chương trình tự thay đổi được dùng phổ biến trước kia, nhưng nay
được xem như một phương cách lập trình dở. Các chương trình như vậy khó sửa sai và
làm khó khăn cho việc dùng chung một chương trình giữa nhiều người sử dụng trong
hệ thống phân chia thời gian.
Vấn đề sao chép cũng có thể được giải
ghi hoặc một từ nhớ được nạp với đòa chỉ A ; một thanh ghi hoặc một từ nhớ thứ
2 được nạp với đòa chỉ B. lệnh MOVE dùng 2 thanh ghi này làm các con trỏ. Sau mỗi
lần sao chép một từ , các con trỏ được tăng thêm 1. Các con trỏ là một phần của dữ
liệu, không phải là phần của chương trình và những người sử dụng không được dùng
chung đồng thời.
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính

-107-
Một giải pháp khác là có 1 hoặc nhiều thanh ghi, gọi là thanh ghi chỉ số (Index
register) hoạt động như sau. Đòa chỉ có 2 phần: số của một thanh ghi chỉ số và một
hằng số. Đòa chỉ của toán hạng là tổng của hằng số với nội dung của thanh ghi chỉ số.
Trong thí dụ trước, nếu cả 2 đòa chỉ được đònh chỉ số bằng cách dùng một thanh ghi chỉ
số ch
sẽ nhanh hơn việc tăng 1 vò trí nhớ.
anh ghi chỉ số đặc biệt tự động
tăng hoặc giảm. Sự thay đổi tự động của một thanh ghi chỉ số được gọi là tự đònh chỉ số
(auto
6 áp
ứa số nguyên k, lệnh MOVE A, B sẽ chuyển nội dung của vò trí nhớ A+k tới B+k.
Bằng cách khới động thanh ghi chỉ số là 0 và tăng nội dung thanh ghi này lên một
lượng bằng kích thước của từ sau khi sao chép 1 từ, chỉ cấn một thanh ghi cho vòng lặp
sao chép. Hơn nữa, việc tăng thanh ghi
Đònh chỉ số (indexing) cũng thường được dùng để đònh đòa chỉ 1 trường có offset
đã biết từ vò trí bắt đầu 1 cấu trúc đã cho. Các biến cục bộ trong một thủ tục cũng được
truy xuất theo phương pháp này.
Trong thí dụ đã cho ở trên, người ta cần tăng thanh ghi chỉ số một lượng đúng
bằng kích thước của từ sau mỗi lần sử dụng. Nhu cầu tăng hoặc giảm thanh ghi chỉ số
ngay trươc hoặc sau khi sử dụng rất phổ biến nên 1 số máy tính cung lớp những lệnh
hoặc các kiểu đònh đòa chỉ đặc biệt hoặc thậm chí các th
indexing).
Cả 2 chip của Intel và Motorola đều có nhiều kiểu đònh đòa chỉ khác nhau bao
gồm đònh chỉ số. 680x0 cũng có kiểu tự đònh chỉ số.
. Đònh đòa chỉ ngăn xe
h máy càng ngắn càng tiết kiệm bộ
nhớ và thời gian của CPU. Giới hạn cuối cùng của việc giảm chiều dài đòa chỉ sẽ dẫn
đến các lệnh không có đòa chỉ, chỉ có opcode. Đây là điều có thể xảy ra bằng cách tổ
chức máy xung quanh một cấu trúc dữ liệu gọi là ngăn xếp (Stack).

nhớ. Phần tử đầu tiên được cất vào ngăn xếp. Phần tử gần
nhất được cất vào stack sẽ ở đỉnh ết hợp với một ngăn xếp là một
thanh
Chúng ta đã lưu ý rằng việc tạo ra các lện
Ngăn xếp bao gồm các phần tử dữ liệu ( từ, ký tự, bit, vv…) được cất theo một
trật tự liên tiếp trong bộ
của ngăn xếp. K
ghi hoặc từ nhớ chứa đòa chỉ của đỉnh ngăn xếp, được gọi là con trỏ ngăn xếp
(stack pointer).
Mặt dù đã thảo luận về ngăn xếp ở chương 4, chúng ta cũng sẽ ôn lại ở đây bởi
vì việc sử dụng ngăn xếp cho các phép toán số học hoàn toàn khác với việc sử dụng
ngăn xếp để lưu giữ các biến cục bộ ( dó nhiên có thể dùng kết hợp cả 2). Hình 5.9
minh họa hoạt động của ngăn xếp. Trong hình 5.9(a) đã có 2 phần tử trong ngăn xếp.
Đáy của ngăn xếp ở vò trí nhớ 1000 và đỉnh của ngăn xếp ở vò trí nhớ 1001. Con trỏ
ngăn xếp chứa đòa chỉ của phần tử trên đỉnh ngăn xếp, tức là 1001 ; nghóa là trỏ tới
đỉnh của ngăn xếp. Trong hình 5.9(b), 6 được cất vào ngăn xếp và con trỏ ngăn xếp
chứa 1002 là đỉnh mới của ngăn xếp. Trong hình 5.9(c), 75 được cất lên ngăn xếp, tăng
con trỏ ngăn xếp lên 1003. Trong hình 5.9(d), 75 được lấy ra khỏi ngăn xếp.
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-108-

Hình 5.9: Hoạt động của một ngăn xếp
Các máy tính hướng ngăn xếp (stack-oriented) có lệnh cất ( push) các nội dung
của vò trí nhớ hoặc thanh ghi vào ngăn xếp. Một lệnh như vậy phải thực hiện việc sao
chép phần tử đó và tăng con trỏ ngăn xếp. Tương tự, lệnh lấy (pop) đỉnh của ngăn xếp
đưa vào thanh ghi hoặc vò trí nhớ phải thực hiện một sao chép mới vào nơi thích hợp và
giảm con trỏ ngăn xếp. Một số máy tính có ngăn xếp đảo ngược, với những phần tử
được
III. LUO

cất liên tiếp vào những vò trí thấp hơn của bộ nhớ thay vì cất liên tiếp vào những
vò trí cao hơn như trong hình 5.9.
ÀNG ĐIỀU KHIỂN
Luồng diều khiển có liên quan tới trình tự thực thi các lệnh. Nhìn chung, các lệnh
được thực hiện lần lược được tìm nạp từ những vò trí liên tiếp. Các lệnh gọi thủ tục là
nguyên nhân làm thay luồng điều khiển, dừng thủ tục đang thực hiện hiện tại và bắt
đầu thủ tục được gọi. Đồng thường trình (corou
iều khiển tuần tự và các lệnh nhảy.
tine) liên quan đến thủ tục (procedure)
và làm cho luồng điều khiển bò thay đổi. Các bẩy và các ngắt cũng làm cho luồng điều
khiển thay đổi khi có các điều kiện đặc biệt xảy ra. Tất cả các vấn đề này sẽ được
thảo luận trong các phần sau.
1. Luồng đ
thực hiện
không còn đúng nữa. Khi có mặt các lệnh nhảy, bộ đếm chương trình không còn là một
hàm tăng đều theo thời gian. Kết quả là khó hình dung chuỗi thực thi lệnh từ bản danh
Đa số các lệnh không làm thay đổi luồng điều khiển. Sau khi một lệnh được thực
hiện, lệnh tiếp theo sau trong bộ nhớ được tìm nạp và thực hiện. Sau mỗi một lệnh, bộ
đếm chương trình được tăng bởi chiều dài của lệnh. Nếu quan sát trên một khoảng thời
gian dài so với thời gian trung bình của lệnh, bộ đếm chương trình gần như có một hàm
tuyến tính theo thời gian. Nói cách khác, trật tự động trong đó bộ xử lý thực sự thực
hiện các lệnh giống như trật tự trong đó các lệnh xuất hiện theo sự liệt kê của chương
trình.
Nếu chương trình chứa các lệnh nhảy, mối liên hệ đơn giản này giữa trật tự trong
đó các lệnh được thực hiện trong bộ nhớ và trật tự trong đó các lệnh được
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-109-
sách của chương trình. Khi người lập chương trình gặp rắc rối trong việc theo dõi chuỗi
lệnh mà bộ xử lý sẽ thực thi, họ dễ gây ra lỗi.

Sự quan sát này đã dẫn đường cho Dijkstra (1968) viết một thư gây tranh luận sau
này có tựa đề ‘GO TO Statement Considered Harmfull ‘ (phát biểu GO TO được xem
như có hại), trong đó ông đề nghò nên tránh dùng phát biểu GO TO. Bức thư đó làm
khai sinh ra cuộc cách mạng cho phương pháp lập trình có cấu trúc, một trong những
nguyên lý của phương pháp này là thay thế phát biểu GO TO bằng những dạng có cấu
trúc hơn của luồng điều khiển, như vòng lập WHILE.
Dó nhiên, những chương trình này biên dòch thành những chương trình lớp 2 chứa
nhiều lệnh nhảy, bởi vì hiệbn thực IF, WHILE và những cấu trúc điều khiển lớp cao
khác yêu cầu việc nhảy.
2. Thủ tục
. Từ quan điểm này, lệnh gọi thủ tục được xem như
một lệnh đơn cho dù có thể rất phức tạp. Để hiểu phần mã chứa lệnh gọi thủ tục, điều
cần biết cách thực hiện.
3
Kỹ thuật quan trọng nhất đối với các chương trình có cấu trúc là thủ tục. Lệnh gọi
thủ tục cũng làm thay đổi dòng điều khiển như lệnh nhảy nhưng không giống. Khi thực
hiện song công việc, thủ tục trả điều khiển trở về cho phát biểu hoặc lệnh theo sau
lệnh gọi.
Tuy nhiên, với cách nhìn khác, phần thân của thủ tục có thể được xem như xác
đònh một lệnh mới ở lớp cao hơn
duy nhất cần biết là làm gì, không
. Đồng thủ tục.
Trong chuỗi gọi thông thường, có sự phân biệt rõ giữa thủ tục gọi và thủ tục được
gọi.
Xét thủ tục A gọi thủ tục B. Thủ tục B tính toán trong một khoảng thời gianvà sau
đó trở về thủ tục A. Thoạt nhìn có lẽ ta sẽ nghó rằng tình huống này có tính đối xứng,
bởi vì cả A và B đều không phải là chương trình chính, chúng đều là các thủ tục. Hơn
nữa, điều khiển đầu tiên được chuyển từ A tới B – gọi – và sau đó điều khiển được
chuyển từ B tới A – trở về.
Tính không đối xứng nảy sinh từ thực tế. Khi điều khiển chuyển tứ A tới B , thủ

tục B bắt đầu được thực thi ở đầu thủ tục; khi điều khiển từ B trở về A , việc thực thi A
không phải ở đầu thủ tục mà ở phát biểu theo sau lời gọi thủ tục B. Nếu A chạy thêm
một khoảng thời gian và gọi B lần nữa, việc thực thi B lại bắt đầu ở đầu thủ tục B,
không phải ở phát biểu theo sau lần trở về trước. Trong hướng hoạt động này, nếu A
gọi B nhiều lần, B luôn luôn bắt đầu lại ở đầu thủ tục mỗi lần được gọi, trái lại A
không bao giờ bắt đầu lại từ đầu thủ tục.
Sự khác nhau này được phản ánh trong cách mà điều khiển được chuyển giữa A
và B. Khi A gọi B, A dùng lệnh gọi thủ tục lệnh này đặt đòa chỉ quay về (đòa chỉ của
phát biểu theo sau lệnh gọi ) vào nơi nào đó thí dụ vào đỉnh của ngăn xếp. Sau đó lệnh
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-110-
này đặt đòa chỉ của B vào bộ đếm chương trình để hoàn tất việc gọi. Khi B trở về, B
không sử dụng lệnh gọi mà là lệnh quay về, lệnh này đơn giản chỉ lấy đòa chỉ trở về từ
ngăn
xem thủ tục kia như là một thủ
tục đ
xếp và đặt vào bộ đếm chương trình .
Đôi khi ta có 2 thủ tục A và B, thủ tục này gọi thủ tục kia như là một thủ tục.
Khi từ B trở về A, điều khiển nhảy tới phát biểu theo sau lệnh gọi B. Khi A
chuyển điều khiển tới B, điều khiển không đi tới phát biểu đầu tiên của thủ tục (trừ
lầu đầu tiên) mà đi tới phát biểu theo sau phát biểu “trở về “ gần nhất, nghóa là, lần
gọi A gần đây nhất 2 thủ tục mà trong đó thủ tục này
ược gọi là các đồng chương trình (coroutine) hay đồng thủ tục.
4. Bẫy
Bẫy (trap) là một loại lời gọi thủ tục tự động được khởi động bởi 1 điều kiện nào
đó do chương trình tạo ra ,thường là điều kiện quan trọng nhưng hiếm khi xảy ra. Tràn
(over
änh nhảy tới 1 thủ tục gọi là bộ điều khiển bẫy (trap handler), bộ này thực
hiện

ương trình phát hiện. Một
phư ả năng điều khiển tràn là dùng một thanh ghi 1 bit được thiết
lập là 1 mỗi khi xảy ra tràn. Người lập trình muốn kiểm tra tràn phải đưa thêm vào một
lệnh
g gian nhớ vừa làm cho tốc độ chậm lại. Bẫy tiết kiệm được thời gian và bộ nhớ
so vơ
ở một lớp có thể ở dưới sự điều khiển của chương trình ở
lớp th
a chỉ lẻ và chia cho zero.
flow) là một thí dụ. Trên nhiều máy tính, nếu kết quả của 1 phép toán số học
vượt quá số lớn nhất có thể biểu diễn, một bẫy xuất hiện, nghóa là luồng điều khiển
được chuyển đến 1 vò trí nhớ nào đó thay vì tiếp tục theo trình tự. Tại vò trí cố đònh đó
có một le
1 động tác thích hợp nào đó, như in 1 thông báo lỗi. Nếu kết quả của phép toán
nằm trong phạm vi cho phép, bẫy không xuất hiện.
Điểm cơ bản của bẫy là bẫy được khởi động bởi 1 điều kiện ngoại lệ nào đó gây
ra bởi chính chương trình và được phần cứng hoặc vi ch
ơng pháp khác có kh
“nhảy nếu bit tràn được thiết lập” sau mỗi lệnh số học. Hiện thực như vậy vừa tốn
khôn
ùi phương pháp kiểm tra điều khiển bởi người lập trình. Bẫy thường được thực hiện
bằng cách có vi chương trình, vi chương trình này đơn giản chỉ thực hiện sự kiểm tra.
Bẫy cũng có thể được thực hiện nhờ vào việc kiểm tra thực hiện bởi trình biên
dòch ở lớp 1. Nếu phát hiện thấy có tràn, đòa chỉ của bẫy được nạp vào bộ đếm chương
trình. Điều này nghóa là bẫy
ấp hơn. Vi chương trình thực hiện việc kiểm tra vẫn tiết kiệm thời gian hơn so với
việc kiểm tra của người lập trình, bởi vì việc này dễ dàng chồng lấp với viêc khác và
cũng tiết kiệm được bộ nhớ, bởi vì việc này chỉ cần xảy ra ở một vài thủ tục của lớp 1,
độc lập với việc có bao nhiêu lệnh số học xuất hiện trong chương trình chính.
Một vài điều kiện thừơng gây ra bẫy là tràn trên dấu chấm động, tràn dưới dấu

chấm động, vi phạm sự bảo vệ, opcode không được xác đònh, tràn stack, khởi động
thiết bò không có thực, tìm nạp một từ ở đò
5. Ngắt
Ngắt (interrupt) là những thay đổi trong luồng điều khiển gây ra không phải do
chương trình đang được thực thi mà do bởi một tác động khác, thường liên quan tới I/O.
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-111-
thí dụ chương trình ra lệnh cho đóa khởi động truyền thông tin và thiết lập trạng thái
đóa để cung lớp một ngắt ngay khi việc truyền thông tin hoàn tất. Giống như bẫy, ngắt
cũng làm ngừng chương trình đang được thực thi và chuyển điều khiển đến bộ điều
khiển gắt
trả đ
i cùng dữ liệu vào,
bẫy sẽ lại xảy ra ở cùng một nơi cho mỗi lần chạy nhưng ngắt lại khác, thí dụ tuỳ
thuộc
ngắt để thực hiện một số động tác thiùch hợp. Khi hoàn tất, bộ điều khiển n
iều khiển cho chương trình bò ngắt. Chương trình này phải khởi động lại quá trình
bò ngắt một cách chính xác ở trạng thái giống như đã có khi xảy ra ngắt, nghóa là khôi
phục lại tất cả các thanh ghi nội về trạng thái trước khi xảy ra ngắt.
Sự khác nhau cơ bản giữa bẫy và ngắt là các bẫy đồng bộ với chương trình còn
ngắt l không đồng bộ. Nếu chương trình chạy lại một triệu lần vớ
chính xác lúc một người ở thiết bi đầu cuối ấn phím CR (carriage return).
Nguyên nhân đối với việt tái tạo lại bẫy à không tái tạo lại ngắt là bẫy được gây ra
trực tiếp bởi chương trình còn ngắt tốt nhất được gay ra gián tiếp bởi chương trình.
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-112-
CHƯƠNG 6:
LỚP MÁY HỆ ĐIỀU HÀNH



Các chương trước đã trình bày cách thức một trình biên dòch chạy trên lớp vi
chương trình (lớp 1) thực thi các chương trình viết cho lớp máy qui ước (lớp 2). Trên
một máy tính được vi lập trì
ơng
trình viết bằng ngôn ngữ máy lớp 2 một trình phiên dòch chạy trên máy lớp 2 có thể
phiên dòch các chương trình viết bằng ngôn ngừ máy lớp 3. Với các lý do có tính lòch
sử, trình phiên dòch chạy trên máy lớp 2 hỗ trợ cho máy lớp 3 được gọi là hệ điều hành
(operating system). Do vậy chúng ta sẽ gọi lớp 3 là lớp máy hệ điều hành do thiếu
thuật ngữ tổng quát chấp nhận được.
Có sự khác biệt quan trọng giữa cách mà lớp máy hệ điều hành được hỗ trợ cách
mà lớp máy qui ước được hỗ trợ. sự khác nhau này thực tế do bởi lớp máy hệ điều
hành được phát triển dần dần ra khỏi lớp máy qui ước. Hầu hết các lệnh của lớp máy
hệ điều hành cũng hiện diện ở lớp máy qui ước. Chúng ta sẽ gọi những lệnh này là các
lệnh lớp 3 "tầm thường" (ordinary) do bởi chúng bao gồm các thao tác bình thường như
các phép toán số học, logic, dòch bit v v… chúng ta cũng sẽ gọi các lệnh khác của máy
lớp 3 (chúng không hiện diện trong máy lớp 2) là các lệnh OSML (Operating System
Machine Language) để nhấn mạnh chúng chỉ hiện diện trong lớp máy hệ điều hành.
Mặc dù ta có thể có hệ điều hành phiên dòch tất cả các lệnh của lớp 3, nhưng
điều này không có hiệu quả cũng như không cần thiết. Các lệnh lớp 3 tầm thường có
thể được dòch trực tiếp bởi vi chương trình. Tình huống này được mô tả cho trương hợp
máy tính chỉ có 1 bộ nhớ để lưu trữ mọi chương trình. Miễn là chỉ có các lệnh tầm
thường đang thực thi, vi chương trình tìm nạp các lệnh trực tiếp từ chương trình người
sử dụng, khảo sát chúng và thực thi chúng.
Tuy nhiên ngay khi gặp một lệnh OSML, tình huống sẽ thay đổi. Vi chương trình
ngừng phiên dòch chương trình của người sử dụng và bắt đầu phiên dòch hệ điều hành.
Hệ điều hành sau đó khảo sát lệnh OSML trong chương trình người sử dụng và thực thi
lệnh này. Khi lệnh OSML đã được thực thi, hệ điều hành thực thi một lệnh nào đó làm
cho vi chương trình tiếp tục tìm nạp và thực thi các lệnh của chương trình người sử

dụng. Dó nhiên nếu lệnh kế của chương trình người sử dụng cũng là lệnh OSML, hệ
điều hành sẽ được khởi động lần nữa.
Phương pháp thực thi các chương trình lớp 3 này có nghóa là một phần thời gian
máy tính có chức năng của một máy 3-lớp và một phần thời gian có chức năng của một
nh, các lệnh của lớp máy qui ước như gọi thủ tục, nhân và
lập vòng không được thực hiện trực tiếp bằng phần cứng. Thay vào đó, chúng được tìm
nạp, được khảo sát và được thực thi như một chuỗi các bước nhỏ bởi vi chương trình.
Máy lớp hai có thể được lập trình bởi những người không biết gì về máy lớp 1 và trình
phiên dòch của lớp này. Ở chừng mực mà chúng có liên quan, máy lớp 2 có thể được
sử dụng như thể máy này là một phần cứng thật sự .
Cũng như một trình phiên dòch chạy trên máy lớp 1 có thể phiên dòch các chư
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-113-
máy 2-lớp. Trong khi thực thi một ơng trình đang chạy, mỗi chương
trình trên mỗi máy (ảo riêng bao gồmbộ đếm
chươn ình riêng. Mộ của lớp 3 trỏ tới lệnh
OSML, bộ đếm chương trình của lớp 2 trỏ tới lệnh của hệ điều hành đang được thực
thivà bộ đếm chương trình của lớp 1 cho biết phần cứng thực sự mà vi lệnh được thực
thi. T
ta có một hệ thống đa lập trình
nhóm
là xuất/nhập tập tin(file I/O), một khái niệm ở
mức
lệnh OSML, 3 chư
). Mỗi chương trình có một trạng thái
t cách khái quát, bộ đếm chương trình g tr
rong chương này để đơn giản, hệ điều hành sẽ được nghiên cứu như một lớp đơn,
điều này không có nghóa là mọi hệ điều hành đều được tổ chức có một lớp. Ngược lại,
một số hệ điều hành nâng cao được cấu trúc thành 1 chuỗi nhiều lớp.

Điều cần đề cập là đa số các hệ điều hành của các máy tính lớn đều là các hệ
thống đa lập trình (multiprogramming system), nghóa là thay vì chỉ hỗ trợ cho máy ảo
lớp 3, hệ điều hành hỗ trợ cho vài máy ảo lớp 3 chạy song song. Nếu mỗi máy ảo được
nối với một thiế bò đầu cuối từ xa, ta có một hệ thống chia sẻ thời gian (time-shared
system). Nếu không có các thiết bò đầu cuối từ xa,
(batch). Với dạng hỗn hợp, một số máy ảo đang được sử dụng trực tuyến (on
line), một số máy khác thì không. Phần chủ yếu của hệ điều hành liên quan đến việc
quản lý tất cả máy ảo hơn là phiên dòch các lệnh OSML.
Chúng ta sẽ tập trung vào 3 vấn đề quan trọng. Trước tiên là bộ nhớ ảo (virtual
memory), một kỹ thuật được cung cấp bởi nhiều hệ điều hành làm cho máy có nhiều
bộ nhớ hơn là máy thật sự có. Thứ 2
cao hơn các lệnh vào/ra mà ta đã nghiên cứu trong chương trứơc. Thứ 3 và cuối
cùng là xử lý song song, cách mà các quá trình (process) có thể thực thi đồng thời ở lớp
3.
Khái niệm quá trình là một khái niệm quan trọng, chúng ta sẽ mô tả chi tiết sau
trong chương này. Một quá trình có thể xem như một chương trình đang chạy với tất cả
các thông tin trạng thái của chương trình (bộ nhớ, các thanh ghi, bộ đếm chương trình,
trạng thái vào/ra…).

I. BỘ NHỚ ẢO
Trong những ngày đầu của máy tính, bộ nhớ có dung lượng nhỏ và rất đắt tiền.
Máy IBM 650, máy tính khoa học hàng đầu lúc này (vào những năm cuối thập niên
1950) chỉ có một bộ nhớ 2000 từ. Một trong những trình biên dòch viết bằng ALGOL 60
đầu tiên được viết cho máy tính chỉ có 1024 từ nhớ. Một hệ thống chia sẻ thời gian
trước đây chạy rất tốt trên PDP-1 với kích thước bộ nhớ tổng cộng chỉ có 4096 từ 18 bit
cho cả hệ điều hành và các chương trình của người sử dụng. Thời đó những người lập
trình phải tốn nhiều thời gian để nén kích thước các chương trình sao cho đặt vừa trong
một bộ nhớ nhỏ. Thông thường họ dùng một giải thuật chạy rất chậm so với giải thuật
khác mà giải thuật tốt hơn thường sẽ rất lớn nghóa là chương trình sử dụng giải thuật
tốt hơn sẽ không đặt vừa trong bộ nhớ của máy tính.

Giải pháp cho vấn đề này là dùng bộ nhớ phụ, như đóa chẵng hạn. Người lập trình
chia chương trình thành một số mảng nhỏ gọi là phần phủ lấp (overlay) có thể đặt vừa
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-114-
trong bộ nhớ. Để chạy chương trình, phần phủ đầu tiên được đem vào bộ nhớ và chạy
trong một khoảng thời gian. Khi phần phủ đã hoàn tất, chương trình đọc phần phủ kế
tiếp và gọi phần phủ này và v.v. Người lập trình có trách nhiệm tách chương trình
thành các phần phủ, quyết đònh xem mỗi phần phủ được cất ở đâu trong bộ nhớ phụ,
và một cách tổng quát quản lý toàn bộ quá trình phần phủ mà không cần có sự giúp đỡ
nào từ máy tính.
Mặt dù phần phủ được dùng rộng rãi qua nhiều năm nhưng kỹ thuật này kéo theo
nhiều công việc liên quan đến việc quản lý phần phủ. Vào năm 1961, một nhóm người
ở Ma
ùy tính này có thể đòa chỉ hoá 65536 từ nhớ vì có 65536(2
16
) đòa chỉ 16 bit. Số từ đòa
chỉ h
rước khi phát minh ra bộ ảo, người ta đã có sự phân biệt giữa các đòa chỉ dưới
4096 và các đòa chỉ bằng hoặc trên 4096. Mặc dù trước khi được phát biểu thẳng nhưng
xem như không gian đòa chỉ có ích ( các đòa chỉ trên 4096 không
được
nh bày trong hình 6.1.
nchester nước Anh đã dề nghò một phương pháp thực hiện tự động quá trình che
phủ, người lập trình thậm chí không cần biết quá trình che phủ dang xảy ra
(Fotheringham, 1961). Phương pháp này, bây giờ gọi là bộ nhớ ảo, rõ ràng có thuận lợi
trong việc giúp cho người lập trình thoát khỏi nhiều công việc kế toán phiền phức.
Đầu tiên phương pháp này được dùng trên một số máy tính trong những năm
1960, hầu hết thường gắn liền với những đề án nghiên cứu thiết kế hệ thống máy tính.
Bây giờ thậm chí các bộ vi xử lý, kể cả 80386 và 68030 cũng như các bộ vi xử lý sau

này đều có hệ thống bộ nhớ ảo rất phức tạp.

Phân trang
Nhóm Manchester đã nảy sinh một ý tưởng tách riêng khái niệm về không gian
đòa chỉ và các vò trí ô nhớ (memory location). Thí du ïxét một máy tính có một trường
đòa chỉ 16 bit trong các lệnh của máy này và có 4096 từ nhớ. Một chương trình trên
ma
oá được chỉ tuỳ thuộc vào số bit có trong một đòa chỉ và không có liên quan dù
bằng cách nào với số từ nhớ thực sự sử dụng được. Không gian đòa chỉ (address space)
của máy tính này bao gồm các số 0, 1, 2…, 65535 bởi vì đó là tập các đòa chỉ có thể
có.
T
2 phần đòa chỉ được
dùng bởi vì chúng không tương ứng với các đòa chỉ của bộ nhớ thực). Người ta
không có sự phân biệt nhiều giữa không gian đòa chỉ và các đòa chỉ của bộ nhớ thực bởi
vì phần cứng bắt buộc phải có sự tương ứng một-một giữa chúng với nhau.
Ý tưởng tách riêng không gian đòa chỉ và các đòa chỉ bộ nhớ như sau. Bất cứ lúc
nào, 4096 từ của bộ nhớ đều có thể được truy xuất trực tiếp nhưng chúng không cần
tương ứng với các đòa chỉ từ 0 tới 4096. Thí dụ ta có thể “bảo” máy tính rằng từ bây giờ
trở đi mỗi khi đòa chỉ 4096 được tham chiếu, từ nhớ 0 được sử dụng; mỗi khi đòa chỉ
4097 được tham chiếu, từ nhớ 1 được sử dụng; mỗi khi đòa chỉ 8191 được tham chiếu,
từ nhớ 4095 được sử dụng và v.v … nói cách khác ta đã đònh nghóa một ánh xạ từ
không gian đòa chỉ lên các đòa chỉ bộ nhớ thực, như trì
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-115-

Hình 6.1: Ánh xạ trong đó các đòa chỉ từ 4096 tới 8191 được ánh xạ
lên các đòa chỉ bộ nhớ chính từ 0 tới 4095


Bằng hình vẽ này, hình vẽ ánh xạ các đòa chỉ từ không gian đòa chỉ lên các vò trí
bộ nhớ thực, một máy 4K thường chỉ có một ánh xạ cố đònh giữa các đòa chỉ từ 0 tới
4095 và 4096 từ của bộ nhớ, không có bộ nhớ ảo. Một câu hỏi thú vò là: điều gì sẽ xảy
ra nếu trương trình nhảy tới một đòa chỉ nằm trong khoảng 8192 và 12297? trên máy
không có bộ nhớ ảo, chương trình sẽ gây ra một bẫy lỗi ( error trap) in ra một thông
báo thích hợp như “bộ nhớ được tham chiếu không hiện hữu“ (non-existent memory
referenced) và kết thúc chương trình. Trên máy có bộ nhớ ảo, chuỗi các bước sau sẽ
cũng
hư có một
bộ nhớ dung lượng lớn.
xảy ra:
1. Nội dung các bộ nhớ chính sẽ được cất vào bộ nhớ phụ
2. Các từ nhớ từ 8192 tới 12287 được đặt vào bộ nhớ phụ
3. Các từ nhớ từ 8192 tới 12287 được nạp vào bộ nhớ chính
4. Bản đồ đòa chỉ được thay đổi để ánh xạ các đòa chỉ từ 8192 tới
12287 lên các vò trí từ 0 tới 4095
5. Việc thực hiện tiếp tục như thể không có gì bất thừơng đã xảy ra
Kỹ thuật che phủ tự động này được gọi là sự phân trang (paping) và những đoạn
(chunk) của chương trình được đọc vào từ bộ nhớ phụ được gọi là các trang (page)
Cũng có một phương pháp phức tạp hơn để ánh xạ các đòa chỉ từ không gian đòa
chỉ lên các đòa chỉ bộ nhớ thực. Để nhấn mạnh, ta sẽ gọi các đòa chỉ mà chương trình
có thể tham chiếu tới là không gian đòa chỉ ảo (virtual address space) và các đòa chỉ bộ
nhớ được nối dây (bộ nhớ thực ) là không gian đòa chỉ vật lý ( physical address space).
Bản đồ bộ nhớ (memory map) liên kết các đòa chỉ ảo với các đòa chỉ vật lý. Chúng ta
giả thuyết rằng bộ nhớ phụ có đủ chỗ để cất toàn bộ chương trình và dữ liệu của
chương trình.
Các chương trình được viết như có thể có đủ bộ nhớ chính cho toàn bộ không gian
bộ nhớ ảo, cho dù không đúng như thế. Các chương trình có thể nạp từ hoặc cất vào
bất kỳ từ nhớ nào trong không gian đòa chỉ ảo mà không quan tâm đến thực tế là thật
ra không có đủ bộ nhớ vật lý. Những người lập trình có thể viết các chương trình mà

thậm chí họ không cần biết đến sự tồn tại của bộ nhớ ảo. Máy tính dường n
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-116-
Điểm này là vấn đề chủ yếu và sẽ được đối chiếu sau này với sự phân đoạn
(segmentation), trong đó người lập trình phải biết đến sự tồn tại ccủa các segment.
Nhấn mạnh lại một lần nữa, sự phân trang cung cấp cho người lập trình ảo tưởng về
một bộ nhớ chính lớn tuyến tính và liên tục có kích thước bằng với kích thước của
không gian đòa chỉ trong khi bộ nhớ chính sử dụng được có thể nhỏ hơn (hoặc lớn hơn)
không gian đòa chỉ. Việc mô phỏng bộ nhớ chính lớn này bằng cách phân trang không
bò chương trình phát hiện (trừ phi bò phát hiện khi đang chạy các chương trình kiểm tra
đònh thì); mỗi khi một đòa chỉ được tham chiếu, lệnh hoặc từ dữ liệu thích hợp sẽ xuất
hiện. Bởi vì ngươ
chế phân tr
Sự phân trang (paging) và sự phân đoạn (segmentation) được so sánh như trong
hình
øi lập trình có thể lập trình như thể sự phân trang không tồn tại, nên cơ
ang được gọi là trong suốt (transparent).
6.2

Sự xem xét Phân trang Phân đoạn
Người lập trình có cần biết kỹ thuật này
đang được sử dụng không ?
Không Có
Có bao nhiêu không gian đòa chỉ tuyến
tính?
1 Nhiều
Không gian chỉ
vượt quá kí thươ
không?

ó
đòa tổng cộng có thể

Có C
ch ùc bộ nhớ vật lý
Các thủ tục và dữ lie
biệt và
äu có thể được phân
được bảo vệ riêng rẽ không ?
Không Có
Các bản
động
g ma ch thø kí ước của chúng dao
Không Có
có thể được điều tiết dễ dàng
không ?
Việc dùng chung các thủ tục của những
người sử dụng có được thuận lợi không ?
Không Có

Sự xem xét Phân trang Phân đoạn
Tại sao kỹ thuật này được phát minh ? Để có một không gian
đòa chỉ tuyến tính lớn mà
Để cho phép
các chương
không cần phải mua
trình và dữ liệu
cấp khả năng
dùng chung và
nhiều bộ nhớ vật lý

được chia ra
thành nhiều
không gian đòa
chỉ logic độc
lập và để cung
Nguyễn Hữu Lộc Khoa Vật Lý
Cấn Trúc Máy Tính
-117-
bảo vệ
Hình 6.2 So sánh phân trang và phân đoạn

Ýù tưởng mà người lập trình có thể sử dụng một đặc tính nào đó không tồn tại và
không quan tâm đến cách làm việc của đặc tính này không phải là mới đối với chúng
ta. Tập lệnh của máy lớp 2 không tồn tại trong ý nghóa không có lệnh nào hoàn toàn là
lệnh phần cứng, nhưng tất cả chúng thực tế đều được thực hiện bởi phần mền ở lớp 1.
Tương tự, người lập trình ở lớp 3 có thể dùng bộ nhớ ảo mà không phải lo lắng gì về
cách bộ nhớ này làm việc. Chỉ có những người viết hệ điều hành cần phải biết bộ nhớ
ảo làm việc như thế nào.
II. CÁC LỆNH VÀO/RA ẢO
hông thường tập lệnh của lớp 2 hoàn toàn khác với tập lệnh của lớp 1. Các thao
tác mà cả hai có thể được thực hiện và các khuôn dạng của các lệnh của cả hai rất
g nhau tre ùp chỉ là tình cờ.
3 trái lại chứa hầu hết các lệnh của lớp 2 cộng thêm vài
ây tổn hại đ loại bỏ. Vào/ra là một trong
phạm vi trong đó các máy lớp 2 và lớp 3 khác nhau. Lý do của sự khác nhau này
ực thi các lệnh lớp 2 thật sự, có thể đọc các
thiết bò đầu cuối của những người sử dụng
một cách tổng quát có thể tạo ra nỗi phiền toái lớn cho chính họ cũng hư đe
h bình thường và đúng mực không muốn tự
. Tiêu bie ùc thanh ghi thiết bò đối với

ỗi. Khi một trong các lỗi xuất hiện, bit tương
át lập. Vài người sử dụng muốn được lo lắng
tin trạng ùc.
1. Các tập tin tuần tự
T
khác nhau. Sự hiện diện của vài lệnh giốn
Tập các lệnh của lớp
ân cả 2 lơ
lệnh mới nhưng quan trọng và vài lệnh g
nhiều
ược
đơn giản là: những người sử dụng có thể th
dữ liệu riêng chứa trong hệ thống, ghi các
khác và
dọa sự an toàn của hệ thống.
Lý do thứ hai, những người lập trìn
viết các chương trình vào/ra riêng cho họ
đóa điển hình có các bit để phát hiện các l
åu là ca
ứng trong một thanh ghi thiết bò được thie
theo dõi tất cả các bit lỗi này và các thông thái kha

ûo là ợc đo ư
rec i l n
vò nào đó của thông tin có nghóa đối với ơ
nhất, một bản ghi logic có thể là một ma trậ g dụng khác bản ghi
có thể là một cấu trúc dữ liệu bao gồm 5 thành phần: hai chuỗi ký tự “tên” và “người
giám sát”; hai số nguyên “phòng” và “cơ quan”; một chuỗi 1-bit “phái”. Một chuỗi các
bản ghi logic được gọi là một tập tin. Các bản ghi trong một tập tin không cần có cùng
chiều dài, trong trường hợp này chúng được gọi là các bản ghi chiều da

Lệnh vào ảo cơ bản đọc bản ghi kế từ 1 tập tin đã được xác đònh và đặt bản ghi
này trong các ô nhớâ liên tiếp trong bộ nhớ chính ở một đòa chỉ đã được xác. Để thực
Một phươ hức vào/ra a
là một chuỗi các bản ghi logic (logical
ng pháp tổ c tưởng äu đư
ord), trong đó một bản gh
người lập trình. Trong trư
n 10x10. Với một ứn
tượng dữ lie ïc hoặc ghi nh
ogic là một đơ
øng hợp đơn giản
øi thay đổi.
Nguyễn Hữu Lộc Khoa Vật Lý

×