操作系统(五)

并发与同步

进程互斥

  • 进程互斥的解决的办法
  1. 由竞争双方平等协商
  2. 引入进程管理者
  • 资源共享的程度分为三个层次:互斥、死锁、饥饿

  • 临界资源的访问过程:进入区、临界区、退出区、剩余区

进程同步机制应遵循的原则

  1. 空闲让进
  2. 忙则等待
  3. 优先等待
  4. 让权等待

进程互斥的硬件方法
1.TS指令 2. Swap指令 3.信 量(软件方法)

进程之间通信的方式

  1. 共享文件
  2. 消息机制
  3. 通过共享文件

同步

注意事项:

  • 无论多个线程的指令序列怎样交替执行,程序都必须正常工作
    -> 多线程程序具有不确定性和不可重现的特点
    -> 不经过专门设计,调试难度很高
  • 不确定性要求并行程序的正确性
    -> 先思考清楚问题,把程序的行为设计清楚
    -> 切忌急于着手编写代码,碰到问题再调试

信 量和管程

为什么需要信 量

  • 回顾一下lock能解决并发问题中竞争条件(竞态条件)对资源的争夺;
  • 但是lock不能解决同步问题,需要更高级的方式实现同步(包括多线程共享公共数据的协调执行;互斥与条件同步的实现(互斥是指同一时间只能有一个线程可以执行临界区));
    • 信 量初始值设置为1,一个线程开头信 量减一锁上,完事后加一解锁;想一想,如果别的线程也想执行,当他执行P操作的时候,信 量为负数了,此时其它的线程就不得不等待,等到当前线程执行完后V操作了,另一个线程才能执行。
    用二进制信 量实现线程同步(调度约束)

    P()等待,V()发出信 。

生产者-消费者模型的正确性要求

->在任何一个时间只能有一个线程操作缓冲区(互斥);
->当缓冲区为空时,消费者必须等待(调度/同步约束);
->当缓冲区满了时,生产者必须等待(调度/同步约束);

生产者-消费者模型实现策略

->利用一个二进制信 量实现互斥,也就是锁的功能;
->用一个计数信 量fullbuffers来约束生产者;
->用一个计数信 量emptybuffers来约束消费者;

信 量的用途:互斥和条件同步(注意等待的条件是独立的互斥);
信 量的缺点:读/开发代码困难;容易出错(使用的信 量被另一个线程占用,完了释放信 量);不能够处理死锁;

管程monitor

  • release()因为当前线程在睡眠,就必须把锁打开一下,以便就绪状态的线程去执行,如果不release可能会造成死锁;
  • schedule()的意思是,当前线程在wait()了,在队列里睡眠了,此时就需要选择一个就绪态的线程去执行;
  • 就绪态的线程执行完毕后就可以再上锁。
    (2)signal():
  • 如果等待队列中有元素,那么就把队列的头元素取出来(并删掉)并唤醒wakeup,此时这个线程就是就绪状态了,它的下一步操作就是wait()里的schedule(),执行这个线程。
    • 基本的硬件操作(禁用中断/原子指令/原子操作)是高层抽象(信 量/锁/条件变量)的基础,采取不同的高层抽象的算法策略,可以实现临界区和管程等不同的并发编程策略。

    读者写者问题

    • 目的:共享数据的访问;

    使用者类型
    -> 读者(不需要修改数据);
    -> 写者(读取和修改数据)。

    问题的约束
    -> 允许同一时间有多个读者,但是任何时间只能有一饿写者;
    -> 当没有写者时,读者才可以访问数据;
    -> 当没有读者和其他写者时,写者才能访问数据;
    -> 在任何时候只能有一个线程可以操作共享变量。

    共享数据包括
    -> 数据集;
    -> 信 量CountMutex(初始值为1,约束读者);
    -> 信 量WriteMutex(初始值为1,约束写者);
    -> 读者数量Rcount(整数,初始值为1)。

    基于信 量的读者优先

    你知道的越多,你不知道的越多。
    有道无术,术尚可求,有术无道,止于术。
    如有其它问题,欢迎大家留言,我们一起讨论,一起学习,一起进步

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2020年1月2日
    下一篇 2020年1月2日

    相关推荐