通過命名管道隊共享內存的數據發送進行保護的bug:
命名管道掛掉后,進程也掛掉了。
6.systemV消息隊列
原理:進程間IPC:原理->看到同一份資源->維護成為一個隊列。
過程:
進程A,進程B進行通信。
讓操作系統提供一個隊列結構,A數據放在隊列結點,把結點放在OS內部,B也這么干
消息隊列可以實現雙向通信進程A放數據,還要放type,
進程A那數據,只拿type和自己不一樣的數據。來區分自己和別的數據結論:
結論1:消息隊列,提供了一種進程給另一種進程發送有類型數據塊的方式。區分那個數據是我要的,那個數據是我發的。
方法:入隊列,出隊列,
結論2:消息隊列存在多個,OS要對消息隊列進行管理->先描述,再組織。
::
消息隊列的結構體:
struct msgid_ds
{
}消息隊列
struct node{
}結點。
結論3:兩個進程怎么保證自己看到是同一個消息隊列,兩個進程約定一個key,再把key放在消息隊列里面。跟共享內存一樣。
消息隊列的調用接口:
msgget:創建消息隊列
?? ?key_t key ? ?:
?? ?int msgflag:
跟共享內存是一樣的。
msgctl:刪除消息隊列
消息隊列:結構體
消息隊列結構體:
struct msgid_ds{
stryct ipc_prem sg perm}
perm信息
struct perm
{
?? ?key_t key
}
跟共享內存的創建基本是保持一致的,除了需要type進行區別
msgsnd:發數據msgrcv:收數據,msgtype!!!
三種ipc通信
ipcs -q:就看消息隊列
下面那個是刪除?
?msgsize():msgdata的大小,type必須大于0
---------------------------------------------------------------------------------------------------------------------------------
這種相似性,叫做system V標準。?
---------------------------------------------------------------------------------------------------------------------------------
7.system V信號量
為什么要信號量
解決保護機制引入->信號量?
基本概念
? 多個執?流(進程),能看到的同?份公共資源:共享資源
? 被保護起來的資源叫做臨界資源
? 保護的?式常?:互斥與同步
? 任何時刻,只允許?個執?流訪問資源,叫做互斥
? 多個執?流,訪問臨界資源的時候,具有?定的順序性,叫做同步
? 系統中某些資源?次只允許?個進程使?,稱這樣的資源為臨界資源或互斥資源。
? 在進程中涉及到互斥資源的程序段叫臨界區。你寫的代碼=訪問臨界資源的代碼(臨界區)+不訪問 臨界資源的代碼(?臨界區)
? 所謂的對共享資源進?保護,本質是對訪問共享資源的代碼進?保護
互斥:
怎么保護:只允許一個執行流訪問資源->互斥
?保護臨界區的一種手段
!!!!!!!!!!!!!!
多個執行流,訪問臨界資源的時候,具有一定的順序性,叫做同步。->一個人訪問完后,通知下一個人繼續訪問,保證臨界區的安全。
原子性:要么做,要么就不做
申請資源,申請鎖。
訪問資源,鎖是要共享的誰來保證鎖的安全->申請鎖的時候,就需要原子性的概念了。
7-2信號量
1.信號量是什么?
本質是一個計數器,用來表示,臨街資源中,資源的數量是多少。
2.理解信號量?
電影院就是共享內存,把共享內存按照不同的區域,部分使用,
1.不要訪問同一個位置
2.不要放過多的進程進來信號量本質是個計數器,表述的是臨界資源中,資源數量的多少
所有進程,訪問臨界資源中的一小塊,就修現申請信號量
進程訪問資源前,現申請信號量,本質是:對資源的預定機制
過程:進程訪問資源,先對信號量進行申請,申請后,信號量--,如果信號量為0,那么就不會給你
?
細節1:信號領本身就是共享資源
申請 -- ,原子性--> p操作sem ++,原子性-->v操作,歸還資源
細節2:
信號量只有1或者0的兩態的信號量叫做二元信號量。--->這就是互斥
二元信號量的本質就是互斥?
3.共享資源使用的問題
信號量和通信有什么關系???
1.先訪問信號量P,每個進程都得先看到同一個信號量!!
system V可以解決這個問題
2.不是傳遞數據,是通信IPC,通知,同步互斥,也算
傳遞控制信息
?4.信號量接口
1.創建信號量:
semeget:
key:
nsems:信號量的個數
semflag:權限返回值:信號量級別的返回值semid
?
2.查看信號量資源:
ipc -s:
semid:返回值
ower:誰創建的
perms:權限
nsem:數量
?
3.刪除信號量:
?
4.對信號量進行操作
semopsembuf:結構體
sem_op:操作P/V
flg:暫時不管
?
5.初始化信號量:
cmd->SETVAL
細節信號量的初始值是多少???
semctl:還
對信號量新進參數初始化。setval:設計在信號量集中第幾個信號量的值
senum:信號量集里面信號量的下標
...:可變參數,可傳入結構體semun
senum = 0,cmd = SETCAL,對信號量集中下標為0的用“...”指向的結構體進行初始化
查看信號量ipc -s
OS內部存在大量的信號量集
操作系統也要對信號量進行掛歷->先描述在,在組織。
信號量結構體:
struct ipc_perm_sem_permipc_perm:第一個資源都是key
struct XXXid_ds的結構!!! - >key!