进程间通信方式,线程间同步

进程的用户空间是相互独立的,一般是不能相互访问的,进程间通信讲的就是怎样在两个程序之间传递信息。

常用的通信方式有:

pipe 管道,FIFO,共享内存,消息队列queue, signal 信号, socket

pipe:只用于父子进程之间,如 ls |wc -w  相当于父亲可以直接说给儿子听

FIFO: 进程间不需要存在父子关系,相当于多个管道,可以多个写一个读,数据一旦被读出就没有了。

queue:是一个先进先出的队列,从内核分配,每个队列都有一个相应的ID。相当于邮筒,每个人都可以往邮筒里放信,邮差负责分发。

signal: 通过信号来告知系统中发生了某种预先规定好的事件,一个键盘中断或者一个错误条件,收到信号的进程可以对此事件进行相应的处理。相当于古代传递信号的烽火

share memory: 通常由一个进程创建,其余进程对这块内存区进行读写。相当于一个小黑板,大家都可以用它来传递信息,但是存在同步的问题。

    需要用信号量(Semaphore)进行控制,给它一个最大的访问值N,每有一个进程使用就减一,当值为负数时,所有的进程都要等待,直到有进程释放资源。

socket,使用socket把数据从一个进程发送到另一个进程

现在使用最多的分布式进程间通信,如大家在互联网上互通消息都属于进程间通信。

 

线程间同步

同一进程下的多个线程可以共享空间资源,多线程间就存在同步的问题。

互斥mutex: 保证只有一个线程访问资源

临界区Critical section:保证在某一个时间只有一个线程可以访问数据的方法,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其它的线程需要等待,直到该线程释放临界区对象为止。

信号量Semaphore: 用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源。

 

 

mutex VS Semaphore

Mutex 含义为互斥体,这个词是Mutual Exclude的缩写,它在计算机中是互斥也就是排他持有的一种方式,和信号量Semaphore有可以对比之处,有人做过如下类比:Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个,一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore,一般的用法是,用于限制对于某一资源的同时访问。


对于Binary semaphore与Mutex,这两者之间就存在了很多相似之处:
在有的系统中Binary semaphore与Mutex是没有差异的。在有的系统上,主要的差异是mutex一定要由获得锁的进程来释放。而semaphore可以由其它进程释放(这时的semaphore实际就是个原子的变量,大家可以加或减),因此semaphore可以用于进程间同步。Semaphore的同步功能是所有系统都支持的,而Mutex能否由其他进程释放则未定,因此建议mutex只用于保护critical section。而semaphore则用于保护某变量,或者同步。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值