管道( pipe): 管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
命名管道(namedpipe): 命名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
信號量( semophore ): 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
消息隊列( messagequeue ): 消息隊列是消息的鏈表,存放在內核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
信號 ( sinal ): 信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經發生。
共享內存( sharedmemory): 共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量配合使用,來實現進程間的同步和通信。
套接字(socket ): 套接口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同主機間的進程通信。
內存映射(mapped memory): 內存映射允許任何多個進程間通信,每一個使用該機制的進程通過把一個共享的文件映射到自己的進程地址空間來實現它。
流水線、進程、線程分別從指令、處理器、進程三個層次,由低到高,實現我們迫切需要的并發處理
TASK_RUNNING: 進程當前正在運行,或者正在運行隊列中等待調度。
TASK_INTERRUPTIBLE: 進程處于睡眠狀態,正在等待某些事件發生。進程可以被信號中斷。接收到信號或被顯式的喚醒呼叫喚醒之后,進程將轉變為 TASK_RUNNING 狀態。
TASK_UNINTERRUPTIBLE: 此進程狀態類似于 TASK_INTERRUPTIBLE,只是它不會處理信號。中斷處于這種狀態的進程是不合適的,因為它可能正在完成某些重要的任務。 當它所等待的事件發生時,進程將被顯式的喚醒呼叫喚醒。
TASK_STOPPED: 進程已中止執行,它沒有運行,并且不能運行。接收到 SIGSTOP 和 SIGTSTP 等信號時,進程將進入這種狀態。接收到 SIGCONT 信號之后,進程將再次變得可運行。
TASK_TRACED: 正被調試程序等其他進程監控時,進程將進入這種狀態。
EXIT_ZOMBIE: 進程已終止,它正等待其父進程收集關于它的一些統計信息。
EXIT_DEAD: 最終狀態(正如其名)。將進程從系統中刪除時,它將進入此狀態,因為其父進程已經通過 wait4() 或 waitpid() 調用收集了所有統計信息。
TASK_KILLABLE: Linux? kernel 2.6.25 引入了這種進程狀態,用于將進程置為睡眠狀態,它可以替代有效但可能無法終止的 TASK_UNINTERRUPTIBLE 進程狀態,以及易于喚醒但更加安全的 TASK_INTERRUPTIBLE 進程狀態。
線程間無需特別的手段進行通信,因為線程間可以共享數據結構,也就是一個全局變量可以被兩個線程同時使用。不過要注意的是線程間需要做好同步,一般用互斥鎖(mutex)。linux的消息屬于IPC,也就是進程間通信,線程用不上。 linux用pthread_kill對線程發信號,singal中斷也很好用,用好信號量,共享資源就可以了。 在進程中共享的變量必須用關鍵字volatile來定義,為了保護變量,我們必須使用信號量、互斥等方法來保證我們對變量的正確使用。
互斥鎖 是一種信號量,常用來防止兩個進程或線程在同一時刻訪問相同的共享資源。可以保證以下三點: 原子性:把一個互斥量鎖定為一個原子操作,這意味著操作系統(或pthread函數庫)保證了如果一個線程鎖定了一個互斥量,沒有其他線程在同一時間可以成功鎖定這個互斥量。 唯一性:如果一個線程鎖定了一個互斥量,在它解除鎖定之前,沒有其他線程可以鎖定這個互斥量。 非繁忙等待:如果一個線程已經鎖定了一個互斥量,第二個線程又試圖去鎖定這個互斥量,則第二個線程將被掛起(不占用任何cpu資源),直到第一個線程解除對這個互斥量的鎖定為止,第二個線程則被喚醒并繼續執行,同時鎖定這個互斥量。 條件變量(與互斥鎖一起用) 信號量 線程私有數據() 線程私有數據采用了一種一鍵多值的技術,即一個鍵對應多個數值。訪問數據時都是通過鍵值來訪問,好像是對一個變量進行訪問,其實是在訪問不同的數據。
就緒:線程分配了CPU以外的全部資源,等待獲得CPU調度
執行:線程獲得CPU,正在執行
阻塞:線程由于發生I/O或者其他的操作導致無法繼續執行,就放棄處理機,轉入線程就緒隊列
掛起:由于終端請求,操作系統的要求等原因,導致掛起。
新聞熱點
疑難解答