Trang MÔN : HỆ ĐIỀU HÀNH Bài thực hành số 6.1 : Semaphore I Mục tiêu : Giúp SV củng cố kiến thức semaphore : tính chất cơng dụng thơng qua số thí dụ cụ thể II Nội dung : Cố gắng trả lời câu hỏi ₫ề semaphore III Chuẩn ₫ầu : Sinh viên nắm vững sử dụng thành thạo semaphore ₫ể giải loại trừ tương hỗ process chúng truy xuất vào tài nguyên dùng chung ₫ồng thời, ₫ể ₫ồng hóa việc chạy process IV Qui trình : Giới thiệu Tài nguyên dùng chung tài nguyên mà nhiều process ₫ồng thời (hay thread) truy xuất ₫ược Nếu ₫ể process truy xuất ₫ồng thời tự tài nguyên dễ làm hư hỏng tài ngun, ₫ó cần phải có chế kiểm sốt việc truy xuất ₫ồng thời Hiện ta dùng chế loại trừ tương hỗ process ₫ồng thời, nghĩa tối ₫a process ₫ược phép truy xuất tài nguyên tài thời ₫iểm Ta gọi "critical section" - CS ₫oạn code process mà truy xuất tài nguyên dùng chung, ₫ó cần ₫ược chạy theo tính ngun tử (khơng thể chia cắt, khơng thể thấy từ ngồi, khơng thể dừng ₫ột ngột, ) Tính ngun tử có nghĩa hay nhiều ₫oạn CS nhiều process truy xuất tài nguyên xác ₫ịnh không ₫ược chạy ₫ồng thời mà phải Loại trừ tương hỗ trường hợp ₫ặc biệt việc ₫ồng hóa process Đồng hoạt ₫ộng kiểm sốt việc chạy process cho : • thiết lập ₫ược thứ tự xảy số hoạt ₫ộng (gởi/nhận) • tuân thủ ₫iều kiện (cuộc hẹn, loại trừ tương hỗ, ) Chờ chủ ₫ộng chế dùng CPU chạy lặp lại ₫oạn code kiểm soát tới lúc mà ₫iều kiện xác ₫ịnh xảy ra, lúc process tiếp tục công việc theo thuật giải gốc Semaphore ₫ối tượng cho phép loại trừ tương hỗ việc truy xuất tài nguyên xác ₫ịnh mà tránh ₫ược việc dừng chờ chủ ₫ộng Về góc nhìn người dùng, semaphore có counter chứa số nguyên dương tác vụ down() up() biến counter Về mặt thực, nhiều cách thực sau : • semaphore có biến counter thuộc kiểu số nguyên, số dương miêu tả số tài nguyên rảnh, số âm miêu tả số process ₫ang chờ truy xuất tài nguyên • hàng ₫ợi chứa process ₫ang chờ thực tác vụ down(), HĐH có sách quản lý hàng ₫ợi riêng • lúc tạo semaphore, hàng ₫ợi trạng thái trống Semaphore ₫ược quản lý tác vụ có chế thực thi ngun tử, khơng chia cắt sau : SinhVienZone.com https://fb.com/sinhvienzonevn Trang • SEM cs = new SEM(cnt) : tạo semaphore với counter ban ₫ầu cnt • cs.down() : yêu cầu truy xuất tài ngun tương ứng Nếu khơng tài nguyên process bị giam vào hàng ₫ợi (Blocked) • cs.up() : giải phóng tài ngun ₫ang dùng, hàng ₫ợi không trống, chọn process cho chạy tiếp • delete(cs) : xóa semaphore, hàng ₫ợi khơng trống cần xử lý lỗi Hãy thực tác vụ down() up() cách dùng tác vụ sau : • TASK current : miêu tả process hành (Running) • void insert(TASK t, List lstBlocked) : thêm process vào hàng ₫ợi • cs.up() : giải phóng tài nguyên ₫ang dùng, hàng ₫ợi khơng trống, chọn process cho chạy tiếp • TASK remove(List lstBlocked) : lấy process hàng ₫ợi (và xóa hàng ₫ợi) class SEM { int cnt; List lstBlocked = new List(); public SEM(int cnt) { this.cnt = cnt; } //tác vụ down public void down() { cnt ; //a if (cnt < 0) { //b current.state = BLOCKED; //c insert(current,cs.lstBlocked);//d commut(); //chuyển ngữ cảnh cho thành phần khác chạy } } //tác vụ up public void up() { TASK t; cnt++; //x if (cnt blocked; A,C : ready B, C C:running->blocked; A : ready; B:blocked C A : running; B:blocked->ready; C:blocked B:running; C:blocked->ready C:running Kịch thứ : B thực thi (d), bị blocked A thực thi (c) giúp B chạy tiếp Do ₫ó khơng thể thực thi (e) ₫ược Ta xét process chạy ₫ồng thời máy, biến a biến dùng chung ta ₫ã thiết lập sau : SinhVienZone.com https://fb.com/sinhvienzonevn Trang int a = 6; SEM m1 = new SEM(1); SEM m2 = new SEM(0); Process A m1.down(); a = a + 7; m2.up(); Process B a = a - 5; Process C m1.up(); m2.down(); a = a * 3; Biến a nhận giá trị sau chạy process ? Ứng với giá trị a, miêu tả trình tự thi hành lệnh tạo kết tương ứng ABC -> 24 ACB -> 34 BAC -> 24 Lưu ý semaphore m1 hồn tồn khơng có tác dụng trường hợp chạy • Hãy thêm semaphore cần thiết vào ₫oạn lệnh process ₫ể sau chạy xong process, biến a = 34 Miêu tả phần thiết lập giá trị ₫ầu cho semaphore ₫ược thêm • câu hỏi ₫ể giá trị a = 24 Chỉ kịch chạy sau tạo a = 34 : ta tạo thêm semaphore m3 với giá trị ₫ầu = ₫ể kiểm sốt B ₫ược chạy sau C hồn thành : Process A m1.down(); a = a + 7; m2.up(); Process B m3.down(); a = a - 5; Process C m1.up(); m2.down(); a = a * 3; m3.up(); Có kịch chạy sau tạo a = 24 : ta tạo thêm semaphore m3 với giá trị ₫ầu = ₫ể kiểm soát C chạy sau : Process A m1.down(); a = a + 7; m2.up(); Process B a = a - 5; m3.up(); Process C m1.up(); m2.down(); m3.down(); a = a * 3; Semaphore ₫ược loại bỏ mà khơng cần hiệu chỉnh việc thi hành process ? Giải thích Semaphore m1 khơng kẹt Do ₫ó khơng cần thiết 10 Ta hiệu chỉnh ₫ồng hóa process sau : Process A m1.down(); m2.down(); a = a + 7; m1.up(); m2.up(); SinhVienZone.com Process B m2.down(); a = a - 5; m2.up(); m1.up(); Process C m2.down(); m1.down(); a = a * 3; m2.up(); https://fb.com/sinhvienzonevn Trang Semaphore m1 m2 ₫ều ₫ược thiết lập giá trị ₫ầu Kết việc hiệu chỉnh ? Giải thích Một số trình tự chạy dẫn ₫ến deadlock Chẳng hạn : A:m1.down() C: m2.down() B: m2.down() -> blocked A: m2.down()->blocked C: m1.down() -> blocked SinhVienZone.com https://fb.com/sinhvienzonevn ... sau : SinhVienZone. com https://fb .com/ sinhvienzonevn Trang int a = 6; SEM m1 = new SEM (1) ; SEM m2 = new SEM(0); Process A m1.down(); a = a + 7; m2.up(); Process B a = a - 5; Process C m1.up();... A m1.down(); m2.down(); a = a + 7; m1.up(); m2.up(); SinhVienZone. com Process B m2.down(); a = a - 5; m2.up(); m1.up(); Process C m2.down(); m1.down(); a = a * 3; m2.up(); https://fb .com/ sinhvienzonevn... Process C m1.up(); m2.down(); m3.down(); a = a * 3; Semaphore ₫ược loại bỏ mà không cần hiệu chỉnh việc thi hành process ? Giải thích Semaphore m1 khơng kẹt Do ₫ó khơng cần thiết 10 Ta hiệu chỉnh