1.1 Deadlock là gì? Tại sao lại xảy ra Deadlock? Một tiến trình gọi là deadlocked nếu nó đang đợi một sự kiện mà sẽ không bao giờ xảy ra. Thông thường, có nhiều hơn một tiến trình bị liên quan trong một deadlock. Deadlock (Tắc nghẽn) là trạng thái xảy ra trong môi trường đa nhiệm (mutithreading) khi hai hoặc nhiều tiến trình đi vào vòng lặp chờ tài nguyên mãi mãi. o Ví dụ: Khi có thread (1) đang giữ tài nguyên (A) và cần truy cập tài nguyên(B) để tiếp tục xử lý (call method xử lý…) nhưng tài nguyên (B) đang được thread (2) sử dụng, trong lúc này thì thread (2) cũng đang cần truy cập vào tài nguyên (A) mà thread (1) đang sử dụng. Lúc này thì cả 2 thread đều không thể tiếp tục thực hiện mà đều phải “chờ” nhau nhưng không biết khi nào thì sẽ kết thúc. Một tiến trình gọi là trì hoãn vô hạn định (Indefinitely postponed) nếu nó bị trì hoãn một khoảng thời gian dài lặp đi, lặp lại trong khi hệ thống đáp án cho những tiến trình khác. o Ví dụ: Một tiến trình sẵn sàng để xử lý nhưng nó không bao giờ nhận được CPU. 1.2 Điều kiện cần để xảy ra DeadLock? Coffman, Elphick và Shoshani đã đưa ra 4 điều kiện cần có thể làm xuất hiện tắc nghẽn: 1) Loại trừ hỗ tương (Mutual exclusion): có sử dụng tài nguyên không thể chia sẻ (nonsharable). • Mỗi thời điểm, một tài nguyên không thể chia sẻ được hệ thống cấp phát chỉ cho một tiến trình, khi tiến trình sử dụng xong tài nguyên này, hệ thống mới thu hồi và cấp phát tài nguyên cho tiến trình khác. (Ví dụ: printer; shareable resource: readonly files). 2) Giữ và chờ cấp thêm tài nguyên (Hold and Wait): một process đang tiếp tục chiếm giữ ít nhất một tài nguyên và đang chờ thêm tài nguyên do quá trình khác đang giữ. 3) Không trưng dụng (Nopreemption): Tài nguyên không thể được thu hồi từ tiến trình đang chiếm giữ chúng trước khi tiến trình này sử dụng chúng xong. 4) Chu trình đợi (Circular wait): có ít nhất hai tiến trình chờ đợi lẫn nhau: tiến trình này chờ được cấp phát tài nguyên đang bị tiến trình kia chiếm giữ và ngược lại. Ví dụ: tồn tại một tập {A1 ,A2,…An} các quá trình đang đợi sao cho A1 đợi một tài nguyên của A2 đang giữ A2 đợi một tài nguyên của A3 đang giữ A(n) đợi một tài nguyên của A1 đang giữ Khi có đủ 4 điều kiện này, thì tắc nghẽn xảy ra. Nếu thiếu một trong 4 điều kiện trên thì không có tắc nghẽn. 1.3 Làm thế nào để phát hiện ra Deadlock? Chấp nhận xảy ra deadlock trong hệ thống, kiểm tra trạng thái hệ thống bằng giải thuật phát hiện deadlock.
BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA: AN TỒN THƠNG TIN NGUN LÝ HỆ ĐIỀU HÀNH VẤN ĐỀ DEADLOCK TRONG JAVA Giảng viên hướng dẫn: Sinh viên thực hiện: Lớp: AT13N03 Ths Trần Văn Minh Nguyễn Xuân Anh Thư Nguyễn Trịnh Phương Linh Nguyễn Xuân Thiên Trần Ngọc Thanh Vy Trần Thảo Vy LỜI MỞ ĐẦU Đề tài nghiên cứu thơng qua q trình tìm hiểu tài liệu “Vấn đề Deadlock Java” Từ đưa phương pháp, biện pháp khắc phục ngăn chặn trình xảy Deadlock Giúp giảm thiểu chi phí thời gian xây dựng hệ thống Đề tài chia làm chương: Chương 1: Deadlock Chương 2: Vấn đề Deadlock Java Chương 3: Chương trình minh họa vấn đề Deadlock Java Chương 4: Kết luận CHƯƠNG 1: DEADLOCK 1.1 Deadlock gì? Tại lại xảy Deadlock? - Một tiến trình gọi deadlocked đợi kiện mà không xảy Thơng thường, có nhiều tiến trình bị liên quan deadlock - Deadlock (Tắc nghẽn) trạng thái xảy môi trường đa nhiệm (muti-threading) hai nhiều tiến trình vào vòng lặp chờ tài ngun mãi o Ví dụ: Khi có thread (1) giữ tài nguyên (A) cần truy cập tài nguyên(B) để tiếp tục xử lý (call method xử lý…) tài nguyên (B) thread (2) sử dụng, lúc thread (2) cần truy cập vào tài nguyên (A) mà thread (1) sử dụng Lúc thread tiếp tục thực mà phải “chờ” khơng biết kết thúc - Một tiến trình gọi trì hỗn vơ hạn định (Indefinitely postponed) bị trì hỗn khoảng thời gian dài lặp đi, lặp lại hệ thống đáp án cho tiến trình khác 1.2 o Ví dụ: Một tiến trình sẵn sàng để xử lý khơng nhận CPU Điều kiện cần để xảy DeadLock? - Coffman, Elphick Shoshani đưa điều kiện cần làm xuất tắc nghẽn: 1) Loại trừ hỗ tương (Mutual exclusion): có sử dụng tài ngun khơng thể chia sẻ (nonsharable) • Mỗi thời điểm, tài ngun khơng thể chia sẻ hệ thống cấp phát cho tiến trình, tiến trình sử dụng xong tài nguyên này, hệ thống thu hồi cấp phát tài ngun cho tiến trình khác (Ví dụ: printer; shareable resource: readonly files) 2) Giữ chờ cấp thêm tài nguyên (Hold and Wait): process tiếp tục chiếm giữ tài nguyên chờ thêm tài ngun q trình khác giữ 3) Khơng trưng dụng (Nopreemption): Tài nguyên thu hồi từ tiến trình chiếm giữ chúng trước tiến trình sử dụng chúng xong 4) Chu trình đợi (Circular wait): có hai tiến trình chờ đợi lẫn nhau: tiến trình chờ cấp phát tài nguyên bị tiến trình chiếm giữ ngược lại Ví dụ: tồn tập {A1 ,A2,…An} trình đợi cho A1 đợi tài nguyên A2 giữ A2 đợi tài nguyên A3 giữ A(n) đợi tài nguyên A1 giữ Khi có đủ điều kiện này, tắc nghẽn xảy Nếu thiếu điều kiện khơng có tắc nghẽn 1.3 Làm để phát Deadlock? - Chấp nhận xảy deadlock hệ thống, kiểm tra trạng thái hệ thống giải thuật phát deadlock - Nếu có deadlock tiến hành phục hồi hệ thống - Các giải thuật phát deadlock thường sử dụng mơ hình RAG - Hệ thống cấp phát tài nguyên khảo sát số trường hợp sau: o Mỗi loại tài nguyên có thực thể (instance) o Mỗi loại tài nguyên có nhiều thực thể 1.4 Các biện pháp để ngăn chặn Deadlock? - Ngăn deadlock cách ngăn điều kiện cần để xảy deadlock 1) Ngăn Mutual Exclusion: o Đối với Nonsharable resource (ví dụ: printer): khơng làm o Đối với Sharable resource (ví dụ: read-only files): không cần thiết 2) Ngăn Hold and Wait: o Cách 1: Mỗi process yêu cầu toàn tài nguyên cần thiết lần Nếu có đủ tài ngun hệ thống cấp phát, khơng đủ tài ngun process phải bị blocked o Cách 2: Khi yêu cầu tài nguyên, process không giữ tài nguyên Nếu có phải trả lại trước yêu cầu o Khuyết điểm cách trên: Hiệu suất sử dụng tài nguyên thấp Qúa trình bị starvation 3) Ngăn No Preemption: Nếu process A có giữ tài nguyên yêu cầu tài nguyên khác tài nguyên chưa cấp phát thì: o Cách 1: Hệ thống lấy lại tài nguyên mà A giữ A bắt đầu lại có tài nguyên bị lấy lại với tài nguyên yêu cầu o Cách 2: Hệ thống xem tài nguyên mà A yêu cầu Nếu tài nguyên giữ process khác đợi thêm tài nguyên, tài nguyên hệ thống lấy lại cấp phát cho A Nếu tài nguyên giữ process không đợi tài nguyên, A phải đợi tài nguyên A bị lấy lại Tuy nhiên hệ thống lấy lại tài nguyên mà process khác yêu cầu 4) Ngăn Circular Wait: Gán thứ tự cho tất tài nguyên hệ thống 1.5 Các biện pháp để tránh deadlock: - Deadlock prevention sử dụng tài nguyên không hiệu - Deadlock avoidance đảm bảo hiệu suất sử dụng tài nguyên tối đa đến mức Yêu cầu process khai báo số lượng tài nguyên tối đa cần để thực công việc - Sử dụng giải thuật deadlock-avoidance kiểm tra trạng thái cấp phát tài nguyên để đảm bảo hệ thống không rơi vào deadlock o Giải thuật đồ thị cấp phát tài nguyên o Giải thuật Banker o Giải thuật yêu cầu tài nguyên o Giải thuật kiểm tra trạng thái an toàn Giải thuật đồ thị cấp phát tài nguyên: a) Ký hiệu: o Process: o Loại tài nguyên với thực thể: o Pi yêu cầu thực thể Rj: o Pi giữ thực thể Rj: b) Đồ thị cấp phát tài nguyên (Resource Allocation graph – RAG) đồ thị có hướng với tập đỉnh V tập cạnh E o Tập đỉnh V gồm loại: P = {P1,P2,…,Pn} : Tất process hệ thống R = {R1,R2,…Rm} : Tất loại tài nguyên hệ thống o Tập cạnh E gồm loại: Cạnh yêu cầu: Pi -> Rj Cạnh cấp phát: Rj -> Pi c) RAG deadlock: o RAG không chứa chu trình => Khơng xảy deadlock o RAG chứa hay nhiều chu trình: Nếu loại tài nguyên có thực thể => Xảy deadlock Nếu loại tài nguyên có nhiều thực thể => xảy deadlock 1.6 Khi Deadlock xảy phục phồi Deadlock nào? - Chủ yếu có ba hương tiếp cận để xử lý tắc nghẽn deadlock xảy : Dùng giao thức ( protocol ) để ngăn chặn (preventing) tránh(avoiding) deadlock , đảm bảo hệ thống không rơi vào tình trạng deadlock 1) Trong đó: + Ngăn deadlock (Preventing): khơng cho phép (ít nhất) điều kiện cần xuất deadlock +Tránh deadlock (Avoiding): process cần cung cấp thơng tin tài ngun cần, để hệ thống cấp phát tài nguyên cách thích hợp 2) Cho phép hệ thống vào trạng thái deadlock , sau phát deadlock phục hồi hệ thống 3) Bỏ qua vấn đề , xem deadlock không xảy hệ thống o Nhiều hệ điều hành sử dụng phương pháp Dẫn đến deadlock không phát hiện, làm giảm hiệu suất hệ thống Cuối hệ thống ngừng hoạt động phải khởi động lại - Khi deadlock xảy ra, để phục hổi thì: o Báo người vận hành hệ thống o Hệ thống tự động phục hồi cách bẻ gãy chu trình deadlock: Chấm dứt hay nhiều trình Lấy lại tài nguyên từ hay nhiều trình - Kết hợp phương pháp bản: Ngăn chặn (Prevention), tránh (avoidance), phát (detection), cho phép sử dụng cách giải tối ưu cho lớp tài nguyên hệ thống để giải deadlock - Phân chia tài nguyên thành lớp theo thứ bậc: Sử dụng kỹ thuật thích hợp cho việc quản lý deadlock lớp CHƯƠNG 2: DEADLOCK TRONG JAVA 2.1 Deadlock Java xảy nào? - Trong Java, Deadlock trường hợp có hai luồng chiếm giữ tài nghuyên khác nhau, hai luồng chờ tài ngun bên thứ lại để hồn thành cơng việc Và khơng bên chịu giải phòng tài nguyên mà chiếm giữ - Deadlock xảy sử dụng synchronization với mục đích đảm bảo thread-safe không cẩn thận sử dụng lock-object (objectidentifier) dễ dẫn đến deadlock - Các vấn đề thường gặp multithread: o Hai hay nhiều thread tranh sử dụng chung tài nguyên - race condition o Thread chiếm giữ tài nguyên thread khác yêu cầu đến -> dẫn đến bị tắc nghẽn - deadlock o Các thread khác chiếm hết tài nguyên -> có thread khơng cung cấp đủ tài ngun -> đói tài nguyên - resource starvation 2.2 DeadLock Java gồm trường hợp, sử dụng phương thức nào? - Để tránh trường hợp thường gặp trên, Java thường sử dụng: o Sử dụng chế Monitor o Sử dụng chế Semaphore o Sử dụng chế synchronized o Sử dụng Object Lock 2.3 Phương thức Synchronized: 2.3.1 Synchronized: - Từ khoá synchronized sử dụng cho việc truy cập độc quyền Để thực phương pháp đồng bộ, cần thêm từ khóa synchronized để khai báo Sau đó, khơng có hai lời gọi method đồng đối tượng xen vào với - Synchronized phải xác định đối tượng cung cấp khóa bên Khi đồng đối tượng - synchronized object sử dụng, bạn phải tránh sử dụng đồng hóa method đối tượng khác tham gia vào method đồng - Ta sử dụng sychronization cách: o Synchronized method: đặt từ khóa synchronized method o Synchronized block: đặt từ khóa synchronized bên method - Sự khác Synchronized method Synchronized block: o Dùng synchronized method có nghĩa method bị block thread thread thực thi Cách đơn giản đơi lúc cưng nhắc o Do đó, nên ưu tiên dùng synchronized block để giảm tối đa đoạn code bị lock, giảm đến mức thấp tình trạng “thắt nút cổ chai” – tất thread phải “đứng đợi” method 2.3.2 Hoạt động Synchronized 2.3.2.1 Synchronized method a) Synchronized instance method public synchronized void add(int value){ this.count += value; } - Chúng ta cần sử dụng từ khóa synchronized việc khai báo method Điều cho Java hiểu synchronized method - Một synchronized instance method Java đồng instance (object) sở hữu method Như vậy, instance có synchronized method đồng đối tượng khác Chỉ có thread thực bên instance method Nếu có nhiều instance tồn tại, thread thời điểm thực thi bên synchronized instance method instance b) Synchronized static method public static synchronized void add(int value){ count += value; } - Synchronized static methods đồng class object sở hữu static method Vì có class object tồn máy ảo Java với Class, có thread thực bên static synchronized method Class - Nếu static synchronized methods đặt Class khác thread thực thi bên static synchronized methods Class 2.3.2.2 Synchronized blocks a) - Synchronized instance blocks Chúng ta create khối synchronize bên method Đôi lúc muốn xử lý đồng phần method public void add(int value){ synchronized(this){ this.count += value; } } - Trong ví dụ này, ta sử dụng Java synchronized block construct để đánh dấu khối xử lý đồng Tuy nhiên đoạn mã không thực giống synchronized methods - Chỉ có thread bên Java code block đồng monitor object 10 b) Synchronized static blocks public static void add(int value){ synchronized(this){ this.count += value; } } CHƯƠNG 3: CHƯƠNG TRÌNH MINH HỌA VẤN ĐỀ DEADLOCK TRONG JAVA 3.1Mơ tả chương trình: Xét hệ thống làm thịt gà gồm thiết bị chính: - Thiết bị 1: Nhiệm vụ cắt cổ gà lấy tiết; - Thiết bị 2: Nhiệm vụ sơ chế gà; - Thiết bị 3: Nhiệm vụ nướng gà đóng gói Nhân viên kỹ thuật giao nhiệm vụ xây dựng quản lý hệ thống 3.2 Môi trường thực hiện: - Làm việc hệ điều hành Windows 10; - Môi trường làm việc: NetBeans IDE version 8.2; - Sử dụng JDK: jdk-8u171-nb-8_2-windows-x64.exe - Sử dụng phương thức: Synchronised để minh họa Deadlock 3.3 Triển khai ví dụ: - Xét trường hợp, nhân viên kỹ thuật khởi tạo nhầm chương trình số nguyên nhân tác động đó: o Thiết bị 1: Sau nhận gà cắt cổ gà thành công Chuyển sang giai đoạn sơ chế gà o Thiết bị 2: Sau nhận gà sơ chế gà thành công lại chuyển ngược lại thiết bị => Gây deadlock 11 o Lúc này, thiết bị không thực thi nhiệm vụ mình, nguyên nhân thiết bị sau sơ chế xong chuyển ngược lại cắt cổ gà trình lặp lại - Đoạn code: - Kết sau thực thi chương trình: - Giải vấn đề: 12 - Kết sau thực thi lại: 13 CHƯƠNG 4: KẾT LUẬN 4.1 Kết luận: Vấn đề Deadlock Java chủ đề khó Nó đòi hỏi kinh nghiệm kỹ người lập trình viên Khi viết chương trình hay hệ thống phần mềm cần phải suy nghĩ đến trường hợp xảy Deadlock để ngăn chặn kịp thời, tránh việc tốn thời gian chi phí sửa chữa khơng thể giao sản phẩm hạn đến tay khách hàng Nếu để xảy Deadlock cần phải lựa chọn phương pháp phù hợp để phục hồi chương trình sớm tốt 4.2 Kết thu được: - Thông qua việc nghiên cứu “Vấn đề Deadlock Java” Nhóm chúng em phần cải thiện kiến thức vấn đề deadlock hệ điều hành áp dụng để triển khai hệ thống ngôn ngữ Java - Nâng cao khả làm việc giải ngăn chặn trình deadlock xảy trình lập trình làm việc với hệ điều hành - Hiểu biết thêm phương thức thư viện Java 14 ... dựng hệ thống Đề tài chia làm chương: Chương 1: Deadlock Chương 2: Vấn đề Deadlock Java Chương 3: Chương trình minh họa vấn đề Deadlock Java Chương 4: Kết luận CHƯƠNG 1: DEADLOCK 1.1 Deadlock gì?... giải deadlock - Phân chia tài nguyên thành lớp theo thứ bậc: Sử dụng kỹ thuật thích hợp cho việc quản lý deadlock lớp CHƯƠNG 2: DEADLOCK TRONG JAVA 2.1 Deadlock Java xảy nào? - Trong Java, Deadlock. .. cứu Vấn đề Deadlock Java Nhóm chúng em phần cải thiện kiến thức vấn đề deadlock hệ điều hành áp dụng để triển khai hệ thống ngôn ngữ Java - Nâng cao khả làm việc giải ngăn chặn trình deadlock