经典调度问题:读者优先/写者优先算法

文章目录

    • 算法介绍
    • 读者优先:
    • 写者优先:
    • 多线程编程注意事项
    • 写者优先算法流程图

算法介绍

创建一个包含n 个线程的控制台进程。用这n 个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者优先:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。
写者优先:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。

  • 首先要明白在多线程编程中的互斥关系: 读写互斥和写写互斥.两个优先方式都遵循这个出发点.
  • 在满足以上条件的情况下,进来的线程都好像是在排队,然后看当前谁优先.
  • 自己如果是优先的,那么可以直接插队.再考虑正在执行的是否和自己阻塞,如果正在执行的和自己阻塞,那自己也得排队,只不过排在前面.(类似写者优先的写写线程),如果正在执行的和自己不是阻塞的,那么自己就可以直接进去执行(读者优先的读读进程).
  • 如果自己不是优先的,那么自己只能老老实实的排队,就算自己前面有和自己不互斥的线程执行也不行.类似写者优先读线程在执行,新的写进程等待资源,更新的读线程只能等写进程释放,如果有新的写进程进来,还可以排在这个读线程前面.

读者优先:

读者就是优先的。假设a,b都是同时请求,但是a是读者那么a优先使用资源,还有一点很重要的就是读者优先的读者可以并行执行。而写着只能单线程执行。在执行过程中,只要阻塞的写者在等待过程中有新的读者进来那么他要等待所有读者完成才能自己释放自己。
经典调度问题:读者优先/写者优先算法_第1张图片

写者优先:

无疑所有写的操作是优先的,这个过程可能会产生大量阻塞,因为相对较快(本来可以并行的读者被大量阻塞)。如果资源中没有写者那么读者依然可以并行,但是一旦出现写者在等待读者资源,那么新的读者就不能在并行执行,要等待所有写者执行完毕才可执行读者。
经典调度问题:读者优先/写者优先算法_第2张图片

多线程编程注意事项

  1. 读者优先和写者优先是两个不同的策略方法,方法有相似之处但是也有很大不同,函数需要分开完成。
  2. 最主要的排序方式基于时间排序,次要的排序以读者还是写者谁优先为准则
  3. 读者优先或者写者优先的阻塞会导致线程开始时间的变化。而不过采用双队列一个存进入时间的排序,一个存结束时间的排序,修改其中的一个会影响另一个队列中元素值不错,但是如果不对另一个队列进行增/删是不会触发堆排序的功能(挺重要的)。
  4. 可能有些阻塞时候的等待时间和开始时间改变处理比较复杂,要考虑当前是读致使阻塞,还是写致使阻塞,还是前面有写的资源再等待致使阻塞。要用多个变量维系系统使得正确的更改线程的阻塞时间。

写者优先算法流程图

经典调度问题:读者优先/写者优先算法_第3张图片

你可能感兴趣的:(操作系统)