操作系统OS报告读者与写者问题(进程同步问题.doc
文本预览下载声明
目 录
一、课程设计目的及要求 1
二、相关知识 1
三、题目分析 2
四、概要设计 4
五、代码及流程 5
六、运行结果 11
七、设计心得 12
八、参考文献 12
一、课程设计目的及要求
读者与写者问题(进程同步问题)
用n 个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制:
1)写-写互斥;
2)读-写互斥;
3)读-读允许;
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
二、相关知识
Windows API:
在本实验中涉及的API 有:
1线程控制:
CreateThread 完成线程创建,在调用进程的地址空间上创建一个线程,以执行指定的函数;它的返回值为所创建线程的句柄。
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
DWORD dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread
function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);
2 ExitThread 用于结束当前线程。
VOID ExitThread(
DWORD dwExitCode // exit code for this thread
);
3 Sleep 可在指定的时间内挂起当前线程。
VOID Sleep(
DWORD dwMilliseconds // sleep time
);
4信号量控制:
WaitForSingleObject 可在指定的时间内等待指定对象为可用状态;
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object
DWORD dwMilliseconds // time-out interval
);
hHandle为等待的对象,也就是实现同步或者互斥的对象。该函数一执行,相应的信号量就减去1,如果信号量小于等于0,那么他一直在循环。
5 实现信号量互斥和同步
CreateSemaphore用于创建信号量,根据参数的不同可以利用它实现互斥和同步。
ReleaseSemaphore用于释放信号量,使用后相应的信号量加1
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//SD
LONG,lInitialCount, //initial count
LONG,lMaximumCount, //maximum count
LPCTSTR lpName //object name
);
ReleaseSemaphore(
HANDLE hSemaphore, //handle to semaphore
LONG lRelseaseCount, //cont increment amount
LPLONG lpPreviousCount //previous count
);
三、题目分析
将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。
(1)构筑读者进程和写者进程间的临界区
题目中说的一批数据被多个读者、写者共享使用,允许多个读者同时访问这些数据,但是如果有一个写者在访问数据时,就不允许其他读者或写者使用,所以,对这一批数据既要保证读者和写者互斥使用,也要保证写者与写者互斥使用。也就是说,在读者进程程序中,使用数据的程序段应该构成临界区;在写者进程程序中,使用数据的程序段应该构成临界区。
(2)判定是否是第一个读者
根据上面的分析,希望在读者进程中有一个办法能判定请求进入临界区的是否是第一个读者。如果是第一个读者,就对信号量wsem做P操作,以取得和写者的同步。为此,设置一个变量rfirst,初值为0.任何一个读者运行时,都现在rfirst上加1,然后判定他是否取值为1.如果是1,则做P(wrt),否则不做。
(3)判定是否是第一个写者
原理同(2)判定是否为第一个读者。
(4)写者优先问
显示全部