面试题答案
一键面试计数器状态转换
- 初始状态:计数器初始值设为0,代表没有进程在进行写操作,且没有进程在等待写操作。
- 读操作状态:当有进程进行读操作时,计数器的值加1,表示有读进程正在访问共享内存。读操作并发执行,每增加一个读进程,计数器加1 。
- 写操作状态:当有进程请求写操作时,先检查计数器的值。若为0,直接将计数器设为 -1,表示正在进行写操作;若不为0,说明有读进程正在访问,写进程等待。当写操作完成,计数器设回0 。
各进程对计数器的操作逻辑
- 读进程:
- 进入读操作前,先原子性地增加计数器的值。
- 完成读操作后,原子性地减少计数器的值。
- 写进程:
- 进入写操作前,检查计数器的值。若为0,原子性地将计数器设为 -1 。若不为0,进入等待状态,直到计数器变为0 。
- 完成写操作后,原子性地将计数器设为0 。
处理读写冲突
- 读 - 写冲突:
- 写进程检查到计数器不为0(即有读进程正在访问共享内存)时,等待。读进程不会因写进程等待而受影响,继续并发执行读操作。只有当所有读进程完成读操作,计数器变为0时,写进程才能将计数器设为 -1 开始写操作。
- 写 - 写冲突:
- 由于写操作开始前会将计数器设为 -1 ,其他写进程检查计数器为 -1 时,会等待,从而保证写操作的独占性。