yêu cầu tài nguyên, nó sẽ chờ đến khi tài nguyên sẵn sàng để cấp phát thì gửi một thông điệp đến tiến trình đang bị khóa trên tài nguyên đó để đánh thức tiến trình này... 49[r]
(1)adlock
(2)Khái niệm Thread
2
❑ Trong các hệ điều hành truyền thống, tiến trình có khơng gian địa một thead duy nhất.
❑ Trong thực tế, người dùng mong muốn có nhiều thread điều khiển không gian địa chạy song song, tiến trình riêng biệt.
(3)Khái niệm Thread
3
❑ Khái niệm Thread:
− Một tiến trình có nhiều thread, thread
thực chức cụ thể không gian địa tiến trình
− Mỗi thread bao gồm:
◼ Một đếm chương trình (Program counter): theo
dõi thị thực thi
(4)Khái niệm multithreading
4
❑ Trạng thái nhiều threads chạy song song trong
cùng một tiến trình gọi là multithreading
(5)Trạng thái thread
5
❑ Một thread có trạng thái: running, blocked, ready, terminated.
❑ Mỗi thread có stack riêng, chứa frame cho
(6)Các thủ tục thread
6
❑ pthread_exit: Khi thread kết thúc công việc.
❑ pthread_wait: Trong một hệ thống thread, một thread có thể chờ thread khác.
(7)Lý sử dụng thread
7
❑ Chia sẻ không gian địa tất các dữ liệu thread
❑ Thread khơng có tài ngun gắn liền với nó, do đó dễ dàng tạo hủy so với tiến trình.
❑ Tăng hiệu năng, có máy tính I/O đáng
(8)Ví dụ multithreading
8
❑ Web server multithreading
◼ Dispatcher: đọc yêu cầu từ
mạng, chọn worker thread rỗi, đánh thức
chuyển từ trạng thái block sang trạng thái ready
◼ Khi worker thread đánh
(9)(10)Giao tiếp tiến trình
10
❑ Có ba lý liên quan đến giao tiếp các tiến trình:
− Trao đổi thông tin − Chia tài nguyên
(11)Điều kiện tương tranh
Race Conditions
11
(12)Miền găng - Critical Regions
12
❑ Một phần chương trình mà nhớ chia sẻ
được truy cập gọi miền găng (critical
region hoặc critical section).
❑ Nếu đảm bảo khơng có hai tiến trình truy cập
(13)Miền găng - Critical Regions
13
❑ Tránh điều kiện tương tranh
− Khơng có 2 tiến trình đồng thời miền găng − Khơng có giả định thực tốc
độ hay số CPU
− Khơng có tiến trình chạy bên ngồi miền găng ngăn chặn tiến trình khác
− Khơng có tiến trình cần phải chờ đợi mãi để
(14)Loại trừ lẫn với
14
(15)Loại trừ lẫn với
15
❑ Cấm ngắt – Disabling interrupts
− Ý tưởng
◼ Mỗi tiến trình cấm tất ngắt sau vào miền
găng kích hoạt lại trước khỏi miền găng
◼ Tiến trình cấm ngắt kiểm tra cập nhật
nhớ chia sẻ mà khơng sợ tiến trình khác can thiệp
− Nhận xét
(16)Loại trừ lẫn với
16
❑ Sử dụng biến Lock
− Đây giải pháp phần mềm
− Các tiến trình chia sẻ biến lock, giá trị khởi tạo
− Tiến trình muốn vào miền găng phải kiểm tra biến lock
◼ Nếu lock= 0, tiến trình thiết lập giá trị cho lock =1
đi vào miền găng
(17)Loại trừ lẫn với
17
❑ Sử dụng biến Lock
− Đoạn code sử dụng biến lock
while (TRUE) {
while (lock == 1); // wait lock = 1;
critical-section(); //thực đoạn găng
lock = 0; //kết thúc đoạn găng phải đặt
(18)Loại trừ lẫn với
18
❑ Nhận xét:
− Khi lock==0: Tiến trình thứ vào miền găng
nhưng chưa kịp thiết lập lock=1,
− Một tiến trình khác chạy theo lịch trình, kiểm tra
thấy lock==0, thiết lập lock=1, vào miền găng
(19)Loại trừ lẫn với
19
❑ Kiểm tra luân phiên - Strict Alternation
− Hai tiến trình dùng chung biến turn kiểu integer,
giá trị khởi tạo
◼ turn = 0, tiến trình P1 vào miền găng, P1 rời
khỏi miền găng, turn =1 cho phép P2 vào miền găng
◼ turn = 1, tiến trình P2 vào miền găng P1 chờ
(20)Loại trừ lẫn với
20
while (TRUE) {
while (turn != 0)/* loop */ ; critical_region();
turn = 1;
noncritical_region(); }
while (TRUE) {
while (turn != 1); /* loop */ ; critical_region();
turn = 0;
noncritical_region(); }
(21)Loại trừ lẫn với
21
❑ Nhận xét:
− Ngăn tình trạng tiến trình đồng thời vào
miền găng
− Số lần vào miền găng P1, P2 cân bằng,
(22)Loại trừ lẫn với
22
❑ Giải pháp Peterson
− Ban đầu khơng có tiến trình miền găng − Hai tiến trình P0 P1 sử dụng hai biến dùng
chung turn, interesse[2]
◼ turn = 0 đến phiên P0; Nếu turn=1 đến phiên P1
◼ Nếu Pi muốn vào miền găng thiết lập
(23)Loại trừ lẫn với
23
− Khởi tạo:
◼ Interesse[0]=Interesse[1]=false; turn = 0 hoặc 1
◼ Giả sử Pi muốn vào miền găng gọi enter_region, và
thiết lập
◼ interesse[i]=TRUE,
◼ turn=j (đề nghị thử Pj vào miền găng)
◼ Nếu tiến trình Pj khơng vào miền găng thiết lập
◼ interesse[j]=FALSE, Pi vào
(24)Loại trừ lẫn với
(25)Loại trừ lẫn với
25
❑ Nhận xét:
− Ngăn chặn tình trạng mâu thuẫn truy xuất ◼ Pi vào miền găng
◼ interesse[j]=FALSE ◼ Hoặc turn = i
◼ Nếu hai tiến trình muốn vào miền găng
◼ interesse[i] = interesse[j] =TRUE
◼ Nhưng giá trị turn là
(26)Loại trừ lẫn với
26
❑ Giải pháp Test and Set Lock – TSL
− Tập lệnh máy có thêm thị đặc biệt để
kiểm tra cập nhật nội dung vùng nhớ đơn vị thao tác, gọi thị TSL
(27)Loại trừ lẫn với
27
❑ Nhận xét:
− Giảm nhẹ cơng việc lập trình việc cài đặt
TSL như lệnh máy phức tạp
(28)28
❑ Giải pháp: Dùng system calls: sleep wakeup
− Sleep: đình tiến trình tiến trình khác đánh thức
− Wakeup: tham số tiến trình đánh thức
❑ Ý tưởng
− Tiến trình chưa đủ điều kiện vào miền găng, gọi Sleep để tự khóa, chờ tiến trình khác gọi Wakeup để giải phóng
(29)29
❑ Code Sleep and Wakeup
int busy; // miền găng bị chiếm
int blocked;//số tiến trình bị tạm khóa
while (1) { if (busy){
blocked = blocked + 1; sleep();}
else busy = 1;
critical-section (); busy = 0;
if(blocked){
(30)30
❑ Ví dụ: bài toán sản xuất - tiêu dùng.
− Hai tiến trình chia sẻ buffer chung, kích thước
cố định
◼ P1: nhà sản xuất, đặt thông tin vào buffer,
◼ P2: người tiêu dùng, lấy thông tin từ buffer
− P1 muốn đặt phần tử vào buffer, buffer đầy, sleep, đánh thức P2 lấy nhiều phần tử từ buffer
− P2 muốn lấy phần tử từ buffer buffer rỗng,
nó sleep, P1 weakup P2 đặt phần tử vào
(31)31
(32)32
Hoạt động consumer
(33)33
❑ Semaphore s là một biến có thuộc tính
− Một số nguyên dương e
− Một hàng đợi f lưu danh sách tiến trình
ở trạng thái waiting
❑ Hai thao tác được định nghĩa trên semaphore
− Down(s): giảm giá trị e đi 1.
◼ Nếu e ≥ tiếp tục xử lý.
◼ Ngược lại, e < 0, tiến trình phải chờ.
(34)34
❑ Down(s) e= e - 1; if e<0
{
status(P)=waiting;
enter(P,f(s)); }
Up(s)
e= e + 1; if e=0
{
exit(Q,f(s));
//Q là tiến trình
đang chờ trên s
status(Q)= ready;
enter(Q,ready-list);
(35)35
❑ Sử dụng semaphore để giải toán
Nhà sản xuất người tiêu dùng:
− Sử dụng semaphore: ◼ Full: đếm số khe đầy
◼ Empty: đếm số khe rỗng
◼ Mutex: để đảm bảo nhà sản xuất người
(36)(37)(38)38
❑ Một mutex là một biến thuộc trong hai trạng thái: unlock hoặc lock
❑ Hai thủ tục sử dụng:
− mutex_lock: Khi thread cần truy cập vào miền găng Nếu mutex unlock gọi thành cơng vào miền găng
− mutex_unlock: Thread trong miền găng kết thúc
(39)39
(40)40
❑ Monitors (Hoare(1974) Brinch& Hansen) là một cấu trúc liệu bao gồm biến thủ tục.
❑ Đặc điểm:
− Các biến cấu trúc liệu bên monitor
chỉ thao tác thủ tục định nghĩa bên monitor (encapsulation)
− Tại thời điểm, có tiến trình
(41)41
❑ Monitor là một cấu trúc với thuộc tính:
− Biến điều kiện (c)
− Hàng đợi chứa tiến trình bị khóa f(c)
− Hai thao tác kèm theo là Wait Signal:
◼ Wait(c): chuyển trạng thái tiến trình gọi sang blocked ,
và đặt tiến trình vào hàng đợi c
◼ Signal(c): có tiến trình bị khóa
(42)42
Wait
Wait(c) {
status(P)=blocked; enter(P,f(c));
}
Signal
if (f(c) != NULL) {
exit(Q,f(c));
//chọn1 tiến trình chờ c statusQ)=ready;
(43)43
❑ Cài đặt monitors
monitor <tên monitor > {
condition <list biến đ/kiện>;
<khai báo các biến>;
procedure Action1(); { }
procedure Actionn(); { }
(44)44
❑ Dùng monitor trong bài toán sản xuất – tiêu dùng
❑ Chỉ có thủ tục
(45)45
− Nhận xét
(46)46
❑ Giải pháp:
− Dựa sở trao đổi thông điệp với hai thao
tác nguyên thủy Send Receive để thực
sự đồng hóa
◼ send(destination, &message): gởi thơng điệp
đến tiến trình hay gởi vào hộp thư
◼ receive(source, &message): nhận thông điệp từ
(47)47
❑ Sử dụng
− Một tiến trình kiểm sốt việc sử dụng tài nguyên
và nhiều tiến trình khác u cầu tài ngun
− Tiến trình có yêu cầu tài nguyên gởi thông
(48)48
− Khi sử dụng xong tài ngun, tiến trình gởi
thơng điệp khác đến tiến trình kiểm sốt để báo kết thúc truy xuất
− Tiến trình kiểm sốt: nhận thơng điệp
(49)49
❑ Cấu trúc tiến trình yêu cầu tài nguyên trong
giải pháp truyền thông điệp
while (TRUE) {
Send(process controler, request message); Receive(process controler,accept message);
critical-section();
(50)50
(51)51
(52)52
❑ Nhận xét:
− Semaphore và monitor có thể giải vấn đề
truy xuất độc quyền máy tính có nhiều xử lý chia nhớ dùng chung
(53)53
❑ Bài toán triết gia ăn tối:
− Có triết gia ăn tối mì ống, ngồi xung quanh bàn trịn, trước mặt người có nĩa Muốn ăn cần có nĩa, người lấy nĩa trước mặt khơng có triết gia ăn
(54)54
❑ Hoạt động triết gia:
− Ăn: cầm nĩa
− Suy nghĩ: đặt nĩa xuống − Đói: cố gắng lấy nĩa
❑ Giải pháp
− Sử dụng array, State để theo dõi triết gia
đang ăn, suy nghĩ, hay đói
− Triết gia bên cạnh xác định macro
LEFT RIGHT
(55)(56)(57)(58)Khái niệm
❑ Deadlock
− Các tiến trình tập hợp chờ đợi lẫn nhau
◼ cạnh tranh sử dụng tài nguyên hay giao tiếp
− Chờ đợi kiện không xảy
Tất tiến trình tập hợp bị khóa vĩnh
viễn !
(59)Mơ hình hệ thống
(60)Các điều kiện xảy Deadlock
(61)Đồ thị cấp phát tài nguyên
❑ Nhận xét
(62)Đồ thị cấp phát tài nguyên
❑ Khơng có chu trình=> khơng deadlock
(63)Đồ thị cấp phát tài nguyên
❑ Có chu trình => deadlock
(64)Đồ thị cấp phát tài ngun
❑ Có chu trình => khơng deadlock
(65)Các tốn xử lý deadlock
❑ Ngăn chặn tắc nghẽn
❑ Tránh/ Ngăn ngừa tắc nghẽn (*)
❑ Phát hiện Xử lý tắc nghẽn
(66)Bài toán ngăn ngừa deadlock
❑
(67)Bài toán ngăn ngừa deadlock
(68)Thuật toán nhà băng Banker’s Algorithm
(69)Thuật toán nhà băng Banker’s Algorithm
❑ TestSafe()
(70)❑ Ý tưởng bản: đảm bảo ln có "con đường hiểm"
❑ Biểu đồ tài nguyên rút gọn
❑ Điều thực thi với thuật toán ngân
hàng:
❑ Khi yêu cầu thực
❑ Giả sử bạn chấp nhận
❑ Giả vờ làm tất yêu cầu pháp lý khác ❑ Biểu đồ bị giảm?
❑ Nếu vậy, phân bổ tài ngun u cầu ❑ Nếu khơng, khóa chủ đề