操作系统之进程间通信+线程同步

进程间通信,指的是进程之间信息交换,所交换的信息量少则是一个状态或树枝,多则成千上万个字节。

每个进程中访问临界资源的那段程序称为临界区临界资源是一次仅允许一个进程使用的共享资源)。

共分为4种

1、共享内存:共享内存就是映射一段能被其他进程所访问的内存。这段内存由一个进程创建,但多个进程可以访问。共享内存是最快放的IPC方式,它是针对其他进程间通信方式效率低锁创建的。它往往与其他的通信机制来配合使用。来实现进程间的同步通信。

 那么,共享内存这种方式为什么是最快的呢? 这是因为共享内存的整个通信过程对消息的复制只有两次。 1>.从数据来源复制到共享内存     2>.从共享内存复制到数据目的地。而管道、消息队列等方式对消息的复制需要四次,因为有缓冲区的存在,读写都要经过缓冲区。

2、管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,通常指父子进程关系。

      有名管道:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。

      无名管道:它是半双工的,即只能单向传输。 它是有进程关系限制的,只能在父子进程之间使用。

3、信号量:信号量是一个技术器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程的同步手段。

信号量只能进行两种操作:等待P和发送信号V,他们的行为是这样的:

P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

4、消息队列:消息队列是由消息的链表存放在内核并有消息队列标识符标识。消息队列克服了信号传递信息量少,管道只能承载无格式字节流以及缓冲区太小受限。

5、套接字: 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。

线程同步的几种方式:

1、互斥量(锁):互斥量有两种状态--解锁和加锁。当一个线程(或进程)需要访问临界区时,它调用互斥锁。如果该互斥量当前是解锁的(即临界区可用),此调用成功,调用线程可以自由进入该临界区。另一方面,如果该互斥量已经加锁,调用线程被阻塞,直到在临界区中的线程完成并调用互斥锁。如果多个线程被阻塞在该互斥量上,将随机选择一个线程并允许它获得锁。

2、信号量:它允许同一时刻多个线程访问同一资源,但是需要一个计数器来控制可以使用某共享资源的线程数目。

Semaphore类来进行信号量操作。

如果两个P/S操作顺序颠倒,会产生死锁。也就是说,使用信号量原语时,信号量操作的顺序至关重要。那么,有木有办法改变这种情况,可不可将信号量的这些组织工作交给一个专门的构造来负责,解放广大程序员?答案是管程。

管程(Monitor)即监视器的意思,它监视的就是进程或线程的同步操作。具体来说,管程就是一组子程序、变量和数据结构的组合。言下之意,把需要同步的代码用一个管程的构造框起来,即将需要保护的代码置于begin monitor和end monitor之间,即可获得同步保护,也就是任何时候只能有一个线程活跃在管程里面。

同步操作的保证是由编译器来执行的,编译器在看到begin monitor和end monitor时就知道其中的代码需要同步保护,在翻译成低级代码时就会将需要的操作系统原语加上,使得两个线程不能同时活跃在同一个管程内。提供了一个Monitor类,它可以帮我们实现互斥的效果。

在管程中使用两种同步机制:锁用来进行互斥,条件变量用来控制执行顺序。从某种意义上来说,管程就是锁+条件变量

条件变量就是线程可以在上面等待的东西,而另外一个线程则可以通过发送信号将在条件变量上的线程叫醒。因此,条件变量有点像信号量,但又不是信号量,因为不能对其进行up和down操作。

管程最大的问题就是对编译器的依赖,因为我们需要将编译器需要的同步原语加在管程的开始和结尾。此外,管程只能在单台计算机上发挥作用。

3、事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。

互斥量跟信号量的区别与联系:

1>.互斥量用于线程的互斥。 信号量用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

2>.互斥量值只能为0/1,信号量值可以为非负整数。也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。

互斥:是指某一资源同时只允许一个访问者对其进行访问。但互斥无法使访问者按照某种规则进行访问。

同步:线程之间的运行必须按照某种规定来执行,执行的次序依赖于要完成的特定的任务。

总结:同步是一种更为复杂的互斥,而互斥是一种特殊的同步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值