目录
对于②:数据覆盖?
1、?关系分析:找出题目中描述的各个进程,分析它们之间的同步、互斥关系
只有互斥关系:写进程与写进程互斥、写进程与读进程互斥、读进程与读进程不互斥
2、整理思路:根据各进程的操作流程确定P、V操作的大致顺序
3、 设置信号量:设置需要的信号量,并根据题目要求确定信号量初值(互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值时多少)
semaphore rw = 1; //用于实现对共享文件的互斥访问
int count = 0; //记录当前有几个读进程在访问该文件
semaphore mutex = 1; //用于保证对count变量的互斥访问
semaphore w = 1; //用于实现“写优先”
4、代码实现?
当出现以下并发执行的顺序时:
- 情况一:读者1->读者2
- 情况二:写者1->写者2
- 情况三:写者1->读者1
- 情况四:读者1->写者1->读者2
- 情况五:写者1->读者1->写者2
1、在这种算法中,连续进入的多个读者可以同时读取文件;写者和其他进程不能同时访问文件;写者不会饥饿,但也并不是真正的“写优先”,而是相对公平的先来先服务原则(故该算法也称“读写公平法”)
2、 该算法为我们解决复杂的互斥问题提供了一个参考思路(其核心思想在于设置了一个计数器count用来记录当前正在访问共享文件的读进程数,我们可以用count的值来判断当前进入的进程是否是第一个/最后一个读进程,从而做出不同的处理,另外,对count变量的检查和赋值不能一气呵成会导致一些错误,因此我们后面也会联想到使用互斥信号量mutex来解决该问题)?
~over~