BÀI tập môn học NGUYÊN lý hệ điều HÀNH VIẾT CHƯƠNG TRÌNH mô PHỎNG QUÁ TRÌNH ĐỒNG bộ TIẾN TRÌNH THEO THEO THUẬT TOÁN 5 TRIẾT GIA ăn tối BẰNG NGÔN NGỮ JAVA
Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
26,37 KB
Nội dung
HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA CỒNG NGHỆ THÔNG TIN BÀI TẬP MÔN HỌC NGUYÊN LÝ HỆ ĐIỀU HÀNH VIẾT CHƯƠNG TRÌNH MƠ PHỎNG Q TRÌNH ĐỒNG BỘ TIẾN TRÌNH THEO THEO THUẬT TỐN TRIẾT GIA ĂN TỐI BẰNG NGƠN NGỮ JAVA Ngành: An tồn thơng tin Sinh viên thực hiện: Nguyễn Văn Hiệp Phạm Công Hưởng Nguyễn Anh Tuấn Lớp: AT16C0405 Người hướng dẫn: TS Nguyễn Đào Trường Khoa Công nghệ thông tin - Học viện Kỹ thuật mật mã Hà Nội, 2022 NHẬN XÉT VÀ CHO ĐIỂM CỦA GIÁO VIÊN LỜI NĨI ĐẦU Nếu khơng có phần mềm, máy tính thiết bị điện tử thông thường Với hỗ trợ phần mềm, máy tính lưu trữ, xử lý thơng tin người sử dụng gọi lại thơng tin Phần mềm máy tính chia thành nhiều loại: chương trình hệ thống, quản lý hoạt động máy tính Chương trình ứng dụng, giải vấn đề liên quan đến việc sử dụng khai thác máy tính người sử dụng hệ điều hành thuộc nhóm chương trình hệ thống chương trình hệ thống quan trọng máy tính người sử dụng Hệ điều hành điều khiển tất tài nguyên máy tính cung cấp mơi trường thuận lợi để chương trình ứng dụng người sử dụng viết chạy máy tính Một máy tinh đại bao gồm: nhiều processor, nhớ, clocks, đĩa, giao diện mạng, thiết bị vào/ra khác Tất tạo thành hệ thống phức tạp Để viết chương trình để theo dõi tất thành phần máy tính sử dụng chúng cách hiệu quả, người lập trình phải biết processor thực chương trình nào, nhớ lưu trữ thông tin nào, thiết bị đĩa làm việc (đọc/ghi) nào, lỗi xảy đọc block đĩa, cơng việc khó khăn q q khó người lập trình Nhưng may cho người lập trình ứng dụng người sử dụng công việc hệ điều hành hỗ trợ nên họ không cần quan tâm đến Chúng ta cần tìm hiểu hệ điều hành đề có nhìn tổng quát liên quan đến việc thiết kế cài đặt cũgn chức hệ điều hành để hệ điều hành đạt mục tiêu: Giúp người sử dụng khai thác máy tính cách dễ dàng chương trình người sử dụng chạy máy tính “Bài tốn bữa tối triết gia” (Dining Philosophers), toán kinh điển tương tranh chia sẻ tài nguyên Việc nghiên cứu toán cho hiểu rõ khia cạnh hệ thống CHƯƠNG 1: CƠ SỞ LÝ THUYẾT I, Tiến trình(processes) 1, Khái niệm: - Tiến trình phận chương trình thực thực hiện, đơn vị thực tiến trình processer - Vì tiến trình phận chương trình nên tương tự chương trình tiến trình sở hữu trỏ lệnh, trỏ stack, tập ghi, không gian địa nhớ tất thơng tin cần thiết khác để tiến trình hoạt động 2, Các loại tiến trình: - Các tiến trình hệ thống chia làm hai loại: tiến trình tiến trình song song + Tiến trình tiến trình mà điểm khởi tạo điểm kết thúc tiến trình trước + Tiến trình song song tiến trình mà điểm khởi tạo tiến trình nằm thân tiến trình khác, thức khởi tạo tiến trình tiến trình chưa kết thúc II, Luồng(Thread) Luồng thành phần tiến trình sở hữu ngăn xếp thực thi độc lập mã lệnh tiến trình Nếu hệ điều hành có nhiều tiến trình tiến trình bạn tạo nhiều tuyến hoạt động song song hệ điều hành Ưu điểm tuyến chúng hoạt động không gian địa tiến trình Tập hợp nhóm tuyến sử dụng chung biến tồn cục, vùng nhớ Heap, bảng mơ tả íìle tiến trình, chế liên lạc tuyến đơn giản hiệu chế liên lạc tiến trình với Ưu điểm việc sử dụng luồng tiến trìnhh đơn giản lập trình Nhiều thao tác xuất nhập hiển thị liệu tách rời phân cho tuyến chạy độc lập thực thi III,Giải pháp Semaphore Semaphore dóng góp quan trọng nhà tốn học E W Dijktra Có thể xem Semaphore mở rộng Mutex locks Semaphore S biến tài nguyên, khởi gán giá trị khơng âm, khả phục vụ tài nguyên tương ứng với Ứng với S có hàng đợi F(s) để lưu tiến trình bị blocked S Chỉ có hai thao tác Down Up tác động đến Semaphore S Down giảm S xuống đơn vị, Up tăng S lên đơn vị Ở cần lưu ý rằng: Down Up thủ tục hệ điều hành, nên hệ điều hành cài đặt chế độc quyền cho nó, tức lệnh bên khơng thể tách rời IV, Deadlock - Deadlock trạng thái mà tập tiến trình bị chặn tiến trình chiếm giữ tài nguyên chờ đợi cấp phát tài nguyên khác giữ tiến trình khác Nói cách khác, tiến trình hệ thống chờ để cấp phát tài nguyên bị chiếm giữ tài nguyên khác Nếu tài ngun khơng giải phóng để tiến trình khác sử dụng, tiến trình chờ lấy tài nguyên chờ mãi, chờ dẫn đến khoá chết (Deadlock) - Các điều kiện phát sinh Deadlock: + Loại từ tương hỗ (Mutual Exclusion): thời điểm, tài nguyên chia sẻ cho hệ thống cấp phát cho tiến trình Tiến trình khác sử dụng tài nguyên giải phóng + Giữ chờ (hold and wait): Mỗi tiến trình tập hợp tiến trình giữ tài nguyên chờ đợi để cấp phát tài ngun + Khơng có quyền ưu tiên (No Preemption): Một tiến trình khơng thể ciếm giữ tài nguyên tài nguyên giải phóng tiến trình sử dụng + Tồn chu kì chờ (Circular Wait): Các tiến trình giữ tài nguyên chờ nhận tài nguyên khác tiến trình kahsc Chúng nối tạo thành vịng trịn Chờ vơ tận CHƯƠNG 2: MƠ TẢ BÀI TỐN I, Đề bài: Viết chương trình mơ q trình đồng tiến trình (điều độ) theo thuật tốn triết gia ăn tối ngôn ngữ Java II, Mô tả toán: Đây toán cổ điển hệ điều hành Bài toán bữa tối triết gia đưuocj đưa bời nhà toán học E W.Dijkstra Bài tốn mơ tả sau: Có năm triết gia ngồi ăn quanh bàn tròn, trước mặt người có đĩa đồ ăn, người có đĩa, hai triết gia có đũa Bài toán phát biểu sau: “ triết gia suy nghĩ, ông ta giao tiếp với triết gia khác Thỉnh thoảng, triết gia cảm thấy đói cố gắng chọn đũa gần nhất( đũa trái đũa phải) Một triết gia lấy đũa thời điểm Chú ý, ông ta lấy đũa mà dùng người bên cạnh Khi triết gia đối có hai đũa lúc, ông ta ăn mà không đặt đũa xuống Khi triết gia ăn xong, ông ta đặt đũa xuống bắt đầu suy nghĩ tiếp” III,u cầu: - Tìm cách để khơng chết đói - Bài toán đặt vấn đề “đồng tiến trình”, giải vấn đề tắc nghẽn xảy CHƯƠNG 3: CÁCH GIẢI QUYẾT BÀI TOÁN I, Mô tả hướng giải Để giải tốn, phần này, ta sử dụng thuật tốn Semaphore Và sử dụng tính chất hoạt động song song đa luồng (Thread) II, Giải thích code kết 1, Class Fork (đũa): statĩc class Fork { public Semaphore mutex = new Semaphữ void grab() { try { ■ mutex.acquire()j } catch (Exception e) { e.printStackTrace(System.out); } } void release() { mutex.release()■ } boolean isFree() { return mutex.availablePermitsO > 0j } } - Với class này, áp dụng thuật toán Semaphore để đánh dấu trạng thái đũa toán Những đũa ban đầu có giá trị Ở giá trị này, coi khơng sử dụng - Khi mà đũa sử dụng, với phương thức acquire(), gán cho đũa giá trị - trạng thái sử dụng - Khi mà sử dụng xong (Hết sleep time) phương thức release() trả lại cho đũa giá trị - Ở đây, ta cho thêm phương thức isFree(), phương thức giúp kiểm tra trạng thái đũa 2, Class Philosopher static class Philosopher extends Thread { public int number; public Fork leftFork; public Fork rightFork; Philosopher(int num, Fork left, Fork right) { number = num; leftFork = leít; rightFork = right; } public void run(){ System.out.println("Xin chão! Tòi lã nhã triết gia số " + number); int think = 0; while (true) { leftFork.grab(); System.out.println("Nhà triểt gia số " + number + ” láy đũa trái.1'); rightFork.grab(); System.out.println("Nhà triết gia sổ " + number + " láy đũa phải."); think = 1; eat(); leftFork.release(); System.out.println("Nhà triết gia số " + number + " nhả đũa trái."); rightFork.release(); System.out.println("Nhà triết gia số " + number + " nhả đũa phải."); if (think == 1) System.out.println("Nhà triết gia sổ " + number + " suy nghĩ!1'); } }| } // void eat() { try { int sleepTime = ThreadLocalRandom.currento.nextlnt(0, 1000); System.out.println("Nhà triết gia số " + number + " ăn " + sleepTime); Thread.steep(sleepTime); } catch (Exception e) { e.printStackTrace(System.out); } - Với class Philosopher, ta kế thừa class Thread để giúp cho class sử dụng chế đa luồng Thread - Đầu tiên, có thuộc tính, number: số thứ tự nhà triết gia, leftFork rightFork: đũa trái, đũa phải triết gia tương ứng - Tiếp theo, có hàm khởi tạo class - Các triết gia có hành động là: tham gia vào bữa ăn, lấy đũa trái, lấy đũa phải, suy nghĩ ăn 3, Main: public static void main(string argv[]) { System.out.println("Giái vãn đề bữa ăn nhà triết gia."); for (int i = 0; i < phỉLosophersNumber; i++) { /orfes[i] = new Fork(); for (int i = 0; i < phiLosophersNumber' Ỉ++) { phỉLosophers[i] = new Philosopheríi, /orfes[i]j forks[(i + 1) % phỉLosophersNumber]); phỉLosophers[i].start(); } while (true) { try { // sleep séc Thread.steep(1000); // check for deadlock boolean deadlock = true; for (Fork f : forks) { if (f.isFree()) { deadlock = talse; break; }' } if (deadlock) { Thread.steep(1000); System.out.println("cảnh báo! Đã đẽn giới hạn Deadlock!"); break; } } catch (Exception e) { e.printStackTrace(System.out); } } System.out.println("Bye!"); System.exit(0); } - Phương thức Main, phương thức sử dụng hai class mà tạo class Fork class Philosopher để chạy chương trình |for (int i = 0; i < phiLosophersNìỉber; i++) { /orks[i] = new Fork()j } - Dùng để tạo mảng chứa đối tượng đũa |for (int i = 0; ỉ < phiLosophersNumber; i++) { phitosophers[i] = new Philosopher(i, yorfes[i]j forks[(i + 1) % phiLosophersNumber]); phiLosophers[i].start(); } - - Dùng để tạo mảng gán đối tượng nhà triết gia khởi động luồng uhile (true) { try { /Ị sleep sec Thread.sLeep(1000); Ị ị check for deadlock bũũlean deadlock = truej for (Fork f : /ơrks) { if (í.isFree()) { deadlũck = fal.se; break; } } if (deadlock) { Thread.steep(1000); System.out.printỉn("Cảnh báo! Đã đến giới hạn Deadlock!")j break; } } catch (Exception e) { e.prĩntStackTrace(System.out); } } System.out.println("Bye!"); System.exit(0); } - Với vịng lặp While, vịng lặp có tác dụng kiểm tra trình Deadlock Tất luồng kiểm tra tài nguyên chiếm giữ Nếu tất luồng bị tải không đủ tài nguyên, dẫn đến giới hạn Deadlock, người dùng nhận cảnh báo tự động dừng chương trình KẾT LUẬN Qua tập này, hiểu rõ cách thức hoạt động luồng hệ điều hành, cách luồng nhận giả lại tài nguyên cho hợp lý hệ điều hành hoạt động tốt Và hiểu thêm thuật toán Semaphore cách thức hoạt động nó, kết hợp với luồng, để sử dụng trường hợp tương lai Em cảm ơn thầy cho em hội nghiên cứu đề tài giúp em có thêm kiến thức Em xin cảm ơn! ... tạo thành vịng trịn Chờ vơ tận CHƯƠNG 2: MƠ TẢ BÀI TỐN I, Đề bài: Viết chương trình mơ q trình đồng tiến trình (điều độ) theo thuật tốn triết gia ăn tối ngơn ngữ Java II, Mơ tả tốn: Đây toán. .. tiến trình: - Các tiến trình hệ thống chia làm hai loại: tiến trình tiến trình song song + Tiến trình tiến trình mà điểm khởi tạo điểm kết thúc tiến trình trước + Tiến trình song song tiến trình. .. hệ điều hành Bài toán bữa tối triết gia đưuocj đưa bời nhà toán học E W.Dijkstra Bài toán mơ tả sau: Có năm triết gia ngồi ăn quanh bàn tròn, trước mặt người có đĩa đồ ăn, người có đĩa, hai triết