Semaphore C là gì

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA KỸ THUẬT MÁY TÍNH

TÀI LIỆU:

HƯỚNG DẪN THỰC HÀNH
HỆ ĐIỀU HÀNH

Nhóm biên soạn:
- ThS. Phan Đình Duy
- ThS. Phạm Văn Phước
- ThS. Nguyễn Việt Quốc
- KS. Nguyễn Hữu Nhân
- KS. Lê Văn La
- KS. Trần Văn Quang

Tháng 7 năm 2011

NỘI DUNG CÁC BÀI THỰC HÀNH

Phần 1: Lập trình trên Linux
Bài 1: Hướng dẫn cài đặt Ubuntu và các lệnh cơ bản của shell
Bài 2: Cơ bản lập trình shell

Phần 2: Thực hành hệ điều hành
Bài 3: Quản lý tiến trình
Bài 4: Định thời CPU
Bài 5: Đồng bộ hóa tiến trình, tiểu trình
Bài 6: Quản lý bộ nhớ

Phần 3: Bài tập lớn

CÁC PHẦN MỀM THIẾT BỊ SỬ DỤNG TRONG MÔN THỰC HÀNH
- Phần mềm VMware
- Hệ điều hành Ubuntu

Chương 1.

Đồng bộ hóa tiến trình và tiểu trình

1.1 Mục Đích
Mục đích của bài thực hành này nhằm giới thiệu đến các sinh viên thư
viện Semaphore và Mutex, một thư viên để đồng bộ hóa các tiến trình và
tiểu trình chạy song song với nhau.
Những công cụ cần chuẩn bị cho bài lập trình:
- Hệ điều hành linux đã cài đặt GCC và G++ compilers [Gói buildessential package của linux]
- Cài

đặt

eclipse

hoặc

các

C/C++

Integrate

Development

Environment.

1.2 Semaphore
Trong khoa học máy tính, Đặc biệt là trong hệ điều hành, semaphore
được biết đến như một biến được sử dụng để điều khiển sự truy xuất vào
tài nguyên chung của các tiểu trình trong xử lý song song hoặc trong các
môi trường đa người dùng.
Semaphore được xem như một danh sách các đơn vị còn trống của một
tài nguyên cụ thể của máy tinh. Có 2 thao tác cơ bản trên một biến
semaphore đó là yêu cầu tài nguyên và giải phóng tài nguyên,và nếu cần
thiết nó còn có thể làm cờ để đợi cho đến khi tài nguyên được một tiểu
trình khác giải phóng.
1.2.1 Các function cơ bản cho Semaphore trên C
Để include thư viên semaphore vào một chương trình C ta sử dụng
#include
Và khai báo thư viện pthread và rt khi biên dịch . Ví dụ
gcc -o filename filename.c -lpthread -lrt

Để định nghĩa một semaphore ta dùng:

sem_t sem_name;
Để khởi tạo một biến semaphore ta sử dụng hàm:
int sem_init[sem_t *sem, int pshared, unsigned int value];
sem : là con trỏ đến địa chỉ của biến semaphore.
Pshared là cờ để cho cài đặt cho việc chia sẻ biến
semaphore giữa các với các fork[]ed processes, tuy nhiên
hiện tại LinuxThread không hỗ trợ Shared semaphores.
Value là giá trị khởi tạo để gán cho semaphore
Ví dụ:
Sem_t sam;
Sem_init[&sam,0,10];
Đợi một semaphore:
Sem_wait[&sem_name];
Nếu giá tri của semaphore là không dương, tiến trình sẽ bị
block, một trong những tiến trình bị block sẽ mở khi có một
process gọi sem_post.
Nếu giá trị của semaphore là dương, giá trị của semaphore
sẽ giảm đi 1. Tiến trình tiếp tục được chạy.
Tìm giá trị của semaphore:
int sem_getvalue[sem_t *sem, int *valp];
Lấy giá trị của semaphore vào biến int có địa chỉ valp.
Ví dụ:
int value;
sem_getvalue[&sem_name, &value];
printf["The value of the semaphors is %d\n", value];
Hủy một biến semaphore:
sem_destroy[sem_t *sem];

Hủy semaphore, không nên có tiểu trình nào sem_wait nó
nữa
1.2.2 Ví dụ về sử dụng semaphore:
Giả sử có 2 process được thực thi song song bởi đoạn code như sau:
processA{
while [true]
na++;
}
process{
while [true]
nb++;
}
Giá trị ban đầu của na và nb là 0. Sử dụng semaphore để đảm bảo rằng
na= nb thì na phải chờ nb tăng lên trước.
Sem_t sam;
Sem_init[&sam,0,0];
processA{
while [true]
{
Sem_wait[&name];
na++;

}
}
process{
while [true]
{
nb++;
sem_post[&sam];
}
}
Theo solution trên, mỗi lần nb tăng them 1 đơn vị thì sam sẽ tăng lên 1 đơn
vị. điều đó kéo theo na được quyền tăng theo 1 đơn vị.
Trước mỗi lẫn na tăng thêm 1 đơn vị thì lệnh Sem_wait[&sam]; được thực
hiện. lệnh này sẽ trừ biến sam đi một đơn vị. Cho đến khi sam=0 thì na
phải đợi nb được tăng thêm một đơn vị mới được tăng tiếp.
1.2.3 Bài tập
1.Lập trình hiện thực hóa ví dụ 1.2.2 trên C
2. Giả sử có 2 process được thực thi song song bởi đoạn code như sau:
processA{
while [true]
na++;
}
process{
while [true]
nb++;

}
Giá trị ban đầu của na và nb là 0. Sử dụng semaphore để đảm bảo rằng
nb

Video liên quan

Chủ Đề