程序間通訊

2022-10-10 19:54:13 字數 1896 閱讀 7391

1.訊號量及管程的不足(只能傳遞少量資料)

2.不適用多處理器情況

1.訊息傳遞

1. send & receive原語

2.適用於分布式系統基於共享記憶體的多處理機系統,單處理機系統,可以解決程序間的同步,通訊問題

1.訊息傳遞

2.共享記憶體

3.管道

4.套接字

5.遠端過程呼叫

傳送程序s                        接收程序r

send(des,msg) -os訊息緩衝區-> receive(src,msg)

msg(text,size) msg(text,size)

1.send()陷入核心,核心複製訊息到訊息緩衝區

2.receivee()取出訊息入隊到pcb中訊息佇列

send(des,msg)

訊號量:

buf-empty 初值為n

buf-full 初值為0

mutex1 初值為1

mutex2 初值為1

1.物理記憶體內建立共享記憶體,將共享記憶體對映到各個程序中

2.讀過解決讀寫者問題,解決共享記憶體中程序寫入互斥問題

程序1 - 共享記憶體 - 程序2

1.利用乙個緩衝傳輸介質,--記憶體或檔案連線兩個相互通訊的程序

寫,傳送程序 -管道-> 讀接收程序

2.問題:

1.字元流方式寫入讀出

2.先進先出順序

3.管道通訊機制必須提供的協調能力

1.互斥,同步,判斷對方程序是否存在

unix

at&t bsd

system v ipc 基於套接字的ipc

linux ipc^|

posix ipc

linux繼承的ipc通訊機制

linux中使用者能夠通過api使用的程序同步機制:

管道,訊息佇列,共享佇列,訊號量,共享記憶體。

訊號,套接字

核心同步機制:原子操作,自旋鎖,讀寫鎖,訊號量,屏障

1.不可分割,在執行完之前不會被其他任務或事件中斷

2.常用於實現資源的引用計數

3.atomic_t

typedef struct atomic_t;

原子操作api包括:

atomic_read(atomic_t*v)

atomic_set(atomic_t*v,int i)

void atomic_add(int i, atomic_t*v)

int atomic_sub_and_test(int i,atomic_t*v)

void atomic_inc(atomic_t*v)

int auomic_add_return(int i,atomic_t*v)

atomic_t v = atomic_init[0];

atomic_set(&v,4)

atomic_add(2,&v)

atomic_inc(&v)

printk('%d\n',atomic_read(&v);

int atomic_dec_and_test(atomic_t*v)

1.一種同步機制(又稱柵欄,關卡)

2.用於對一組執行緒進行協調

3.應用場景

1.一組執行緒協同完成一項任務,需要所有執行緒都到達乙個匯合點後在一起向前推進

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...

程序間通訊

實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...

程序間通訊

最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...