2011年12月15日 星期四

UNIX處理序間通訊(IPC)簡介


所謂處理序間通訊,顧名思義,就是在2個(多數情況下)或多個進程間傳遞資訊。方法大致如下幾種:
1,
(file),匿名管道(anonymous pipe),具名管道(named pipe),信號(signal).
2
System V IPC 包括訊息佇列(message queue),共用記憶體(shared memory),信號量(semaphore)。這種形式的ipc首先在UNIX分支system V中使用,現在多數unix系統都支援。
檔形式的IPC:

進程(process) A寫資訊到檔1,進程B讀檔1。檔的內容,由進程自己決定。
匿名管道:

command1 args1 | command2 args2.
最常見的例子:ls –l |more 由於管道操作由shell代替完成,沒有產生有名字的實體,所以稱為匿名管道。 Shell做的事情是調用pipe(),產生一個管道,然後把command1的輸出連接到管道的出入端,把command2的輸入連接到管道的輸出端。
具名管道

首先,建立一個特殊檔,mkfifo pipe1或者mknod fifo1 p
然後,就當作正常文件讀寫pipe1。例如: ls > fifo1 (寫入)。
while read a
do
echo $a
done (
讀出)
由於產生有名字的實體,所以被稱為具名管道。
信號:

單的用法: kill –USER2 pid,也就是通過kill()系統調用或者kill命令,發送信號到別的進程。各個進程對於信號的處理過程是自己定義的(除了9,也就是KILL是強制 的)。比如自己可以忽略HUP,TERMINT(control-C), 等。
訊息佇列(message queue)

息佇列,是一個佇列的結構,佇列裡面的內容由使用者進程自己定義。實際上,佇列裡面記錄的是指向使用者自訂結構的指標和結構的大小。要使用message queue,首先要通過系統調用(msgget)產生一個佇列,然後,進程可以用msgsnd發送消息到這個佇列,消息就是如上所說的結構。別的進程用 msgrcv讀取。訊息佇列一旦產生,除非明確的刪除(某個有許可權的進程或者用ipcrm命令)或者系統重啟。否則,產生的佇列會一直保留在系統中。而 且,只要有許可權,就可以對佇列進行操作。訊息佇列和管道很相似,實際上,管道就是使用者消息為1個位元組的佇列。
ipcs –aq
命令可以查看message queue的狀況:
Message Queues:
T ID KEY MODE OWNER GROUP CREATOR CGROUP CBYTES QNUM QBYTES LSPID LRPID STIME RTIME CTIME
q 256 0x417d0896 --rw------- root daemon root daemon 0 0 16384 97737 210466 14:31:14 14:31:14 9:52:53
其中:
T:
類型, q 表明這是個訊息佇列
ID:
用戶自己定義的,在調用msgget時傳送的參數。
Key:
系統返還的全域唯一的ID
Mode:
許可權,含義和文件許可權基本一致
Owner, group:
佇列建立者的名字和組
CREATOR, CGROUP
:佇列建立者和組的ID
CBYTES :
目前queue在佇列裡的位元組數
QNUM
目前queue在佇列裡的消息數
QBYTES:
佇列中消息最大允許位元組數
LSPID:
最後發送者PID
LRPID:
最後接受者PID
STIME:
最後發送時間
RTIME:
最後接受時間。.
CTIME:
建立或者最後修改的時間
共用記憶體(shared memory)

享記憶體是一段可以被多個進程共用的記憶體段。首先,用shmget系統調用產生指定大小的共用記憶體段,然後需要訪問此共用記憶體的進程調用shmat系統調 用,把這個記憶體段附加到自己的位址空間,然後就可以像訪問自己私有的記憶體一樣訪問這個記憶體段了。等到訪問完畢,用shmdt脫離。同message queue一樣,共用記憶體一旦產生,除非明確的刪除(某個有許可權的進程或者用ipcrm命令)或者系統重啟。否則,產生的共用記憶體會一直保留在系統中。而 且,只要有許可權,就可以對共用記憶體進行操作。共用記憶體的內容由進程自己定義。為了防止多個進程在同一時間寫同樣一段共用記憶體,一般程式會使用信號量來控制 對某一段位址的讀寫。
ipcs –am
命令可以查看share memory的狀況:
Shared Memory:
T ID KEY MODE OWNER GROUP CREATOR CGROUP NATTCH SEGSZ CPID LPID ATIME DTIME CTIME
m 258 0 --rw-r----- oracle dba oracle dba 12 8388608 106303 106329 16:28:54 16:48:36 16:28:49
T:
類型 m 表明這是個共用記憶體
ID:
用戶自己定義的,在調用shmget時傳送的參數。
Key:
系統返還的全域唯一的ID
Mode:
許可權,含義和文件許可權基本一致
Owner, group:
佇列建立者的名字和組
CREATOR, CGROUP
:佇列建立者和組的ID
NATTCH:
有幾個進程掛接(attach)在這段共用記憶體上
SEGSZ:
共用記憶體段大小(位元組)
CPID:
產生者PID
LPID:
最後掛接(attach)或者脫離(detach)PID
ATIME:
最後掛接(attach)時間
DTIME:
最後脫離(detach)時間。.
CTIME:
建立或者最後修改的時間
信號量(semaphore)

作業系統中,有些資源數量是有限的,在同一時間,只能由有限(一個或幾個)的進程使用和訪問。例如磁帶機,同一時間,只能由一個進程使用。這樣的資源被稱 為關鍵(critical)資源。信號量就是用來記錄關鍵資源的使用情況的。首先,利用系統調用semget產生一個信號量。當需要使用關鍵資源時,調用 semop,傳遞的參數為需要使用的資源的數量,例如2個,參數就為+2。如果這個資源有2個或者更多可用,進程就獲得了使用權,否則就必須等待,直到有 足夠的資源可用。當進程使用資源結束的時候,也用semop釋放關鍵資源。參數為需要釋放的數量,例如2,參數為-2。同message queue一樣,共信號量一旦產生,除非明確的刪除(某個有許可權的進程或者用ipcrm命令)或者系統重啟。否則,信號量會一直保留在系統中。而且,只要 有許可權,就可以對其進行操作。
ipcs –as
命令可以查看Semaphore的狀況:
Semaphores:
T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME
s 0 0x696e6974 --ra-r--r-- root system root system 8 9:52:53 9:59:30
T:
類型 s 表明這是個信號量
ID:
用戶自己定義的,在調用semget時傳送的參數。
Key:
系統返還的全域唯一的ID
Mode:
許可權,含義和文件許可權基本一致
Owner, group:
佇列建立者的名字和組
CREATOR, CGROUP
:佇列建立者和組的ID

沒有留言: