Thực hành hệ điều hành Semaphore.doc
THỰC HÀNH HỆ ĐIỀU HÀNHTIỂU TRÌNH _ DÙNG SEMAPHORE ĐỂ BẢOVỆ CRITICAL SECTIONBài 1 : Mục tiêu : Bài thực hành cho biết cách dùng hàm CreateThread để tạo tiểu trình và hàm WaitForMultipleObjects đợi các tiểu trình kết thúcHANDLE CreateThread{LPSECURITY_ATTRIBUTES security,DWORD stack,LPTHREAD_START_ROUTINE function,LPVOID param,DWORD flags,LPDWORD threadID );DWORD WaitForMultipleObjects{DWORD numObjects,CONST HANDLE* lpObjects,BOOL fWaitAll,DWORD timeOut );Hàm main tạo 4 tiểu trình CountThread, mỗi tiểu trình tăng biến toàn cục Count lên 250000. Vậy khi 4 tiểu trình kết thúc, Count sẽ có giá trị là 1000000.Hãy chạy và giải thích tại sao giá trị thực tế Count < 1000000 ?#include <stdio.h>#include <stdlib.h>#include <windows.h>int Count;void CountThread(int iterations){int i,x;for (i=0;i<iterations;i++){ // đoạn chương trình critical-section bắt đầu ở đâyx=Count;x++;for(int j=0;j<1000;j++);//muốn làm chậm lại việc gán Count=xCount=x;// đoạn chương trình critical section kết thúc ở đây}}const int numThreads=4;void main(){HANDLE h[numThreads];DWORD threadID;int i; THỰC HÀNH HỆ ĐIỀU HÀNHTIỂU TRÌNH _ DÙNG SEMAPHORE ĐỂ BẢOVỆ CRITICAL SECTION//tạo các tiểu trình, mỗi tiểu trình tăng biến Count lên 250000for (i=0;i<numThreads;i++){h[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)CountThread,(void*)250000,0, &threadID);}WaitForMultipleObjects(numThreads,h,TRUE,INFINITE);//đợi tất cả các tiểu trình hoàn tấtprintf("Gia tri cua Count la %d:",Count);//Count = 1000000 hay khác ?}Bài 1b : Dùng giải thuật cờ hiệu (flag) sao cho không có 2 tiểu trình đồng thời thực thi đoạn chương trình critical-section. Giải thuật có thực hiện đúng yêu cầu không ? Cho ví dụ để minh hoạ giải thuật dùng cờ hiệu không ngăn chận được việc 2 tiến trình đồng thời thực thi critical-sectionint Count;int flag=0;void CountThread(int iterations){int i,x;for (i=0;i<iterations;i++){while ( flag == 1);for (int j=0;j<1000;j++) ;//muốn chứng tỏ giải thuật dùng cờ hiệu sai nếu bị ngắt ở //điểm nàyflag = 1;// đoạn chương trình critical-section bắt đầu ở đâyx=Count;x++;for(int j=0;j<1000;j++);//muốn làm chậm lại việc gán Count=xCount=x;// đoạn chương trình critical section kết thúc ở đâyflag = 0 ;}}Bài 1c : Dùng giải thuật sử dụng cờ luân phiên (turn) sao cho không có 2 tiểu trình đồng thời thực thi đoạn chương trình critical-section. Giải thuật có thực hiện đúng yêu cầu không ? Cho ví dụ để minh họa vấn đề xảy ra đối với giải thuật này là việc không thực thi critical-section của tiến trình này ngăn chận việc thực thi critical-section của tiến trình kiaBài 1d : Dùng giải thuật Peterson để giải quyết vấn đề critical-section trong bài 1. Giải thuật có thực hiện đúng yêu cầu không ? Khuyết điểm chung của các giải thuật 1b,1c và 1d là gì?Bài 2 : Mục tiêu của bài là dùng Semaphore để “bảo vệ” việc truy xuất biến Count để có kết qủa đúng.Hàm CreateSemaphore để tạo lập biến Semaphore SHàm WaitForSingleObject giống như hàm down() trong giải pháp Sleep and Wake upHàm ReleaseSemaphore có vai trò như hàm up() trong giải pháp Sleep and Wake upHàm CloseHandle để hủy đối tượng Semaphore S#include <stdio.h>#include <stdlib.h> THỰC HÀNH HỆ ĐIỀU HÀNHTIỂU TRÌNH _ DÙNG SEMAPHORE ĐỂ BẢOVỆ CRITICAL SECTION#include <windows.h>int Count;HANDLE S;void CountThread(int iterations){int i,x;for (i=0;i<iterations;i++){ WaitForSingleObject(S,INFINITE); //downx=Count;x++;for(int j=0;j<1000;j++);//muon lam cham lai viec gan Count=xCount=x;ReleaseSemaphore(S,1,0); //up}}const int numThreads=4;void main(){HANDLE h[numThreads];DWORD threadID;int i;S = CreateSemaphore(0,1,1,0); //khởi động giá trị e=1//tao lap cac tieu trinhfor (i=0;i<numThreads;i++){h[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)CountThread,(void*)250000,0,&threadID);}WaitForMultipleObjects(numThreads,h,TRUE,INFINITE);CloseHandle(S);printf("Gia tri cua Count la %d:",Count);}ĐỒNG BỘ HOÁ TIẾN TRÌNH BẰNG SEMAPHOREBài 1 :Viết chương trình tạo 2 tiểu trình : một tiểu trình tên P1 thực hiện hàm A() và một tiểu trình P2 thực hiện hàm B() sao cho A() hoàn tất trước khi B() thực hiện Bài 2 : Viết chương trình tạo 4 tiểu trình : P1,P2,P3,P4 thực hiện các công việc tương ứng A,B,C,D, sao cho A hoàn tất xong thì B,C mới được phép bắt đầu. B,C hoàn tất thì D mới được phép bắt đầu . . THỰC HÀNH HỆ ĐIỀU HÀNHTIỂU TRÌNH _ DÙNG SEMAPHORE ĐỂ BẢOVỆ CRITICAL SECTIONBài 1 : Mục tiêu : Bài thực hành cho biết cách dùng. CloseHandle để hủy đối tượng Semaphore S#include <stdio.h>#include <stdlib.h> THỰC HÀNH HỆ ĐIỀU HÀNHTIỂU TRÌNH _ DÙNG SEMAPHORE ĐỂ BẢOVỆ CRITICAL