IT面試題:進程間的通信方式有哪幾種_第1頁
IT面試題:進程間的通信方式有哪幾種_第2頁
IT面試題:進程間的通信方式有哪幾種_第3頁
IT面試題:進程間的通信方式有哪幾種_第4頁
IT面試題:進程間的通信方式有哪幾種_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、進程間的通信方式,其實我們一直在用它,但是我們都不會去注意它。如果碰到面試官 問你知道多少種進程間的通信方式,估計很多人都會有點懵。今天我們就來總結下進程間的 通信方式有哪些。進程間通信的7種方式:1、管道/匿名管道(管道)管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道。只能用于父子進程或者兄弟進程之間(具有親緣關系的進程);單獨構成一種獨立的文件系統:管道對于管道兩端的進程而言,就是一個文件,但它不 是普通的文件,它不屬于某種文件系統,而是自立門戶,單獨構成一種文件系統,并且只存 在與內存中。數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出寫入的內

2、容每 次都添加在管道緩沖區的末尾,并且每次都是從緩沖區的頭部讀出數據。(1)管道的實質:管道的實質是一個內核緩沖區,進程以先進先出的方式從緩沖區存取數據,管道一端的 進程順序的將數據寫入緩沖區,另一端的進程則順序的讀出數據。該緩沖區可以看做是一個循環隊列,讀和寫的位置都是自動增長的,不能隨意改變,一 個數據只能被讀一次,讀出來以后在緩沖區就不復存在了。當緩沖區讀空或者寫滿時,有一定的規則控制相應的讀進程或者寫進程進入等待隊列, 當空的緩沖區有新數據寫入或者滿的緩沖區有數據讀出來時,就喚醒等待隊列中的進程繼續 讀寫。(2)管道的局限:管道的主要局限性正體現在它的特點上:只支持單向數據流;只能用于

3、具有親緣關系的進程之間;沒有名字;管道的緩沖區是有限的(管道制存在于內存中,在管道創建時,為緩沖區分配一個頁 面大小);管道所傳送的是無格式字節流,這就要求管道的讀出方和寫入方必須事先約定好數據 的格式,比如多少字節算作一個消息(或命令,或記錄)等等;2、有名管道(FIFO)匿名管道,由于沒有名字,只能用于親緣關系的進程間通信。為了克服這個缺點,提出 了有名管道(FIFO)。有名管道不同于匿名管道之處在于它提供了一個路徑名與之關聯,以有名管道的文件形 式存在于文件系統中,這樣,即使與有名管道的創建進程不存在親緣關系的進程,只要可以 訪問該路徑,就能夠彼此通過有名管道相互通信,因此,通過有名管道

4、不相關的進程也能交 換數據。值的注意的是,有名管道嚴格遵循先進先出(first in first out),對匿名管道及有名 管道的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。它們不支持諸如Iseek 的O等文件定位操作。有名管道的名字存在于文件系統中,內容存放在內存中。匿名管道和有名管道總結:(1)管道是特殊類型的文件,在滿足先入先出的原則條件下可以進行讀寫,但不能進行 定位讀寫。(2)匿名管道是單向的,只能在有親緣關系的進程間通信;有名管道以磁盤文件的方式 存在,可以實現本機任意兩個進程通信。(3)無名管道阻塞問題:無名管道無需顯示打開,創建時直接返回文件描述符,在讀寫 時需要確

5、定對方的存在,否則將退出如果當前進程向無名管道的一端寫數據,必須確定另一 端有某一進程。如果寫入無名管道的數據超過其最大值,寫操作將阻塞,如果管道中沒有數據,讀操作 將阻塞,如果管道發現另一端斷開,將自動退出。(4)有名管道阻塞問題:。有名管道在打開時需要確實對方的存在,否則將阻塞即以讀 方式打開某管道,在此之前必須一個進程以寫方式打開管道,否則阻塞此外,可以以讀寫 (O_RDWR)模式打開有名管道,即當前進程讀,當前進程寫,不會阻塞。3、信號(信號)信號是Linux的系統中用于進程間互相通信或者操作的一種機制,信號可以在任何時候 發給某一進程,而無需知道該進程的狀態。如果該進程當前并未處于執

6、行狀態,則該信號就有內核保存起來,知道該進程回復執行 并傳遞給它為止。如果一個信號被進程設置為阻塞,則該信號的傳遞被延遲,直到其阻塞被取消是才被傳 遞給進程。Linux系統中常用信號:(1)SIGHUP:用戶從終端注銷,所有已啟動進程都將收到該進程。系統缺省狀態下對該 信號的處理是終止進程。(2) SIGINT:程序終止信號。程序運行過程中,按CtrlY鍵將產生該信號。(3) SIGQUIT:程序退出信號。程序運行過程中,按Ctrl+鍵將產生該信號。(4) SIGBUS和SIGSEGV:進程訪問非法地址。(5) SIGFPE:運算中出現致命錯誤,如除零操作、數據溢出等。(6) SIGKILL:

7、用戶終止進程執行信號。shell下執行kill -9發送該信號。(7) SIGTERM:結束進程信號。shell下執行kill進程pid發送該信號。(8) SIGALRM:定時器信號。(9) SIGCLD:子進程退出信號。如果其父進程沒有忽略該信號也沒有處理該信號,則子 進程退出后將形成僵尸進程。信號來源:信號是軟件層次上對中斷機制的一種模擬,是一種異步通信方式,,信號可以 在用戶空間進程和內核之間直接交互,內核可以利用信號來通知用戶空間的進程發生了哪些 系統事件,信號事件主要有兩個來源:硬件來源:用戶按鍵輸入Ctrl + C鍵退出,硬件異常如無效的存儲訪問等。軟件終止:終止進程信號,其他進程

8、調用殺函數,軟件異常產生信號。信號生命周期和處理流程:(1)信號被某個進程產生,并設置此信號傳遞的對象(一般為對應進程的PID),然后 傳遞給操作系統;(2)操作系統根據接收進程的設置(是否阻塞)而選擇性的發送給接收者,如果接收者 阻塞該信號(且該信號是可以阻塞的),操作系統將暫時保留該信號,而不傳遞,直到該進程 解除了對此信號的阻塞(如果對應進程已經退出,則丟棄此信號),如果對應進程沒有阻塞, 操作系統將傳遞此信號。(3)目的進程接收到此信號后,將根據當前進程對此信號設置的預處理方式,暫時終止 當前代碼的執行,保護上下文(主要包括臨時寄存器數據,當前程序位置以及當前CPU的狀 態),轉而執行

9、中斷服務程序,執行完成后在回復到中斷的位置。當然,對于搶占式內核,在 中斷返回時還將引發新的調度。4、消息(消息)隊列消息隊列是存放在內核中的消息鏈表,每個消息隊列由消息隊列標識符表示。與管道(無名管道:只存在于內存中的文件;命名管道:存在于實際的磁盤介質或者文件 系統)不同的是消息隊列存放在內核中,只有在內核重啟(即,操作系統重啟)或者顯示地 刪除一個消息隊列時,該消息隊列才會被真正的刪除。另外與管道不同的是,消息隊列在某個進程往一個隊列寫入消息之前,并不需要另外某 個進程在該隊列上等待消息的到達延伸閱讀:消息隊列?語言的實踐消息隊列特點總結:(1)消息隊列是消息的鏈表,具有特定的格式,存放

10、在內存中并由消息隊列標識符標識。(2)消息隊列允許一個或多個進程向它寫入與讀取消息。(3)管道和消息隊列的通信數據都是先進先出的原則。(4)消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以 按消息的類型讀取。比FIFO更有優勢。(5)消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩沖區大小受 限等缺;(6)目前主要有兩種類型的消息隊列:POSIX消息隊列以及System V消息隊列,系統V 消息隊列目前被大量使用。系統V消息隊列是隨內核持續的,只有在內核重起或者人工刪除 時,該消息隊列才會被刪除。5、共享內存(共享內存)使得多個進程可以可以直接讀寫同一塊內

11、存空間,是最快的可用IPC形式。是針對其他 通信機制運行效率較低而設計的。為了在多個進程間交換信息,內核專門留出了一塊內存區,可以由需要訪問的進程將其 映射到自己的私有地址空間。進程就可以直接讀寫這一塊內存而不需要進行數據的拷貝,從 而大大提高效率。由于多個進程共享一段內存,因此需要依靠某種同步機制(如信號量)來達到進程間的 同步及互斥。延伸閱讀:Linux支持的主要三種共享內存方式:remap ()系統調用,Posix共享內存,以及System V共享內存實踐6、信號量(信號量)信號量是一個計數器,用于多進程對共享數據的訪問,信號量的意圖在于進程間同步。為了獲得共享資源,進程需要執行下列操作

12、:(1)創建一個信號量:這要求調用者指定初始值,對于二值信號量來說,它通常是b 也可是0。(2)等待一個信號量:該操作會測試這個信號量的值,如果小于0,就阻塞也稱為P操 作。(3)掛出一個信號量:該操作將信號量的值加1,也稱為V操作。為了正確地實現信號量,信號量值的測試及減1操作應當是原子操作為此,信號量通常 是在內核中實現的.Linux環境中,有三種類型:Posix的(可移植性操作系統接口)有用信 號量(使用PosixIPC名字標識),Posix基于內存的信號量(存放在共享內存區中),系統V 信號量(在內核中維護)。這三種信號量都可用于進程間或線程間的同步。信號量與普通整型變量的區別:(1)

13、信號量是非負整型變量,除了初始化之外,它只能通過兩個標準原子操作:wait (semap) signal (semap); 來進行訪問;(2)操作也被成為PV原語(P來源于荷蘭語proberen “測試”,V來源于荷蘭語verhogen “增加”,P表示通過的意思,V表示釋放的意思),而普通整型變量則可以在任何語句塊中被 訪問;信號量與互斥量之間的區別:(1)互斥量用于線程的互斥,信號量用于線程的同步。這是互斥量和信號量的根本區別, 也就是互斥和同步之間的區別。互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性但互斥 無法限制訪問者對資源的訪問順序,即訪問是無序的。同步:是

14、指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少 數情況是指可以允許多個訪問者同時訪問資源(2)互斥量值只能為0/1,信號量值可以為非負整數。也就是說,一個互斥量只能用于一個資源的互斥訪問,它不能實現多個資源的多線程互 斥問題。信號量可以實現多個同類資源的多線程互斥和同步。當信號量為單值信號量是,也 可以完成一個資源的互斥訪問。(3)互斥量的加鎖和解鎖必須由同一線程分別對應使用,信號量可以由一個線程釋放, 另一個線程得到。7、套接字(插座)套接字是一種通信機制,憑借這種機制,客戶/服務器(即要進

15、行通信的進程)系統的開 發工作既可以在本地單機上進行,也可以跨網絡進行。也就是說它可以讓不在同一臺計算機 但通過網絡連接計算機上的進程進行通信。套接字是應用層和傳輸層之間的橋梁。套接字是支持TCP /IP的網絡通信的基本操作單元,可以看做是不同主機之間的進程進 行雙向通信的端點,簡單的說就是通信的兩方的一種約定,用套接字中的相關函數來完成通 信過程。套接字特性:套接字的特性由3個屬性確定,它們分別是:域,端口號,協議類型。(1)套接字的域它指定套接字通信中使用的網絡介質,最常見的套接字域有兩種:一是AFNET,它指的是互聯網網絡。當客戶使用套接字進行跨網絡的連接時,它就需 要用到服務器計算機的

16、IP地址和端口來指定一臺聯網機器上的某個特定服務,所以在使用插 座作為通信的終點,服務器應用程序必須在開始通信之前綁定一個端口,服務器在指定的端 口等待客戶的連接。另一個域AF_UNIX,表示UNIX文件系統,它就是文件輸入/輸出,而它的地址就是文件 名。(2)套接字的端口號每一個基于TCP/IP網絡通訊的程序(進程)都被賦予了唯一的端口和端口號,端口是 一個信息緩沖區,用于保留插槽中的輸入/輸出信息,端口號是一個16位無符號整數,范圍 是0-65535,以區別主機上的每一個程序(端口號就像房屋中的房間號),低于256的端口號 保留給標準應用程序,比如POP3的端口號就是110,每一個套接字都

17、組合進了 IP地址,端 口,這樣形成的整體就可以區別每一個套接字。(3)套接字協議類型因特網提供三種通信機制:一是流套接字,流套接字在域中通過TCP/IP連接實現,同時也是AF_UNIX中常用的套 接字類型。流套接字提供的是一個有序,可靠,雙向字節流的連接,因此發送的數據可以確 保不會丟失,重復或亂序到達,而且它還有一定的出錯后重新發送的機制。二個是數據報套接字,它不需要建立連接和維持一個連接,它們在域中通常是通過UDP/ IP協議實現的。它對可以發送的數據的長度有限制,數據報作為一個單獨的網絡消息被傳輸, 它可能會丟失,復制或錯亂到達,UDP不是一個可靠的協議,但是它的速度比較高,因為它 并

18、一需要總是要建立和維持一個連接。三是原始套接字,原始套接字,允許對較低層次的協議直接訪問,比如IP,ICMP協議, 它常用于檢驗新的協議實現,或者訪問現有服務中配置的新設備,因為RAW SOCKET可以自如 地控制Windows下的多種協議,能夠對網絡底層的傳輸機制進行控制,所以可以應用原始套 接字來操縱網絡層和傳輸層應用。比如,我們可以通過RAW SOCKET來接收發向本機的ICMP, IGMP協議包,或者接收的TCP /IP棧不能夠處理的IP包,也可以用來發送一些自定包頭或自定協議的IP包。網絡監聽技 術很大程度上依賴于SOCKET_RAW.原始套接字與標準套接字的區別在于:原始套接字可以讀寫內核沒有處理的IP數據包, 而流套接字只能讀取TCP協議的數據,數據報套接字只能讀取UDP協議的數據。因此,如果 要訪問其他協議發送數據必須使用原始套接字。套接字通信的建立:服務器端:(1)首先服務器應用程序用系統調用套接字來創建一個套接字,它是系統分配給該服務 器進程的類似文件描述符的資源,它不能與其他的進程共享。(2)然后,服務器進程會給套接字起個名字,我們使用系統調用結合來給套接字命名。 然后服務器進程就開始等待客戶連接

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論