You are on page 1of 15

BÁO CÁO LAB 3

MÔN HỆ ĐIỀU HÀNH – Lớp IT007.O16.2


Danh sách thành viên nhóm 8

STT MSSV Họ và tên Nội dung


2252023
1 Phùng Văn Đạt BT thực hành: Câu 1
4
2252126
2 Trịnh Thái Sơn BT thực hành: Câu 2
1
2252003
3 Trương Huỳnh Thúy An BT thực hành: Câu 3 + làm file báo cáo
3
2252036
4 Lê Văn Giáp BT thực hành: Câu 4
3
2252126
5 Trần Giang Sử BT ôn tập: Câu 1
6
I. Bài tập thực hành
1. Thực hiện Ví dụ 3-1, 3-2, 3-3, 3-4 giải thích code và kết quả nhận được?

Ví dụ 3-1:

Giải
thích:

line 7: Hàm chính, nơi chương trình bắt đầu. Chấp nhận tham số dòng lệnh.
Khai Báo Biến:
line 9: Khai báo biến để lưu trữ ID tiến trình.
Forking
line 10: Cuộc gọi hệ thống fork() được sử dụng để tạo một tiến trình
mới. Nó trả về 0 trong tiến trình con và ID tiến trình con trong tiến trình
cha.
Khối Tiến Trình Cha:
 line 11: Khối này được thực hiện bởi tiến trình cha.
 line 13-14: In ID tiến trình cha và ID tiến trình cha của cha.
 line 15 -16-17;: In số lượng tham số dòng lệnh nếu có nhiều hơn hai.
 line 18: Chờ tiến trình con hoàn thành.
Khối Tiến Trình Con:
 line 20: Khối này được thực hiện bởi tiến trình con.
 line 23: In ID tiến trình con và ID tiến trình cha.
 line 25: In một thông báo.
 line 26: In từng tham số dòng lệnh.
Ví dụ 3-2:

Giải thích:
Khai Báo Biến:
line 8: Khai báo biến để lưu trữ ID tiến trình.
Forking:
line 9: Cuộc gọi hệ thống fork() được sử dụng để tạo một tiến trình mới. Nó
trả về 0 trong tiến trình con và ID tiến trình con trong tiến trình cha.
Khối Tiến Trình Cha:
line 10: Khối này được thực hiện bởi tiến trình cha.
line 12-13: In ID tiến trình cha và ID tiến trình cha của cha.
line 14-15: In số lượng tham số dòng lệnh nếu có nhiều hơn hai.
line 17: Chờ tiến trình con hoàn thành.
Khối Tiến Trình Con:
line 19: Khối này được thực hiện bởi tiến trình con.
line 21: Thực hiện chương trình shell count.sh với tham số "10". Hàm này
thay thế tiến trình con hiện tại bằng chương trình được thực hiện.
line 23: In ID tiến trình con và ID tiến trình cha.
line 24: In một thông báo.
line 26-27-28: In từng tham số dòng lệnh.
Exit:
exit(0);: Kết thúc tiến trình.

Ví dụ 3-3:
Giải thích:

Thân Hàm Main:


line 8: In ID tiến trình cha và ID tiến trình cha của cha.
line 10-11-12: In số lượng tham số dòng lệnh nếu có nhiều hơn hai.
line 14: Thực hiện lệnh shell "count.sh 10" bằng cách sử dụng hàm
system(). Hàm này thực hiện một lệnh shell và đợi cho đến khi lệnh đó
hoàn thành trước khi tiếp tục chạy chương trình.
line 16: In một thông báo.
line 19: In từng tham số dòng lệnh.
Exit:
exit(0);: Kết thúc tiến trình.

Ví dụ 3-4:
Giải thích:

Process A khởi tạo bộ nhớ chia sẻ, ghi vào bộ nhớ "Hello Process B", sau đó chờ
bộ nhớ được cập nhật bởi Process B.

Proces B truy cập bộ nhớ chia sẻ, đọc dữ liệu do Process A ghi vào, sau đó cập
nhật bộ nhớ với chuỗi "Hello Process A"
2. Viết chương trình time.c thực hiện đo thời gian thực thi của một lệnh shell.
Chương trình sẽ được chạy với cú pháp "./time <command>" với <command> là lệnh
shell muốn đo thời gian thực thi.

Code:

Kết quả:

Giải thích code:

- Line 9: Tạo cấu trúc timeval chứa tv_sec(giây) và tv_usec(micro giây=10^-6 giây)

- Line 12: Trong tiến trình cha

+ Line 14: Lấy mốc thời gian trước khi thực hiện lệnh shell. Vì không dùng
múi giờ nên để NULL ở tham số thứ 2.

+ Line 15: chờ tiến trình con.

+ Line 16: Lấy mốc thời gian sau khi thực hiện lệnh shell.
+ Line 17-18: tính toán và xuất ra thời gian thực thi theo giây.

- Line 20: Trong tiến trình con

+ Line 22-23: dùng execl để thực thi lệnh shell sau đó kết thúc tiến trình con.

Trong đó:

/bin/sh: là đường dẫn tới chương trình thực thi

sh: là tên chương trình

-c: cho biết câu lệnh cần thực thi là một chuỗi(string)

argv[1]: lệnh shell muốn đo thời gian thực thi

- Line 25: Xuất ra lỗi nếu hàm fork thất bại.

3. Viết một chương trình làm bốn công việc sau theo thứ tự:
- In ra dòng chữ: “Welcome to IT007, I am <your_student_ID> !”
- Thực thi file script count.sh với số lần đếm là 120
- Trước khi count.sh đếm đến 120, bấm CTRL+C để dừng tiến trình này
- Khi người dùng nhấn CTRL+C thì in ra dòng chữ: “count.sh has stoppped”

Chương trình in ra dòng chữ theo yêu cầu, thực thi file script count.sh với số lần đếm
120 và khi count.sh đếm đến 77 thì bị dừng lại vì người dùng nhấn CTRL+C, và khi
nhấn CTRL+C thì dòng chữ “count.sh has stoppped” được in ra. (kết quả đếm được
ghi vào file text count.txt)
Code:
Kết quả:
4. Viết chương trình mô phỏng bài toán Producer - Consumer như sau: Sử dụng kỹ
thuật shared-memory để tạo một bounded-buffer có độ lớn là 10 bytes. Tiến trình cha
đóng vai trò là Producer, tạo một số ngẫu nhiên trong khoảng [10, 20] và ghi dữ liệu
vào buffer Tiến trình con đóng vai trò là Consumer đọc dữ liệu từ buffer, in ra màn
hình và tính tổng Khi tổng lớn hơn 100 thì cả 2 dừng lại

Code:

Kết quả:

Giải thích:

- Tại Process A, trong vòng lặp while sẽ kiểm tra giá trị sum có lớn hơn 100 hay
không. Nếu không, sẽ tạo ra một con số ngẫu nhiên từ 10 đến 20 và cập nhật giá trị
đó cho ptr trỏ tới vùng nhớ chia sẻ.

- Kế đến sẽ đợi 1s cho cho Process B cập nhật được giá trị đó tính vào sum. Giá trị
sum được cập nhật trên vùng nhớ chia sẻ và Process A sẽ kiểm tra giá trị đó trị và
thực hiện vòng lặp cho đến khi sum lớn hơn 100 rồi thoát vòng lặp.
- Cuối cùng, Process in ra màn hình "Tong lon hon 100 roi” rồi đợi chương trình con
kết thúc và thu hồi tài nguyên

- Tại Process B, trong vòng lặp while sẽ kiểm tra giá trị sum có lớn hơn 100 hay
không. Nếu không, sẽ in ra màn hình giá trị ngẫu nhiên vừa được cập nhật được tại
vùng nhớ chia sẻ và lấy giá trị sum cộng với giá trị ngẫu nhiên này rồi cập nhật trên
vùng nhớ chia sẻ và in ra màn hình. Sau đó, chương trình sẽ đợi 1s để Process A cập
nhật giá trị ngẫu nhiên mới. Điều này lặp lại đến khi sum lớn hơn 100 sẽ thoát vòng
lặp và thu hồi tài nguyên

II. Bài tập ôn tập


1. Phỏng đoán Collatz xem xét chuyện gì sẽ xảy ra nếu ta lấy một số nguyên dương
bất kỳ và áp dụng theo thuật toán sau đây:

{
n
nếu n là số chẵn
n= 2
3 n+1 nếu n làsố lẻ

Phỏng đoán phát biểu rằng khi thuật toán này được áp dụng liên tục, tất cả số nguyên
dương đều sẽ tiến đến 1. Ví dụ, với n = 35, ta sẽ có chuỗi kết quả như sau:

35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1

Viết chương trình C sử dụng hàm fork() để tạo ra chuỗi này trong tiến trình con. Số
bắt đầu sẽ được truyền từ dòng lệnh. Ví dụ lệnh thực thi ./collatz 8 sẽ chạy thuật toán
trên n = 8 và chuỗi kết quả sẽ ra là 8, 4, 2, 1. Khi thực hiện, tiến trình cha và tiến trình
con chia sẻ một buffer, sử dụng phương pháp bộ nhớ chia sẻ, hãy tính toán chuỗi trên
tiến trình con, ghi kết quả vào buffer và dùng tiến trình cha để in kết quả ra màn hình.
Lưu ý, hãy nhớ thực hiện các thao tác để kiểm tra input là số nguyên dương.

Xây dựng chương trình C để giải:


Trước hết ta cần phải xem xét các điều kiện cần và đủ để chương trình có thể chạy:
1. Số lượng biến đầu vào.
Vd nếu chỉ đưa vào ./collatz thì chương trình sẽ trả về dòng “usage: .collatz
<number>” có nghĩa là ta đưa vào thiếu mất 1 biến là số.

2. Số n đưa vào phải là số nguyên dương


Vd nếu ta input n = -8 thì sẽ in ra màn yêu cầu nhập lại số n là số nguyên
dương

**Thử nghiệm chương trình hoạt động với input n = 31**

Giải thích:

Ta đã tạo vùng nhớ chia sẻ (shm_fol)

Và ánh xạ vùng nhớ chia sẻ (resultBuf)

Ta tạo biến đếm i và cho số hiện tại currentNum = starNum ( = 31)

Chương trình con sẽ đảm nhận việc tính toán + đồng thời ánh xạ những số đã tính
toán vào vùng nhớ chia sẻ (resultBuf) theo công thức như hàm collatz ta đã tạo:
Sau khi chương trình con đã tính toán hoàn toàn xong và thoát vòng lặp, tiến trình
cha sẽ hoạt động và đảm nhiệm việc in những số đã được ánh xạ vào vùng nhớ
chia sẻ:

Sau đó là việc xóa ( giải phóng ) vùng nhớ chia sẻ ta đã cấp phát.

You might also like