1.進程與線程區(qū)別
(1)定義
進程是資源擁有的基本單位,線程是獨立調度的基本單位,一個進程中可以有多個線程。
(2)開銷
創(chuàng)建與撤銷進程要為之分配與回收資源,如內存空間I/O設備等,開銷遠大于線程。而進程切換的時候涉及當前CPU環(huán)境的保存及新進程CPU環(huán)境設置,而線程切換僅需保存和設置少量寄存器內容,因此開銷很小。
(3)資源
進程地址空間之間相互獨立,同一進程的各個進程共享進程地址空間。
2.進程間通信
(1)管道
管道是Linux中進程間通信的一種方式,它把一個程序的輸出直接連接到另一個程序的輸入(其實我更愿意將管道比喻為農村澆地的管子)。Linux的管道主要包括兩種:無名管道和有名管道。這一節(jié)主要講無名管道,首先介紹一下這兩個管道。(特點很重要?。。?/p>
1、無名管道
無名管道是Linux中管道通信的一種原始方法,如圖一(左)所示,它具有以下特點:
① 它只能用于具有親緣關系的進程之間的通信(也就是父子進程或者兄弟進程之間);
② 它是一個半雙工的通信模式,具有固定的讀端和寫端;
③ 管道也可以看成是一種特殊的文件,對于它的讀寫也可以使用普通的 read()、write()等函數(shù)。但它不是普通的文件,并不屬于其他任何文件系統(tǒng)并且只存在于內存中。
2、有名管道(FIFO)
有名管道是對無名管道的一種改進,如圖1(右)所示,它具有以下特點:
① 它可以使互不相關的兩個進程間實現(xiàn)彼此通信;
② 該管道可以通過路徑名來指出,并且在文件系統(tǒng)中是可見的。在建立了管道之后,兩個進程就可以把它當做普通文件一樣進行讀寫操作,使用非常方便;
③ FIFO嚴格地遵循先進先出規(guī)則,對管道及FIFO的讀總是從開始處返回數(shù)據(jù),對它們的寫則是把數(shù)據(jù)添加到末尾,它們不支持如 lseek()等文件定位操作。
(2)信號(Signal)
信號是比較復雜的通信方式,用于通知接受進程有某種事件發(fā)生,除了用于進程間通信外,進程還可以發(fā)送信號給進程本身;linux除了支持Unix早期信號語義函數(shù)sigal外,還支持語義符合Posix.1標準的信號函數(shù)sigaction(實際上,該函數(shù)是基于BSD的,BSD為了實現(xiàn)可靠信號機制,又能夠統(tǒng)一對外接口,用sigaction函數(shù)重新實現(xiàn)了signal函數(shù))。
(3)報文(Message)隊列(消息隊列)
消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。
(4)共享內存
使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
(5)信號量(semaphore)
主要作為進程間以及同一進程不同線程之間的同步手段。
(6)套接口(Socket)
更為一般的進程間通信機制,可用于不同機器之間的進程間通信。起初是由Unix系統(tǒng)的BSD分支開發(fā)出來的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。