问题描述
- 计算机中的数据常被若干个并发程序所共享,某些进程可能只希望“读数据”,读完过后,该数据仍然存在且并未发生任何修改,该进程即为“读进程”。同样有一些进程访问数据时,需要对所访问的数据进行修改,原数据将被修改数据替代,不复存在。该类进程即为“写进程”。
- 多个读进程可以并发的交替访问共享数据资源,但写进程与读进程(写进程)不能同时访问共享数据资源,这样可能导致数据的不一致。
问题分析
- 找出题目中所描述的各个进程,分析它们的互斥、同步关系。
- 根据进程的操作流程写出大致的P、V操作。
- 设置信号量。通过题目给出的已知的条件确定对应的同步信号量的初值(根据对应资源的多少),互斥信号量的初始值一般设为mutex=1。
- 具体分析:
两类进程:读进程、写进程。
互斥关系:写进程与读进程、写进程与写进程。
写进程与任何进程都互斥,设置互斥信号量为wmutex,在写者访问共享资源的前后分别加上P、V操作。因为写者与读者的互斥,在共享资源时,也会执行P(wmutex)操作,这样就会导致后续的读者一直处于阻塞状态。如何防止该类事件的发生呐?我们可以让第一个访问资源的读进程占用该资源,最后一个访问的读进程释放该资源,通过变量count来记录访问共享数据读进程的个数。这样就可以解决多个读进程可以共享同一数据资源了。
问题实现
读者-写者问题可分为3种情况实现:
- 读者优先
- 写者优先
- 公平竞争
读者优先
写者优先
公平竞争
总结
读者-写者问题为我们解决复杂的互斥问题提供了参考思路。它对共享资源的访问类型分成两类:读操作和写操作。对于进行读操作的进程,其对共享资源的访问时共享式的;对于进行写操作的进程,其对共享资源的访问是互斥的,且读、写操作也需互斥,否则将导致数据的不一致。