Báo cáo thực hành lab 3 - Hệ Điều Hành | Trường Đại học CNTT Thành Phố Hồ Chí Minh

Báo cáo thực hành lab 3 - Hệ Điều Hành | Trường Đại học CNTT Thành Phố Hồ Chí Minh được được sưu tầm và soạn thảo dưới dạng file PDF để gửi tới các bạn sinh viên cùng tham khảo, ôn tập đầy đủ kiến thức, chuẩn bị cho các buổi học thật tốt. Mời bạn đọc đón xem!

lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
1
HỆ ĐIỀU HÀNH
BÁO CÁO LAB 3
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: 10
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?
Ví dụ 3-1 : test_fork.c
Cách làm :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
2
- Đầu tiên ta khởi tạo biến pid, dùng ể lưu trữ PID (Process ID) của
tiến trình với kiểu dữ liu __pid_t.
- pid = fork() : Ta gọi hàm fork() ể tạo ra 1 tiến trình con (như 1 bản
sao của tiến trình hiện tại), và gán pid bằng với PID của tiến trình
cha, và pid = 0 ối với tiến trình con.
- if (pid>0) : Đoạn mã sau ược thực thi trong tiến trình cha (vì PID của
cha > 0)
printf("PARENTS | PID = %ld | PPID = %ld\n",
(long)getpid(), (long)getppid()); : Dùng câu lệnh này ể in ra
PID và PPID (Parent Process ID) của tiến trình cha.
Sau ó tiến hành kiểm tra số lượng ối số ầu vào argc, nếu có
nhiều hơn 2 ối số thì in ra thông báo “There are X arguments”
trong ó X là số lượng ối số trừ i 1 (argc -1).
- wait(NULL): Khi tiến trình cha gọi lệnh này, tiến trình cha tạm dừng
và chờ cho ến khi tiến trình con hoàn thành. Khi tiến trình con kết
thúc, nó thông báo cho tiến trình cha và tiến trình cha tiếp tục thực
hiện tiếp.
- if (pid == 0): Đoạn mã sau sẽ ược tiến trình con thực hiện (PID = 0)
printf("CHILDREN | PID = %ld | PPID = %ld\n",
(long)getpid(), (long)getppid()); : Lệnh giúp in ra màn hình
PID và PPID của tiến trình con. Trong ó PPID chính là PID
của tiến trình cha.
Sau ó in ra danh sách dối số ược truyền vào thông qua mảng
argv bằng vòng lặp for.
- exit(0) : Kết thúc cả tiến trình cha và tiến trình con.
Hình ảnh minh chứng :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
3
Giải thích kết qu :
- oạn lệnh trên, ta truyền vào 3 ối số 1 2 3
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
4
- Trong tiến trình cha in ra PID và PPID của tiến trình cha thông qua
hàm getpid() với PID của cha là 2981 và PPID là 2587
- Sau khi ếm có 3 ối số ược truyền vào, tiến trình cha in ra “There are
3 arguments”. Nếu có ít hơn 2 ối số thì tiến trình cha sẽ không
in ra dòng này.
- tiến trình con, cũng in ra PID là 2982PPID là 2981 (ng chính
PID của tiến trình cha vì PPID giúp lấy ra PID của tiến trình tạo ra nó)
- Sau ó, tiến trình con tiếp tục in ra lần lượt các ối số ược truyền vào.
List of arguments : 1 2 3
- Kết thúc chương trình.
Ví dụ 3-2 : test_execl.c
Cách làm :
- Đầu tiên ta khởi tạo biến pid, dùng ể lưu trữ PID (Process ID) của tiến
trình với kiểu dữ liu __pid_t.
- pid = fork() : Ta gọi hàm fork() ể tạo ra 1 tiến trình con (như 1 bản sao
của tiến trình hiện tại), và gán pid bằng với PID của tiến trình cha, và
pid = 0 ối với tiến trình con.
- if (pid>0) : Đoạn mã sau ược thực thi trong tiến trình cha (vì PID của
cha > 0)
printf("PARENTS | PID = %ld | PPID = %ld\n",
(long)getpid(), (long)getppid()); : Dùng câu lệnh này ể in ra
PID và PPID (Parent Process ID) của tiến trình cha.
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
5
Sau ó tiến hành kiểm tra số lượng ối số ầu vào argc, nếu có nhiều hơn 2
ối số thì in ra thông báo “There are X arguments trong ó X là số
lượng ối số tr i 1 (argc -1).
- wait(NULL): Khi tiến trình cha gọi lệnh này, tiến trình cha tạm dừng và
chờ cho ến khi tiến trình con hoàn thành. Khi tiến trình con kết thúc, nó
thông báo cho tiến trình cha và tiến trình cha tiếp tục thực hiện tiếp.
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
6
if (pid == 0): Đoạn mã sau sẽ ược tiến trình con thực hiện (PID = 0)
Hàm execl() ược dùng ể thay thể chương trình ang chạy bằng
file script có tên là count.sh. File script này ưc gọi với các ối
số là “./count.sh”,”10”, NULL.
Sau khi execl() ược gọi, tiến trình con sẽ ược thay thế bởi
count.sh, tiến trình con sẽ kết thúc khi thực hiện xong file
script.
Vì lệnh execl( ) thay ổi hoàn toàn tiến trình con nên lệnh
printf và vòng lặp for sau nó sẽ không ược thực thi.
Trong file script “count.sh”, thực hiện lần lượt các câu leehnhj
sau : o echo "Implementing: $0": In ra thông báo cho biết
file count.sh ang ược thực thi. $0 là biến môi trường chứa tên
của tệp kịch bản hiện tại.
o echo "PPID of count.sh: ": In ra dòng: "PPID of count.sh: ".
o ps -ef | grep count.sh : lệnh này ược sử dụng ể liệt kê tất cả
các tiến trình ang chạy trên hệ thống và lọc ra các dòng có
chuỗi “count.sh” bằng lệnh grep.
o Khởi tạo biến i lúc ầu bằng 1.
o while [ $i -le $1 ]: Bắt ầu một vòng lặp while kiểm tra giá trị
của biến i so với tham số ược nhập vào. -le là phép so sánh bé
hơn hoặc bằng.
o echo $i >> count.txt: In giá trị của biến i lên tệp count.txt.
Dòng này ược lặp lại cho ến khi i vượt quá giới hạn.
o i=$((i + 1)): Tăng giá trị của biến in một ơn vị sau mỗi lần
lặp.
o sleep 1: Tạm dừng chương trình trong 1 giây trước khi lặp lại
vòng lặp.
o exit 0: Kết thúc tệp kịch bản với mã trạng thái 0 ể chỉ ra rằng
nó ã thực hiện thành công.
- exit(0) : Kết thúc cả tiến trình cha và tiến trình con.
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
-
7
Hình nh minh chứng :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
8
file script : count.sh
Giải thích kết quả :
- oạn lệnh trên, ta truyền vào 3 ối số : 1 2 3
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
-
9
- Trong tiến trình cha in ra PID và PPID của tiến trình cha thông qua
hàm getpid() với PID của cha là 3429 và PPID là 2587
- Sau khi ếm có 3 ối số ược truyền vào, tiến trình cha in ra “There are
3 arguments”. Nếu có ít hơn 2 ối số thì tiến trình cha sẽ không in ra
dòng này.
- Trong tiến trình con, ngay khi gọi hàm execl(), tiến trình con sẽ ược
thay thế bởi file script count.sh. Lúc này tiến trình con sẽ thực hiện
lần lượt các câu lệnh trong file count.sh
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
-
10
Sau khi in ra 2 dòng Implementing: ./count.shPPID of count.sh:,
chương trình con liệt kê ra tất cả các quá trình có chuỗi là count.sh.
- Các thông tin của quá trình ược in ra bao gồm: UID (User iD), PID
(Process ID), PPID (Parent Process ID), C (CPU utilization), STIME
(Start time), TTY (Terminal type), TIME (Total accumulated CPU
time), CMD (Command).
- Trong file count.txt, in ra từ 1 ến 10 bởi câu lệnh echo $i >> count.txt
Ví dụ 3-3 : test_system
Cách làm :
- printf("PARENTS | PID = %ld | PPID = %ld\n", (long)getpid(),
(long)getppid()); : Dùng câu lệnh này ể in ra PID và PPID (Parent
Process ID) của tiến trình cha.
- Kiểm tra số lượng ối số trên dòng lệnh (argc) và nếu có nhiều hơn 2
ối số, in ra thông báo "There are X arguments" trong ó X là số ối số
tr1 (argc - 1). Argc là số lượng ối số dòng lệnh mà chương trình
nhận, bao gồm cả tên chương trình. Vì vậy, nếu muốn biết số lượng
các ối số (tức là số lượng thông tin truyền vào ngoài tên chương
trình), phải trừ i 1 từ argcloại bỏ tên chương trình.
- Hàm system dùng ể thực thi 1 lệnh shell. Trong trường hợp này, lệnh
system(“./count.sh 10”) giúp chạy file script count.sh. Hàm system
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
-
11
tạm dừng thực hiện chương trình hiện tại ến khi các câu lệnh trong
file script ược chạy xong.
Sau ó in ra danh sách dối số ược truyền vào thông qua mảng argv bằng
vòng lặp for.
- Trong file script count.sh:
echo "Implementing: $0": In ra thông báo cho biết file count.sh
ang ược thực thi. $0 là biến môi trường chứa tên của tệp kịch bản
hiện tại.
echo "PPID of count.sh: ": In ra dòng: "PPID of count.sh: ".
ps -ef | grep count.sh : lệnh này ược sử dụng ể liệt kê tất cả các
tiến trình ang chạy trên hệ thống và lọc ra các dòng có chuỗi
“count.sh” bằng lệnh grep.
Khởi tạo biến i lúc ầu bằng 1.
while [ $i -le $1 ]: Bắt ầu một vòng lặp while kiểm tra giá trị của
biến i so với tham số ược nhập vào. -le là phép so sánh bé hơn hoc
bằng.
echo $i >> count.txt: In giá trị của biến i lên tệp count.txt. Dòng
này ược lặp lại cho ến khi i vượt quá giới hạn.
i=$((i + 1)): Tăng giá trị của biến in một ơn vị sau mỗi lần lặp.
sleep 1: Tạm dừng chương trình trong 1 giây trước khi lặp lại vòng
lặp.
exit 0: Kết thúc tệp kịch bản với mã trạng thái 0 ể chỉ ra rằng nó ã
thực hiện thành công.
- exit(0) : Kết thúc cả tiến trình cha và tiến trình con.
Hình nh minh chứng :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
12
- file script count.sh :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
-
13
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
14
Giải thích kết quả :
- oạn lệnh trên, ta truyền vào 3 ối số : 1 2 3
- Trong tiến trình cha in ra PID và PPID của tiến trình cha thông qua
hàm getpid() với PID của cha là 3971 và PPID là 2587
- Sau khi ếm có 3 ối số ược truyền vào, tiến trình cha in ra “There are 3
arguments”. Nếu có ít hơn 2 ối số thì tiến trình cha sẽ không in ra
dòng này.
- Sau khi in ra 2 dòng Implementing: ./count.shPPID of count.sh:,
chương trình con liệt kê ra tất cả các quá trình có chuỗi là count.sh.
- Các thông tin của quá trình ược in ra bao gồm: UID (User iD), PID
(Process ID), PPID (Parent Process ID), C (CPU utilization), STIME
(Start time), TTY (Terminal type), TIME (Total accumulated CPU
time), CMD (Command).
- Trong file count.txt, in ra từ 1 ến 10 bởi câu lệnh echo $i >> count.txt
- Khác với execl(), sau khi gọi lệnh system(), thì khi thực hiện xong các
lệnh trong file script count.sh, tiến trình tiếp tục ược thực hiện và in ra
màn hình : List of arguments : 1 2 3 thông qua vòng lặp for.
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
15
Ví dụ 3-4 : test_shm.c
Cách làm :
- Tại process A :
const int SIZE = 4096 : kích thước của ối tượng bộ nhớ chia sẻ
là 4096 bytes
const char *name: Tên của ối tượng bộ nhớ chia sẻ.
Chương trình khởi tạo bộ nhớ chia sẻ bằng cách sử dụng
shm_open. Nó tạo mt ối tượng bộ nhớ chia sẻ với tên "OS"
bằng cách sử dụng các cờ O_CREAT | O_RDWR. O_CREAT
ược sử dụng ể tạo ối tượng nếu nó không tồn tại. Nếu ối tượng ã
tồn tại, hàm này vẫn sẽ mở nó. O_RDWR mở ối tượng ể ọc và
ghi. Điều này cho phép quá trình mở ối tượng có quyền ọc và
ghi vào nó. 0666 quyền truy cập
(permission) của ối tượng bộ nhớ chia sẻ mới ược tạo. Trong
trường hợp này, 0666 cho phép ọc và ghi.
ftruncate(fd, SIZE) : Cấu hình kích thước của ối tượng bộ nh
chia sẻ ến SIZE byte.
mmap ược sử dụng ể ánh xạ ối tượng bộ nhớ chia sẻ vào không
gian ịa chỉ của quá trình. Bộ nhược cấu hình cho cả ọc và ghi
(PROT_READ | PROT_WRITE), và nó ược chia sẻ gia
nhiều quá trình (MAP_SHARED).
strcpy(ptr, "Hello Process B") : Ghi chuỗi "Hello Process B"
vào ối tượng bộ nhớ chia sẻ thông qua con trỏ ptr.
Vòng lặp while (strncmp(ptr, "Hello Process B", 15) == 0):
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
16
Đợi cho ến khi quá trình B cập nhật ối tượng bộ nhớ chia sẻ.
Hàm strncmp so sánh chuỗi trong ptr với chuỗi "Hello
Process
B" trong 15 ký tự ầu tiên.
munmap(ptr, SIZE) : Hủy ánh xạ ối tượng bộ nhớ chia sẻ từ
không gian ịa chỉ của quá trình, giải phóng vùng nhớ ã cấp phát.
close(fd) : Đóng file descriptor liên kết với ối tượng bộ nh
chia sẻ.
- Tại process B :
const int SIZE = 4096 : kích thước của ối tượng bộ nhớ chia sẻ là
4096 bytes
const char *name: Tên của ối tượng bộ nhớ chia sẻ.
Chương trình khởi tạo bộ nhớ chia sẻ bằng cách sử dụng
shm_open. Nó tạo mt ối tượng bộ nhớ chia sẻ với tên "OS" bằng
cách sử dụng các cờ O_CREAT | O_RDWR. O_CREAT ược sử
dụng ể tạo ối tượng nếu nó không tồn tại. Nếu ối tượng ã tồn tại,
hàm này vẫn sẽ mở nó. O_RDWR mở ối tượng ể ọc và ghi.
Điều này cho phép quá trình mở ối tượng có quyền ọc và ghi vào
nó. 0666 là quyền truy cập (permission) của ối tượng bộ nhớ chia sẻ
mới ược tạo. Trong trường hợp này, 0666 cho phép ọc và ghi.
ftruncate(fd, SIZE) : Cấu hình kích thước của ối tượng bộ nhớ chia sẻ
ến SIZE byte.
mmap ược sử dụng ể ánh xạ ối tượng bộ nhớ chia sẻ vào không
gian ịa chỉ của quá trình. Bộ nhược cấu hình cho cả ọc và ghi
(PROT_READ | PROT_WRITE), và nó ược chia sẻ giữa nhiu
quá trình (MAP_SHARED).
Chương trình ọc bộ nhược chia sẻ "Read shared memory: "
Chương trình cập nhật nội dung của ối tượng bộ nhớ chia sẻ với
chuỗi "Hello Process A" sử dụng strcpy.
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
17
sleep(5): ợi ể quá trình B có thể ọc bộ nhớ chia sẻ trước khi nó bị
hủy ánh xạ và bị xóa.
munmap(ptr, SIZE), close(fd): Hủy ánh xạ oạn nhớ chia sẻ và óng
tập tin mô tả.
shm_unlink ược sử dụng ể loại bỏ ối tượng bộ nhớ chia sẻ. Bước
này thường ược thực hiện bởi một trong các quá trình sau khi nó ã
sử dụng xong bộ nhớ chia sẻ.
- Thực hiện bằng cách cấp quyền thực thi cho 2 file và chạy bằng lệnh
./test_shm_A./test_shm_B.
Hình nh minh chứng :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
18
Giải thích kết quả :
- Tiến trình A sau khi chạy, ghi vào bộ nhớ “Hello Process B”
- Sau ó in ra chui "Waiting for Process B to update shared
memory" cho ến khi tiến trình B chia sẻ bnh.
- Khi tiến trình B bắt ầu chạy, sẽ ọc bộ nhớ chia sẻ hiện có là dòng :
Hello Process B”. Và in ra màn hình : Read shared memory: Hello
Process B
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
19
- Tiến trình B tiếp tục chia sẻ bộ nhớ với chuỗi “Hello Process A” cho
tiến trình A.
- Lúc này tiến trình A cập nhật bộ nhớ chia sẻ với tiến trình B
"Memory updated: Hello Process A ". Vòng lặp while kết thúc vì
bộ nhớ chia sẻ ã cập nhật nên 2 chuỗi lúc này khác nhau.
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.
$ ./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...
* Trình bày cách làm:
- Lấy thời gian bắt ầu bằng lệnh: gettimeofday(&start, NULL);
- Fork một tiến trình con bằng lệnh: pid = fork();
- Tiến trình con thực hin lệnh shell bằng hàm execl bằng lệnh: execl(“/bin/sh”,
“sh”, “-c”, argv[1], (char *)NULL);
- Tiến trình cha chờ tiến trình con kết thúc bằng lệnh: wait(NULL)
- Lấy thời gian kết thúc bằng lệnh: gettimeofday(&end, NULL);
- Tính thời gian thực thi bằng lệnh: double execution_time = (end.tv_sec –
start.tv_sec) + (end.tv_usec – start.tv_usec) / 1e6;
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
20
- In thời gian thực thi bng lệnh: printf(“Thời gian thực thi: %.5f seconds\n”,
execution_time);
* Chụp hình minh chứng:
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
21
* Giải thích kết quả:
Kết quả chính xác của chương trình này sẽ phthuộc vào lệnh shell ược chạy (ở ây ví
dụ là lệnh ls) và tốcthc thi của máy tính. Nó sin ra thời gian thực thi ca lệnh shell ó
trong ơn vị giây với ộ chính xác ến 5 chữ số sau dấu chấm thập phân.
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
22
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”
Cách làm :
- Code theo như sau :
- Ở file script count.sh :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
23
Hình ảnh minh chứng :
- Ta cấp quyền thực thi và chạy code bằng lệnh: ./Bai3
- Để dừng code, ta Ctrl C.
- Trong file count.txt lúc này :
Giải thích kết quả :
- In ra thông iệp chào mừng: Dòng lệnh printf ược sử dụng ể in ra dòng
chữ "Welcome to IT007, I am 22520480!\n".
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
24
- Tạo tiến trình con: Hàm fork() ược sử dụng ể tạo một tiến trình con.
Trong oạn mã này, fork() sẽ tạo một bản sao của tiến trình hiện tại.
Nếu pid trả về bằng 0, ó là tiến trình con.
- Thiết lập xử lý tín hiệu SIGINT: signal(SIGINT, sigint_handler) ược
sử dụng ể thiết lập xử lý tín hiệu Ctrl+C (SIGINT). Khi nhận ược tín
hiệu này, chương trình sẽ gọi hàm sigint_handler và thoát.
- Chtiến trình con kết thúc: waitpid(pid, NULL, 0) chờ ợi tiến trình
con với pid ã ược tạo trước ó kết thúc. Hàm này sẽ dừng cho ến khi
tiến trình con kết thúc, sau ó chương trình sẽ tiếp tục.
- In ra thông iệp khi tiến trình con kết thúc: Sau khi tiến trình con kết
thúc, chương trình in ra thông iệp "The child proccess has finished
executing."
- Vòng lặp vô hạn ể ợi tín hiệu SIGINT: Vòng lặp while(1) với sleep(1)
sẽ duy trì chương trình chạy vô hạn (loop indefinitely) sau khi tiến
trình con kết thúc. Điều này giữ cho chương trình luôn chạy và ợi tín
hiệu từ Ctrl+C (SIGINT) ể kết thúc chương trình.
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
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
25
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 tng lớn hơn 100 thì cả 2 dừng lại
Trả lời...
* Trình bày cách làm :
- Định nghĩa kích thước buffer bằng lệnh: const int BUFFER_SIZE = 10;
khởi tạo tên của shared-memory bằng lệnh: const char *name = “OS”;
- Khởi tạo biến sum và lưu tổng vào cuối buffer bằng lệnh: int *sum = buffer +
BUFFER_SIZE; và khởi tạo tổng bằng 0 bằng lệnh: *sum = 0;
- Tạo một tiến trình con bằng lệnh: pid_t pid = fork(); - Tiến trình con
(Consumer):
+ In ra giá trị phần tử bằng lệnh: printf(“Consumer reads %d\n”,
buffer[i]);
+ Cộng giá trị phần tử vào tổng bằng lệnh: *sum += buffer[i] và ặt lại giá trị
phần tử thành 0 bằng lệnh: buffer[i] = 0;
+ In ra thông báo khi tổng lớn hơn 100 bằng lệnh: printf(“Sum > 100,
Consumer stops\n”);
- Tiến trình cha (Producer):
+ Tạo ra các giá trị ngẫu nhiên trong khoảng [10, 20] và gán vào phần tử
bằng lệnh: buffer[i] = rand() % 11 + 10;
+ In ra các giá trị ã ghi vào phần tử bằng lệnh: printf(“Producer writes %d\n”,
buffer[i]);
+ In ra thông báo khi tổng lớn hơn 100 bằng lệnh: printf(“Sum > 100,
Producer stops\n”);
+ Đợi tiến trình con kết thúc trước khi tiến trình cha kết thúc bằng lệnh:
wait(NULL);
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
26
- Thu hồi share-memory object bằng lệnh: shm_unlink(name); * Chụp hình
minh chứng:
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
27
* Giải thích kết quả :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
28
- Tiến trình cha (Producer) và tiến trình con (Consumer) lần lượt thực
hiện công việc của mình trong khi chia sẻ dữ liệu thông qua bộ nhớ chia
sẻ. - Dữ liệu ược ọc và ghi trong bộ ệm, và tổng ược cập nhật.
- Tiến trình cha và tiến trình con sẽ dừng khi tổng vượt quá giá trị 100. -
Sau khi công việc hoàn thành, ối tượng bộ nhớ chia sẻ ược dọn dẹp.
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| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
29
𝒏 =
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 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...
Cách làm :
- Xác thực ầu vào: Kiểm tra số lượng ối số dòng lệnh. Nếu không có
úng một ối số, chương trình sẽ yêu cầu người dùng nhập một s
nguyên dương và kết thúc.
- Xử lý ối số: Chuyển i ối số dòng lệnh thành một số nguyên và kiểm
tra xem số này có lớn hơn 0 không. Nếu không, chương trình sẽ yêu
cầu người dùng nhập một số nguyên dương và kết thúc.
- Tạo bộ nhớ chia s: Sử dụng mmap ể tạo bnhớ chia sẻ có kích
thước là (n + 1) số nguyên.
- Tạo tiến trình con: Sử dụng fork ể tạo một tiến trình con. Tiến trình
con sẽ thực hiện chuỗi tính toán dựa trên thuật toán Collatz, lưu kết
quả vào bộ nhớ chia sẻ.
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
30
- Tiến trình con tính toán: Tiến trình con sẽ thực hiện tính toán chuỗi
theo thuật toán Collatz với số nguyên ược nhập, lưu trữ chuỗi kết quả
trong bộ nhớ chia sẻ.
- Tiến trình cha ợi và in kết quả: Tiến trình cha sẽ chtiến trình con
kết thúc (wait(NULL)) sau ó in chuỗi kết quả từ bộ nh chia sẻ và dọn
dẹp bộ nhớ chia sẻ (munmap).
- Kết thúc chương trình: Trả về 0 ể kết thúc chương trình.
Hình nh minh chứng :
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
31
Giải thích kết quả :
- Ở ví dụ trên, ta lần lượt truyền vào 3 ối số: 10, 0 và 9 o
Với 10 :
10 là số chẵn nên in ra số tiếp theo là 10/2 = 5
5 là số lẻ => 3*5 +1 = 16
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
32
16 là số chẵn => 16/2 = 8
8 là số chẵn => 8/2 = 4
4 là số chẵn => 4/2 = 2
2 là số chẵn => 2/1 = 1
Kết thúc chương trình o Với 0 : In ra màn hình “Vui long nhap
mot so duong” vì vi phạm iều kiện số dương
o Với 9 :
9 là số lẻ => 3*9 +1 = 28
28 là số chẵn => 28/2 = 14
14 là số chẵn => 14/2 = 7
7 là số lẻ => 3*7 +1 = 22
22 là số chẵn => 22/2 = 11
11 là số lẻ => 3*11 + 1 = 34
34 là số chẵn => 34/2 = 17
17 là số lẻ => 3*17 + 1 = 52
52 là số chẵn => 52/2 = 26
26 là số chẵn => 26/2 = 13
13 là số lẻ => 3*13 +1 = 40
40 là số chẵn => 40/2 = 20
20 là số chẵn => 20/2 = 10
10 là số chẵn => 10/2 =5
5 là số lẻ => 3*5 +1 = 16
16 là số chẵn => 16/2 = 8
8 là số chẵn => 8/2 = 4
4 là số chẵn => 4/2 = 2 2
là số chẵn => 2/2 =1
Kết thúc chương trình.
lOMoARcPSD| 40551442
Báo cáo thực hành môn Hệ iều hành - Ging viên: Trần Hoàng Lộc.
33
| 1/33

Preview text:

lOMoAR cPSD| 40551442
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Ệ ĐIỀU HÀNH BÁO CÁO LAB 3 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: 10
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?
Ví dụ 3-1 : test_fork.c Cách làm : 1 lOMoAR cPSD| 40551442
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 ta khởi tạo biến pid, dùng ể lưu trữ PID (Process ID) của
tiến trình với kiểu dữ liệu __pid_t.
- pid = fork() : Ta gọi hàm fork() ể tạo ra 1 tiến trình con (như 1 bản
sao của tiến trình hiện tại), và gán pid bằng với PID của tiến trình
cha, và pid = 0 ối với tiến trình con.
- if (pid>0) : Đoạn mã sau ược thực thi trong tiến trình cha (vì PID của cha > 0)
printf("PARENTS | PID = %ld | PPID = %ld\n",
(long)getpid(), (long)getppid()); : Dùng câu lệnh này ể in ra
PID và PPID (Parent Process ID) của tiến trình cha.
▪ Sau ó tiến hành kiểm tra số lượng ối số ầu vào argc, nếu có
nhiều hơn 2 ối số thì in ra thông báo “There are X arguments”
trong ó X là số lượng ối số trừ i 1 (argc -1).
- wait(NULL): Khi tiến trình cha gọi lệnh này, tiến trình cha tạm dừng
và chờ cho ến khi tiến trình con hoàn thành. Khi tiến trình con kết
thúc, nó thông báo cho tiến trình cha và tiến trình cha tiếp tục thực hiện tiếp.
- if (pid == 0): Đoạn mã sau sẽ ược tiến trình con thực hiện (PID = 0)
printf("CHILDREN | PID = %ld | PPID = %ld\n",
(long)getpid(), (long)getppid()); : Lệnh giúp in ra màn hình
PID và PPID của tiến trình con. Trong ó PPID chính là PID
của tiến trình cha.
▪ Sau ó in ra danh sách dối số ược truyền vào thông qua mảng
argv bằng vòng lặp for.
- exit(0) : Kết thúc cả tiến trình cha và tiến trình con.
Hình ảnh minh chứng : 2 lOMoAR cPSD| 40551442
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ả :
- Ở oạn lệnh trên, ta truyền vào 3 ối số 1 2 3 3 lOMoAR cPSD| 40551442
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 tiến trình cha in ra PID và PPID của tiến trình cha thông qua
hàm getpid() với PID của cha là 2981 và PPID là 2587
- Sau khi ếm có 3 ối số ược truyền vào, tiến trình cha in ra “There are
3 arguments”. Nếu có ít hơn 2 ối số thì tiến trình cha sẽ không in ra dòng này.
- Ở tiến trình con, cũng in ra PID là 2982PPID là 2981 (cũng chính
PID của tiến trình cha vì PPID giúp lấy ra PID của tiến trình tạo ra nó)
- Sau ó, tiến trình con tiếp tục in ra lần lượt các ối số ược truyền vào.
List of arguments : 1 2 3
- Kết thúc chương trình.
Ví dụ 3-2 : test_execl.c Cách làm :
- Đầu tiên ta khởi tạo biến pid, dùng ể lưu trữ PID (Process ID) của tiến
trình với kiểu dữ liệu __pid_t.
- pid = fork() : Ta gọi hàm fork() ể tạo ra 1 tiến trình con (như 1 bản sao
của tiến trình hiện tại), và gán pid bằng với PID của tiến trình cha, và
pid = 0 ối với tiến trình con.
- if (pid>0) : Đoạn mã sau ược thực thi trong tiến trình cha (vì PID của cha > 0)
printf("PARENTS | PID = %ld | PPID = %ld\n",
(long)getpid(), (long)getppid()); : Dùng câu lệnh này ể in ra
PID và PPID (Parent Process ID) của tiến trình cha. 4 lOMoAR cPSD| 40551442
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 ó tiến hành kiểm tra số lượng ối số ầu vào argc, nếu có nhiều hơn 2
ối số thì in ra thông báo “There are X arguments” trong ó X là số
lượng ối số trừ i 1 (argc -1).
- wait(NULL): Khi tiến trình cha gọi lệnh này, tiến trình cha tạm dừng và
chờ cho ến khi tiến trình con hoàn thành. Khi tiến trình con kết thúc, nó
thông báo cho tiến trình cha và tiến trình cha tiếp tục thực hiện tiếp. 5 lOMoAR cPSD| 40551442
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.
if (pid == 0): Đoạn mã sau sẽ ược tiến trình con thực hiện (PID = 0)
▪ Hàm execl() ược dùng ể thay thể chương trình ang chạy bằng
file script có tên là count.sh. File script này ược gọi với các ối
số là “./count.sh”,”10”, NULL.
▪ Sau khi execl() ược gọi, tiến trình con sẽ ược thay thế bởi
count.sh, tiến trình con sẽ kết thúc khi thực hiện xong file script.
▪ Vì lệnh execl( ) thay ổi hoàn toàn tiến trình con nên lệnh
printf và vòng lặp for sau nó sẽ không ược thực thi.
▪ Trong file script “count.sh”, thực hiện lần lượt các câu leehnhj
sau : o echo "Implementing: $0": In ra thông báo cho biết
file count.sh ang ược thực thi. $0 là biến môi trường chứa tên
của tệp kịch bản hiện tại.
o echo "PPID of count.sh: ": In ra dòng: "PPID of count.sh: ".
o ps -ef | grep count.sh : lệnh này ược sử dụng ể liệt kê tất cả
các tiến trình ang chạy trên hệ thống và lọc ra các dòng có
chuỗi “count.sh” bằng lệnh grep.
o Khởi tạo biến i lúc ầu bằng 1.
o while [ $i -le $1 ]: Bắt ầu một vòng lặp while kiểm tra giá trị
của biến i so với tham số ược nhập vào. -le là phép so sánh bé hơn hoặc bằng.
o echo $i >> count.txt: In giá trị của biến i lên tệp count.txt.
Dòng này ược lặp lại cho ến khi i vượt quá giới hạn.
o i=$((i + 1)): Tăng giá trị của biến i lên một ơn vị sau mỗi lần lặp.
o sleep 1: Tạm dừng chương trình trong 1 giây trước khi lặp lại vòng lặp.
o exit 0: Kết thúc tệp kịch bản với mã trạng thái 0 ể chỉ ra rằng
nó ã thực hiện thành công.
- exit(0) : Kết thúc cả tiến trình cha và tiến trình con. 6 lOMoAR cPSD| 40551442
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ình ảnh minh chứng : 7 lOMoAR cPSD| 40551442
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 script : count.sh
Giải thích kết quả :
- Ở oạn lệnh trên, ta truyền vào 3 ối số : 1 2 3 8 lOMoAR cPSD| 40551442
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 tiến trình cha in ra PID và PPID của tiến trình cha thông qua
hàm getpid() với PID của cha là 3429 và PPID là 2587
- Sau khi ếm có 3 ối số ược truyền vào, tiến trình cha in ra “There are
3 arguments”. Nếu có ít hơn 2 ối số thì tiến trình cha sẽ không in ra dòng này.
- Trong tiến trình con, ngay khi gọi hàm execl(), tiến trình con sẽ ược
thay thế bởi file script count.sh. Lúc này tiến trình con sẽ thực hiện
lần lượt các câu lệnh trong file count.sh 9 lOMoAR cPSD| 40551442
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 in ra 2 dòng Implementing: ./count.shPPID of count.sh:,
chương trình con liệt kê ra tất cả các quá trình có chuỗi là count.sh.
- Các thông tin của quá trình ược in ra bao gồm: UID (User iD), PID
(Process ID), PPID (Parent Process ID), C (CPU utilization), STIME
(Start time), TTY (Terminal type), TIME (Total accumulated CPU time), CMD (Command).
- Trong file count.txt, in ra từ 1 ến 10 bởi câu lệnh echo $i >> count.txt
Ví dụ 3-3 : test_system Cách làm :
- printf("PARENTS | PID = %ld | PPID = %ld\n", (long)getpid(),
(long)getppid()); : Dùng câu lệnh này ể in ra PID và PPID (Parent
Process ID) của tiến trình cha.
- Kiểm tra số lượng ối số trên dòng lệnh (argc) và nếu có nhiều hơn 2
ối số, in ra thông báo "There are X arguments" trong ó X là số ối số
trừ 1 (argc - 1). Argc là số lượng ối số dòng lệnh mà chương trình
nhận, bao gồm cả tên chương trình. Vì vậy, nếu muốn biết số lượng
các ối số (tức là số lượng thông tin truyền vào ngoài tên chương
trình), phải trừ i 1 từ argc ể loại bỏ tên chương trình.
- Hàm system dùng ể thực thi 1 lệnh shell. Trong trường hợp này, lệnh
system(“./count.sh 10”) giúp chạy file script count.sh. Hàm system 10 lOMoAR cPSD| 40551442
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ạm dừng thực hiện chương trình hiện tại ến khi các câu lệnh trong
file script ược chạy xong.
Sau ó in ra danh sách dối số ược truyền vào thông qua mảng argv bằng vòng lặp for.
- Trong file script count.sh:
echo "Implementing: $0": In ra thông báo cho biết file count.sh
ang ược thực thi. $0 là biến môi trường chứa tên của tệp kịch bản hiện tại.
echo "PPID of count.sh: ": In ra dòng: "PPID of count.sh: ".
ps -ef | grep count.sh : lệnh này ược sử dụng ể liệt kê tất cả các
tiến trình ang chạy trên hệ thống và lọc ra các dòng có chuỗi
“count.sh” bằng lệnh grep.
▪ Khởi tạo biến i lúc ầu bằng 1.
while [ $i -le $1 ]: Bắt ầu một vòng lặp while kiểm tra giá trị của
biến i so với tham số ược nhập vào. -le là phép so sánh bé hơn hoặc bằng.
echo $i >> count.txt: In giá trị của biến i lên tệp count.txt. Dòng
này ược lặp lại cho ến khi i vượt quá giới hạn.
i=$((i + 1)): Tăng giá trị của biến i lên một ơn vị sau mỗi lần lặp.
sleep 1: Tạm dừng chương trình trong 1 giây trước khi lặp lại vòng lặp.
exit 0: Kết thúc tệp kịch bản với mã trạng thái 0 ể chỉ ra rằng nó ã
thực hiện thành công.
- exit(0) : Kết thúc cả tiến trình cha và tiến trình con.
Hình ảnh minh chứng : 11 lOMoAR cPSD| 40551442
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 script count.sh : 12 lOMoAR cPSD| 40551442
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| 40551442
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ả :
- Ở oạn lệnh trên, ta truyền vào 3 ối số : 1 2 3
- Trong tiến trình cha in ra PID và PPID của tiến trình cha thông qua
hàm getpid() với PID của cha là 3971 và PPID là 2587
- Sau khi ếm có 3 ối số ược truyền vào, tiến trình cha in ra “There are 3
arguments”. Nếu có ít hơn 2 ối số thì tiến trình cha sẽ không in ra dòng này.
- Sau khi in ra 2 dòng Implementing: ./count.shPPID of count.sh:,
chương trình con liệt kê ra tất cả các quá trình có chuỗi là count.sh.
- Các thông tin của quá trình ược in ra bao gồm: UID (User iD), PID
(Process ID), PPID (Parent Process ID), C (CPU utilization), STIME
(Start time), TTY (Terminal type), TIME (Total accumulated CPU time), CMD (Command).
- Trong file count.txt, in ra từ 1 ến 10 bởi câu lệnh echo $i >> count.txt
- Khác với execl(), sau khi gọi lệnh system(), thì khi thực hiện xong các
lệnh trong file script count.sh, tiến trình tiếp tục ược thực hiện và in ra
màn hình : List of arguments : 1 2 3 thông qua vòng lặp for. 14 lOMoAR cPSD| 40551442
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.
Ví dụ 3-4 : test_shm.c Cách làm : - Tại process A :
const int SIZE = 4096 : kích thước của ối tượng bộ nhớ chia sẻ là 4096 bytes
const char *name: Tên của ối tượng bộ nhớ chia sẻ.
▪ Chương trình khởi tạo bộ nhớ chia sẻ bằng cách sử dụng
shm_open. Nó tạo một ối tượng bộ nhớ chia sẻ với tên "OS"
bằng cách sử dụng các cờ O_CREAT | O_RDWR. O_CREAT
ược sử dụng ể tạo ối tượng nếu nó không tồn tại. Nếu ối tượng ã
tồn tại, hàm này vẫn sẽ mở nó. O_RDWR mở ối tượng ể ọc và
ghi. Điều này cho phép quá trình mở ối tượng có quyền ọc và
ghi vào nó. 0666 là quyền truy cập
(permission) của ối tượng bộ nhớ chia sẻ mới ược tạo. Trong
trường hợp này, 0666 cho phép ọc và ghi.
ftruncate(fd, SIZE) : Cấu hình kích thước của ối tượng bộ nhớ
chia sẻ ến SIZE byte.
mmap ược sử dụng ể ánh xạ ối tượng bộ nhớ chia sẻ vào không
gian ịa chỉ của quá trình. Bộ nhớ ược cấu hình cho cả ọc và ghi
(PROT_READ | PROT_WRITE), và nó ược chia sẻ giữa
nhiều quá trình (MAP_SHARED).
strcpy(ptr, "Hello Process B") : Ghi chuỗi "Hello Process B"
vào ối tượng bộ nhớ chia sẻ thông qua con trỏ ptr.
Vòng lặp while (strncmp(ptr, "Hello Process B", 15) == 0): 15 lOMoAR cPSD| 40551442
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.
Đợi cho ến khi quá trình B cập nhật ối tượng bộ nhớ chia sẻ.
Hàm strncmp so sánh chuỗi trong ptr với chuỗi "Hello Process
B" trong 15 ký tự ầu tiên.
munmap(ptr, SIZE) : Hủy ánh xạ ối tượng bộ nhớ chia sẻ từ
không gian ịa chỉ của quá trình, giải phóng vùng nhớ ã cấp phát.
close(fd) : Đóng file descriptor liên kết với ối tượng bộ nhớ chia sẻ. - Tại process B :
const int SIZE = 4096 : kích thước của ối tượng bộ nhớ chia sẻ là 4096 bytes
const char *name: Tên của ối tượng bộ nhớ chia sẻ.
▪ Chương trình khởi tạo bộ nhớ chia sẻ bằng cách sử dụng
shm_open. Nó tạo một ối tượng bộ nhớ chia sẻ với tên "OS" bằng
cách sử dụng các cờ O_CREAT | O_RDWR. O_CREAT ược sử
dụng ể tạo ối tượng nếu nó không tồn tại. Nếu ối tượng ã tồn tại,
hàm này vẫn sẽ mở nó. O_RDWR mở ối tượng ể ọc và ghi.
Điều này cho phép quá trình mở ối tượng có quyền ọc và ghi vào
nó. 0666 là quyền truy cập (permission) của ối tượng bộ nhớ chia sẻ
mới ược tạo. Trong trường hợp này, 0666 cho phép ọc và ghi. ▪
ftruncate(fd, SIZE) : Cấu hình kích thước của ối tượng bộ nhớ chia sẻ ến SIZE byte.
mmap ược sử dụng ể ánh xạ ối tượng bộ nhớ chia sẻ vào không
gian ịa chỉ của quá trình. Bộ nhớ ược cấu hình cho cả ọc và ghi
(PROT_READ | PROT_WRITE), và nó ược chia sẻ giữa nhiều
quá trình (MAP_SHARED).
▪ Chương trình ọc bộ nhớ ược chia sẻ "Read shared memory: "
Chương trình cập nhật nội dung của ối tượng bộ nhớ chia sẻ với
chuỗi "Hello Process A" sử dụng strcpy. 16 lOMoAR cPSD| 40551442
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.
sleep(5): ợi ể quá trình B có thể ọc bộ nhớ chia sẻ trước khi nó bị
hủy ánh xạ và bị xóa.
munmap(ptr, SIZE), close(fd): Hủy ánh xạ oạn nhớ chia sẻ và óng tập tin mô tả.
shm_unlink ược sử dụng ể loại bỏ ối tượng bộ nhớ chia sẻ. Bước
này thường ược thực hiện bởi một trong các quá trình sau khi nó ã
sử dụng xong bộ nhớ chia sẻ.
- Thực hiện bằng cách cấp quyền thực thi cho 2 file và chạy bằng lệnh
./test_shm_A./test_shm_B.
Hình ảnh minh chứng : 17 lOMoAR cPSD| 40551442
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ả :
- Tiến trình A sau khi chạy, ghi vào bộ nhớ “Hello Process B”
- Sau ó in ra chuỗi "Waiting for Process B to update shared
memory" cho ến khi tiến trình B chia sẻ bộ nhớ.
- Khi tiến trình B bắt ầu chạy, sẽ ọc bộ nhớ chia sẻ hiện có là dòng :
Hello Process B”. Và in ra màn hình : Read shared memory: Hello Process B 18 lOMoAR cPSD| 40551442
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.
- Tiến trình B tiếp tục chia sẻ bộ nhớ với chuỗi “Hello Process A” cho tiến trình A.
- Lúc này tiến trình A cập nhật bộ nhớ chia sẻ với tiến trình B
"Memory updated: Hello Process A ". Vòng lặp while kết thúc vì
bộ nhớ chia sẻ ã cập nhật nên 2 chuỗi lúc này khác nhau.
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.
$ ./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...
* Trình bày cách làm: -
Lấy thời gian bắt ầu bằng lệnh: gettimeofday(&start, NULL); -
Fork một tiến trình con bằng lệnh: pid = fork(); -
Tiến trình con thực hiện lệnh shell bằng hàm execl bằng lệnh: execl(“/bin/sh”,
“sh”, “-c”, argv[1], (char *)NULL); -
Tiến trình cha chờ tiến trình con kết thúc bằng lệnh: wait(NULL) -
Lấy thời gian kết thúc bằng lệnh: gettimeofday(&end, NULL); -
Tính thời gian thực thi bằng lệnh: double execution_time = (end.tv_sec –
start.tv_sec) + (end.tv_usec – start.tv_usec) / 1e6; 19 lOMoAR cPSD| 40551442
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. -
In thời gian thực thi bằng lệnh: printf(“Thời gian thực thi: %.5f seconds\n”, execution_time);
* Chụp hình minh chứng: 20 lOMoAR cPSD| 40551442
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ả:
Kết quả chính xác của chương trình này sẽ phụ thuộc vào lệnh shell ược chạy (ở ây ví
dụ là lệnh ls) và tốc ộ thực thi của máy tính. Nó sẽ in ra thời gian thực thi của lệnh shell ó
trong ơn vị giây với ộ chính xác ến 5 chữ số sau dấu chấm thập phân. 21 lOMoAR cPSD| 40551442
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. 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
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” Cách làm : - Code theo như sau :
- Ở file script count.sh : 22 lOMoAR cPSD| 40551442
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ình ảnh minh chứng :
- Ta cấp quyền thực thi và chạy code bằng lệnh: ./Bai3
- Để dừng code, ta Ctrl C.
- Trong file count.txt lúc này :
Giải thích kết quả :
- In ra thông iệp chào mừng: Dòng lệnh printf ược sử dụng ể in ra dòng
chữ "Welcome to IT007, I am 22520480!\n". 23 lOMoAR cPSD| 40551442
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ạo tiến trình con: Hàm fork() ược sử dụng ể tạo một tiến trình con.
Trong oạn mã này, fork() sẽ tạo một bản sao của tiến trình hiện tại.
Nếu pid trả về bằng 0, ó là tiến trình con.
- Thiết lập xử lý tín hiệu SIGINT: signal(SIGINT, sigint_handler) ược
sử dụng ể thiết lập xử lý tín hiệu Ctrl+C (SIGINT). Khi nhận ược tín
hiệu này, chương trình sẽ gọi hàm sigint_handler và thoát.
- Chờ tiến trình con kết thúc: waitpid(pid, NULL, 0) chờ ợi tiến trình
con với pid ã ược tạo trước ó kết thúc. Hàm này sẽ dừng cho ến khi
tiến trình con kết thúc, sau ó chương trình sẽ tiếp tục.
- In ra thông iệp khi tiến trình con kết thúc: Sau khi tiến trình con kết
thúc, chương trình in ra thông iệp "The child proccess has finished executing."
- Vòng lặp vô hạn ể ợi tín hiệu SIGINT: Vòng lặp while(1) với sleep(1)
sẽ duy trì chương trình chạy vô hạn (loop indefinitely) sau khi tiến
trình con kết thúc. Điều này giữ cho chương trình luôn chạy và ợi tín
hiệu từ Ctrl+C (SIGINT) ể kết thúc chương trình.
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 24 lOMoAR cPSD| 40551442
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.
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...
* Trình bày cách làm :
- Định nghĩa kích thước buffer bằng lệnh: const int BUFFER_SIZE = 10;
khởi tạo tên của shared-memory bằng lệnh: const char *name = “OS”;
- Khởi tạo biến sum và lưu tổng vào cuối buffer bằng lệnh: int *sum = buffer +
BUFFER_SIZE; và khởi tạo tổng bằng 0 bằng lệnh: *sum = 0;
- Tạo một tiến trình con bằng lệnh: pid_t pid = fork(); - Tiến trình con (Consumer):
+ In ra giá trị phần tử bằng lệnh: printf(“Consumer reads %d\n”, buffer[i]);
+ Cộng giá trị phần tử vào tổng bằng lệnh: *sum += buffer[i] và ặt lại giá trị
phần tử thành 0 bằng lệnh: buffer[i] = 0;
+ In ra thông báo khi tổng lớn hơn 100 bằng lệnh: printf(“Sum > 100, Consumer stops\n”);
- Tiến trình cha (Producer):
+ Tạo ra các giá trị ngẫu nhiên trong khoảng [10, 20] và gán vào phần tử
bằng lệnh: buffer[i] = rand() % 11 + 10;
+ In ra các giá trị ã ghi vào phần tử bằng lệnh: printf(“Producer writes %d\n”, buffer[i]);
+ In ra thông báo khi tổng lớn hơn 100 bằng lệnh: printf(“Sum > 100, Producer stops\n”);
+ Đợi tiến trình con kết thúc trước khi tiến trình cha kết thúc bằng lệnh: wait(NULL); 25 lOMoAR cPSD| 40551442
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.
- Thu hồi share-memory object bằng lệnh: shm_unlink(name); * Chụp hình minh chứng: 26 lOMoAR cPSD| 40551442
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ả : 27 lOMoAR cPSD| 40551442
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.
- Tiến trình cha (Producer) và tiến trình con (Consumer) lần lượt thực
hiện công việc của mình trong khi chia sẻ dữ liệu thông qua bộ nhớ chia
sẻ. - Dữ liệu ược ọc và ghi trong bộ ệm, và tổng ược cập nhật.
- Tiến trình cha và tiến trình con sẽ dừng khi tổng vượt quá giá trị 100. -
Sau khi công việc hoàn thành, ối tượng bộ nhớ chia sẻ ược dọn dẹp.
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: 28 lOMoAR cPSD| 40551442
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... • Cách làm :
- Xác thực ầu vào: Kiểm tra số lượng ối số dòng lệnh. Nếu không có
úng một ối số, chương trình sẽ yêu cầu người dùng nhập một số
nguyên dương và kết thúc.
- Xử lý ối số: Chuyển ổi ối số dòng lệnh thành một số nguyên và kiểm
tra xem số này có lớn hơn 0 không. Nếu không, chương trình sẽ yêu
cầu người dùng nhập một số nguyên dương và kết thúc.
- Tạo bộ nhớ chia sẻ: Sử dụng mmap ể tạo bộ nhớ chia sẻ có kích
thước là (n + 1) số nguyên.
- Tạo tiến trình con: Sử dụng fork ể tạo một tiến trình con. Tiến trình
con sẽ thực hiện chuỗi tính toán dựa trên thuật toán Collatz, lưu kết
quả vào bộ nhớ chia sẻ. 29 lOMoAR cPSD| 40551442
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.
- Tiến trình con tính toán: Tiến trình con sẽ thực hiện tính toán chuỗi
theo thuật toán Collatz với số nguyên ược nhập, lưu trữ chuỗi kết quả trong bộ nhớ chia sẻ.
- Tiến trình cha ợi và in kết quả: Tiến trình cha sẽ chờ tiến trình con
kết thúc (wait(NULL)) sau ó in chuỗi kết quả từ bộ nhớ chia sẻ và dọn
dẹp bộ nhớ chia sẻ (munmap).
- Kết thúc chương trình: Trả về 0 ể kết thúc chương trình.
Hình ảnh minh chứng : 30 lOMoAR cPSD| 40551442
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ả :
- Ở ví dụ trên, ta lần lượt truyền vào 3 ối số: 10, 0 và 9 o Với 10 :
10 là số chẵn nên in ra số tiếp theo là 10/2 = 5
5 là số lẻ => 3*5 +1 = 16 31 lOMoAR cPSD| 40551442
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.
16 là số chẵn => 16/2 = 8
8 là số chẵn => 8/2 = 4
4 là số chẵn => 4/2 = 2
2 là số chẵn => 2/1 = 1
Kết thúc chương trình o Với 0 : In ra màn hình “Vui long nhap
mot so duong” vì vi phạm iều kiện số dương o Với 9 :
9 là số lẻ => 3*9 +1 = 28
28 là số chẵn => 28/2 = 14
14 là số chẵn => 14/2 = 7
7 là số lẻ => 3*7 +1 = 22
22 là số chẵn => 22/2 = 11
11 là số lẻ => 3*11 + 1 = 34
34 là số chẵn => 34/2 = 17
17 là số lẻ => 3*17 + 1 = 52
52 là số chẵn => 52/2 = 26
26 là số chẵn => 26/2 = 13
13 là số lẻ => 3*13 +1 = 40
40 là số chẵn => 40/2 = 20
20 là số chẵn => 20/2 = 10
10 là số chẵn => 10/2 =5
5 là số lẻ => 3*5 +1 = 16
16 là số chẵn => 16/2 = 8
8 là số chẵn => 8/2 = 4
4 là số chẵn => 4/2 = 2 2 là số chẵn => 2/2 =1
Kết thúc chương trình. 32 lOMoAR cPSD| 40551442
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. 33