You are on page 1of 24

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.

Họ và tên: Nguyễn Hoàng Bách


Mã số sinh viên: 2250091
Lớp: IT007.O15

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

Trình bày cách làm

Chụp hình minh chứng


Giải thích kết quả

5.6. BÀI TẬP ÔN TẬP

BT 1

Trình bày cách làm


Chụp hình minh chứng
Giải thích kết quả

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.

5.5. BÀI TẬP THỰC HÀNH


1. Hiện thực hóa mô hình trong ví dụ 5.3.1.2, tuy nhiên thay bằng điều kiện sau:
sells <= products <= sells + [4 số cuối của MSSV]
Trả lời...
Code:

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.

Giải thích kết quả:


1. Thêm và xóa phần tử:

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.

• Luồng addRandomNumber thêm phần tử vào mảng a, tăng kích thước


của mảng sau mỗi lần thêm.
• Luồng removeElement xóa một phần tử ngẫu nhiên từ mảng a, giảm kích
thước của mảng sau mỗi lần xóa.
2. Sự không xác định trong kết quả:
• Do việc sử dụng phép toán ngẫu nhiên khi thêm và xóa phần tử, kết quả có
thể thay đổi mỗi khi chương trình được thực thi lại.
• Việc chọn ngẫu nhiên phần tử cần xóa hoặc thêm sẽ tạo ra các kết quả khác
nhau từ lần chạy này sang lần chạy khác.
• Sự không đồng bộ hóa khi các luồng cùng truy cập vào mảng a có thể dẫn
đến trường hợp truy cập hoặc sửa đổi dữ liệu khi một luồng đang thực hiện
thao tác khác.
3. Hiện tượng không chắc chắn (Race conditions):
• Do không có đồng bộ hóa giữa các luồng, có thể xảy ra race conditions khi
một luồng đang cố gắng thay đổi dữ liệu mà một luồng khác cũng có thể
truy cập hoặc thay đổi dữ liệu đó cùng một lúc.
• Điều này có thể dẫn đến việc các thay đổi không được dự đoán và có thể
xảy ra một số vấn đề liên quan đến dữ liệu, chẳng hạn như mảng bị tràn
hoặc lỗi khi truy cập phần tử không hợp lệ.
Những vấn đề này thể hiện rõ ràng tính không xác định khi làm việc với đa luồng mà
không có cơ chế đồng bộ hóa thích hợp. Điều này cần phải được xử lý một cách an toàn
để đảm bảo tính nhất quán và độ tin cậy của dữ liệu khi làm việc với đa luồng.
Khi đồng bộ hoá
Code:

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ả:

Giải thích 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.

3. Cho 2 process A và B chạy song song như sau:

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.

Giải thích kết quả:


So sánh kết quả với bài 3 thì ta thấy biến x đã được tăng lên một cách đúng đắn, theo thứ
tự. Lí do là vì khi tiểu trình A tăng giá trị biến x lên thì tiểu trình B không thể thực thi, do
đó giá trị của biến x được đảm bảo.

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.

5.6. BÀI TẬP ÔN TẬP


1. Biến ans được tính từ các biến x1, x2, x3, x4, x5, x6 như sau:
w = x1 * x2; (a)
v = x3 * x4; (b)
y = v * x5; (c)
z = v * x6; (d)
y = w * y; (e)
z = w * z; (f)
ans = y + z; (g)
Giả sử các lệnh từ (a) → (g) nằm trên các thread chạy song song với nhau. Hãy lập
trình mô phỏng và đồng bộ trên C trong hệ điều hành Linux theo thứ tự sau:
(c), (d) chỉ được thực hiện sau khi v được tính

(e) chỉ được thực hiện sau khi w và y được tính

(g) chỉ được thực hiện sau khi y và z được tính


Trả lời...

24

You might also like