我们刚才说的匿名&命名管道,共享内存,消息队列都是以传输数据为目的,但是信号量是通过共享资源的方式来达到多个进程的同步和互斥
信号量本质是一个计数器,用来衡量临界资源中的资源数目
信号量本质是对临界资源内部的资源数目的统计,更重要的是操作系统给我们提供一种对临界资源的预定机制,而信号量本身要被预定,所有进程要访问临界资源,得先申请信号量,就意味着所有进程要先看到信号量,所以信号量本身就是一个临界资源, 信号量常见的V操作和P操作必须保证原子性
什么是临界资源
1)能被多个执行流同时访问的资源都是临界资源,比如,显示器文件、进程间通信的时候:管道、共享内存、消息队列都是临界资源
因为进程间通信需要引入能被多个进程看到的资源,但这也同时带来了临界资源的数据不安全的问题,信号量是用来保护临界资源的,前提是每个人得先看到信号量,因此信号量本身就是临界资源
问:父子进程定义一个全局变量,这个全局变量是不是父子的临界资源
不是!因为会发生写时拷贝,访问的不是同一个全局变量
那谁保护信号量呢?
就是通过PV操作保证原子性, P操作:申请信号量 V操作:释放信号量
什么是临界区
进程代码有很多,其中用来访问临界资源的代码叫做临界区
什么是原子性
一件事要么不做,要么就做完,没有中间态
什么是互斥
任意一个时刻,只能允许一个执行流进入临界资源 执行它的临界区
1)由于进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系叫做进程互斥
2)系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源
3)在进程中涉及到临界资源的程序段叫临界区
4)IPC资源必须删除,否则不会自动删除,因为system V IPC的生命周期随内核
在系统当中也为信号量维护了相关的内核数据结构, 先描述再组织!

通过对system V系列进程间通信的学习,可以发现共享内存、消息队列以及信号量,虽然它们内部的属性差别很大
但是维护它们的数据结构的第一个成员却是一样的 -> 都是ipc_perm类型的成员变量

这样设计的好处就是:在操作系统内可以定义一个struct ipc_perm类型的数组,此时每当我们申请一个IPC资源,就在该数组当中开辟一个这样的空间,在内核中, 所有的 ipc 资源都是通过数组组织起来的,所以所有的Syetem V表中的IPC资源的结构体的第一个成员都是ipc_perm
换句话说:在内核当中只需要将所有的IPC资源的ipc_perm成员组织成数组的样子,然后用切片的方式获取到该IPC资源的起始地址,然后就可以访问该IPC资源的每一个成员了