信号量(资源的个数)
信号量的机制:
1.信号量 ——来描述可使用资源的个数
2.P操作
表示使用这个资源, 资源个数减一
P操作逻辑:尝试获取资源,有资源可用时直接使用,资源个数减一,
没有资源可用时,等待。
3.V操作
表示产生这个资源,资源个数加一
V操作逻辑:释放一个资源,然后检查是否有等待该信号量的进程。如果有等待进程,那么从 等待队列中唤醒一个或多个进程,具体唤醒的数量取决于信号量的设置和等待队 列的情况。
信号量的分类:
1、信号无名量 ——>线程间通信
2、有名信号量——>进程间通信
框架:
1.信号量的定义:sem_t sem //造了一类资源
2.信号量的初始化:sem_init
3.信号量的PV操作(核心):sem_wait()/ sem_post()
4.信号量的销毁:sem_destroy
semaphore
信号量的定义 :
sem t 信号量的类型
sem 信号量的变量
例如:sem_t sem_1;
通信的方式:
同一主机
1、古老的通信方式
管道: 无名管道——(1)
有名管道——(2)
信号 ——(3)
2、IPC对象通信 system v BSD suse fedora kernel.org
消息队列——(4)
共享内存(*)——(5)//最高效
信号量集()——(6)
3、socket通信
网络通信——(7)
管道:
无名管道
int pipe(int pipefd[2]);
功能:
创建一个管道参数:
pipefd :用来获取 管道的两端 (读端pipefd[0] / 写端pipefd[1])
返回值:
成功 0
失败 -1 && errno
管道的特点:
1.管道大小:65536字节,即64k
2.管道操作特点:
读走数据之后,认为数据没了;
1.读端存在,写管道
管道空:可以写数据
管道满:会造成-->写阻塞
2.读端不存在,写管道
系统会给进程发一个信号SIGPIPE(管道破裂)
3.写端存在,读管道
管道空,读不到数据这时会造成读操作阻塞
4.写端不存在,读管道
如果管道中有数据,则读取这些数据!
如果没有数据,读操作不阻塞,立即返回!