BÀI 1 TỔng quan về HỆ ĐIỀu hàNH


a) Sự tin cậy b) Sự bảo toàn thứ tự dữ liệu



tải về 1.4 Mb.
trang4/17
Chuyển đổi dữ liệu15.08.2016
Kích1.4 Mb.
#20344
1   2   3   4   5   6   7   8   9   ...   17

a) Sự tin cậy

b) Sự bảo toàn thứ tự dữ liệu

c) Lặp lại dữ liệu

d) Chế độ nối kết

e) Bảo toàn giới hạn thông điệp

f) 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:

    a) Liên lạc trong chế độ không liên kết : liên lạc theo hình thức hộp thư:



hai tiến trình liên lạc với nhau không kết nối trực tiếp

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 được :



người gởi không chắc chắn thông điệp của học được gởi đến người nhận,

một thông điệp có thể được gởi nhiều lần,

hai thông điệp đượ 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ử hai primitive sendreceive.

    b) Liên lạc trong chế độ nối kế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-serveur. 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 3.4 Các socket và port trong mối nối TCP.

Hình 3.4 minh họa một cách giao tiếp giữa hai máy tính trong nghi thức truyền 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.



Thảo luận: 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.

 

III. Nhu cầu đồng bộ 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:

III.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 khô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ẻ.

III.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 tác vụ, 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 khác đã kết thúc một công việc nào đó …

III.3. Bài toán đồng bộ hoá

    III.3.1. Vấn đề tranh đoạt điều khiển (race condition)

Giả sử có hai tiến trình P1 và P2 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


    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. Nếu xảy ra tình huống như sau :



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 !

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, và kết quả phụ thuộc vào sự điều phối tiến trình của hệ thống- được gọi là các tình huống tranh đoạt điều khiển (race condition) .

    III.3.2. Miền găng (critical section)

Để ngăn chặn các tình huống lỗi có thể nảy sinh khi các tiến trình truy xuất đồng thời một tài nguyên không thể chia sẻ, cần phải áp đặt một sự truy xuất độc quyền trên tài nguyên đó : khi một tiến trình đang sử dụng tài nguyên, thì những tiến trình khác không được truy xuất đến tài nguyên.

Đoạn chương trình trong đó có khả năng xảy ra các mâu thuẫn truy xuất trên tài nguyên chung được gọi là miền găng (critical section). Trong ví dụ trên, đoạn mã :

if (taikhoan - tienrut >=0)

taikhoan = taikhoan - tienrut;

của mỗi tiến trình tạo thành một miền găng.

Có thể giải quyết vấn đề mâu thuẫn truy xuất nếu có thể bảo đảm tại một thời điểm chỉ có duy nhất một tiến trình được xử lý lệnh trong miền găng.

Một phương pháp giải quyết tốt bài toán miền găng cần thõa mãn 4 điều kiện sau :



Không có hai tiến trình cùng ở trong miền găng cùng lúc.

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.

Một tiến trình tạm dừng bên ngoài miền găng không được ngăn cản các tiến trình khác vào miền găng.

Không có tiến trình nào phải chờ vô hạn để được vào miền găng.

IV. Tóm tắt

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.

Một số cơ chế trao đổi thông tin giữa các tiến trình :

Tín hiệu : thông báo sự xảy ra của một sự kiện

Pipe : truyền dữ liệu không cấu trúc

Vùng nhớ chia sẻ : cho phép nhiều tiến trình truy cập đến cùng một vùng nhớ

Trao đổi thông điệp : truyền dữ liệu có cấu trúc, có thể vận dụng trong các hệ phân tán

Socket : chuẩn hoán việc liên lạc giữa các hệ thống khác biệt

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.

Củng cố bài học

   Các câu hỏi cần trả lời được sau bài học này :

1. Các cơ chế trao đổi thông tin : tình huống sử dụng, ưu, khuyết ?

2. Các yêu cầu đồng bộ hoá ?



Bài tập

Phân tích các bài toán sau đây và xác định những yêu cầu đồng bộ hoá, miền găng :



Bài 1.Bài toán Tạo phân tử H2O

Đồng bộ hoạt động của một phòng thí nghiệm sử dụng nhiều tiến trình đồng hành sau để tạo các phân tử H2O:



MakeH() // Mỗi tiến trình MakeH tạo 1 nguyên tử H
{
    Make-Hydro();
}

MakeO() // Mỗi tiến trình MakeO tạo 1 nguyên tử O
{
    Make-Oxy();
}

MakeWater() /* Tiến trình MakeWater hoạt động đồng hành
 với các tiến trình MakeH, MakeO, chờ có đủ 2 H và 1 O để tạo H2O */
{
    while (T)
    Make-Water(); //Tạo 1 phân tử H2O
}


Bài 2.Bài toán Cây cầu cũ

Để tránh sụp đổ, người ta chỉ có cho phép tối đa 3 xe lưu thông đồng thời qua một cây cầu rất cũ. Hãy xây dựng thủ tục ArriveBridge(int direction)ExitBridge() kiểm soát giao thông trên cầu sao cho :



Tại mỗi thời điểm, chỉ cho phép tối đa 3 xe lưu thông trên cầu.

Tại mỗi thời điểm, chỉ cho phép tối đa 3 xe lưuthông cùng hướng
trên cầu.

Mỗi chiếc xe khi đến đầu cầu sẽ gọi ArriveBridge(direction) để kiểm tra điều kiện lên cầu, và khi đã qua cầu được sẽ gọi ExitBridge() để báo hiệu kết thúc.

Giả sử hoạt động của mỗi chiếc xe được mô tả bằng một tiến trình Car() sau đây:

Car(int direction) /* direction xác định hướng di chuyển của mỗi chiếc xe.*/
{

RuntoBridge(); // Đi về phía cầu


ArriveBridge(direction);

PassBridge(); // Qua cầu
Exit Bridge();

RunfromBridge(); // Đã qua cầu

}

Bài 3. Bài toán Qua sông

Để vượt qua sông, các nhân viên Microsof và các Linux hacker cùng sử dụng một bến sông và phải chia sẻ một số thuyền đặc biệt. Mỗi chiếc thuyền này chỉ cho phép chở 1 lần 4 người, và phải có đủ 4 người mới khởi hành được. Để bảo đảm an toàn cho cả 2 phía, cần tuân thủ các luật sau :

a. Không chấp nhận 3 nhân viên Microsoft và 1 Linux hacker trên cùng một chiếc thuyền.

b. Ngược lại, không chấp nhận 3 Linux hacker và 1 nhân viên Microsoft trên cùng một chiếc thuyền.

c. Tất cả các trường hợp kết hợp khác đều hợp pháp.

d. Thuyền chỉ khởihành khi đã có đủ 4 hành khách.

Cần xây dựng 2 thủ tục HackerArrives()EmployeeArrives() được gọi tương ứng bởi 1 hacker hoặc 1 nhân viên khi họ đến bờ sông để kiểm tra điều kiện có cho phép họ xuống thuyền không ? Các thủ tục này sẽ sắp xếp những người thích hợp có thể lên thuyền. Những người đã được lên thuyền khi thuyền chưa đầy sẽ phải chờ đến khi người thứ 4 xuống thuyền mới có thể khởi hành qua sông. (Không quan tâm đến số lương thuyền hay việc thuyền qua sông rồi trở lại…Xem như luôn có thuyền để sắp xếp theo các yêu cầu hợp lệ)

Giả sử hoạt động của mỗi hacker được mô tả bằng một tiến trình Hacker() sau đây:

Hacker()
{

RuntoRiver(); // Đi đến bờ sông


HackerArrives ();
// Kiểm tra điều kiện xuống thuyền
CrossRiver(); // Khởi hành qua sông

}

và hoạt động của mỗi nhân viên được mô tả bằng một tiến trình Employee() sau đây:



Employee()
{

RuntoRiver(); // Đi đến bờ sông


EmployeeArrives ();
// Kiểm tra điều kiện xuống thuyền
CrossRiver(); // Khởi hành qua sông

}

Bài 4. Bài toán Điều phối hành khách xe bus

Hãy tưởng tượng bạn chịu trách nhiệm kiểm soát hành khách lên xe bus tại một trạm dừng.

Mỗi xe bus có đủ chỗ cho 10 hành khách. Trong đó 4 chỗ chỉ dành cho khách ngồi xe lăn, 6 chỗ còn lại chỉ dành cho khách bình thường.

Công việc của bạn là cho khách lên xe theo đúng qui định chỗ, khi xe đầy khách sẽ khởi hành. Có thể có nhiều xe và nhiều hành khách vào bến cùng lúc, nguyên tắc điều phối sẽ xếp khách vào đầy một xe, cho xe này khởi hành rồi mới điều phối cho xe khác.

Giả sử hoạt động điều phối khách của bạn cho 1 chiếc xe bus được mô tả qua tiến trình GetPassengers(); hoạt động của mỗi hành khách tùy loại được mô tả lần lượt bằng tiến trình WheelPassenger()NonWheelPassenger() sau đây , hãy sửa chữa các đoạn code, sử dụng cơ chế semaphore để thực hiện các nguyên tắc đồng bộ hoá cần thiết.



GetPassenger()
{

ArriveTerminal(); // tiếp nhận một xe vào bến


OpenDoor(); // mở cửa xe, thủ tục này xem như đã có
for (int i=0; i<4; i++) // tiếp nhận các hành khách ngồi xe lăn
{
    ArrangeSeat(); // đưa 1 khách vào chỗ

}

for (int i=0; i<6; i++) // tiếp nhận các hành khách bình thường


{
    ArrangeSeat(); // đưa 1 khách vào chỗ

}

CloseDoor(); // đóng cửa xe, thủ tục này xem như đã có



DepartTerminal(); // cho một xe rời bến

}

WheelPassenger()


{

ArriveTerminal(); // đến bến


GetOnBus(); // lên xe

}

NonWheelPassenger()


{

ArriveTerminal(); // đến bến


GetOnBus(); // lên xe

}

Bài 5. Bài toán sản xuất thiết bị xe hơi

Hãng Pontiac có 2 bộ phận hoạt động song song :

- Bộ phận sản xuất 1 khung xe :

MakeChassis() { // tạo khung xe
   Produce_chassis();

}

- Bộ phận sản xuất 1 bánh xe :



MakeTires() { // tạo bánh xe và gắn vào khung xe
    Produce_tire();
    Put_tire_to_Chassis();

}

Hãy đồng bộ hoạt động trong việc sản xuất xe hơi theo nguyên tắc sau :



o Sản xuất một khung xe,

o cần có đủ 4 bánh xe cho 1 khung xe được sản xuất ra, sau đó mới tiếp tục sản xuất khung xe khác…



BÀI 5 : CÁC GIẢI PHÁP ĐỒNG BỘ HOÁ

Bài học này sẽ giới thiệu các giải pháp cụ thể để xử lý bài toán đồng bộ hoá. Có nhiều giải pháp để thực hiện việc truy xuất miền găng, các giải pháp này được phân biệt thành hai lớp tùy theo cách tiếp cận trong xử lý của tiến trình bị khóa :các giải pháp « busy waiting » và các giải pháp « sleep and wakeup ».

I. GiẢi pháp « busy waiting »

I.1. Các giải pháp phần mềm

I.1.1. Sử dụng các biến cờ hiệu:

Tiếp cân : các tiến trình chia sẻ một biến chung đóng vai trò « chốt cửa » (lock) , biến này được khởi động là 0. Một tiến trình muốn vào miền găng trước tiên phải kiểm tra giá trị của biến lock. Nếu lock = 0, tiến trình đặt lại giá trị cho lock = 1 và đi vào miền găng. Nếu lock đang nhận giá trị 1, tiến trình phải chờ bên ngoài miền găng cho đến khi lock có giá trị 0. Như vậy giá trị 0 của lock mang ý nghĩa là không có tiến trình nào đang ở trong miền găng, và lock=1 khi có một tiến trình đang ở trong miền găng.

while (TRUE) {

while (lock == 1); // wait
lock = 1;
critical-section ();
lock = 0;
Noncritical-section ();

}

Hình 3.5 Cấu trúc một chương trình sử dụng biến khóa để đồng bộ



Thảo luận : Giải pháp này có thể vi phạm điều kiện thứ nhất: hai tiến trình có thể cùng ở trong miền găng tại một thời điểm. Giả sử một tiến trình nhận thấy lock = 0 và chuẩn bị vào miền găng, nhưng trước khi nó có thể đặt lại giá trị cho lock là 1, nó bị tạm dừng để một tiến trình khác hoạt động. Tiến trình thứ hai này thấy lock vẫn là 0 thì vào miền găng và đặt lại lock = 1. Sau đó tiến trình thứ nhất được tái kích hoạt, nó gán lock = 1 lần nữa rồi vaò miền găng. Như vậy tại thời điểm đó cả hai tiến trình đều ở trong miền găng.

I.1.2. Sử dụng việc kiểm tra luân phiên :

Tiếp cận : Đây là một giải pháp đề nghị cho hai tiến trình. Hai tiến trình này sử dụng chung biến turn (phản ánh phiên tiến trình nào được vào miền găng), được khởi động với giá trị 0. Nếu turn = 0, tiến trình A được vào miền găng. Nếu turn = 1, tiến trình A đi vào một vòng lặp chờ đến khi turn nhận giá trị 0. Khi tiến trình A rời khỏi miền găng, nó đặt giá trị turn về 1 để cho phép tiến trình B đi vào miền găng.

while (TRUE) {

while (turn != 0); // wait
critical-section ();
turn = 1;
Noncritical-section ();

}

(a) Cấu trúc tiến trình A

while (TRUE) {

while (turn != 1); // wait


critical-section ();
turn = 0;
Noncritical-section ();

}

(b) Cấu trúc tiến trình B



Hình 3.6 Cấu trúc các tiến trình trong giải pháp kiểm tra luân phiên

Thảo luận: Giải pháp này dựa trên việc thực hiện sự kiểm tra nghiêm nhặt đến lượt tiến trình nào được vào miền găng. Do đó nó có thể ngăn chặn được tình trạng hai tiến trình cùng vào miền găng, nhưng lại có thể vi phạm điều kiện thứ ba: một tiến trình có thể bị ngăn chặn vào miền găng bởi một tiến trình khác không ở trong miền găng. Giả sử tiến trình B ra khỏi miền găng rất nhanh chóng. Cả hai tiến trình đều ở ngoài miền găng, và turn = 0. Tiến trình A vào miền găng và ra khỏi nhanh chóng, đặt lại giá trị của turn là1, rồi lại xử lý đoạn lệnh ngoài miền găng lần nữa. Sau đó, tiến trình A lại kết thúc nhanh chóng đoạn lệnh ngoài miền găng của nó và muốn vào miền găng một lần nữa. Tuy nhiên lúc này B vẫn còn mãi xử lý đoạn lệnh ngoài miền găng của mình, và turn lại mang giá trị 1 ! Như vậy, giải pháp này không có giá trị khi có sự khác biệt lớn về tốc độ thực hiện của hai tiến trình, nó vi phạm cả điều kiện thứ hai.

I.1.3. Giải pháp của Peterson

Tiếp cận : Peterson đưa ra một giải pháp kết hợp ý tưởng của cả hai giải pháp kể trên. Các tiến trình chia sẻ hai biến chung :

int turn; // đến phiên ai

int interesse[2]; // khởi động là FALSE

Nếu interesse[i] = TRUE có nghĩa là tiến trình Pi muốn vào miền găng. Khởi đầu, interesse[0]=interesse[1]=FALSE và giá trị của turn được khởi động là 0 hay 1. Để có thể vào được miền găng, trước tiên tiến trình Pi đặt giá trị interesse[i]=TRUE ( xác định rằng tiến trình muốn vào miền găng), sau đó đặt turn=j (đề nghị thử tiến trình khác vào miền găng). Nếu tiến trình Pj không quan tâm đến việc vào miền găng (interesse[j]=FALSE), thì Pi có thể vào miền găng, nếu không, Pi phải chờ đến khi interesse[j]=FALSE. Khi tiến trình Pi rời khỏi miền găng, nó đặt lại giá trị cho interesse[i]= FALSE.

while (TRUE) {

int j = 1-i; // j là tiến trình còn lại


interesse[i]= TRUE;
turn = j;
while (turn == j && interesse[j]==TRUE);
critical-section ();
interesse[i] = FALSE;
Noncritical-section ();

}


Каталог: 2014
2014 -> -
2014 -> Năng suất lao động trong nông nghiệp: Vấn đề và giải pháp Giới thiệu
2014 -> QUẢn lý nuôi trồng thủy sản dựa vào cộng đỒNG
2014 -> CÔng ty cổ phần autiva (autiva. Jsc)
2014 -> CÙng với mẹ maria chúng ta về BÊn thánh thể with mary, we come before the eucharist cấp II thiếU – camp leader level II search
2014 -> Part d. Writing 0 points)
2014 -> CỘng hòa xã HỘi chủ nghĩa việt nam độc lập – Tự do – Hạnh phúc
2014 -> Mẫu số 01. Đơn xin giao đất/cho thuê đất/cho phép chuyển mục đích sử dụng đất
2014 -> Biểu số: 22a/btp/cn-tn
2014 -> Ủy ban nhân dân cộng hòa xã HỘi chủ nghĩa việt nam thành phố HỒ chí minh độc lập Tự do Hạnh phúc

tải về 1.4 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6   7   8   9   ...   17




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương