进程和线程的通信方式

进程间通信

1、同步机制遵循的原则

① 空闲让进;

② 忙则等待(保证对临界区的互斥访问);

③ 有限等待(有限代表有限的时间,避免死等);

④ 让权等待,(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)。

 

2、通信方式:

① 管道/匿名管道:存在于内存中的文件,用于具有亲缘关系的父子进程间或者兄弟进程之间的通信

② 命名管道:存在于实际的磁盘介质或者文件系统,解决只能亲缘关系间进程通信的问题,可以实现本机的任务两个进程通信,严格遵循先进先出规则

③ 消息队列:消息队列是内核中存储消息的链表,它由消息队列标识符进行标识,这种方式能够在不同的进程之间提供全双工的通信连接。

  管道和消息队列的通信数据都是先进先出的原则,与管道不同的是消息队列存放在内核中,只有在内核重启(即操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。

  消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。

  消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺点

④ 信号量:信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件

⑤ 共享内存:使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式

 

线程间同步方式

① 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制

② 信号量(Semphares):它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量

③ 事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较

 

临界区

临界区不仅针对线程,同样针对进程,临界区同步的一些实现方式:

1、锁

使⽤加锁操作和解锁操作可以解决并发线程/进程的互斥问题。

任何想进⼊临界区的线程,必须先执⾏加锁操作。若加锁操作顺利通过,则线程可进⼊临界区;在完成对临界资源的访问后再执⾏解锁操作,以释放该临界资源。

加锁和解锁锁住的是什么呢?可以是临界区对象,也可以只是一个简单的互斥量,例如互斥量是0无锁,1表示加锁。

根据锁的实现不同,可以分为忙等待锁和和⽆忙等待锁:

忙等待锁和就是加锁失败的线程,会不断尝试获取锁,也被称为自旋锁,它会一直占用CPU。

⽆忙等待锁就是加锁失败的线程,会进入阻塞状态,放弃CPU,等待被调度

2、信号量

信号量是操作系统提供的⼀种协调共享资源访问的⽅法。

通常信号量表示资源的数量,对应的变量是⼀个整型( sem )变量。

另外,还有两个原⼦操作的系统调⽤函数来控制信号量的,分别是:p 和 v

P 操作是⽤在进⼊临界区之前,V 操作是⽤在离开临界区之后,这两个操作是必须成对出现的。

posted @ 2022-05-11 13:22  蚂蚁力量  阅读(442)  评论(0编辑  收藏  举报