lOMoARcPSD| 59285474
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
Họ và tên: Nguyễn Trần Nghĩa
Mã số sinh viên: 23521013
Lớp: IT007.P14.2
HỆĐIỀUHÀNH BÁOCÁOLAB3
CHECKLIST
3.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ả
3.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:
<MSSV>_LAB3.pdf
2.5. BÀI TẬP THỰC HÀNH
1. Thực hiện Ví dụ 3-1, Ví dụ 3-2, Ví dụ 3-3, Ví dụ 3-4 giải thích code và kết quả
nhận ược? Trả lời… VD 3-1:
lOMoARcPSD| 59285474
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
Đầu tiên khởi tạo biến pid với kiểu dữ liệu __pid_t (thường là một kiểu số nguyên ược
sử dụng ể lưu trữ PID, nó thường ược ịnh nghĩa trong các file header của h
thống như <sys/types.h>)Tiếp theo gọi hàm fork(), lúc này sẽ tạo ra 2 tiến trình ược
thực thi song song là tiến
trình cha và tiến trình con, hàm fork() sẽ trả về giá trị 0 nếu là tiến trình con và giá trị lớn
hơn 0 nếu là tiến trình cha
Ở khối lệnh if ầu tiên, nếu pid > 0 sẽ thực hiện in ra PARENTS, PID của tiến trình cha,
PID của tiến trình cha của tiến trình cha (PPID) bằng cách sử dụng hàm getpid()
getppid()
Tiếp theo nếu có nhiều hơn 2 ối số ược truyền vào thì in ra số lượng ối số và thực
hiện wait(NULL), tức là tiến trình cha chờ tiến trình con kết thúc trước khi tiếp tục Ở
lOMoARcPSD| 59285474
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
khối lệnh if thứ hai, nếu pid = 0 cũng sẽ in ra các thông tin như ở tiến trình cha
(CHILDREN, PID, PPID), nhưng cuối cùng sẽ in ra danh sách các ối số trừ ối số
ầu tiên (tên chương trình) thay vì số lượng ối số Kết quả:
Tiến trình cha có PID: 13636, PID của tiến trình cha của nó PPID: 287
Tiến trình con có PID: 13637, PID của tiến trình cha của nó PPID: 13636
Danh sách các ối số truyền vào: ThamSo1, ThamSo2, ThamSo3 VD
3-2:
lOMoARcPSD| 59285474
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.
4
File scripts count.sh:
lOMoARcPSD| 59285474
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
Tương tự như VD 3-1, nhưng ở khối lệnh if thứ hai có sự khác biệt. Lệnh
execl(“./count.sh”, “./count.sh”, “10”, NULL) dùng ể tạo ra tiến trình mới trong tiến
trình hiện tại, chương trình hiện tại sẽ ược thay thế bởi chương trình ược chỉ
ịnh trong execl(), cụ thể là thực thi file scripts count.sh, các ối số truyền vào lần lượt là
“./count.sh” và “10”
lOMoARcPSD| 59285474
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.
6
Trong file count.sh, chương trình sẽ in ra Implementing: $0 (với $0 là tham số ầu
tiên truyền vào, tức là “./count.sh”), sau ó in ra PPID of count.sh
Lệnh ps –ef | grep count.sh ể hiển thị danh sách các tiến trình ang chạy trên hệ
thống và tìm các dòng có chứa “count.sh”
Tiếp theo là khối lệnh while do dùng ể in giá trị của biến i vào file count.txt khi i vẫn
còn bé hơn giá trị của $1 là 10 ược truyền vào, sau mỗi lần in giá trị của i sẽ tăng
thêm 1 và mất 1 giây ể in giá trị tiếp theo (sleep 1)
Nếu lệnh execl() thành công, các lệnh phía sau sẽ không ược thực thi, ngược lại nếu
thất bại, chương trình sẽ thực thi các lệnh tiếp theo Kết quả:
Ta thấy các thông tin như PID,PPID và danh sách các ối số không ược in ra, có nghĩa
là lệnh execl() ã ược thực thi thành công và in lần lượt từ 1 ến 10 vào
file count.txt
VD 3-3:
lOMoARcPSD| 59285474
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.
7
lOMoARcPSD| 59285474
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
Giải thích:
Đầu tiên, in ra PARENTS,PID và PPID của nó bằng hàm getpid() và getppid()
Nếu có nhiều hơn 2 ối số truyền vào thì in ra số lượng ối số
Tiếp theo, lệnh system(“./count.sh 10”) ể tạo ra một tiến trình con và thực thi file
count.sh ở tiến trình con ó, sau ó mới thực thi các lệnh tiếp theo ở tiến trình cha
Cuối cùng in ra danh sách các ối số Kết quả:
Ta thấy kết quả tương tự như VD 3-2, nhưng khác ở chỗ sau khi in từ 1 ến 10 vào
file count.txt, chương trình vẫn thực thi các lệnh tiếp theo là in ra danh sách ối số trừ
ối số ầu tiên (tên chương trình)
VD 3-4:
lOMoARcPSD| 59285474
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.
9
Đầu tiên khởi tạo biến pid với kiểu dữ liệu pid_t và gọi hàm fork() tạo ra 2 tiến trình là
tiến trình cha và tiến trình con, hai tiến trình sẽ ược thực thi song song
Ở lệnh if, fork() sẽ trả về giá trị 0 cho pid nếu ó là tiến trình con và giá trị lớn hơn 0
nếu là tiến trình cha. Vì vậy sẽ in ra “Child process” và giá trị của pid trước Ở lệnh
else, tức là ang ở tiến trình cha, lệnh wait(NULL) dùng ể ngăn tiến trình cha thực thi
cho ến khi tiến trình con kết thúc, sau ó in ra “Parent Proces” và giá trị pid
fork() trả về
Cuối cùng exit(0) ể kết thúc chương trình Kết
quả:
Thực thi tiến trình con ầu tiên (vì fork() trả về giá trị pid = 0), in ra “Child process”
pid = 0
lOMoARcPSD| 59285474
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
Sau khi tiến trình con kết thúc, tiến trình cha in ra “Parent Proces” và giá trị pid mà fork()
trả về (pid = 17493)
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.
Ví dụ:
$ ./time ls
time.c time
Thi gian thc thi: 0.25422
Gợi ý: Tiến trình cha gọi hàm fork() tạo ra tiến trình con rồi wait(). Tiến trình
con gọi hàm gettimeofday() ể lấy mốc thời gian trước khi thực thi lệnh shell, sau
ó sử dụng hàm execl() ể thực thi lệnh. Sau khi tiến trình con kết thúc, tiến
trình cha tiếp tục gọi hàm gettimeifday() một lần nữa ể lấy mốc thời gian sau
khi thực thi lệnh shell và tính toán.
Trả lời...
lOMoARcPSD| 59285474
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
Đầu tiên khởi tạo các biến pid với kiểu dữ liệu pid_t ể lưu PID, before_time
after_time với kiểu dữ liệu timeval ể lưu thời gian trước và sau khi thực thi lệnh
shell, time_taken lưu thời gian thực thi lệnh
Lệnh if (argc < 2) ể kiểm tra xem có lệnh shell nào ược truyền vào hay không (vì argc là
số lượng ối số truyền vào, ối số ầu tiên là tên chương trình và ối số thứ 2 là tên lệnh)
Tiếp theo lệnh gettimeofday(&before_time,NULL) ể lấy thời gian trước khi thực thi
lệnh và gán cho biến before_time
Gọi hàm fork() ể tạo tiến trình con, nếu pid > 0 thì gọi wait(NULL), lúc này tiến trình
cha sẽ chờ tiến trình con thực thi và kết thúc thì mới thực thi các câu lệnh tiếp theo. Tiến
trình con ang ược thực thi song song với tiến trình cha nhưng do pid của nó bằng
0 nên sẽ bỏ qua lệnh if ầu tiên, ến lệnh if thứ hai thì iều kiện thoả mãn nên nó sẽ thực
thi câu lệnh execl(argv[1],argv[1],NULL) ,tức là thực thi lệnh shell và kết thúc tiến trình
Sau ó tiến trình cha sẽ ược thực thi tiếp, lấy thời gian sau khi thực thi và thực hiện
tính toán thời gian thực thi của lệnh shell và in kết quả ra màn hình
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
lOMoARcPSD| 59285474
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
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”
Trả lời…
lOMoARcPSD| 59285474
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
lOMoARcPSD| 59285474
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
Ta ịnh nghĩa hàm on_sigint với chức năng in ra câu “count.sh has stopped”
Trong hàm main, ầu tiên in ra câu “Welcome to IT007, I am 23521013” Tiếp
theo hàm signal(SIGINT,on_sigint) ăng kí hàm signal(), khi nhận
ược tín hiệu ngắt tiến trình SIGINT (CTRL+C), hàm on_sigint sẽ ược gọi
Tiến trình cha chỉ ợi tiến trình con kết thúc, tiến trình con chỉ thực thi file count.sh
file count.sh, khởi tạo biến I với giá trị 1 tức là ếm từ 1, while [$i –le $1]: kiểm tra xem
nếu giá trị của i bé hơn hoặc bằng (-le) $1 ( ối số ầu tiên truyền vào, ở ây là 120)
thì in i ra màn hình và tang i thêm 1
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
Trả lời…
2.6. 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:
lOMoARcPSD| 59285474
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.
15
/ ếàốẵ
=
∗+ếàốẻ
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 chuỗi kết quả sẽ ra 8, 4, 2, 1. Khi thực hiện, tiến trình cha 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 bufferdù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 số nguyên
dương.
Trả lời...

Preview text:

lOMoAR cPSD| 59285474
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 Trần Nghĩa Mã số sinh viên: 23521013 Lớp: IT007.P14.2
HỆĐIỀUHÀNH BÁOCÁOLAB3 CHECKLIST
3.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ả
3.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: _LAB3.pdf
2.5. BÀI TẬP THỰC HÀNH
1. Thực hiện Ví dụ 3-1, Ví dụ 3-2, Ví dụ 3-3, Ví dụ 3-4 giải thích code và kết quả
nhận ược?
Trả lời… VD 3-1: 1 lOMoAR cPSD| 59285474
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.
Đầu tiên khởi tạo biến pid với kiểu dữ liệu __pid_t (thường là một kiểu số nguyên ược sử dụng
ể lưu trữ PID, nó thường ược ịnh nghĩa trong các file header của hệ
thống như )Tiếp theo gọi hàm fork(), lúc này sẽ tạo ra 2 tiến trình ược
thực thi song song là tiến
trình cha và tiến trình con, hàm fork() sẽ trả về giá trị 0 nếu là tiến trình con và giá trị lớn
hơn 0 nếu là tiến trình cha
Ở khối lệnh if ầu tiên, nếu pid > 0 sẽ thực hiện in ra PARENTS, PID của tiến trình cha,
PID của tiến trình cha của tiến trình cha (PPID) bằng cách sử dụng hàm getpid() getppid()
Tiếp theo nếu có nhiều hơn 2
ối số ược truyền vào thì in ra số lượng ối số và thực
hiện wait(NULL), tức là tiến trình cha chờ tiến trình con kết thúc trước khi tiếp tục Ở 2 lOMoAR cPSD| 59285474
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.
khối lệnh if thứ hai, nếu pid = 0 cũng sẽ in ra các thông tin như ở tiến trình cha
(CHILDREN, PID, PPID), nhưng cuối cùng sẽ in ra danh sách các ối số trừ ối số
ầu tiên (tên chương trình) thay vì số lượng ối số Kết quả:
Tiến trình cha có PID: 13636, PID của tiến trình cha của nó PPID: 287
Tiến trình con có PID: 13637, PID của tiến trình cha của nó PPID: 13636 Danh sách các
ối số truyền vào: ThamSo1, ThamSo2, ThamSo3 VD 3-2: 3 lOMoAR cPSD| 59285474
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. File scripts count.sh: 4 lOMoAR cPSD| 59285474
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.
Tương tự như VD 3-1, nhưng ở khối lệnh if thứ hai có sự khác biệt. Lệnh
execl(“./count.sh”, “./count.sh”, “10”, NULL) dùng ể tạo ra tiến trình mới trong tiến
trình hiện tại, chương trình hiện tại sẽ
ược thay thế bởi chương trình ược chỉ
ịnh trong execl(), cụ thể là thực thi file scripts count.sh, các ối số truyền vào lần lượt là “./count.sh” và “10” 5 lOMoAR cPSD| 59285474
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.
Trong file count.sh, chương trình sẽ in ra Implementing: $0 (với $0 là tham số ầu
tiên truyền vào, tức là “./count.sh”), sau ó in ra PPID of count.sh
Lệnh ps –ef | grep count.sh
ể hiển thị danh sách các tiến trình ang chạy trên hệ
thống và tìm các dòng có chứa “count.sh”
Tiếp theo là khối lệnh while do dùng
ể in giá trị của biến i vào file count.txt khi i vẫn
còn bé hơn giá trị của $1 là 10
ược truyền vào, sau mỗi lần in giá trị của i sẽ tăng thêm 1 và mất 1 giây
ể in giá trị tiếp theo (sleep 1)
Nếu lệnh execl() thành công, các lệnh phía sau sẽ không
ược thực thi, ngược lại nếu
thất bại, chương trình sẽ thực thi các lệnh tiếp theo Kết quả:
Ta thấy các thông tin như PID,PPID và danh sách các ối số không ược in ra, có nghĩa là lệnh execl() ã
ược thực thi thành công và in lần lượt từ 1 ến 10 vào file count.txt VD 3-3: 6 lOMoAR cPSD| 59285474
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. 7 lOMoAR cPSD| 59285474
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:
Đầu tiên, in ra PARENTS,PID PPID của nó bằng hàm getpid() và getppid()
Nếu có nhiều hơn 2 ối số truyền vào thì in ra số lượng ối số
Tiếp theo, lệnh system(“./count.sh 10”) ể tạo ra một tiến trình con và thực thi file
count.sh ở tiến trình con
ó, sau ó mới thực thi các lệnh tiếp theo ở tiến trình cha
Cuối cùng in ra danh sách các ối số Kết quả:
Ta thấy kết quả tương tự như VD 3-2, nhưng khác ở chỗ sau khi in từ 1 ến 10 vào
file count.txt, chương trình vẫn thực thi các lệnh tiếp theo là in ra danh sách ối số trừ
ối số ầu tiên (tên chương trình) VD 3-4: 8 lOMoAR cPSD| 59285474
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.
Đầu tiên khởi tạo biến pid với kiểu dữ liệu pid_t và gọi hàm fork() tạo ra 2 tiến trình là
tiến trình cha và tiến trình con, hai tiến trình sẽ ược thực thi song song
Ở lệnh if, fork() sẽ trả về giá trị 0 cho pid nếu ó là tiến trình con và giá trị lớn hơn 0
nếu là tiến trình cha. Vì vậy sẽ in ra “Child process” và giá trị của pid trước Ở lệnh
else, tức là ang ở tiến trình cha, lệnh wait(NULL) dùng ể ngăn tiến trình cha thực thi
cho ến khi tiến trình con kết thúc, sau ó in ra “Parent Proces” và giá trị pid mà fork() trả về
Cuối cùng exit(0) ể kết thúc chương trình Kết quả: Thực thi tiến trình con
ầu tiên (vì fork() trả về giá trị pid = 0), in ra “Child process” và pid = 0 9 lOMoAR cPSD| 59285474
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.
Sau khi tiến trình con kết thúc, tiến trình cha in ra “Parent Proces” và giá trị pid mà fork()
trả về (pid = 17493)
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 " với
là lệnh shell muốn
o thời gian thực thi. Ví dụ: $ ./time ls time.c time
Thời gian thực thi: 0.25422
Gợi ý: Tiến trình cha gọi hàm fork() tạo ra tiến trình con rồi wait(). Tiến trình
con gọi hàm gettimeofday() ể lấy mốc thời gian trước khi thực thi lệnh shell, sau

ó sử dụng hàm execl() ể thực thi lệnh. Sau khi tiến trình con kết thúc, tiến
trình cha tiếp tục gọi hàm gettimeifday() một lần nữa ể lấy mốc thời gian sau
khi thực thi lệnh shell và tính toán.
Trả lời... 10 lOMoAR cPSD| 59285474
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.
Đầu tiên khởi tạo các biến pid với kiểu dữ liệu pid_t ể lưu PID, before_time
after_time với kiểu dữ liệu timeval
ể lưu thời gian trước và sau khi thực thi lệnh
shell, time_taken ể lưu thời gian thực thi lệnh
Lệnh if (argc < 2) ể kiểm tra xem có lệnh shell nào ược truyền vào hay không (vì argc là
số lượng ối số truyền vào, ối số ầu tiên là tên chương trình và ối số thứ 2 là tên lệnh)
Tiếp theo lệnh gettimeofday(&before_time,NULL) ể lấy thời gian trước khi thực thi
lệnh và gán cho biến before_time
Gọi hàm fork() ể tạo tiến trình con, nếu pid > 0 thì gọi wait(NULL), lúc này tiến trình
cha sẽ chờ tiến trình con thực thi và kết thúc thì mới thực thi các câu lệnh tiếp theo. Tiến trình con
ang ược thực thi song song với tiến trình cha nhưng do pid của nó bằng
0 nên sẽ bỏ qua lệnh if ầu tiên,
ến lệnh if thứ hai thì iều kiện thoả mãn nên nó sẽ thực
thi câu lệnh execl(argv[1],argv[1],NULL) ,tức là thực thi lệnh shell và kết thúc tiến trình
Sau ó tiến trình cha sẽ ược thực thi tiếp, lấy thời gian sau khi thực thi và thực hiện
tính toán thời gian thực thi của lệnh shell và in kết quả ra màn hình
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 !”
Thực thi file script count.sh với số lần ếm là 120 11 lOMoAR cPSD| 59285474
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.
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” Trả lời… 12 lOMoAR cPSD| 59285474
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 lOMoAR cPSD| 59285474
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.
Ta ịnh nghĩa hàm on_sigint với chức năng in ra câu “count.sh has stopped” Trong hàm main,
ầu tiên in ra câu “Welcome to IT007, I am 23521013” Tiếp
theo hàm signal(SIGINT,on_sigint)
ăng kí hàm signal(), khi nhận
ược tín hiệu ngắt tiến trình SIGINT (CTRL+C), hàm on_sigint sẽ ược gọi
Tiến trình cha chỉ ợi tiến trình con kết thúc, tiến trình con chỉ thực thi file count.sh Ở
file count.sh, khởi tạo biến I với giá trị 1 tức là ếm từ 1, while [$i –le $1]: kiểm tra xem
nếu giá trị của i bé hơn hoặc bằng (-le) $1 ( ối số
ầu tiên truyền vào, ở ây là 120)
thì in i ra màn hình và tang i thêm 1
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 bufferTiế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 Trả lời…
2.6. 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: 14 lOMoAR cPSD| 59285474
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. / ếàốẵ = ∗+ếàốẻ 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.
Trả lời... 15