system V的进程间通信除了共享内存,还有消息队列和信号量
IPC(进程间通信的简称)
消息队列
消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法
每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值
特性方面
IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核
总之消息队列比较落伍,就是简单提一下
来看一下信号量
信号量
要了解信号量是什么首先我们要了解什么是临界资源
临界资源
能被多个执行流(进程、线程或协程)同时访问的资源就是临界资源,简单理解就是可能会被争抢的资源就是临界资源;例如多进程启动后,同时向显示器打印,显示器就是临界资源。
在进行进程间通信的时候,管道、共享内存、消息队列都是临界资源,那么应该新的问题产生了:临界资源你能用,我能用,但是大家不能一起用(当然了)
所以我们就要进行临界资源的互斥使用,这种进程竞争使用这些资源的关系称为互斥
互斥
互斥:任何时刻只有一个执行流在访问共享资源
在进程中涉及到互斥资源的程序段叫临界区
举个例子,client.c的这部分和server.c的这部分是他们之间的临界区:
client.c:

server.c:

或者多个进程访问显示器的时候,显示器是临界i这样,进程中只有printf区域在访问显示器,printf就叫临界区
深入理解信号量
比如说你要看陶吉吉的演唱会,买到票那么这个座位就是你的;妹买到就不是你的
演唱会的座位票就是临界资源,买票的本质就是对临界资源的预定机制
假如你是米团狗眼的后端程序员,那么你肯定要保证卖出的票不能比座位多吧
所以只能在有票的时候,票才可以被卖,没票的时候,就不能被卖(听上去像废话)
你怎么知道票还有没有?此时就需要引入信号量来维护票的数量,每有一个人买票count--,每有一个人退票count++,但是count本身也是应该临界资源(因为买票和退票判断两端都要看见count是不是>0),count也是临界资源,临界资源怎么保护临界资源?
count多一个就++,少一个就--;如果我们的信号量也是临界资源,那么我们必须保证对count的++和--得是安全的(不会出现负数的情况),怎么保证安全?保证对信号量的操作是原子性的
什么是原子性?
没有中间过程,只有1和0:一件事要么彻底不做,要么就做完
非原子性:做某件事情的时候有中间过程就叫非原子性

我们的count在++和--的时候是不是原子性的呢?

我们的count++和--的时候,要有一个从内存读到CPU的动作,所以本身不是原子性的

还有一个问题,既然我们的信号量可以做++和--,那么他是不是也得被两边看到才能进行对应的++和--?
所以他也得像我之前学的共享内存和管道一样,被两个或多个进程看见
这个信号量他不能做全局变量,因为全局变量不能被多个进程看见
所以一个优秀的信号量应该保证自己的安全(原子性)+可以被别的进程看见
我们的信号量就可以解决生产者-消费者、读-写这种的互斥问题
什么是同步?
这里的同步并不是传统意义的同

最低0.47元/天 解锁文章
427

被折叠的 条评论
为什么被折叠?



