TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
-��� -BÀI TẬP LỚN MÔN: NGUYÊN LÝ HỆ ĐIỀU HÀNH
ĐỀ TÀI: Lập trình mô phỏng các phương pháp kiểm tra
tính an toàn của hệ
Giảng viên : TS Nguyễn Bá Nghiễn
Nhóm số: 04
Lớp: IT6025.2 - K15
Hà Nội, 2022
Trang 2Mục lục
Mục lục 1
Lời mở đầu 2
Chương I: Tìm hiểu về hiện tượng bế tắc 3
1.1 Khái niệm bế tắc 3
1.2 Điều kiện xảy ra bế tắc trong hệ thống 4
1.3 Các mức phòng tránh bế tắc 4
1.4 Ngăn chặn bế tắc và an toàn hệ thống 5
1.4.1 Ngăn chặn bế tắc 5
1.4.2 Dãy tiến trình an toàn 7
Chương II: Tìm hiểu về các phương pháp kiểm tra hệ an toàn 8
Chương III: Cài đặt thuật toán 10
3.1 Thuật toán chuyển sang trạng thái an toàn 10
3.2 Thuật toán kiểm tra tính an toàn của hệ 11
3.3 Cài đặt thuật toán 12
3.4 Ví dụ minh họa 16
Kết luận 17
Tài liệu tham khảo 18
Trang 3Lời mở đầu
Công nghệ thông tin trong giai đoạn hiện nay đang phát triển như vũ bão ở mọi lĩnh vực hoạt động khắp nơi trên thế giới Điều xảy ra trong vòng vài năm qua ở Việt Nam là sự đầu tư ồ ạt vào công nghệ Tin học đã và đang
là một trong các vấn đề không thể thiếu đối với bất kỳ công ty nào Đặc biệt tin học ngày càng giữ vai trò quan trọng trong vấn đề quản lý tại các tổ chức nhất là tại các lĩnh vực thu thập thông tin Tuy ngành công nghệ thông tin ở nước ta mới chỉ phát triển trong vài năm trở lại đây và đang từng bước phát triển nhưng những bước phát triển đó đã cho thấy tiềm năng lớn lao trong lĩnh vực công nghệ thông tin ở nước ta, trong đó phát triển hệ thống thông tin đang
là thế mạnh của đất nước Hệ thống thông tin giúp công việc quản lý dễ dàng hơn, nâng cao hiệu quả sản xuất, tiết kiệm được lượng lớn thời gian và công sức
Qua thời gian học tập và tìm hiểu học phần “Nguyên lý hệ điều hành”, nhóm em đã chọn đề tài “Lập trình mô phỏng các phương pháp kiểm tra hệ an toàn” Báo cáo thực tập gồm có 3 chương sau:
● Chương I: Tìm hiểu về hiện tượng bế tắc
● Chương II: Tìm hiểu về các phương pháp kiểm tra hệ an toàn
● Chương III: Cài đặt thuật toán
Dưới sự hướng dẫn của giảng viên Nguyễn Bá Nghiễn chúng em đã tìm hiểu và hoàn thành đề tài được giao Mong các thầy (cô) góp ý để bài làm của chúng em được hoàn thiện hơn Chúng em xin chân thành cảm ơn!
Trang 5Chương I: Tìm hiểu về hiện tượng bế tắc
1.1 Khái niệm bế tắc
Bế tắc là trạng thái trong hệ thống có ít nhất hai tiến trình đang dừng chờ lẫn nhau và chúng không thể chạy tiếp được, sự chờ đợi này có thể kéo dài vô hạn nếu không có sự tác động từ bên ngoài
Hầu hết các hệ điều hành không cung cấp phương tiện ngăn chặn bế tắc Vấn đề bế tắc chỉ trở thành vấn đề phổ biến, xu hướng hiện hành gồm số lượng lớn tiến trình, chương trình đa luồng, nhiều tài nguyên trên hệ thống và đặc biệt các tập tin có đời sống dài và những máy phục vụ cơ sở dữ liệu hơn
là hệ thống đóng
Giả sử rằng có ba Process P1, P2 và P3 Có ba tài nguyên khác nhau R1, R2
và R3 R1 được gán cho P1, R2 được gán cho P2 và R3 được gán cho P3
Sau một thời gian, P1 yêu cầu R1 đang được P2 sử dụng P1 tạm dừng Process thực thi của nó vì nó không thể hoàn thành nếu không có R2 P2 cũng yêu cầu R3 đang được P3 sử dụng P2 cũng dừng Process thực thi của nó vì nó không thể tiếp tục mà không có R3 P3 cũng yêu cầu R1 đang được P1 sử dụng
do đó P3 cũng dừng thực thi
Trong kịch bản này, một chu trình đang được hình thành giữa ba Process Không có Process nào đang diễn ra và tất cả đều đang chờ đợi Máy tính không phản hồi vì tất cả các Process đã bị chặn
Hình 1 Minh họa 3 Process thực thi
Trang 61.2 Điều kiện xảy ra bế tắc trong hệ thống
Hiện tượng bế tắc xảy ra khi và chỉ khi trong hệ thống tồn tại bốn điều kiện
- Có tài nguyên găng:
+ Một tài nguyên bị chiếm bởi một tiến trình và không tiến trình nào khác có thể sử dụng tài nguyên này
- Có hiện tượng giữ và đợi:
+ Một tiến trình giữ ít nhất một tài nguyên và chờ một số tài nguyên khác rỗi để sử dụng Các tài nguyên này đang bị một tiến trình khác chiếm giữ
- Không có hệ thống phân phối lại tài nguyên:
+ Tài nguyên bị chiếm giữ chỉ có thể rỗi khi tiến trình tự nguyện giải phóng tài nguyên sau khi đã sử dụng xong
- Có hiện tượng chờ đợi vòng tròn:
+ Một tập tiến trình {P0, P1, …, Pn} có xuất hiện điều kiện “chờ vòng” nếu
P0 chờ một tài nguyên do P1 chiếm giữ, P1 chờ một tài nguyên khác do P2
chiếm giữ, , Pn-1 chờ tài nguyên do Pn chiếm giữ và Pn chờ tài nguyên do
P0 chiếm giữ
1.3 Các mức phòng tránh bế tắc
Để tránh hiện tượng bế tắc, thông thường hệ thống áp dụng ba mức:
Ngăn ngừa: Áp dụng các biện pháp để hệ không rơi vào trạng thái bế tắc
Dự báo và tránh bế tắc: Áp dụng các biện pháp để kiểm tra các tiến trình xem
có bị rơi vào trạng thái bế tắc hay không Nếu có thì thông báo trước khi bế tắc xảy ra
Nhận biết và khắc phục: Tìm cách phát hiện và giải quyết
Trang 71.4 Ngăn chặn bế tắc và an toàn hệ thống
1.4.1 Ngăn chặn bế tắc
Mỗi khi phân bổ tài nguyên cho các tiến trình, hệ thống sẽ kiểm tra xem liệu việc phân bổ đó có đẩy hệ thống vào tình trạng bế tắc hay không Nếu có tìm cách giải quyết trước khi bế tắc xảy ra
Ngăn chặn bế tắc (deadlock prevention) là phương pháp xử lý bế tắc, không cho nó xảy ra bằng cách làm cho ít nhất một điều kiện cần của bế tắc là loại trừ lẫn nhau, giữ và chờ, không có đặc quyền hoặc chờ vòng không được thỏa mãn (không xảy ra)
Để ngăn chặn bế tắc cần đảm bảo sao cho 4 điều kiện xảy ra bế tắc không xảy ra đồng thời
- Loại bỏ tài nguyên găng:
+ Loại trừ lẫn nhau: là điều kiện bắt buộc cho các tài nguyên không sử dụng chung được → Khó làm cho C1 không xảy ra vì các hệ thống luôn có các tài nguyên không thể sử dụng chung được
- Loại bỏ yếu tố giữ và đợi: Có thể làm cho “Giữ và đợi “không xảy ra bằng cách đảm bảo:
+ Một tiến trình luôn yêu cầu cấp phát tài nguyên chỉ khi nó không chiếm giữ bất kỳ một tài nguyên nào
+ Một tiến trình chỉ thực hiện khi nó được cấp phát toàn bộ các tài nguyên cần thiết
- Ngăn chặn “không có đặc quyền “: Để ngăn chặn không cho điều kiện này xảy ra, có thể sử dụng giao thức sau:
+ Nếu tiến trình P (đang chiếm tài nguyên R1, , Rn-1) yêu cầu cấp phát tài nguyên Rn nhưng không được cấp phát ngay (có nghĩa là P phải chờ) thì tất cả các tài nguyên R1, , Rn-1 phải được “thu hồi”
Trang 8+ Nói cách khác R1, , Rn-1 phải được “giải phóng” một cách áp đặt, tức
là các tài nguyên này phải được đưa vào danh sách các tài nguyên mà P đang chờ cấp phát
- Mã lệnh ngăn chặn “không có đặc quyền”:
+ Tiến trình P yêu cầu cấp phát tài nguyên R1, , Rn-1 if (R1, , Rn-1 rỗi) then cấp phát tài nguyên cho P else if ({Ri Rj} được cấp phát cho Q
và Q đang trong trạng thái chờ một số tài nguyên S khác) then thu hồi {Ri .Rj} và cấp phát cho P else đưa P vào trạng thái chờ tài nguyên
R1, , Rn-1
- Loại bỏ yếu tố chờ đợi vòng tròn
+ Một giải pháp ngăn chặn chờ vòng là đánh số thứ tự các tài nguyên và bắt buộc các tiến trình yêu cầu cấp phát tài nguyên theo số thứ tự tăng dần
+ Giả sử có các tài nguyên {R1, …, Rn} Ta gán cho mỗi tài nguyên một
số nguyên dương duy nhất qua một ánh xạ 1 – 1 f: R -> N, với N là tập các số tự nhiên
- Giao thức ngăn chặn “Chờ vòng”:
+ Khi tiến trình P không chiếm giữ tài nguyên nào, nó có thể yêu cầu cấp phát nhiều thể hiện của một tài nguyên Ri bất kỳ
+ Sau đó P chỉ có thể yêu cầu các thể hiện của tài nguyên Rj nếu và chỉ nếu f(R j) > f(R i) Một cách khác, nếu P muốn yêu cầu cấp phát tài nguyên R j, nó đã giải phóng tất cả các tài nguyên Ri thỏa mãn f(R i) ≥ f(R j)
+ Nếu P cần được cấp phát nhiều loại tài nguyên, P phải lần lượt yêu cầu các thể hiện của từng tài nguyên đó
- Ưu nhược điểm của ngăn chặn giải pháp bế tắc:
Trang 9+ Ưu điểm: ngăn chặn bế tắc (deadlock prevention) là phương pháp tránh được bế tắc bằng cách làm cho điều kiện cần không được thỏa mãn
+ Nhược điểm: Giảm khả năng tận dụng tài nguyên và giảm thông lượng của hệ thống và không mềm dẻo
1.4.2 Dãy tiến trình an toàn
Cho 1 dãy tiến trình P1, P2, P3, …, Pn song hành Dãy tiến trình được gọi là
an toàn (safe process) nếu với mọi tiến trình Pi, tài nguyên mà Pi cần có thể được thỏa mãn bởi các tài nguyên khả dụng của hệ thống và tài nguyên do các tiến trình Pi’ đang giữ với điều kiện i’ < i
Hệ thống ở trạng thái an toàn tại một thời điểm nếu dãy tiến trình song hành tại thời điểm đó có thể được sắp xếp thành dãy an toàn
Trang 10Chương II: Tìm hiểu về các phương pháp kiểm tra hệ an toàn
Thuật toán banker là một thuật toán phân bổ tài nguyên và tránh bế tắc kiểm tra độ an toàn bằng cách mô phỏng việc phân bổ cho số lượng tối đa có thể được xác định trước của tất cả các tài nguyên, sau đó thực hiện kiểm tra
“trạng thái s” để kiểm tra các hoạt động có thể xảy ra, trước khi quyết định có nên cho phép phân bổ hay không để tiếp tục
Thuật toán của Banker được đặt tên như vậy vì nó được sử dụng trong
hệ thống ngân hàng để kiểm tra xem khoản vay có thể bị xử phạt đối với một người hay không Giả sử có n số chủ tài khoản trong một ngân hàng và tổng
số tiền của họ là S Nếu một người làm thủ tục vay vốn thì trước tiên ngân hàng lấy tổng số tiền ngân hàng trừ đi số tiền cho vay và nếu số tiền còn lại lớn hơn hơn S thì chỉ khoản vay bị xử phạt Nó được thực hiện bởi vì nếu tất
cả các chủ tài khoản đến rút tiền của họ thì ngân hàng có thể dễ dàng thực hiện
Nói cách khác, ngân hàng sẽ không bao giờ phân bổ tiền của mình theo cách mà nó không còn có thể đáp ứng nhu cầu của tất cả các khách hàng của mình Ngân hàng sẽ luôn cố gắng ở trong trạng thái an toàn
Các đặc điểm của thuật toán Banker như sau:
● Nếu bất kỳ quá trình nào yêu cầu một tài nguyên, thì nó phải đợi
● Thuật toán này bao gồm các tính năng nâng cao để phân bổ tài nguyên tối đa
● Có giới hạn tài nguyên trong hệ thống có
● Trong thuật toán này, nếu bất kỳ quá trình nào nhận được tất cả các tài nguyên cần thiết, thì nó sẽ trả lại các tài nguyên đó trong một khoảng thời gian hạn chế
Trang 11● Các tài nguyên khác nhau được duy trì trong thuật toán này có thể đáp ứng nhu cầu của ít nhất một khách hàng
Ưu điểm:
● Nó chứa các tài nguyên khác nhau đáp ứng các yêu cầu của từng quy trình
● Mỗi quy trình phải cung cấp thông tin cho hệ điều hành về các yêu cầu tài nguyên sắp tới, số lượng tài nguyên và thời gian tài nguyên sẽ được lưu giữ
● Nó giúp hệ điều hành quản lý và kiểm soát các yêu cầu của quy trình đối với từng loại tài nguyên trong hệ thống máy tính
● Thuật toán có thuộc tính Tài nguyên tối đa đại diện cho biết mỗi quá trình có thể chứa số tài nguyên tối đa trong một hệ thống
Nhược điểm:
● Nó yêu cầu một số lượng quy trình cố định và không có quy trình bổ sung nào có thể được khởi động trong hệ thống trong khi thực hiện quy trình
● Thuật toán không còn cho phép các quy trình trao đổi nhu cầu tối đa của nó trong khi xử lý các tác vụ của nó
● Mỗi tiến trình phải biết và nêu trước yêu cầu tài nguyên tối đa của chúng cho hệ thống
● Số lượng yêu cầu tài nguyên có thể được cấp trong một thời gian hữu hạn, nhưng thời hạn để cấp phát tài nguyên là một năm
Khi làm việc với thuật toán của một ngân hàng, nó yêu cầu biết về ba điều:
● Mỗi tiến trình có thể yêu cầu bao nhiêu cho mỗi tài nguyên trong hệ
thống Nó được biểu thị bằng yêu cầu [ MAX ].
● Mỗi quy trình hiện đang giữ mỗi tài nguyên trong một hệ thống là bao
nhiêu Nó được biểu thị bằng tài nguyên [ ALLOCATED ].
● Nó đại diện cho số lượng của mỗi tài nguyên hiện có trong hệ
thống Nó được biểu thị bằng tài nguyên [ AVAILABLE ].
Trang 12Chương III: Cài đặt thuật toán
3.1 Thuật toán chuyển sang trạng thái an toàn
Giả sử hệ có p tiến trình và r kiểu tài nguyên Các cấu trúc dữ liệu sử dụng trong thuật toán được xây dựng như sau:
- Available: mảng 1x r thể hiện số tài nguyên có thể sử dụng của mỗi kiểu Nếu Available (j) = k suy ra có k tài nguyên kiểu rj có thể sử dụng
- Max: mảng p x r thể hiện số tài nguyên cực đại mà mỗi tiến trình yêu cầu Nếu Max (i, j) = k suy ra tiến trình Pi chỉ có thể yêu cầu cực đại k tài nguyên kiểu rj cực đại là k
- Allocation: mảng p x r thể hiện số tài nguyên mỗi kiểu hiện đã phân bổ cho các tiến trình Nếu Allocation (i, j) = k suy ra tiến trình Pi đang sử dụng k tài nguyên kiểu rj
- Need: mảng p x r thể hiện số tài nguyên còn cần của mỗi tiến trình Need (i, j) = k; Tiến trình còn cần k tài nguyên của ri
- Need (i, j) = Max (i, j) – Allocation (i, j)
- Request: Mảng n x m thể hiện yêu cầu tài nguyên của các tiến trình
- Request (i, j) = k: tiến trình pi yều cầu k tài nguyên kiểu rj
Quy ước: khi viết Request i thể hiện dòng thứ i của mảng (ứng với tiến trình Pi (các biến Need i, Allocation i …)
Khi tiến trình Pi đưa ra một yêu cầu tài nguyên hệ thống tiến hành các bước như sau:
Bước 1: If Request i <= Need i then go to Bước 2
Else Error;
Trang 13Else Pi đợi (tài nguyên không thể phân bổ);
Bước 3: Hệ thống dự định phân bổ tài nguyên
Available i = Available i – Request i
Allocation i = Allocation i – Request i
Need i = Need i – Request i
Bước 4: Kiểm tra hệ có ở trạng thái an toàn hay không?
Nếu có phân bổ tài nguyên theo dự tính
Nếu không tiến trình Pi phải đợi cùng với tài nguyên Request i
3.2 Thuật toán kiểm tra tính an toàn của hệ
- Trong thuật toán sử dụng thêm hai cấu trúc dữ liệu sau:
• Work: mảng 1 x p thể hiện số tài nguyên khả dụng của hệ thống và
số tài nguyên do các tiến trình Pi đang sử dụng với điều kiện i' < i.
• Finish: mảng 1 x r đánh dấu các tiến trình đã xét.
- Thuật toán:
Bước 1: Khởi tạo:
Work := Available;
Finish(i) = false; (với mọi i = 1….r) Bước 2: Tìm i sao cho Finish(i) = false và Need(i) <= Work Nếu không tìm thấy, go to bước 4
Bước 3: Work := Work + Allocation(i);
Finish(i) = true;
go to bước 2 Bước 4: Nếu Finish(i) = true với mọi i thì hệ thống ở trạng thái an toàn, ngược lại hệ thống sẽ gặp bế tắc
Trang 143.3 Cài đặt thuật toán
#include <iostream>
#include <iomanip>
using namespace std;
#define MAX 100
void nhapDuLieu(int arr[MAX][MAX], int &m, int &n)
{
for (int i = 0; i < m; i++) {
cout << "Nhap hang thu " << i + 1 << endl;
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
} }
}
void tinhNeed(int need[MAX][MAX], int max[MAX][MAX], int
allocation[MAX][MAX], int p, int r)
{
for (int i = 0; i < p; i < i++) {
for (int j = 0; j < r; j++) {
need[i][j] = max[i][j] - allocation[i][j];
} }
}
bool kiemTraHeAnToan(int *process, int allocation[MAX][MAX], int max[MAX][MAX], int *available, int need[MAX][MAX], int p, int r) {
tinhNeed(need, max, allocation, p, r);
// gan tat ca tien trinh bang false;
bool finish[p] = {0};
// luu chuoi tien trinh an toan
int trinhTuAnToan[p];
// gan work = available
int work[r];
for (int i = 0; i < r; i++) {
work[i] = available[i];
}
Trang 15bool found = false;
for (int i = 0; i < p; i++) {
// kiem tra tien trinh ket thuc chua
if (finish[i] == 0) {
// kiem tra need <= work hay khong int j;
for (j = 0; j < r; j++) {
if (need[i][j] > work[j]) {
break;
} }
// neu tat ca cac need cua tien trinh thoa man
if (j == r) {
// gan work = work + allocation for (int k = 0; k < r; k++) {
work[k] += allocation[i][k];
} // them tien trinh vao trinh tu tien trinh an toan
trinhTuAnToan[count++] = i;
// danh dau tien trinh ket thuc finish[i] = 1;
found = true;
} }
} // neu khong tim thay tien trinh tiep theo trong trinh tu an toan
if (found == false) {
cout << "\t=> HE THONG KHONG O TRANG THAI AN TOAN";
return false;
} }
// neu he thong o trang thai an toan
cout << "\t=> HE THONG O TRANG THAI TOAN.\n\t=> TRINH TU TIEN TRINH AN TOAN: ";
for (int i = 0; i < p; i++) {
cout << trinhTuAnToan[i] << " ";
}
return true;
}