操作系统之多线程资源竞争篇

通过上一篇文章操作系统之进程线程篇,我们知道,线程共享进程的资源,当一个进程中有多个线程且同时访问共享资源时,如果不采取有效的措施,则会造成共享数据的混乱。那么,我们如何解决多个线程对资源的竞争?操作系统通过互斥同步两种方法来实现。

互斥

概念:对于临界资源区,同一时刻只能有一个线程来访问,其他线程被阻止进入临界资源区。

同步

概念:并发线程在一些关键点上可能需要互相等待与互通消息,这种相互等待与互通消息称为线程同步。

那么问题来了,操作系统是如何实现互斥与同步的?

主要的方法有2种:信号量其中,锁和信号量都能实现线程间的互斥,而信号量的功能更加强大,不但能实现线程间的互斥,还能实现进程间的同步。

锁:

  我们对想进入临界资源区的线程,必须先执行加锁操作,若加锁操作顺利通过,则进入临界资源区,在完成对临界资源区的访问后进行解锁,释放临界资源。

锁的分类:

  忙等待锁:也称为自旋锁,这是最简单的一种锁,当线程获取不到锁时,线程就会一直while循环,不做任何事情。

  无等待锁:获取不到锁时,不用自旋,把当前线程放到锁的等待队列,执行调度程序,把CPU让给其他线程执行。

信号量:

  信号量是操作系统提供的一种协调共享资源访问的方法,我们通常用信号量表示资源的数量,对应的变量是一个整型(sem)变量。此外,用P操作和V操作来控制信号量。

  P操作:将sem减1,相减后,如果sem<0,则线程进入阻塞等待,否则继续,表明P操作可能会阻塞。

  V操作:将sem加1,相加后,如果sem<=0,唤醒一个等待的线程,表明V操作不会阻塞。

  P操作是用在进入临界区之前,V操作是用在离开临界区之后,P、V操作必须成对出现。

那么信号量是如何实现临界区互斥访问?

  共享资源设置一个互斥信号量s初值为1,表示该临界资源未被占用。

  当一个线程要进入临界区时,必须先对互斥信号量进行P操作,执行P操作之后s的值变为0,表示临界资源空闲,可分配给该线程。此时第二个线程想要进入临界区,也应该先执行P操作s值为-1,意味着临界资源已被占用,第二个线程被阻塞。直到第一个线程释放临界资源执行V操作s值为0,才唤醒第二个线程并进入临界区,等完成访问并执行V操作,此时s值为1。

  对于两个并发线程,互斥信号量的取值有1,0,-1三个值,分别表示:

    如果互斥信号量为1,表示没有线程进入临界区。

    如果互斥信号量为0,表示有一个线程进入临界区。

    如果互斥信号量为-1,表示有一个线程进入临界区,另一个线程等待进入。

那么信号量是如何实现事件同步?  

  

 

生产者-消费者问题:

描述:生产者生产数据后放在缓冲区中,消费者从缓冲区取出数据处理,任何时刻,只能有一个生产者和消费者可以访问缓冲区。

分析:

  任何时刻只能有一个线程访问缓冲区,需要互斥

  缓冲区空时,消费者必须等待生产者生成数据,缓冲区满时,生产者必须等待消费者从缓冲区取出数据,说明生产者和消费者需要同步。

 


 

哲学家就餐问题(经典同步问题):

问题描述:有五个哲学家,他们的生活方式是交替地进行思考和进餐。他们共用一张圆桌,分别坐在五张椅子上。在圆桌上有五个碗和五支叉子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的叉子,只有在他拿到两支叉子时才能进餐。进餐完毕,放下叉子又继续思考。

方案一:当哲学家饿了就去拿叉子,有叉子直接用,没有叉子就等待其他哲学家放回叉子。

缺点:极限情况下,5位哲学家同时拿起了左边的叉子,桌子上没有叉子了,同时也没有人能够拿到他们右边的叉子,就会导致了死锁的发生。

方案二:让哲学家们顺序进餐,每次进餐只能有一个哲学家,其他哲学家都不能动,只有这位哲学家吃完,才能轮到下一个哲学家进餐。

缺点:5把叉子理论上可以有两个哲学家同时进餐,从效率上讲,这不是最好的解决方案。

方案三:让偶数编号的哲学家先拿左边的叉子再拿右边的叉子,奇数编号的哲学家先拿右边的叉子后拿左边的叉子。这样不会出现死锁,且两个哲学家可以同时就餐。

方案四:用一个记录每一位哲学家在进餐、思考还是饥饿状态(试图拿起叉子),当一个哲学家只有在两个邻居都没有进餐时,才可以进入进餐状态。这样也不会出现死锁,也可以使两个哲学家同时进餐。


 

读者-写者问题(数据库访问模型):

描述:读-读:同一时刻,允许多个读者同时读。

   读-写:没有写者时才能读,没有读者时写者才能写。

   写-写:没有其他写者时,写者才能写。

策略:

  读者、写者优先级相同。

  写者、读者互斥访问。

  只能一个写者访问临界区。

  可以有多个读者同时访问临界区。

posted @ 2020-10-12 17:18  zzzgzx  阅读(653)  评论(0编辑  收藏  举报