面試問題 計算機網(wǎng)絡與操作系統(tǒng)

以下知識解答參考了各路網(wǎng)絡大佬的分享,主要用于自己復習備考,如有侵權(quán)請聯(lián)系刪除,感謝!
進程的狀態(tài)和轉(zhuǎn)換:


答:進程的狀態(tài)一共有就緒狀態(tài),運行狀態(tài),阻塞狀態(tài);

運行狀態(tài):進程正在處理機上運行。一個處理機在一個時刻最多有一個進程處于運行狀態(tài);

就緒狀態(tài):所有資源已經(jīng)分配完畢,只等處理機空出來。

阻塞狀態(tài):資源還沒給到位,還在等待資源(或者等待輸入、輸出完成),就算處理機為空也不能運行。


進程與線程的區(qū)別:


答:1.進程是系統(tǒng)進行資源分配和調(diào)度的最小單位。線程是進程的一個實體,它是cpu調(diào)度進行運算(資源調(diào)度)的最小單位,它是比進程更小的能獨立運行的基本單位。 2. 線程基本上不擁有資源,線程只能在一個進程的地址空間內(nèi)活動,但是可以與同一個進程下的線程共享所擁有的資源。并且同一進程下的線程使用的是相同的地址空間,所以cpu切換線程比切換進程方便的多。 3.****線程在執(zhí)行過程中需要協(xié)作同步,不同進程的線程間要利用消息通信的方法實現(xiàn)同步。


多進程與多線程的區(qū)別


image

強相關(guān)的處理用線程,弱相關(guān)的處理用進程。


線程同步方式:


1.臨界區(qū):串行化來訪問公共資源的一段代碼,就像廁所,一次只能一個人用;

2.互斥量:采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權(quán)限,這樣可以保證公共資源不會同時被多個線程訪問。

3.信號量:它允許多個線程在同一時刻來訪問同一資源,但是要限制最大數(shù)量;

4.事件(信號):通過通知操作的方式來保持多線程的同步;


進程同步方式:


(1)信號量(Semaphore)及PV操作

優(yōu):PV操作能夠?qū)崿F(xiàn)對臨界區(qū)的管理要求;實現(xiàn)簡單;允許使用它的代碼休眠,持有鎖的時間可相對較長。

缺:信號量機制必須有公共內(nèi)存,不能用于分布式操作系統(tǒng),這是它最大的弱點。信號量機制功能強大,但使用時對信號量的操作分散,而且難以控制,讀寫和維護都很困難。加重了程序員的編碼負擔;核心操作P-V分散在各用戶程序的代碼中,不易控制和管理;一旦錯誤,后果嚴重,且不易發(fā)現(xiàn)和糾正。

(2)自旋鎖

優(yōu):旋鎖是為了保護共享資源提出的一種鎖機制;調(diào)用者申請的資源如果被占用,即自旋鎖已經(jīng)被別的執(zhí)行單元保持,則調(diào)用者一直循環(huán)在那里看是否該自旋鎖的保持者已經(jīng)釋放了鎖;低開銷;安全和高效;

缺:自旋鎖是一種比較低級的保護數(shù)據(jù)結(jié)構(gòu)和代碼片段的原始方式,可能會引起****死鎖和****過多地占用CPU資源兩個問題。

傳統(tǒng)自旋鎖由于無序競爭會導致“公平性”問題

(3)管程

優(yōu):集中式同步進程——管程。其基本思想是將共享變量和對它們的操作集中在一個模塊中,操作系統(tǒng)或并發(fā)程序就由這樣的模塊構(gòu)成。這樣模塊之間聯(lián)系清晰,便于維護和修改,易于保證正確性。

缺:如果一個分布式系統(tǒng)具有多個CPU,并且每個CPU擁有自己的私有內(nèi)存,它們通過一個局域網(wǎng)相連,那么這些原語將失效。而管程在少數(shù)幾種編程語言之外又無法使用,并且,這些原語均未提供機器間的信息交換方法。

(4)會合

進程直接進行相互作用

(5)分布式系統(tǒng)

消息和rpc ,由于在分布式操作系統(tǒng)中沒有公共內(nèi)存,因此參數(shù)全為值參, 而且不可為指針.


socket套接字:


image

進程間的通信方式:


**   每個進程各自有不同的用戶地址空間,任何一個進程的全局變量在另一個進程中都看不到,所以進程之間要交換數(shù)據(jù)必須通過內(nèi)核,在內(nèi)核中開辟一塊緩沖區(qū),進程1把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū),進程2再從內(nèi)核緩沖區(qū)把數(shù)據(jù)讀走,內(nèi)核提供的這種機制稱為進程間通信(IPC,InterProcess Communication)。**

1. 管道/匿名管道(pipe)

** 管道是半雙工的,數(shù)據(jù)只能向一個方向流動;需要雙方通信時,需要建立起兩個管道。只能用于父子進程或者兄弟進程之間(具有親緣關(guān)系的進程);管道的實質(zhì)是一個內(nèi)核緩沖區(qū),進程以先進先出的方式從緩沖區(qū)存取數(shù)據(jù),管道一端的進程順序的將數(shù)據(jù)寫入緩沖區(qū),另一端的進程則順序的讀出數(shù)據(jù)。****該緩沖區(qū)可以看做是一個循環(huán)隊列,讀和寫的位置都是自動增長的,不能隨意改變,一個數(shù)據(jù)只能被讀一次,讀出來以后在緩沖區(qū)就不復存在了。**


2. 有名管道(FIFO)

有名管道不同于匿名管道之處在于它提供了一個路徑名與之關(guān)聯(lián),以有名管道的文件形式存在于文件系統(tǒng)中,這樣,即使與有名管道的創(chuàng)建進程不存在親緣關(guān)系的進程,只要可以訪問該路徑,就能夠彼此通過有名管道相互通信,因此,通過有名管道不相關(guān)的進程也能交換數(shù)據(jù)。值的注意的是,有名管道嚴格遵循先進先出(first in first out),對匿名管道及有名管道的讀總是從開始處返回數(shù)據(jù),對它們的寫則把數(shù)據(jù)添加到末尾。

** 管道類似與數(shù)據(jù)結(jié)構(gòu)中的隊列。**

**無名管道阻塞問題:無名管道無需顯示打開,創(chuàng)建時直接返回文件描述符,在讀寫時需要確定對方的存在,否則將退出。如果當前進程向無名管道的一端寫數(shù)據(jù),必須確定另一端有某一進程。如果寫入無名管道的數(shù)據(jù)超過其最大值,寫操作將阻塞,如果管道中沒有數(shù)據(jù),讀操作將阻塞,如果管道發(fā)現(xiàn)另一端斷開,將自動退出。** 

** 有名管道阻塞問題:有名管道在打開時需要確實對方的存在,否則將阻塞。即以讀方式打開某管道,在此之前必須一個進程以寫方式打開管道,否則阻塞。此外,可以以讀寫(O_RDWR)模式打開有名管道,即當前進程讀,當前進程寫,不會阻塞。**


3. 信號(Signal)

信號是Linux系統(tǒng)中用于進程間互相通信或者操作的一種機制,信號可以在任何時候發(fā)給某一進程,而無需知道該進程的狀態(tài)。

如果該進程當前并未處于執(zhí)行狀態(tài),則該信號就有內(nèi)核保存起來,知道該進程回復執(zhí)行并傳遞給它為止。

如果一個信號被進程設置為阻塞,則該信號的傳遞被延遲,直到其阻塞被取消是才被傳遞給進程。

Linux系統(tǒng)中常用信號:

(1)SIGHUP:用戶從終端注銷,所有已啟動進程都將收到該進程。系統(tǒng)缺省狀態(tài)下對該信號的處理是終止進程。

(2)SIGINT:程序終止信號。程序運行過程中,按Ctrl+C鍵將產(chǎn)生該信號。

(3)SIGQUIT:程序退出信號。程序運行過程中,按Ctrl+鍵將產(chǎn)生該信號。

(4)SIGBUS和SIGSEGV:進程訪問非法地址。

(5)SIGFPE:運算中出現(xiàn)致命錯誤,如除零操作、數(shù)據(jù)溢出等。

(6)SIGKILL:用戶終止進程執(zhí)行信號。shell下執(zhí)行kill -9發(fā)送該信號。

(7)SIGTERM:結(jié)束進程信號。shell下執(zhí)行kill 進程pid發(fā)送該信號。

(8)SIGALRM:定時器信號。

(9)SIGCLD:子進程退出信號。如果其父進程沒有忽略該信號也沒有處理該信號,則子進程退出后將形成僵尸進程。


信號來源

信號是軟件層次上對中斷機制的一種模擬,是一種異步通信方式,

硬件來源:用戶按鍵輸入Ctrl+C退出、硬件異常如無效的存儲訪問等。

軟件終止:終止進程信號、其他進程調(diào)用kill函數(shù)、軟件異常產(chǎn)生信號。


信號生命周期和處理流程

信號被某個進程產(chǎn)生,并設置此信號傳遞的對象(一般為對應進程的pid),然后傳遞給操作系統(tǒng);如果對應進程沒有阻塞,操作系統(tǒng)將傳遞此信號。目的進程接收到此信號后,將根據(jù)當前進程對此信號設置的預處理方式,暫時終止當前代碼的執(zhí)行,保護上下文(主要包括臨時寄存器數(shù)據(jù),當前程序位置以及當前CPU的狀態(tài))、轉(zhuǎn)而執(zhí)行中斷服務程序,執(zhí)行完成后在回復到中斷的位置。


4. 消息(Message)隊列

消息隊列是存放在內(nèi)核中的消息鏈表,每個消息隊列由消息隊列標識符表示。

消息隊列特點總結(jié):

(1)消息隊列是消息的鏈表,具有特定的格式,存放在內(nèi)存中并由消息隊列標識符標識.

(2)消息隊列允許一個或多個進程向它寫入與讀取消息.

(3)管道和消息隊列的通信數(shù)據(jù)都是先進先出的原則。

(4)消息隊列可以實現(xiàn)消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取.比FIFO更有優(yōu)勢。

(5)消息隊列克服了信號承載信息量少,管道只能承載無格式字 節(jié)流以及緩沖區(qū)大小受限等缺。

(6)目前主要有兩種類型的消息隊列:POSIX消息隊列以及System V消息隊列,系統(tǒng)V消息隊列目前被大量使用。系統(tǒng)V消息隊列是隨內(nèi)核持續(xù)的,只有在內(nèi)核重起或者人工刪除時,該消息隊列才會被刪除。


5. 共享內(nèi)存(share memory)

使得多個進程可以可以直接讀寫同一塊內(nèi)存空間,是最快的可用IPC形式。

為了在多個進程間交換信息,內(nèi)核專門留出了一塊內(nèi)存區(qū),可以由需要訪問的進程將其映射到自己的私有地址空間。進程就可以直接讀寫這一塊內(nèi)存而不需要進行數(shù)據(jù)的拷貝,從而大大提高效率。延伸閱讀:Linux支持的主要三種共享內(nèi)存方式:mmap()系統(tǒng)調(diào)用、Posix(可移植性操作系統(tǒng)接口)共享內(nèi)存,以及System V(在內(nèi)核中維護)共享內(nèi)存實踐。


6. 信號量(semaphore)

信號量是一個計數(shù)器,用于多進程對共享數(shù)據(jù)的訪問,信號量的意圖在于進程間同步。信號量是非負整型變量,除了初始化之外,它只能通過兩個標準原子操作:wait(semap) , signal(semap) ;

為了獲得共享資源,進程需要執(zhí)行下列操作:

(1)創(chuàng)建一個信號量:這要求調(diào)用者指定初始值,對于二值信號量來說,它通常是1,也可是0。

(2)等待一個信號量:該操作會測試這個信號量的值,如果小于0,就阻塞。也稱為P操作。申請

(3)掛出一個信號量:該操作將信號量的值加1,也稱為V操作。釋放


7. 套接字(socket)


Socket是應用層和傳輸層之間的橋梁,套接字的特性由3個屬性確定,它們分別是:域、端口號、協(xié)議類型。

套接字是支持TCP/IP的網(wǎng)絡通信的基本操作單元,可以看做是不同主機之間的進程進行雙向通信的端點,簡單的說就是通信的兩方的一種約定,用套接字中的相關(guān)函數(shù)來完成通信過程。

(1)套接字的域

它指定套接字通信中使用的網(wǎng)絡介質(zhì),一是AF_INET,它指的是Internet網(wǎng)絡。另一個域AF_UNIX,表示UNIX文件系統(tǒng)。

(2)套接字的端口號

每一個基于TCP/IP網(wǎng)絡通訊的程序(進程)都被賦予了唯一的端口和端口號,端口是一個信息緩沖區(qū),用于保留Socket中的輸入/輸出信息。

(3)套接字協(xié)議類型

一是流套接字,流套接字在域中通過TCP/IP連接實現(xiàn),同時也是AF_UNIX中常用的套接字類型。流套接字提供的是一個有序、可靠、雙向字節(jié)流的連接,因此發(fā)送的數(shù)據(jù)可以確保不會丟失、重復或亂序到達,而且它還有一定的出錯后重新發(fā)送的機制。

二個是數(shù)據(jù)報套接字,它不需要建立連接和維持一個連接,它們在域中通常是通過UDP/IP協(xié)議實現(xiàn)的。它對可以發(fā)送的數(shù)據(jù)的長度有限制,數(shù)據(jù)報作為一個單獨的網(wǎng)絡消息被傳輸,它可能會丟失、復制或錯亂到達,UDP不是一個可靠的協(xié)議,但是它的速度比較高,因為它并不需要總是要建立和維持一個連接。

三是原始套接字,原始套接字允許對較低層次的協(xié)議直接訪問,比如IP、 ICMP協(xié)議,它常用于檢驗新的協(xié)議實現(xiàn),或者訪問現(xiàn)有服務中配置的新設備。


套接字通信的建立


服務器端

(1)創(chuàng)建socket,不能與其他的進程共享。

(2)給套接字起名為bind,然后服務器進程就開始等待客戶連接到這個套接字。

(3)接下來,系統(tǒng)調(diào)用listen來創(chuàng)建一個隊列并將其用于存放來自客戶的進入連接。

(4)最后,服務器通過系統(tǒng)調(diào)用accept來接受客戶的連接。它會創(chuàng)建一個與原有的命名套接不同的新套接字,這個套接字只用于與這個特定客戶端進行通信,而命名套接字(即原先的套接字)則被保留下來繼續(xù)處理來自其他客戶的連接(建立客戶端和服務端的用于通信的流,進行通信)。


客戶端

(1)創(chuàng)建一個未命名的socket,然后將服務器的命名套接字作為一個地址來調(diào)用connect與服務器建立連接。

(2)一旦連接建立,我們就可以像使用底層的文件描述符那樣用套接字來實現(xiàn)雙向數(shù)據(jù)的通信(通過流進行數(shù)據(jù)傳輸)。


linux內(nèi)核態(tài)和用戶態(tài)

內(nèi)核從本質(zhì)上看是一種軟件——控制計算機的硬件資源,并提供上層應用程序運行的環(huán)境。

內(nèi)核態(tài)和用戶態(tài)的最大區(qū)別在于特權(quán)級不同。運行在用戶態(tài)下的程序不能直接訪問操作系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)和程序。

用戶態(tài)切換到內(nèi)核態(tài)的3種方式:1、系統(tǒng)調(diào)用(主動) 2、異常(被動) 3、外圍設備中斷(中斷)

linux中g(shù)rep、awk、sed、fork

答:awk、grep、sed是linux操作文本的三大利器,合稱文本三劍客,也是必須掌握的linux命令之一。三者的功能都是處理文本,但側(cè)重點各不相同,其中屬awk功能最強大,但也最復雜。grep更適合單純的查找或匹配文本,sed更適合編輯匹配到的文本,awk更適合格式化文本,對文本進行較復雜格式處理。

grep功能:用于過濾/搜索特定字符??墒褂谜齽t表達式 能多種命令配合使用。

fork函數(shù):通過系統(tǒng)調(diào)用創(chuàng)建一個與原來進程幾乎完全相同的進程,也就是兩個進程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同,兩個進程也可以做不同的事。

1)在父進程中,fork返回新創(chuàng)建子進程的進程ID;

2)在子進程中,fork返回0;

3)如果出現(xiàn)錯誤,fork返回-1;

信號量及PV操作
答:

image.png
進程三個狀態(tài)之間的轉(zhuǎn)換就是靠PV操作來控制的。
信號量S>=0時,S表示可用資源的數(shù)量。執(zhí)行一次P操作意味著請求分配一個單位資源,因此S的值減1;當S<0時,表示已經(jīng)沒有可用資源,請求者必須等待別的進程釋放該類資源,它才能運行下去。
而執(zhí)行一個V操作意味著釋放一個單位資源,因此S的值加1;若S<0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀態(tài)的進程,使之運行下去。

使用PV操作實現(xiàn)同步操作
用一個信號量S與一個消息(或者資源)聯(lián)系起來,當信號量的值為0時,表示期望的消息尚未產(chǎn)生(或者資源不可用);當信號量的值S>0時,表示期望的消息已經(jīng)存在(有資源可用)。用P V操作實現(xiàn)進程同步時,調(diào)用P操作測試消息是否到達(是否有資源可用),調(diào)用V操作發(fā)送消息(添加資源)。

使用PV操作實現(xiàn)進程(線程)同步時:
1.分析進程(線程)間的制約關(guān)系,確定信號量種類。在保持進程(線程)間有正確的同步關(guān)系情況下,哪個進程先執(zhí)行,哪些進程后執(zhí)行,彼此間通過什么資源(信號量)進行協(xié)調(diào),從而明確要設置哪些信號量。
2.信號量的初值與相應資源的數(shù)量有關(guān),也與P、V操作在程序代碼中出現(xiàn)的位置有關(guān)。
3.同一信號量的P、V操作一般必須要成對出現(xiàn),但它們分別在不同的進程(線程)代碼中。

使用PV操作實現(xiàn)互斥操作時:
1.同一信號量的P、V操作必須要成對出現(xiàn),且出現(xiàn)在同一的進程(線程)代碼中。
2.每個互斥的P、V操作必須成對出現(xiàn),先做P操作,進臨界區(qū),后做V操作,出臨界區(qū)。若有多個分支,要認真檢查其成對性, 否則會造成死鎖。
3.P、V操作應分別緊靠臨界區(qū)的頭尾部,臨界區(qū)的代碼應盡可能短,不能有死循環(huán)。
互斥信號量的初值一般為1。

吞吐率和吞吐量、事務TPS
答:單位時間內(nèi)服務器處理的請求數(shù)來描述其并發(fā)處理能力。稱之為吞吐率(Throughput),單位是 “req/s”。吞吐率特指 Web 服務器單位時間內(nèi)處理的請求數(shù)。另一種描述,吞吐率是單位時間內(nèi)網(wǎng)絡上傳輸?shù)臄?shù)據(jù)量,也可以指單位時間內(nèi)處理客戶請求數(shù)量。它是衡量網(wǎng)絡性能的重要指標。通常情況下,吞吐率 “字節(jié)數(shù)/秒” 來衡量。
吞吐量,是指在一次性能測試過程中網(wǎng)絡上傳輸?shù)臄?shù)據(jù)量的總和。
事物是用戶某一步或幾步操作的集合。
TPS是指每秒鐘系統(tǒng)能夠處理事務或交易的數(shù)量,它是衡量系統(tǒng)處理能力的重要指標。

image.png
image.png

image.png

網(wǎng)關(guān)是什么?
答:網(wǎng)關(guān)又稱為協(xié)議轉(zhuǎn)換器。網(wǎng)關(guān)的功能是實現(xiàn)網(wǎng)絡之間的相互連接。網(wǎng)關(guān)不僅可以讓廣域網(wǎng)之間相互連接,也可以讓局域網(wǎng)之間相互連接。網(wǎng)關(guān)在計算機和設備之間起轉(zhuǎn)換的作用,相當于一個翻譯器,可以使不同的協(xié)議、語言、數(shù)據(jù)在不同的系統(tǒng)之間進行轉(zhuǎn)換。

DHCP協(xié)議
答:對一個臨時加入的設備,它是不知道自己的ip地址是多少的。這個設備在加入時會先采用UDP協(xié)議廣播DHCP發(fā)現(xiàn)報文,通過這個DHCP發(fā)現(xiàn)報文來查找DHCP服務在哪。這個設備使用了UDP協(xié)議,那肯定使用了IP協(xié)議,但是他的IP地址是什么確定的呢?他是通過把主機號全填寫為1,來發(fā)送廣播報文。DHCP服務器收到這個報文以后,就會發(fā)出DHCP提供報文,告訴這個設備可以提供IP地址。設備收到DHCP提供報文之后,發(fā)出請求報文,DHCP服務器收到之后就回應并提供IP地址。

線程間的通信方式:
答:線程通信是通過讀寫同一進程的數(shù)據(jù)進行通信的。
鎖機制:包括互斥鎖、條件變量、讀寫鎖
互斥鎖:提供了以排他方式防止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。
讀寫鎖:允許多個線程同時共享數(shù)據(jù),而對寫操作是互斥的。
條件變量:可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
信號量機制(Semaphore):包括無名進程信號量和命名線程信號量
信號機制(Signal):類似進程間的信號處理

輸入一個url之后的具體過程:
答:瀏覽器中輸入一個URL:
(1) 首先瀏覽器要將URL解析為IP地址,解析域名就要用到DNS協(xié)議,首先主機會查詢DNS的緩存,如果沒有給本地DNS發(fā)送查詢請求。DNS的查詢方式有兩種,一種是遞歸查詢,一種是迭代查詢。如果是迭代查詢,本地的DNS服務器,向根域名服務器發(fā)出查詢請求,根域名服務器告知該域名的一級域名服務器,然后本地服務器給該一級域名服務器發(fā)送查詢請求,然后依次類推直到查詢到該域名的IP地址。DNS服務器是基于UDP的,因此會用到UDP協(xié)議。
(2) 得到IP地址以后,瀏覽器就要與服務器建立一個HTTP連接,因此要用到HTTP協(xié)議,HTTP協(xié)議報文格式上面已經(jīng)提及到。HTTP生成一個get請求報文,將該報文傳給tcp層處理。如果采用到HTTPS還會對數(shù)據(jù)進行加密。TCP層如果有需要先將HTTP數(shù)據(jù)包分片,分片依據(jù)路徑MTU和MSS。
(3) TCP的數(shù)據(jù)包然后會發(fā)送給IP層,用到IP協(xié)議。IP層通過路由選擇,一跳一跳發(fā)送到目的地址。當然在一個網(wǎng)絡內(nèi)的尋址是通過以太網(wǎng)協(xié)議實現(xiàn),以太網(wǎng)協(xié)議需要知道目的IP地址的物理地址,有需要ARP協(xié)議。

fork函數(shù)
**答:fork調(diào)用的一個奇妙之處就是它僅僅被調(diào)用一次,卻能夠返回兩次,它可能有三種不同的返回值:
在父進程中,fork返回新創(chuàng)建子進程的進程ID;
在子進程中,fork返回0;
如果出現(xiàn)錯誤,fork返回一個負值;
fork出錯可能有兩種原因:
(1)當前的進程數(shù)已經(jīng)達到了系統(tǒng)規(guī)定的上限,這時errno的值被設置為EAGAIN。
(2)系統(tǒng)內(nèi)存不足,這時errno的值被設置為ENOMEM。(關(guān)于errno的意義,請參考本系列的第一篇文章。)
**
fork函數(shù)和vfork函數(shù)的區(qū)別
**

  1. fork ():子進程拷貝父進程的數(shù)據(jù)段,代碼段
    vfork ():子進程與父進程共享數(shù)據(jù)段
  2. fork ()父子進程的執(zhí)行次序不確定
    vfork 保證子進程先運行,在調(diào)用exec 或exit 之前與父進程數(shù)據(jù)是共享的,在它調(diào)用exec
    或exit 之后父進程才可能被調(diào)度運行。
  3. vfork ()保證子進程先運行,在她調(diào)用exec 或exit 之后父進程才可能被調(diào)度運行。如果在
    調(diào)用這兩個函數(shù)之前子進程依賴于父進程的進一步動作,則會導致死鎖。
    **
    孤兒進程、僵尸進程
    孤兒進程
    一個父進程退出,而它的一個或多個子進程還在運行,那么這些子進程將成為孤兒進程。
    孤兒進程將被 init 進程(進程號為 1)所收養(yǎng),并由 init 進程對它們完成狀態(tài)收集工作。
    由于孤兒進程會被 init 進程收養(yǎng),所以孤兒進程不會對系統(tǒng)造成危害。

僵尸進程
一個子進程的進程描述符在子進程退出時不會釋放,只有當父進程通過 wait() 或 waitpid() 獲取了子進程信息后才會釋放。如果子進程退出,而父進程并沒有調(diào)用 wait() 或 waitpid(),那么子進程的進程描述符仍然保存在系統(tǒng)中,這種進程稱之為僵尸進程。
僵尸進程通過 ps 命令顯示出來的狀態(tài)為 Z(zombie)。
系統(tǒng)所能使用的進程號是有限的,如果產(chǎn)生大量僵尸進程,將因為沒有可用的進程號而導致系統(tǒng)不能產(chǎn)生新的進程。
要消滅系統(tǒng)中大量的僵尸進程,只需要將其父進程殺死,此時僵尸進程就會變成孤兒進程,從而被 init 所收養(yǎng),這樣 init 就會釋放所有的僵尸進程所占有的資源,從而結(jié)束僵尸進程。

軟連接和硬鏈接

軟連接,其實就是新建立一個文件,這個文件就是專門用來指向別的文件的(那就和windows 下的快捷方式的那個文件有很接近的意味)。軟鏈接產(chǎn)生的是一個新的文件,但這個文件的作用就是專門指向某個文件的,刪了這個軟連接文件,那就等于不需要這個連接,和原來的存在的實體原文件沒有任何關(guān)系,但刪除原來的文件,則相應的軟連接不可用(cat那個軟鏈接文件,則提示“沒有該文件或目錄“)

硬連接是不會建立inode的,他只是在文件原來的inode link count域再增加1而已,也因此硬鏈接是不可以跨越文件系統(tǒng)的。相反是軟連接會重新建立一個inode,當然inode的結(jié)構(gòu)跟其他的不一樣,他只是一個指明源文件的字符串信息。一旦刪除源文件,那么軟連接將變得毫無意義。而硬鏈接刪除的時候,系統(tǒng)調(diào)用會檢查inode link count的數(shù)值,如果他大于等于1,那么inode不會被回收。因此文件的內(nèi)容不會被刪除。

硬鏈接實際上是為文件建一個別名,鏈接文件和原文件實際上是同一個文件??梢酝ㄟ^ls -i來查看一下,這兩個文件的inode號是同一個,說明它們是同一個文件;而軟鏈接建立的是一個指向,即鏈接文件內(nèi)的內(nèi)容是指向原文件的指針,它們是兩個文件。

多線程和多進程的優(yōu)點:
答:
多線程的優(yōu)點:內(nèi)存和資源共享更為方便、高效,同步和通信簡單。因為是屬于同一個進程,地址空間是相同的,所以在上下文切換時更為方便。

多進程的優(yōu)點:更強的容錯性,進程之間互不影響。更好的多核可伸縮性。

在linux中,如果需要進行大量共享數(shù)據(jù)或者頻繁通信時,使用多線程,其他情況下盡量使用多進程,能用多進程就用多進程。

select、poll、epoll
**

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容