进程同步之生产者消费者问题

文章目录

  • 生产者消费者问题
    • 如何避免——竞争条件
      • peterson solution
      • 硬件可以控制中断(关中断)
  • 信号量(semaphore)
    • wait() and signal () 即 P() and V()
    • 技术信号量
    • 二进制信号量
  • 读者-写者问题
    • 1
  • 哲学家就餐问题
  • 管程(monitor)

核心问题:当多线程多进程的编程时,只要有共享的数据(内存)被访问,数据就有可能被破坏。

生产者消费者问题

生产者往缓冲区写数据,消费者读数据,缓冲区有限制,一个只能读,一个只能写,且速度不一样。
进程同步之生产者消费者问题_第1张图片
count记录现在缓冲区的数据,这是两个进程中共享的变量,缓冲区最多可放BUFFER_SIZE个数据。
对于生产者而言,当count的数量和最大值相等时不做任何事,count一开始是0。
对于消费者而言,当count的数量和0相等时不做任何事。
进程同步之生产者消费者问题_第2张图片
进程同步之生产者消费者问题_第3张图片

count ++ 的汇编执行过程(3条指令)
先把内存中的值读入寄存器,寄存器执行+1,然后写回去=count。
多进程同时运行,发生切换时的这个点有规律吗?随时都有可能。切换的触发由中断引起,指令执行完才会触发中断(切换)。

蓝色是count++,红色是count–执行过程。当第一次count执行++时,在寄存器一+1指令完成后,要发生count–指令,此时的count还没来得及+1,就把初始值5给力寄存器二。
进程同步之生产者消费者问题_第4张图片

如何避免——竞争条件

两进程同时读不会破坏共享数据,写的时候会破坏。
临界区的保护:任意时刻不会有两个以上进程在临界区对数据操作。保护临界区常见的措施是锁,一个进程进去之后上锁,另一进程只有等锁解开了才能进入临界区。
如何加锁变量lock是共享资源
满足三个条件
1.互斥条件
2.进程
3.有限等待任何一个进程不能是个饿死进程

peterson solution

前提:两进程 /load,store 原子操作(指令不能发生中断)
i进程=true向进入临界区,如果j=false不想进入临界区,则不成立,所以j就进入临界区了。
j=true想进入临界区,turn=j就等,这是个stroe指令,一定是先后发生。
两进程间的来回切换
进程同步之生产者消费者问题_第5张图片

硬件可以控制中断(关中断)

缺点:
1.开关中断间的时间要短,太长数据丢失。
2.应用程序不能开关中断
3.多处理器系统麻烦

原子硬件指令TESTANDSET汇编
对内存单元执行时 ,对内存单元的值取出来,赋值true,最后把之前的值返回。
进程同步之生产者消费者问题_第6张图片
一个进程执行,lock=false,while(false)肯定不执行了,然后就进入了临界区,然后因为执行了TestandSet指令lock=true。另一个进程进入执行代码,现在while(TestAndSet)返回的是true,然后就一直循环等待且写true。在临界区的进程工作完后,lock=false,while(false)肯定不执行了,这样另一个进程就可以开始进入临界区了。
进程同步之生产者消费者问题_第7张图片
把函数作成一个系统调用就可以实现。

信号量(semaphore)

本身就是一个整数

wait() and signal () 即 P() and V()

整个操作是个原子操作,mutex好像锁的状态。
进程同步之生产者消费者问题_第8张图片
进程同步之生产者消费者问题_第9张图片

技术信号量

通过控制mutex值来控制进入临界区的个数

二进制信号量

互斥锁,mutex=1
避免忙等
进程同步之生产者消费者问题_第10张图片
每一个设备设置一个链表,等待的进程链在一起
需要两个系统调用:
block(阻塞)和wakeup(唤醒)
进程同步之生产者消费者问题_第11张图片
wait()先减再去等,value=1,–,value=0,当前进程进入临界区。如果下一个进程的value小于0,就把当前进程加入队列里,进程就阻塞了。
Signal()解锁,value++,<=0说明有其他进程等信号量,就唤醒一个进程。

重新回到生产者消费者问题
生产者:mutex是锁,保护这两个进程的共享资源访问;
wait(empty):一开始empty是n,empty-1,生产者生产数据往里面放了一个,如果好多生产者往里放数据,n+1个数量时就会阻塞,因为没有空位了 。多个生产者访问buffer时不会出现两个同时向一个格子里写数据的情况。
signal(full),代表有多少个各自是满的。
进程同步之生产者消费者问题_第12张图片
消费者:只有生产者signal(full)才会唤醒
进程同步之生产者消费者问题_第13张图片

读者-写者问题

1

帖子在修改时,有很多人在读,那么读的内容是修改的还是原来没修改的。
同一时间只有一个写操作,写者获得了wrt锁,就能进行写操作
进程同步之生产者消费者问题_第14张图片
读者
读者获得了mutex互斥信号量,对readcount起保护作用,就能进入临界区。来一个读者,对readcount++,读完了readcount–。readercount=1,第一个读者读时,wait(wrt)把写者拒之门外,再有读者过来,继续读;读完后readcount–,=0时释放wrt。相当于图书馆有两扇门,一个是读者门,一个是写者门,第一个读者进来后,把写者们关了,然后一个个的读者进来了,最后一个读者离开的时候再把写者门开了。
问题:只要读者不出来,写者永远不能写。
进程同步之生产者消费者问题_第15张图片
文件系统和数据库都需要用到这个问题,对数据的访问,指针指向来进行读,新来的数据不直接写,而是新开一块空间,更新完毕后改指针,再回收原来的空间

哲学家就餐问题

哲学家一生只做吃饭和思考两件事。五个哲学家,五根筷子
进程同步之生产者消费者问题_第16张图片

进程同步之生产者消费者问题_第17张图片

管程(monitor)

更高阶的对临界区进行保护的方法,实现于语言层面,把进程放到管子里。给函数加关键字,就不能同时又多个进程线程进入函数执行,

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