Bài giảng Hệ điều hành - Chương 5.2: Đồng bộ giúp người học hiểu được nhóm giải pháp Busy waiting bao gồm: Các giải pháp phần mềm, các giải pháp phần cứng. Đây là một tài liệu hữu ích dành cho các bạn sinh viên đang theo học và những ai quan tâm dùng làm tài liệu học tập và nghiên cứu.
HỆ ĐIỀU HÀNH Chương – Đồng (2) 1/17/2018 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Ôn tập chương (1) Khi xảy tranh chấp race condition? Vấn đề Critical Section gì? Yêu cầu lời giải cho CS problem? Có loại giải pháp? Kể tên? 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Mục tiêu chương (2) Hiểu nhóm giải pháp Busy waiting bao gồm: Các giải pháp phần mềm Các giải pháp phần cứng 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Nội dung chương (2) Các giải pháp phần mềm Sử dụng giải thuật kiểm tra luân phiên Sử dụng biến cờ hiệu Giải pháp Peterson Giải pháp Bakery Các giải pháp phần cứng Cấp ngắt Chỉ thị TSL 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Giải thuật Biến chia sẻ int turn; /* khởi đầu turn = */ turn = i Pi phép vào critical section, với i = hay Process Pi { while (turn != i); critical section turn = j; remainder section } while (1); Thỏa mãn Mutual exclusion (1) Nhưng không thoả mãn yêu cầu progress (2) bounded waiting (3) tính chất strict alternation giải thuật 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Giải thuật (tt) Process P0: while (turn != 0); critical section turn := 1; remainder section while (1); Process P1: while (turn != 1); critical section turn := 0; remainder section while (1); Điều xảy P0 có RS (remainder section) lớn cịn P1 có RS nhỏ? 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Giải thuật Biến chia sẻ boolean flag[ ]; /* khởi đầu flag[ ] = flag[ ] = false */ Nếu flag[ i ] = true Pi “sẵn sàng” vào critical section Process Pi { flag[ i ] = true; /* Pi “sẵn sàng” vào CS */ while ( flag[ j ] ); /* Pi “nhường” Pj */ critical section flag[ i ] = false; remainder section } while (1); Thỏa mãn Mutual exclusion (1) Không thỏa mãn progress Vì sao? 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Giải thuật (Peterson) Biến chia sẻ Kết hợp giải thuật Process Pi, với i = i = { flag[ i ] = true; /* Process i sẵn sàng */ turn = j; /* Nhường process j */ while (flag[ j ] and turn == j); critical section flag[ i ] = false; remainder section } while (1); Thoả mãn yêu cầu ? ⇒ giải toán critical section cho process 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Giải thuật (Peterson) cho tiến trình Process P0 { Process P1 { /* wants in */ /* wants in */ flag[0] = true; flag[1] = true; /* gives a chance to */ /* gives a chance to */ turn = 1; while (flag[1] &&turn == 1); critical section turn = 0; while (flag[0] && turn == 0); critical section /* no longer wants in */ /* no longer wants in */ flag[0] = false; remainder section } while(1); 1/17/2018 flag[1] = false; remainder section } while(1); Copyrights 2017 CE-UIT All Rights Reserved Giải thuật 3: Tính đắn Giải thuật thỏa mutual exclusion, progress, bounded waiting Mutual exclusion đảm bảo bởi P0 P1 ở CS flag[0] = flag[1] = true turn = I cho Pi (không thể xảy ra) Chứng minh thỏa yêu cầu progress bounded waiting Pi vào CS bị kẹt vòng lặp while() với điều kiện flag[j]=true turn = j Nếu Pj khơng muốn vào CS flag[j] = false Pi vào CS 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 10 Giải thuật 3: Tính đắn (tt) Nếu Pj bật flag[j]=true chờ while() có hai trường hợp turn = i turn = j Nếu turn = i Pi vào CS Nếu turn = j Pj vào CS bật flag[j]=false thoát -> cho phếp Pi CS Nhưng Pj có đủ thời gian bật flag[j]=true Pj phải gán turn = i Vì Pi khơng thay đởi trị biến turn kẹt vòng lặp while(), Pi chờ để vào CS nhiều sau lần Pj vào CS (bounded waiting) 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 11 Giải thuật bakery: n process Trước vào CS, process Pi nhận số Process giữ số nhỏ vào CS Trường hợp Pi Pj cùng nhận số: Nếu i < j Pi vào trước (Đối xứng) Khi khỏi CS, Pi đặt lại số bằng Cơ chế cấp số cho process thường tạo số theo chế tăng dần, ví dụ 1, 2, 3, 3, 3, 3, 4, 5,… Kí hiệu (a,b) < (c,d) a < c if a = c b < d max(a0,…,ak) số b cho b ≥ với mọi i = 0,…, k 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 12 Giải thuật bakery: n process (tt) /* shared variable */ boolean choosing[ n ]; /* initially, choosing[ i ] = false */ int num[ n ]; /* initially, num[ i ] = */ { choosing[ i ] = true; num[ i ] = max(num[0], num[1],…, num[n − 1]) + 1; choosing[ i ] = false; for (j = 0; j < n; j++) { while (choosing[ j ]); while ((num[ j ] != 0) && (num[ j ], j) < (num[ i ], i)); } critical section num[ i ] = 0; remainder section } while (1); 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 13 Từ software đến hardware Khuyết điểm giải pháp software: Các process yêu cầu vào vùng tranh chấp phải liên tục kiểm tra điều kiện (busy waiting), tốn nhiều thời gian xử lý CPU Nếu thời gian xử lý vùng tranh chấp lớn, giải pháp hiệu nên có chế block process cần đợi Các giải pháp phần cứng: Cấm ngắt (disable interrupts) Dùng lệnh đặc biệt 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 14 Cấm ngắt Trong hệ thống uniprocessor: mutual exclusion đảm bảo Nhưng system clock cập nhật interrupt thì… Trong hệ thống multiprocessor: mutual exclusion không đảm bảo Process Pi: { ; disable_interrupts() critical section enable_interrupts(); remainder section } while (1); Chỉ cấm ngắt CPU thực thi lệnh disable_interrupts Các CPU khác truy cập nhớ chia sẻ 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 15 Lệnh TestAndSet Đọc ghi biến thao tác atomic (không chia cắt được) boolean TestAndSet( boolean *target){ boolean rv = *target; *target = true; Shared data: boolean lock = false; Process Pi : return rv; } { while (TestAndSet(&lock)); critical section lock = false; remainder section } while (1); 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 16 Lệnh TestAndSet Mutual exclusion bảo đảm: Pi vào CS, process Pj khác busy waiting Khi Pi khỏi CS, trình chọn lựa process Pj vào CS tùy ý ⇒ không bảo đảm điều kiện bounded waiting Do xảy starvation (bị bỏ đói) Các processor (ví dụ Pentium) thông thường cung cấp lệnh đơn Swap(a, b) có tác dụng hốn chuyển nội dung a b Swap(a, b) có ưu nhược điểm TestAndSet 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 17 Swap mutual exclusion Biến chia sẻ lock khởi tạo giá trị false Mỗi process Pi có biến cục key Process Pi thấy giá trị lock = false vào CS Process Pi loại trừ process Pj khác thiết lập lock = true void Swap(boolean *a, boolean *b) { boolean temp = *a; *a = *b; *b = temp; } 1/17/2018 ➢ Biến chia sẻ (khởi tạo false) bool lock; bool key; ➢ Process Pi { key = true; while (key == true) Swap(&lock, &key); critical section lock = false; remainder section } while (1) Không thỏa mãn bounded waiting Copyrights 2017 CE-UIT All Rights Reserved 18 Giải thuật dùng TestAndSet thoả mãn yêu cầu Cấu trúc dữ liệu dùng chung (khởi tạo false) bool waiting[ n ]; bool lock; Mutual exclusion: Pi vào CS waiting[ i ] = false, key = false key = false TestAndSet (hay Swap) thực thi Process thực thi TestAndSet mới có key == false; process khác phải đợi waiting[ i ] = false process khác rời khỏi CS Chỉ có waiting[ i ] có giá trị false Progress: chứng minh tương tự mutual exclusion Bounded waiting: waiting in the cyclic order 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 19 Giải thuật dùng TestAndSet thoả mãn yêu cầu (tt) { waiting[ i ] = true; key = true; while (waiting[ i ] && key) key = TestAndSet(lock); waiting[ i ] = false; critical section j = (i + 1) % n; while ( (j != i) && !waiting[ j ] ) j = (j + 1) % n; if (j == i) lock = false; else waiting[ j ] = false; remainder section } while (1) 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 20 Tóm tắt lại nội dung b̉i học Các giải pháp phần mềm Sử dụng giải thuật kiểm tra luân phiên Sử dụng biến cờ hiệu Giải pháp Peterson Giải pháp Bakery Các giải pháp phần cứng Cấp ngắt Chỉ thị TSL 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 21 THẢO LUẬN 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved 22 ... Reserved Mục tiêu chương (2) Hiểu nhóm giải pháp Busy waiting bao gồm: Các giải pháp phần mềm Các giải pháp phần cứng 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved Nội dung chương (2) ... khỏi CS Chỉ có waiting[ i ] có giá trị false Progress: chứng minh tương tự mutual exclusion Bounded waiting: waiting in the cyclic order 1/17/2018 Copyrights 2017 CE-UIT All Rights Reserved... cầu (tt) { waiting[ i ] = true; key = true; while (waiting[ i ] && key) key = TestAndSet(lock); waiting[ i ] = false; critical section j = (i + 1) % n; while ( (j != i) && !waiting[ j ] ) j =