Professional Documents
Culture Documents
HỆ ĐIỀU HÀNH
BÁO CÁO LAB 5
CHECKLIST
5.5. BÀI TẬP THỰC HÀNH
BT 1 BT 2 BT 3 BT 4
BT 1
Tự chấm điểm:
*Lưu ý: Xuất báo cáo theo định dạng PDF, đặt tên theo cú pháp:
<Tên nhóm>_LAB5.pdf
1
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
2
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
3
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
Kết quả:
4
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
5
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
2. Cho một mảng a được khai báo như một mảng số nguyên có thể chứa n phần tử,
a được khai báo như một biến toàn cục. Viết chương trình bao gồm 2 thread
chạy song song:
Một thread làm nhiệm vụ sinh ra một số nguyên ngẫu nhiên sau đó bỏ vào a.
Sau đó đếm và xuất ra số phần tử của a có được ngay sau khi thêm vào.
Thread còn lại lấy ra một phần tử trong a (phần tử bất kỳ, phụ thuộc vào
người lập trình). Sau đó đếm và xuất ra số phần tử của a có được ngay sau
khi lấy ra, nếu không có phần tử nào trong a thì xuất ra màn hình “Nothing
in array a”.
Chạy thử và tìm ra lỗi khi chạy chương trình trên khi chưa được đồng bộ. Thực hiện đồng
bộ hóa với semaphore.
Khi chưa đồng bộ hoá:
6
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
Code:
7
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
8
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
Kết quả:
9
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
10
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
11
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
12
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
13
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
14
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
Kết quả:
15
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
1. Luồng addRandomNumber được thực thi đầu tiên với turn bằng 0. Nó thêm một
phần tử vào mảng a và tăng kích thước của mảng lên 1. Sau đó, turn được thiết
lập bằng 1 để chuyển lượt cho luồng removeElement.
2. Luồng removeElement bắt đầu thực thi với turn bằng 1. Tuy nhiên, vì kích thước
của mảng là 1, nó xóa phần tử từ mảng, giảm kích thước xuống 0 và in ra thông
báo "Nothing in array a". Sau đó, turn được thiết lập bằng 0 để chuyển lượt cho
luồng addRandomNumber.
3. Quá trình này lặp lại khi các luồng tiếp tục xen kẽ nhau, thêm và xóa phần tử từ
mảng a theo thứ tự chính xác và không đồng thời. Mỗi lượt lặp tạo ra các thông
báo tương tự về việc thêm và xóa phần tử.
Như vậy, kết quả của chương trình hiển thị sự xen kẽ giữa việc thêm và xóa phần tử từ
mảng a, mỗi luồng thực hiện công việc của mình theo lượt đã được xác định sẵn. Điều
này giúp tránh xung đột dữ liệu và đảm bảo tính nhất quán trong quá trình thao tác với
mảng trong môi trường đa luồng.
int x = 0;
PROCESS A PROCESS B
processA() processB()
{ {
while(1){ while(1){
x = x + 1; x = x + 1;
if (x == 20) if (x == 20)
x = 0; x = 0;
print(x); print(x);
} }
16
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
} }
Hiện thực mô hình trên C trong hệ điều hành Linux và nhận xét kết quả.
Code:
17
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
Kết quả:
18
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
19
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
Giải thích kết quả: do không có đồng bộ hóa, các giá trị được in ra bởi tiến trình A và B
có thể xen kẽ lẫn nhau và không tuân theo một quy tắc cụ thể. Điều này dẫn đến kết quả
không ổn định và không thể dự đoán được, và có thể gây ra hiện tượng đọc/ghi không an
toàn (race condition).
4. Đồng bộ với mutex để sửa lỗi bất hợp lý trong kết quả của mô hình Bài 3.
Trả lời…
Để sửa lỗi bất hợp lí trong kết quả mô hình bài 3, ta sử dụng mutex để đồng bộ các tiểu
trình giúp cho kết quả hiển thị ra màn hình có tính đúng đắn.
20
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
Cách làm:
- Khai báo biến mutex có kiểu pthread_mutex_t để kiểm soát tiểu trình A và B vào
vùng tranh chấp, từ đó tránh gây nhiễu cho giá trị của biến x.
- Trong tiểu trình A, trước khi tăng biến x lên thì dùng hàm
pthread_mutex_lock(&mutext) để khóa biến mutex lại, không cho tiểu trình khác
thâm nhập vào vùng tranh chấp khi tiểu trình A đang thực hiện. Sau khi thao tác
trên vùng tranh chấp xong, ta dùng hàm pthread_mutex_unlock(&mutex) để mở
khóa biến mutex, cho phép tiểu trình khác thực thi trên vùng tranh chấp.
- Trong tiểu trình B ta cũng dùng hàm pthread_mutex_lock(&mutex) và
pthread_mutex_unlock(&mutex) tương tự như trong tiểu trình A.
- Trong hàm main, ta khai báo giá trị ban đầu của biến mutex là NULL qua hàm
pthread_mutex_init(&mutex, NULL).
Code:
21
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
Kết quả:
22
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
23
Báo cáo thực hành môn Hệ điều hành - Giảng viên: Trần Hoàng Lộc.
24