Đăng ký Đăng nhập

Tài liệu Uit ce lab hdh lab5

.PDF
11
5780
129

Mô tả:

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 (1); Chúng ta biết rằng processA và processB được thực thi đồng thời, và không gì đảm bảo rằng processA và process sẽ được chạy ở cùng một tốc độ. Do đó, tốc độ tăng của na và nb là không giống nhau. Điều này dẫn đến nếu nb chạy chậm hơn na thì rang buộc (1) không còn được đảm bảo. Để giải quyết điều này, chúng ta sử dụng 1 semaphore để đảm rằng nếu như 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 - Xem thêm -