前提:
信息量:线程间有序的进行工作
资源的个数
机制:描述可使用资源的个数
操作:
p操作:使用这个资源,表示资源个数减1
v操作:产生这个资源,表示资源个数加1
p操作逻辑:尝试获取资源,有资源可用,直接使用,资源减1,如果没有,继续等待
v操作逻辑:释放一个资源,如果此时有任务在等待这个资源
信号量的定义:sem_t sem 创造了一类资源
初始化:sem_init()
参数1:&sem 参数2:0,表示线程间的信号量 参数3:定义了几个类资源
信号量的pv操作:
函数:sem_wait()/ sem_post()
参数都为&sem;pv互相约束,一连贯的操作,相互补给
信号量的销毁:sem_destroy()
参数:&sem
信号量举例:
总结:共享进程资源方便
线程抢占公共资源带来的问题
1.互斥访问
需要互斥锁,来保障原子性操作
2.有顺序的进行访问
信号量机制:核心操作:pv
---------------------------------------------------------------------------------------------------------------------------------
进程间的通信:
进程创建好之后,父子进程的空间相互独立
通信的方式:
1.古老的通信方式:
管道:
无名管道 有名管道
信号
2.ipc对象通信
消息队列
共享内存(*重要)
信号量集
3.socket通信
网络通信(网络部分学习,不同主机之间的通信)
---------------------------------------------------------------------------------------------------------------------------------
管道:
无名管道:
函数 pipe(int pipefd[2])
功能:创建一个无名管道
参数:pipefd,用来获取管道的两端// 读端:pipefd[0] 写端: pipefd[1] 读端和写端都是固定的
返回值:成功返回0,失败错误码
管道的特点:
1.管道的大小:65536个字节,64k
2.管道的操作特点:
数据读完之后,就认为消失了
写端存在,读端也存在:管道如果为空,此时就可以一直写,直到写满
写端存在,读端不存在:写操作会导致管道破裂,收到信号SIGPIPE,这个信号会使得程序结束
写端存在,读管道:可以读管道,但是管道中如果没有数据,此时读操作阻塞
写端不存在,读管道:可以读管道,如果管道中没数据,此时读操作,不阻塞