Thực hành hệ điều hành Semaphore.doc
Trang 1Bà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úc
HANDLE CreateThread{
LPSECURITY_ATTRIBUTES security,
LPTHREAD_START_ROUTINE function,
DWORD WaitForMultipleObjects{
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 ở đây
x=Count;
x++;
for(int j=0;j<1000;j++);//muốn làm chậm lại việc gán Count=x Count=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;
Trang 2//tạo các tiểu trình, mỗi tiểu trình tăng biến Count lên 250000
for (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ất printf("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-section
int 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ày
flag = 1;
// đoạn chương trình critical-section bắt đầu ở đây x=Count;
x++;
for(int j=0;j<1000;j++);//muốn làm chậm lại việc gán Count=x Count=x;
// đoạn chương trình critical section kết thúc ở đây
flag = 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 kia
Bà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 S
Hàm WaitForSingleObject giống như hàm down() trong giải pháp Sleep and Wake up
Hàm ReleaseSemaphore có vai trò như hàm up() trong giải pháp Sleep and Wake up
Hàm CloseHandle để hủy đối tượng Semaphore S
#include <stdio.h>
#include <stdlib.h>
Trang 3#include <windows.h>
int Count;
HANDLE S;
void CountThread(int iterations)
{
int i,x;
for (i=0;i<iterations;i++)
{ WaitForSingleObject(S,INFINITE); //down
x=Count;
x++;
for(int j=0;j<1000;j++);//muon lam cham lai viec gan Count=x Count=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 trinh
for (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 SEMAPHORE Bà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