gameover.chuot

New Member

Download miễn phí Ebook Kiến trúc unix/linux





Phần 1: Lí thuyết HĐH Unix/Linux
Mục lục
A. Tổng quan: Vài nét về Hệ Điều hành
B. Unix/Linux
Chương I. Tổng quan hệ thống Unix
Chương II. Hệ thống tệp (file subsystem)
1. Tổng quan về Hệ thống tệp
2. Gọi Hệ Thống thao tác tệp (System call for FS)
Chương III. Tiến Trình (process)
1 Tổng quan về tiến trình
2 Cấu trúc của Tiến trình
3 Kiểm soát tiến trình
Chương IV. Liên lạc giữa các tiến trình
Chương V. Các hệ thống vào ra (I/O subsystem)
Chương VI. Đa xử lí (Multiprocessor Systems)
Chương VII Các hệ Unix phân tán (Distributed Unix Systems)
Phần 2: Lập trình trong Unix
Phần 3: Lập trình mạng trong Unix



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

ủa TT lúc này là “ đang được tạo S8“.
Kernel điều chỉnh lại các số đếm qui chiếu vào các tệp TT bố đã mở, +1, vì TT con sẽ tự
động kết hợp tới. Vì TT con tồn tại trong thư mục của TT bố, nên tổng số các TT truy nhập
thư mục tăng 1, tương tự như vậy số đếm qui chiếu của inode cũng tăng 1. Nếu TT bố , hay
một trong các tổ tiên đã thực hiện một GHT chroot để đổi đường dẫn, TT con mới sẽ thừa kế
và số đếm inode qui chiếu tăng 1. Kernel cuối cùng tìm đến số đếm qui chiếu các mô tả tệp
của mỗi tệp TT bố đã mở trong file table và tăng 1. TT con không chỉ thừa kế cả các quyền
trên tệp TT bố đã mở mà còn chia sẻ truy nhập tệp với TT bố bởi cả hai TT đều cùng thao tác
các đầu vào trong file table. Hiệu quả của fork() là tương tự của dup() (nhân bản) theo quan
điểm mở tệp, chỉ khác là có hai bảng con trỏ tệp (file descriptor table), mỗi bảng trong
u_area của mỗi TT, đều trỏ tới cùng một tệp trong file table. (Xem hình dưới).
Lúc này kernel đã sẳn sàng tạo user_level context (static) cho TT con (u_area, các
miền, pages) bằng việc nhân đôi từng miền của TT bố cho TT con bằng dupreg() và ghép vào
cho TT con bằng attachreg(). Sau đó kernel tạo tiếp phần dynamic của context: copy layer1
context của TT bố, layer này chứa register context của user đã được bảo vệ, cũng như các lớp
kernel stack của GHT fork()... Cơ chế thực hiện các bước lúc này tương tự như khi thực hiện
chuyển bối cảnh của TT. Khi context của TT con đã chuẩn bị xong, TT bố hoàn tất fork()
bằng việc thay đổi trạng thái của TT con thành “ready to run (in memory)” và trả lại PID cho
user. TT con sẽ được thực hiện theo cách lập biểu thông thường bởi scheduler. Hai TT bố và
con thực sự là hai TT chạy độc lập trong hệ, thông thường mã thực thi của TT con được
người lập trình xác định khi thực hiện một kiểm tra với PID=0. Kernel kích hoạt mã này từ bộ
đếm chương trình mà kernel đã lưu trong khi tạo bối cảnh cho TT con từ TT bố và để ở lớp
saved register context trong layer 2 như đã đề cập. Hình dưới mô tả quá trình tạo bối cảnh cho
TT con trong mô hình với kernel stack là một phần của u_area của mỗi TT. Nếu là mô hình
khác thì TT bố sẽ sao chép kernel stack của nó vào vùng nhớ riêng kết hợp của TT con. Còn
các mô hình khác kernel tack của TT bố và TT con là đồng nhất như nhau.
Đại học Dân Lập Thăng Long KIẾN TRÚC UNIX/LINUX
___________________________________________________________________________
95
________________________________________________________________________
Huỳnh Thúc Cước, Viện CNTT, VKHCN VN, Hà nội
Ví dụ: TT bố và TT con cùng chia sẽ tệp (do TT bố đã mở): copy.c ($copy tep1 tep2)
#include
int fdrd, fdwt;
char c;
main(argc, argv)
int argc;
char *argv[];
{
if (argc !=3)
exit(1);
if ((fdrd = open(argv[1], O_RDONLY)) ==-1)
exit(1);
if ((fdwt = creat(argv[2], 0666)) ==-1)
exit(1);
fork();
/*cả hai TT cùng thực hiện code như nhau:*/
rdwrt();
close(fdrd);
Đại học Dân Lập Thăng Long KIẾN TRÚC UNIX/LINUX
___________________________________________________________________________
96
________________________________________________________________________
Huỳnh Thúc Cước, Viện CNTT, VKHCN VN, Hà nội
close(fdwt);
exit(0);
}
rdwrt()
{
for (;;)
{
if(read(fdrd,&c,1)!=1) /*end of file*/
return;
write(fdwt,&c,1);
}
}
Chương trình trên thực hiện copy tệp khi user kích hoạt với hai đối đầu vào là tên tệp đã có và
tên tệp sẽ tạo. Bên trong kernel sao chép context của TT bố cho TT con. Mỗi TT thực hiện
trong một không gian địa chỉ khác nhau, truy nhập bản copy riêng của các biến tổng thể fdrd
và fdwt, c, và bản copy riêng stack các biến argc, argv và gọi hàm rdwrt() độc lập. Bởi vì
kernel đã sao chép u_area của TT bố cho TT con nên TT con thừa hưởng truy nhập tệp mà
TT bố đã mở: ở đây các mô tả tệp fdrd, fdwt của cả hai TT đều qui chiếu và cùng các đầu vào
trong file table: fdrd (tệp nguồn), fdwt (tệp đích), số đếm qui chiếu vào mỗi tệp tăng lên thành
2, cả hai TT dùng chung các gía trị của file offset (thay đổi mỗi lần thực hiện rdwrt()), nhưng
các giá trị lại không giống nhau, vì kernel thay đổi giá trị đó sau mỗi lần gọi read() và write()
của mỗi TT và mặc dù có những hai lần copy tệp do thực hiện chung mã lệnh (các lệnh sau
fork(): hàm rdwrt()), kết quả sẽ phụ thuộc vào trình tự TT nào sẽ thực hiện cuối cùng (do
scheduler sắp đặt): kernel không đảm bảo rằng tệp đích có nội dung giống hoàn toàn tệp gốc
(thử nghỉ tới kịch bản như sau: hai TT đang thực hiện read() hai kí tự “ab” trong tệp nguồn.
Giả sử TT bố readt() tự “a” (con trỏ tệp file offset tăng để trỏ vào “b” sau khi xong read()) và
kernel chuyển sang thực hiện TT con, trước khi nó kịp ghi “a” vào tệp đích. TT con read() (sẽ
đọc “b” theo giá trị của file offset hiện tại, và sau đó tăng 1) và giả sử nó thực hiện được
write() ghi xong “b” vào tệp đích. TT bố trở lại chạy, nó ghi “a” đã đọc trước khi bị treo thực
hiện (theo file ofset TT con đã tăng. Kết quả lúc này trong tệp đích sẽ là xâu “ba” chứ không
phảI là “ab” như tệp gốc !.) Điều gì đã xảy ra: đó là do quá trình thực hiện hai TT không luân
phiên như sụ mong muốn mà do kernel sắp đặt theo hoàn cảnh chung của hệ thống.
Đại học Dân Lập Thăng Long KIẾN TRÚC UNIX/LINUX
___________________________________________________________________________
97
________________________________________________________________________
Huỳnh Thúc Cước, Viện CNTT, VKHCN VN, Hà nội
Ví dụ: Tạo một TT con, hai TT bố và con cùng chia sẽ phần mã thục thi ngay sau khi fork
thành công:
#include
#include
#include
main()
{
printf( “TT bố: “Bắt đầu tạo TT con”. (Dòng lệnh này in ra từ mã của TT bố)\n”);
fork(); /* Tạo TT con, không xác định mã riêng*/
printf( “PID= %d \n”, getpid()); /* Bắt đầu mã chung (shared code)*/
execl(“/bin/ls/”,”ls”, “-l”,0);
printf(“Nếu in ra được dòng này, execl() không thành công !!!\n”);
}
Phần in đậm là shared code của hai TT, và kết quả thực hiện sẽ là:
- In ra hai dòng với PID khác nhau, là PID của TT bố và PID của TT con;
- Hai kết quả danh sách thư mục do hai TT thực hiện lệnh “ls –l”.
2. Tín hiệu (signals)
Đại học Dân Lập Thăng Long KIẾN TRÚC UNIX/LINUX
___________________________________________________________________________
98
________________________________________________________________________
Huỳnh Thúc Cước, Viện CNTT, VKHCN VN, Hà nội
Tín hiệu (signals) là loại ngắt mềm, thông báo cho các TT về sự xuất hiện của các sự
kiện (events) không đồng bộ, cũng như cho một cách để xử lí các sự kiện đó. Các TT
có thể gởi cho mỗi TT khác các tín hiệu bằng GHT kill(), hay kernel gởi tín hiệu bên trong
hệ thống. Mô hình về signal trên các hệ Unix có khác nhau và không tương thích (như giữa
4.3 BSD và SVR3), tuy nhiên với chuẩn POSIX.1 các thủ tục đã được chuẩn hoá và đảm bảo
có độ tin cậy cao. Unix System V Realse 4 và 4.3+BSD có 31 loại signals (định nghĩa trong
) và được phân chia như sau:
1. signal thực hiện kết thúc của một TT, được gởi đi khi TT gọi exit() hay khi TT kích
hoạt GHT signal() với thông số “death of child”- TT con kết thúc;
2. signal thông báo các trường hợp bất thường do TT gây ra, như khi TT qui chiếu vào
miền địa chỉ ảo không phải của nó, TT ghi vào miền địa chỉ “chỉ đọc”, TT thực hiện các
lệnh đ
 

Các chủ đề có liên quan khác

Top