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


int Available[NumResources]



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

int Available[NumResources];

// Available[r]= số lượng các thể hiện còn tự do của tài nguyên r



int Allocation[NumProcs, NumResources];

// Allocation[p,r] = số lượng tài nguyên r thực sự cấp phát cho p



int Request[NumProcs, NumResources];

// Request[p,r] = số lượng tài nguyên r tiến trình p yêu cầu thêm



Giải thuật phát hiện tắc nghẽn

1. int Work[NumResources] = Available;

int Finish[NumProcs];
for (i = 0; i < NumProcs; i++)

Finish[i] = (Allocation[i] == 0);


2. Tìm i sao cho

Finish[i] == false

Request[i] <= Work

Nếu không có i như thế, đến bước 4.


3. Work = Work + Allocation[i];

Finish[i] = true;

Đến bước 2
4. Nếu Finish[i] == true với mọi i,

thì hệ thống không có tắc nghẽn

Nếu Finish[i] == false với một số giá trị i,

thì các tiến trình mà Finish[i] == false sẽ ở trong

tình trạng tắc nghẽn.

II.8. Hiệu chỉnh tắc nghẽn

Khi đã phát hiện được tắc nghẽn, có hai lựa chọn chính để hiệu chỉnh tắc nghẽn :

Đình chỉ hoạt động của các tiến trình liên quan

Cách tiếp cận này dựa trên việc thu hồi lại các tài nguyên của những tiến trình bị kết thúc. Có thể sử dụng một trong hai phương pháp sau :



Đình chỉ tất cả các tiến trình trong tình trạng tắc nghẽn 

Đình chỉ từng tiến trình liên quan cho đến khi không còn chu trình gây tắc nghẽn : để chọn được tiến trình thích hợp bị đình chỉ, phải dựa vào các yếu tố như độ ưu tiên, thời gian đã xử lý, số lượng tài nguyên đang chiếm giữ , số lượng tài nguyên yêu cầu...

Thu hồi tài nguyên

Có thể hiệu chỉnh tắc nghẽn bằng cách thu hồi một số tài nguyên từ các tiến trình và cấp phát các tài nguyên này cho những tiến trình khác cho đến khi loại bỏ được chu trình tắc nghẽn. Cần giải quyết 3 vấn đề sau:



Chọn lựa một nạn nhân: tiến trình nào sẽ bị thu hồi tài nguyên ? và thu hồi những tài nguyên nào ?

Trở lại trạng thái trước tắc nghẽn: khi thu hồi tài nguyên của một tiến trình, cần phải phục hồi trạng thái của tiến trình trở lại trạng thái gần nhất trước đó mà không xảy ra tắc nghẽn.

Tình trạng « đói tài nguyên »: làm sao bảo đảm rằng không có một tiến trình luôn luôn bị thu hồi tài nguyên ?

V.Tóm tẮt

Các giải pháp đồng bộ hoá do lập trình viên xây dựng không được ưa chuộng vì phải tiêu thụ CPU trong thời gian chờ vào miền găng (« busy waiting »), và khó mở rộng. Thay vào đó, lập trình viên có thể sử dụng các cơ chế đồng bộ do hệ điều hành hay trình biên dịch trợ giúp như semaphore, monitor, trao đổi thông điệp .

Tắc nghẽn là tình trạng xảy ra trong một tập các tiến trình nếu có hai hay nhiều hơn các tiến trình chờ đợi vô hạn một sự kiện chỉ có thể được phát sinh bởi một tiến trình cũng đang chờ khác trong tập các tiến trình này.

Có 3 hướng tiếp cận chính trong xử lý tắc nghẽn :

Phòng tránh tắc nghẽn : tuân thủ một vài nghi thức bảo đảm hệ thống không
bao giờ lâm vào trạng thái tắc nghẽn.

Phát hiện tắc nghẽn : khi có tắc nghẽn xảy ra, phát hiện các tiến trình liên
quan và tìm cách phục hồi.

Bỏ qua tắc nghẽn : xem như hệ thống không bao giờ lâm vào trạng thái
tắc nghẽn.

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. Phân biệt nhóm giải pháp busy waiting và Sleep&Wakeup

2. Phân biệt cách sử dụng semaphore, monitor và message để đồng bộ hoá.

3. Mô hình giải quyết nhu cầu độc quyền truy xuất và mô hình giaỉ quyết nhu cầu phối hợp hoạt động.

Bài tập

Bài 1. Xét giải pháp phần mềm do Dekker đề nghị để tổ chức truy xất độc quyền cho hai tiến trình . Hai tiến trình P0, P1 chia sẻ các biến sau :

var flag : array [0..1] of boolean; (khởi động là false)

turn : 0..1;

Cấu trúc một tiến trình Pi ( i =0 hay 1, và j là tiến trình còn lại ) như sau :

repeat

flag[i] := true;



while flag[j] do

    if turn = j then

begin 

flag[i]:= false;


while turn = j do ;
flag[i]:= true;

end;


    critical_section();

    turn:= j;

flag[i]:= false;

non_critical_section();

until false;

Giải pháp này có phải là một giải pháp đúng thỏa mãn 4 yêu cầu không ?



Bài 2.Xét giải pháp phần mềm do Eisenberg và McGuire đề nghị để tổ chức truy xất độc quyền cho N tiến trình . Các tiến trình chia sẻ các biến sau :

var flag : array [0..N-1] of (idle, want-in, in-cs);

turn : 0..N-1;

Tất cả các phần tử của mảng flag được khởi động là idle, turn được khởi gán một trong những giá trị từ 0..N-1

Cấu trúc một tiến trình Pi như sau :

repeat


repeat

flag[i] := want-in;

j := turn;

while j<>i do

if flag[j]<> idle then j:= turn

else j:= j+1 mod n;

flag[i]:= in-cs;

j:=0;


while ( j in-cs) do j:=j+1;

until ( j>=N) and ( turn =i or flag[turn] = idle);

turn := i;

critical_section();

j:= turn + 1 mod N;

while (flag[j]= idle) do j := j+1 mod N;

turn := j;

flag[i]:= idle;

non_critical_section();

until false;

Giải pháp này có phải là một giải pháp đúng thỏa mãn 4 yêu cầu không ?

Bài 3.Xét giải pháp đồng bộ hoá sau :

while (TRUE) {

int j = 1-i;

flag[i]= TRUE; turn = i;

while (turn == j && flag[j]==TRUE);

critical-section ();

flag[i] = FALSE;

Noncritical-section ();

}

Đây có phải là một giải pháp bảo đảm được độc quyền truy xuất không ?



Bài 4.Giả sử một máy tính không có chỉ thị TSL, nhưng có chỉ thị Swap có khả năng hoán đổi nội dung của hai từ nhớ chỉ bằng một thao tác không thể phân chia :

procedure Swap() var a,b: boolean);

var temp : boolean;

begin


temp := a;

a:= b;


b:= temp;

end;


Sử dụng chỉ thị này có thể tổ chức truy xuất độc quyền không ? Nếu có xây dựng cấu trúc chương trình tương ứng.

Bài 5.Chứng tỏ rằng nếu các primitive Down và Up trên semaphore không thực hiện một cách không thể phân chia, thì sự truy xuất độc quyền sẽ bị vi phạm.

Bài 6.Sử dụng semaphore để cài đặt cơ chế monitor.

Bài 7.Xét hai tiến trình sau :

process A

{ while (TRUE)

na = na +1;

}

process B



{ while (TRUE)

nb = nb +1;

}

a)Đồng bộ hoá xử lý của hai tiến trình trên, sử dụng hai semaphore tổng quát, sao cho tại bất kỳ thời điểm nào cũng có nb < na <= nb +10



b)Nếu giảm điều kiện chỉ là na <= nb +10, giải pháp của bạn sẽ được sửa chữa như thế nào ?

c)Giải pháp của bạn có còn đúng nếu có nhiều tiến trình loại A và B cùng thực hiện?



Bài 8.Một biến X được chia sẻ bởi hai tiến trình cùng thực hiện đoạn code sau :

do

  X = X +1;



    if ( X == 20) X = 0;

    while ( TRUE );

Bắt đầu với giá trị X = 0, chứng tỏ rằng giá trị X có thể vượt quá 20. Cần sửa chữa đoạn chương trình trên như thế nào để bảo đảm X không vượt quá 20 ?

Bài 9.Xét hai tiến trình xử lý đoạn chương trình sau :

process P1 { A1 ; A2 } process P2 { B1 ; B2 }

Đồng bộ hoá hoạt động của hai tiến trình này sao cho cả A1 và B1 đều hoàn tất trước khi A2 hay B2 bắt đầu .

Bài 10.Tổng quát hoá câu hỏi 8) cho các tiến trình xử lý đoạn chương trình sau :

process P1 { for ( i = 1; i <= 100; i ++) Ai }

process P2 { for ( j = 1; j <= 100; j ++) Bj }

Đồng bộ hoá hoạt động của hai tiến trình này sao cho cả với k bất kỳ ( 2  k  100), Ak chỉ có thể bắt đầu khi B(k-1) đã kết thúc, và Bk chỉ có thể bắt đầu khi A(k-1) đã kết thúc.



Bài 11.Sử dụng semaphore để viết lại chương trình sau theo mô hình xử lý đồng hành:

w := x1 * x2

v := x3 * x4

y := v * x5

z := v * x6

y := w * y

z := w * z

ans := y + z



Bài 12.Xây dựng một giải pháp ( sử dụng semaphore ) để giải quyết vấn đề Readers_Writers trong đó :

a) Readers được ưu tiên ( khi không có ai truy xuất database, Reader được ưu tiên truy cập database ngay, Writer phải đợi tất cả các Reader truy xuất xong mới được vào database)

b) Writers được ưu tiên ( khi không có ai truy xuất database, Writer được ưu tiên truy cập database ngay, Reader phải đợi tất cả các Write truy xuất xong mới được vào database)

c) Công bằng cho Reader, Writer ( khi không có ai truy xuất database, Writer hoặc Reader có cơ hội ngang nhau để truy cập database)



Bài 13.Dining Philosophers : Giả sử hành vi của một triết gia thứ i trong bữa ăn tối được mô tả như sau :

#define N 5

void philosopher( int i)

{ while (TRUE)

{ think(); // Suy nghĩ

take_fork(i); // lấy nĩa bên trái

take_fork((i+1)%N); // lấy nĩa bên phải

eat(); // yum-yum, spaghetti

put_fork(i); // đặt nĩa bên trái lên bàn lại

put_fork((i+1)%N); // đặt nĩa bên phải lên bàn lại

}

}

a) Lưu ý là trên bàn chỉ có 5 cái nĩa, và nếu có 2 triết gia cùng muốn lấy một cái nĩa, thì chỉ một người được quyền lấy cái nĩa đó. Sử dụng semaphore để tổ chức độc quyền truy xuất đến các cái nĩa cho đoạn chương trình trên ( Gợi ý : dùng mỗi semaphore phản ánh tình trạng sử dụng của mỗi cái nĩa)



b) Liệu giải pháp của câu a) có là một giải pháp tốt cho bài toán Dining philosopher?Nếu không, cho biết các tình huống lỗi sẽ xảy ra, và đề nghị phương pháp cải tiến.

Bài 14.Xét một giải pháp đúng cho bài toán Dining philosophers :

#define N 5

#define LEFT (i-1)%N

#define RIGHT (i+1)%N

#define THINKING 0

#define HUNGRY 1

#define EATING 2

int state[N];

semaphore mutex = 1;

semaphore s[N];

void philosopher( int i) // i : xác định triết gia nào (0..N-1)

{

while (TRUE)



{ thinhk(); // Suy nghĩ

take_forks(i); // yêu cầu đến khi có đủ 2 nĩa

eat(); // yum-yum, spaghetti

put_forks(i); // đặt cả 2 nĩa lên bàn lại

}

}

void take_forks ( int i) // i : xác định triết gia nào (0..N-1)



{

while (TRUE)

{ down(mutex); // vào miền găng

state[i] = HUNGRY; // ghi nhận triết gia i đã đói

test(i); // cố gắng lấy 2 nĩa

up(mutex); // ra khỏi miền găng

down(s[i]); // chờ nếu không có đủ 2 nĩa

}

}



}

void put_forks ( int i) // i : xác định triết gia nào (0..N-1)

{

while (TRUE)



{ down(mutex); // vào miền găng

state[i] = THINKING; // ghi nhận triết gia i ăn xong

test(LEFT); // kiểm tra người bên trái đã có thể ăn?

test(RIGHT); // kiểm tra người bên phải đã có thể ăn?

up(mutex); // ra khỏi miền găng

}

}



void test ( int i) // i : xác định triết gia nào (0..N-1)

{

if(state[i]==HUNGRY && state[LEFT]!=EATING



&& state[RIGHT]!= EATING

{

state[i] = EATING;



up(s[i]);

}

}



a)Tại sao phải đặt state[i] = HUNGRY trong take_forks ?

b)Giả sử trong put_forks, lệnh gán state[i] = THINKING được thực hiện sau hai lệnh test(LEFT), test(RIGHT). Điều này ảnh hưởng thế nào đến giải pháp cho 3 triết gia? Cho 100 triết gia?



Bài 15.Xây dựng giải pháp monitor cho bài toán Dining Philosophers.

Bài 16.Baber problem : Một cửa hiệu cắt tóc có một thợ, một ghế cắt tóc và N ghế cho khách đợi. Nếu không có khách hàng, anh thợ cắt tóc sẽ ngồi vào ghế cắt tóc và ngủ thiếp đi. Khi một khách hàng vào tiệm, anh ta phải đánh thức người thợ. Nếu một khách hàng vào tiệm khi người thợ đang bận cắt tóc cho kh1ch hàng khác, người mới vào sẽ phải ngồi chờ nếu có ghế đợi trống, hoặc rời khỏi tiệm nếu đã có N người đợi. Xây dựng một giải pháp với semaphore để thực hiện đồng bộ hoá hoạt động của thợ và khách hàng trong cửa hiệu cắt tóc này.

/* Semaphore to protect critical sections */

Semaphore mutex = 1;
/* Semaphore for the number of waiting customers.

* This lets the barber go to sleep when there are no customers */

Semaphore customers = 0;
/* Number of waiting customers in the barber shop */

/* Just used to turn away customers when there are too many already. */

int waiting_customers = 0
/* Semaphore on which to wait for a haircut */

Semaphore haircut = 0;


/* Customer calls this function to try to get their hair cut

* it returns true if the hair gets cut. */

int customer()

{

/* protect access to shared variables with semaphore mutex */



wait( mutex );
/* Make sure there is an empty chair */

if( waiting_customers >= 5 ){

signal( mutex );

return 0;

}

/* there is now a new waiting customer */



waiting_customers += 1;

signal( mutex );

/* Wake the barber if the shop was empty */

signal( customers );

/* Wait for a haircut from the barber */

wait( haircut );

return 1;

}
/* Barber loops within this function */

void barber()

{

while( 1 ){



/* Go to sleep if there are no customers */

wait( customers );


// protect access to shared variables with semaphore mutex

wait( mutex );


/* take customer out of a chair */

waiting_customers -= 1;


signal( mutex );
/* cut hair of the current customer */

cut_hair();

/* Let the customer go. */

signal( haircut );



}

}

Bài 17.Giải quyết bài toán Baber trong trường hợp tiệm có nhiều thợ .



Bài 18.Xét trạng thái hệ thống :

Max

Allocation

Available

R1

R2

R3

R1

R2

R3

R1

R2

R3

P1

3

2

2

1

0

0







P2

6

1

3

2

1

1







P3

3

1

4

2

1

1







P4

4

2

2

0

0

2







Nếu tiến trình P2 yêu cầu 4 cho R1, 1 cho R3. hãy cho biết yêu cầu này có thể đáp ứng mà bảo đảm không xảy ra tình trạng deadlock hay không ?

Bài 19.Xét trạng thái hệ thống :

Max

Allocation

Available

A

B

C

D

A

B

C

D

A

B

C

D

P1

0

0

1

2

0

0

1

2










P2

1

7

5

0

1

0

0

0










P3

2

3

5

6

1

3

5

4










P4

0

6

5

2

0

6

3

2










P5

0

6

5

6

0

0

1

4










a) Cho biết nội dung của bảng Need.

b) Hệ thông có ở trạng thái an toàn không?

c) Nếu tiến trình P2 có yêu cầu tài nguyên ( 0,4,2,0), yêu cầu này có được đáp ứng tức thời không?


Каталог: 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   10   ...   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