1、操作系统课程设计报告操作系统课程设计报告 一、一、读者读者/写者的问题模拟实现写者的问题模拟实现 读者/写者问题,是指保证一个 writer 进程必须与其他进程互斥地访问共享对象的同步 问题。 读者写者问题可以这样的描述:有一群写者和一群读者,写者在写同一本书,读者 也在读这本书, 多个读者可以同时读这本书, 但是只能有一个写者在写书, 并且读者必优先, 也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时,需要有一个互斥操 作,另外需要有一个信号量 S 来确定当前是否可操作。 信号量机制是支持多道程序的并 发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制, 而读者写者则是
2、这一机 制的一个经典范例。 与记录型信号量解决读者写者问题不同, 信号量机制它增加了一个 限制,即最多允许 RN 个读者同时读。为此,又引入了一个信号量 L,并赋予初值为 RN, 通过执行 wait (L,1,1)操作来控制读者的数目,每当有一个读者进入时,就要执行 wait (L,1,1)操作,使 L 的值减 1。当有 RN 个读者进入读后,L 便减为 0,第 RN+1 个读 者要进入读 时,必然会因 wait(L,1,1)操作失败而堵塞。 程序实例: #include #include #include #include #include #include #define MAX_PERS
3、ON 100 #define READER 0 /读者 #define WRITER 1 /写者 #define END -1 #define R READER #define W WRITER typedef struct _Person HANDLE m_hThread;/定义处理线程的句柄 int m_nType;/进程类型(读写) int m_nStartTime;/开始时间 int m_nWorkTime;/运行时间 int m_nID;/进程号 Person; Person g_PersonsMAX_PERSON; int g_NumPerson = 0; long g_Curre
4、ntTime= 0;/基本时间片数 int g_PersonLists = /进程队列 1, W, 3, 5, 2, W, 16, 5, 3, R, 5, 2, 4, W, 6, 5, 5, R, 4, 3, 6, R, 17,7, END, ; int g_NumOfReading = 0; int g_NumOfWriteRequest = 0;/申请写进程的个数 HANDLE g_hReadSemaphore;/读者信号 HANDLE g_hWriteSemaphore;/写者信号 bool finished = false; /所有的读完成 /bool wfinished = false; /所有的写完成 void CreatePersonList(int *pPersonList); bool CreateReader(int StartTime,int WorkTime,int ID); bool CreateWriter(int StartT