以下知識解答參考了各路網(wǎng)絡(luò)大佬的分享,主要用于自己復(fù)習(xí)備考,如有侵權(quán)請聯(lián)系刪除脱茉,感謝!
進(jìn)程的狀態(tài)和轉(zhuǎn)換:
答:進(jìn)程的狀態(tài)一共有就緒狀態(tài)交汤,運(yùn)行狀態(tài),阻塞狀態(tài)劫笙;
運(yùn)行狀態(tài):進(jìn)程正在處理機(jī)上運(yùn)行蜻展。一個處理機(jī)在一個時刻最多有一個進(jìn)程處于運(yùn)行狀態(tài);
就緒狀態(tài):所有資源已經(jīng)分配完畢邀摆,只等處理機(jī)空出來纵顾。
阻塞狀態(tài):資源還沒給到位,還在等待資源(或者等待輸入栋盹、輸出完成)施逾,就算處理機(jī)為空也不能運(yùn)行。
進(jìn)程與線程的區(qū)別:
答:1.進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的最小單位例获。線程是進(jìn)程的一個實(shí)體汉额,它是cpu調(diào)度進(jìn)行運(yùn)算(資源調(diào)度)的最小單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位榨汤。 2. 線程基本上不擁有資源蠕搜,線程只能在一個進(jìn)程的地址空間內(nèi)活動,但是可以與同一個進(jìn)程下的線程共享所擁有的資源收壕。并且同一進(jìn)程下的線程使用的是相同的地址空間妓灌,所以cpu切換線程比切換進(jìn)程方便的多轨蛤。 3.****線程在執(zhí)行過程中需要協(xié)作同步,不同進(jìn)程的線程間要利用消息通信的方法實(shí)現(xiàn)同步虫埂。
多進(jìn)程與多線程的區(qū)別
強(qiáng)相關(guān)的處理用線程祥山,弱相關(guān)的處理用進(jìn)程。
線程同步方式:
1.臨界區(qū):串行化來訪問公共資源的一段代碼掉伏,就像廁所缝呕,一次只能一個人用;
2.互斥量:采用互斥對象機(jī)制斧散,只有擁有互斥對象的線程才有訪問公共資源的權(quán)限供常,這樣可以保證公共資源不會同時被多個線程訪問。
3.信號量:它允許多個線程在同一時刻來訪問同一資源鸡捐,但是要限制最大數(shù)量栈暇;
4.事件(信號):通過通知操作的方式來保持多線程的同步;
進(jìn)程同步方式:
(1)信號量(Semaphore)及PV操作
優(yōu):PV操作能夠?qū)崿F(xiàn)對臨界區(qū)的管理要求闯参;實(shí)現(xiàn)簡單;允許使用它的代碼休眠悲立,持有鎖的時間可相對較長鹿寨。
缺:信號量機(jī)制必須有公共內(nèi)存,不能用于分布式操作系統(tǒng)薪夕,這是它最大的弱點(diǎn)脚草。信號量機(jī)制功能強(qiáng)大,但使用時對信號量的操作分散原献,而且難以控制馏慨,讀寫和維護(hù)都很困難。加重了程序員的編碼負(fù)擔(dān)姑隅;核心操作P-V分散在各用戶程序的代碼中写隶,不易控制和管理;一旦錯誤讲仰,后果嚴(yán)重慕趴,且不易發(fā)現(xiàn)和糾正。
(2)自旋鎖
優(yōu):旋鎖是為了保護(hù)共享資源提出的一種鎖機(jī)制鄙陡;調(diào)用者申請的資源如果被占用冕房,即自旋鎖已經(jīng)被別的執(zhí)行單元保持,則調(diào)用者一直循環(huán)在那里看是否該自旋鎖的保持者已經(jīng)釋放了鎖趁矾;低開銷耙册;安全和高效;
缺:自旋鎖是一種比較低級的保護(hù)數(shù)據(jù)結(jié)構(gòu)和代碼片段的原始方式毫捣,可能會引起****死鎖和****過多地占用CPU資源兩個問題详拙。
傳統(tǒng)自旋鎖由于無序競爭會導(dǎo)致“公平性”問題
(3)管程
優(yōu):集中式同步進(jìn)程——管程帝际。其基本思想是將共享變量和對它們的操作集中在一個模塊中,操作系統(tǒng)或并發(fā)程序就由這樣的模塊構(gòu)成溪厘。這樣模塊之間聯(lián)系清晰胡本,便于維護(hù)和修改,易于保證正確性畸悬。
缺:如果一個分布式系統(tǒng)具有多個CPU侧甫,并且每個CPU擁有自己的私有內(nèi)存,它們通過一個局域網(wǎng)相連蹋宦,那么這些原語將失效披粟。而管程在少數(shù)幾種編程語言之外又無法使用,并且冷冗,這些原語均未提供機(jī)器間的信息交換方法守屉。
(4)會合
進(jìn)程直接進(jìn)行相互作用
(5)分布式系統(tǒng)
消息和rpc ,由于在分布式操作系統(tǒng)中沒有公共內(nèi)存蒿辙,因此參數(shù)全為值參拇泛, 而且不可為指針.
socket套接字:
進(jìn)程間的通信方式:
** 每個進(jìn)程各自有不同的用戶地址空間,任何一個進(jìn)程的全局變量在另一個進(jìn)程中都看不到思灌,所以進(jìn)程之間要交換數(shù)據(jù)必須通過內(nèi)核俺叭,在內(nèi)核中開辟一塊緩沖區(qū),進(jìn)程1把數(shù)據(jù)從用戶空間拷到內(nèi)核緩沖區(qū)泰偿,進(jìn)程2再從內(nèi)核緩沖區(qū)把數(shù)據(jù)讀走熄守,內(nèi)核提供的這種機(jī)制稱為進(jìn)程間通信(IPC,InterProcess Communication)耗跛。**
1. 管道/匿名管道(pipe)
** 管道是半雙工的裕照,數(shù)據(jù)只能向一個方向流動;需要雙方通信時调塌,需要建立起兩個管道晋南。只能用于父子進(jìn)程或者兄弟進(jìn)程之間(具有親緣關(guān)系的進(jìn)程);管道的實(shí)質(zhì)是一個內(nèi)核緩沖區(qū),進(jìn)程以先進(jìn)先出的方式從緩沖區(qū)存取數(shù)據(jù)羔砾,管道一端的進(jìn)程順序的將數(shù)據(jù)寫入緩沖區(qū)搬俊,另一端的進(jìn)程則順序的讀出數(shù)據(jù)。****該緩沖區(qū)可以看做是一個循環(huán)隊(duì)列蜒茄,讀和寫的位置都是自動增長的唉擂,不能隨意改變,一個數(shù)據(jù)只能被讀一次檀葛,讀出來以后在緩沖區(qū)就不復(fù)存在了玩祟。**
2. 有名管道(FIFO)
有名管道不同于匿名管道之處在于它提供了一個路徑名與之關(guān)聯(lián),以有名管道的文件形式存在于文件系統(tǒng)中屿聋,這樣空扎,即使與有名管道的創(chuàng)建進(jìn)程不存在親緣關(guān)系的進(jìn)程藏鹊,只要可以訪問該路徑,就能夠彼此通過有名管道相互通信转锈,因此盘寡,通過有名管道不相關(guān)的進(jìn)程也能交換數(shù)據(jù)。值的注意的是撮慨,有名管道嚴(yán)格遵循先進(jìn)先出(first in first out),對匿名管道及有名管道的讀總是從開始處返回數(shù)據(jù)竿痰,對它們的寫則把數(shù)據(jù)添加到末尾。
** 管道類似與數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列砌溺。**
**無名管道阻塞問題:無名管道無需顯示打開影涉,創(chuàng)建時直接返回文件描述符,在讀寫時需要確定對方的存在规伐,否則將退出蟹倾。如果當(dāng)前進(jìn)程向無名管道的一端寫數(shù)據(jù),必須確定另一端有某一進(jìn)程猖闪。如果寫入無名管道的數(shù)據(jù)超過其最大值鲜棠,寫操作將阻塞,如果管道中沒有數(shù)據(jù)培慌,讀操作將阻塞豁陆,如果管道發(fā)現(xiàn)另一端斷開,將自動退出检柬。**
** 有名管道阻塞問題:有名管道在打開時需要確實(shí)對方的存在献联,否則將阻塞竖配。即以讀方式打開某管道何址,在此之前必須一個進(jìn)程以寫方式打開管道,否則阻塞进胯。此外用爪,可以以讀寫(O_RDWR)模式打開有名管道,即當(dāng)前進(jìn)程讀胁镐,當(dāng)前進(jìn)程寫偎血,不會阻塞。**
3. 信號(Signal)
信號是Linux系統(tǒng)中用于進(jìn)程間互相通信或者操作的一種機(jī)制盯漂,信號可以在任何時候發(fā)給某一進(jìn)程颇玷,而無需知道該進(jìn)程的狀態(tài)。
如果該進(jìn)程當(dāng)前并未處于執(zhí)行狀態(tài)就缆,則該信號就有內(nèi)核保存起來帖渠,知道該進(jìn)程回復(fù)執(zhí)行并傳遞給它為止。
如果一個信號被進(jìn)程設(shè)置為阻塞竭宰,則該信號的傳遞被延遲空郊,直到其阻塞被取消是才被傳遞給進(jìn)程份招。
Linux系統(tǒng)中常用信號:
(1)SIGHUP:用戶從終端注銷,所有已啟動進(jìn)程都將收到該進(jìn)程狞甚。系統(tǒng)缺省狀態(tài)下對該信號的處理是終止進(jìn)程锁摔。
(2)SIGINT:程序終止信號。程序運(yùn)行過程中哼审,按Ctrl+C鍵將產(chǎn)生該信號谐腰。
(3)SIGQUIT:程序退出信號。程序運(yùn)行過程中棺蛛,按Ctrl+鍵將產(chǎn)生該信號怔蚌。
(4)SIGBUS和SIGSEGV:進(jìn)程訪問非法地址。
(5)SIGFPE:運(yùn)算中出現(xiàn)致命錯誤旁赊,如除零操作桦踊、數(shù)據(jù)溢出等。
(6)SIGKILL:用戶終止進(jìn)程執(zhí)行信號终畅。shell下執(zhí)行kill -9發(fā)送該信號籍胯。
(7)SIGTERM:結(jié)束進(jìn)程信號。shell下執(zhí)行kill 進(jìn)程pid發(fā)送該信號离福。
(8)SIGALRM:定時器信號杖狼。
(9)SIGCLD:子進(jìn)程退出信號。如果其父進(jìn)程沒有忽略該信號也沒有處理該信號妖爷,則子進(jìn)程退出后將形成僵尸進(jìn)程蝶涩。
信號來源
信號是軟件層次上對中斷機(jī)制的一種模擬,是一種異步通信方式絮识,
硬件來源:用戶按鍵輸入Ctrl+C退出绿聘、硬件異常如無效的存儲訪問等。
軟件終止:終止進(jìn)程信號次舌、其他進(jìn)程調(diào)用kill函數(shù)熄攘、軟件異常產(chǎn)生信號。
信號生命周期和處理流程
信號被某個進(jìn)程產(chǎn)生彼念,并設(shè)置此信號傳遞的對象(一般為對應(yīng)進(jìn)程的pid)挪圾,然后傳遞給操作系統(tǒng);如果對應(yīng)進(jìn)程沒有阻塞逐沙,操作系統(tǒng)將傳遞此信號哲思。目的進(jìn)程接收到此信號后,將根據(jù)當(dāng)前進(jìn)程對此信號設(shè)置的預(yù)處理方式吩案,暫時終止當(dāng)前代碼的執(zhí)行棚赔,保護(hù)上下文(主要包括臨時寄存器數(shù)據(jù),當(dāng)前程序位置以及當(dāng)前CPU的狀態(tài))、轉(zhuǎn)而執(zhí)行中斷服務(wù)程序忆嗜,執(zhí)行完成后在回復(fù)到中斷的位置己儒。
4. 消息(Message)隊(duì)列
消息隊(duì)列是存放在內(nèi)核中的消息鏈表,每個消息隊(duì)列由消息隊(duì)列標(biāo)識符表示捆毫。
消息隊(duì)列特點(diǎn)總結(jié):
(1)消息隊(duì)列是消息的鏈表,具有特定的格式,存放在內(nèi)存中并由消息隊(duì)列標(biāo)識符標(biāo)識.
(2)消息隊(duì)列允許一個或多個進(jìn)程向它寫入與讀取消息.
(3)管道和消息隊(duì)列的通信數(shù)據(jù)都是先進(jìn)先出的原則闪湾。
(4)消息隊(duì)列可以實(shí)現(xiàn)消息的隨機(jī)查詢,消息不一定要以先進(jìn)先出的次序讀取,也可以按消息的類型讀取.比FIFO更有優(yōu)勢。
(5)消息隊(duì)列克服了信號承載信息量少绩卤,管道只能承載無格式字 節(jié)流以及緩沖區(qū)大小受限等缺途样。
(6)目前主要有兩種類型的消息隊(duì)列:POSIX消息隊(duì)列以及System V消息隊(duì)列,系統(tǒng)V消息隊(duì)列目前被大量使用濒憋。系統(tǒng)V消息隊(duì)列是隨內(nèi)核持續(xù)的何暇,只有在內(nèi)核重起或者人工刪除時,該消息隊(duì)列才會被刪除凛驮。
5. 共享內(nèi)存(share memory)
使得多個進(jìn)程可以可以直接讀寫同一塊內(nèi)存空間裆站,是最快的可用IPC形式。
為了在多個進(jìn)程間交換信息黔夭,內(nèi)核專門留出了一塊內(nèi)存區(qū)宏胯,可以由需要訪問的進(jìn)程將其映射到自己的私有地址空間。進(jìn)程就可以直接讀寫這一塊內(nèi)存而不需要進(jìn)行數(shù)據(jù)的拷貝本姥,從而大大提高效率肩袍。延伸閱讀:Linux支持的主要三種共享內(nèi)存方式:mmap()系統(tǒng)調(diào)用、Posix(可移植性操作系統(tǒng)接口)共享內(nèi)存婚惫,以及System V(在內(nèi)核中維護(hù))共享內(nèi)存實(shí)踐氛赐。
6. 信號量(semaphore)
信號量是一個計數(shù)器,用于多進(jìn)程對共享數(shù)據(jù)的訪問先舷,信號量的意圖在于進(jìn)程間同步艰管。信號量是非負(fù)整型變量,除了初始化之外密浑,它只能通過兩個標(biāo)準(zhǔn)原子操作:wait(semap) , signal(semap) ;
為了獲得共享資源蛙婴,進(jìn)程需要執(zhí)行下列操作:
(1)創(chuàng)建一個信號量:這要求調(diào)用者指定初始值粗井,對于二值信號量來說尔破,它通常是1,也可是0浇衬。
(2)等待一個信號量:該操作會測試這個信號量的值懒构,如果小于0,就阻塞耘擂。也稱為P操作胆剧。申請
(3)掛出一個信號量:該操作將信號量的值加1,也稱為V操作。釋放
7. 套接字(socket)
Socket是應(yīng)用層和傳輸層之間的橋梁秩霍,套接字的特性由3個屬性確定篙悯,它們分別是:域、端口號铃绒、協(xié)議類型鸽照。
套接字是支持TCP/IP的網(wǎng)絡(luò)通信的基本操作單元,可以看做是不同主機(jī)之間的進(jìn)程進(jìn)行雙向通信的端點(diǎn)颠悬,簡單的說就是通信的兩方的一種約定矮燎,用套接字中的相關(guān)函數(shù)來完成通信過程。
(1)套接字的域
它指定套接字通信中使用的網(wǎng)絡(luò)介質(zhì)赔癌,一是AF_INET诞外,它指的是Internet網(wǎng)絡(luò)。另一個域AF_UNIX灾票,表示UNIX文件系統(tǒng)峡谊。
(2)套接字的端口號
每一個基于TCP/IP網(wǎng)絡(luò)通訊的程序(進(jìn)程)都被賦予了唯一的端口和端口號,端口是一個信息緩沖區(qū)刊苍,用于保留Socket中的輸入/輸出信息靖苇。
(3)套接字協(xié)議類型
一是流套接字,流套接字在域中通過TCP/IP連接實(shí)現(xiàn)班缰,同時也是AF_UNIX中常用的套接字類型贤壁。流套接字提供的是一個有序、可靠埠忘、雙向字節(jié)流的連接脾拆,因此發(fā)送的數(shù)據(jù)可以確保不會丟失、重復(fù)或亂序到達(dá)莹妒,而且它還有一定的出錯后重新發(fā)送的機(jī)制名船。
二個是數(shù)據(jù)報套接字,它不需要建立連接和維持一個連接旨怠,它們在域中通常是通過UDP/IP協(xié)議實(shí)現(xiàn)的渠驼。它對可以發(fā)送的數(shù)據(jù)的長度有限制,數(shù)據(jù)報作為一個單獨(dú)的網(wǎng)絡(luò)消息被傳輸,它可能會丟失鉴腻、復(fù)制或錯亂到達(dá)迷扇,UDP不是一個可靠的協(xié)議,但是它的速度比較高爽哎,因?yàn)樗⒉恍枰偸且⒑途S持一個連接蜓席。
三是原始套接字,原始套接字允許對較低層次的協(xié)議直接訪問课锌,比如IP厨内、 ICMP協(xié)議,它常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn),或者訪問現(xiàn)有服務(wù)中配置的新設(shè)備雏胃。
套接字通信的建立
服務(wù)器端
(1)創(chuàng)建socket请毛,不能與其他的進(jìn)程共享。
(2)給套接字起名為bind瞭亮,然后服務(wù)器進(jìn)程就開始等待客戶連接到這個套接字获印。
(3)接下來,系統(tǒng)調(diào)用listen來創(chuàng)建一個隊(duì)列并將其用于存放來自客戶的進(jìn)入連接街州。
(4)最后兼丰,服務(wù)器通過系統(tǒng)調(diào)用accept來接受客戶的連接。它會創(chuàng)建一個與原有的命名套接不同的新套接字唆缴,這個套接字只用于與這個特定客戶端進(jìn)行通信鳍征,而命名套接字(即原先的套接字)則被保留下來繼續(xù)處理來自其他客戶的連接(建立客戶端和服務(wù)端的用于通信的流,進(jìn)行通信)面徽。
客戶端
(1)創(chuàng)建一個未命名的socket艳丛,然后將服務(wù)器的命名套接字作為一個地址來調(diào)用connect與服務(wù)器建立連接。
(2)一旦連接建立趟紊,我們就可以像使用底層的文件描述符那樣用套接字來實(shí)現(xiàn)雙向數(shù)據(jù)的通信(通過流進(jìn)行數(shù)據(jù)傳輸)氮双。
linux內(nèi)核態(tài)和用戶態(tài)
內(nèi)核從本質(zhì)上看是一種軟件——控制計算機(jī)的硬件資源,并提供上層應(yīng)用程序運(yùn)行的環(huán)境霎匈。
內(nèi)核態(tài)和用戶態(tài)的最大區(qū)別在于特權(quán)級不同戴差。運(yù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、外圍設(shè)備中斷(中斷)
linux中g(shù)rep墨吓、awk球匕、sed、fork
答:awk帖烘、grep亮曹、sed是linux操作文本的三大利器,合稱文本三劍客秘症,也是必須掌握的linux命令之一照卦。三者的功能都是處理文本,但側(cè)重點(diǎn)各不相同历极,其中屬awk功能最強(qiáng)大窄瘟,但也最復(fù)雜衷佃。grep更適合單純的查找或匹配文本趟卸,sed更適合編輯匹配到的文本,awk更適合格式化文本,對文本進(jìn)行較復(fù)雜格式處理锄列。
grep功能:用于過濾/搜索特定字符图云。可使用正則表達(dá)式 能多種命令配合使用邻邮。
fork函數(shù):通過系統(tǒng)調(diào)用創(chuàng)建一個與原來進(jìn)程幾乎完全相同的進(jìn)程竣况,也就是兩個進(jìn)程可以做完全相同的事,但如果初始參數(shù)或者傳入的變量不同筒严,兩個進(jìn)程也可以做不同的事丹泉。
1)在父進(jìn)程中,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID鸭蛙;
2)在子進(jìn)程中摹恨,fork返回0;
3)如果出現(xiàn)錯誤娶视,fork返回-1晒哄;
信號量及PV操作
答:
信號量S>=0時肪获,S表示可用資源的數(shù)量寝凌。執(zhí)行一次P操作意味著請求分配一個單位資源,因此S的值減1孝赫;當(dāng)S<0時较木,表示已經(jīng)沒有可用資源,請求者必須等待別的進(jìn)程釋放該類資源青柄,它才能運(yùn)行下去劫映。
而執(zhí)行一個V操作意味著釋放一個單位資源,因此S的值加1刹前;若S<0泳赋,表示有某些進(jìn)程正在等待該資源,因此要喚醒一個等待狀態(tài)的進(jìn)程喇喉,使之運(yùn)行下去祖今。
使用PV操作實(shí)現(xiàn)同步操作
用一個信號量S與一個消息(或者資源)聯(lián)系起來,當(dāng)信號量的值為0時拣技,表示期望的消息尚未產(chǎn)生(或者資源不可用)千诬;當(dāng)信號量的值S>0時,表示期望的消息已經(jīng)存在(有資源可用)膏斤。用P V操作實(shí)現(xiàn)進(jìn)程同步時徐绑,調(diào)用P操作測試消息是否到達(dá)(是否有資源可用),調(diào)用V操作發(fā)送消息(添加資源)莫辨。
使用PV操作實(shí)現(xiàn)進(jìn)程(線程)同步時:
1.分析進(jìn)程(線程)間的制約關(guān)系傲茄,確定信號量種類毅访。在保持進(jìn)程(線程)間有正確的同步關(guān)系情況下,哪個進(jìn)程先執(zhí)行盘榨,哪些進(jìn)程后執(zhí)行喻粹,彼此間通過什么資源(信號量)進(jìn)行協(xié)調(diào),從而明確要設(shè)置哪些信號量草巡。
2.信號量的初值與相應(yīng)資源的數(shù)量有關(guān)守呜,也與P、V操作在程序代碼中出現(xiàn)的位置有關(guān)山憨。
3.同一信號量的P查乒、V操作一般必須要成對出現(xiàn),但它們分別在不同的進(jìn)程(線程)代碼中郁竟。
使用PV操作實(shí)現(xiàn)互斥操作時:
1.同一信號量的P侣颂、V操作必須要成對出現(xiàn),且出現(xiàn)在同一的進(jìn)程(線程)代碼中枪孩。
2.每個互斥的P憔晒、V操作必須成對出現(xiàn),先做P操作蔑舞,進(jìn)臨界區(qū)拒担,后做V操作,出臨界區(qū)攻询。若有多個分支从撼,要認(rèn)真檢查其成對性, 否則會造成死鎖钧栖。
3.P低零、V操作應(yīng)分別緊靠臨界區(qū)的頭尾部,臨界區(qū)的代碼應(yīng)盡可能短拯杠,不能有死循環(huán)掏婶。
互斥信號量的初值一般為1。
吞吐率和吞吐量潭陪、事務(wù)TPS
答:單位時間內(nèi)服務(wù)器處理的請求數(shù)來描述其并發(fā)處理能力雄妥。稱之為吞吐率(Throughput),單位是 “req/s”依溯。吞吐率特指 Web 服務(wù)器單位時間內(nèi)處理的請求數(shù)老厌。另一種描述,吞吐率是單位時間內(nèi)網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)量黎炉,也可以指單位時間內(nèi)處理客戶請求數(shù)量枝秤。它是衡量網(wǎng)絡(luò)性能的重要指標(biāo)。通常情況下慷嗜,吞吐率 “字節(jié)數(shù)/秒” 來衡量淀弹。
吞吐量丹壕,是指在一次性能測試過程中網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)量的總和。
事物是用戶某一步或幾步操作的集合垦页。
TPS是指每秒鐘系統(tǒng)能夠處理事務(wù)或交易的數(shù)量雀费,它是衡量系統(tǒng)處理能力的重要指標(biāo)干奢。
網(wǎng)關(guān)是什么痊焊?
答:網(wǎng)關(guān)又稱為協(xié)議轉(zhuǎn)換器。網(wǎng)關(guān)的功能是實(shí)現(xiàn)網(wǎng)絡(luò)之間的相互連接忿峻。網(wǎng)關(guān)不僅可以讓廣域網(wǎng)之間相互連接薄啥,也可以讓局域網(wǎng)之間相互連接。網(wǎng)關(guān)在計算機(jī)和設(shè)備之間起轉(zhuǎn)換的作用逛尚,相當(dāng)于一個翻譯器垄惧,可以使不同的協(xié)議、語言绰寞、數(shù)據(jù)在不同的系統(tǒng)之間進(jìn)行轉(zhuǎn)換到逊。
DHCP協(xié)議
答:對一個臨時加入的設(shè)備,它是不知道自己的ip地址是多少的滤钱。這個設(shè)備在加入時會先采用UDP協(xié)議廣播DHCP發(fā)現(xiàn)報文觉壶,通過這個DHCP發(fā)現(xiàn)報文來查找DHCP服務(wù)在哪。這個設(shè)備使用了UDP協(xié)議件缸,那肯定使用了IP協(xié)議铜靶,但是他的IP地址是什么確定的呢?他是通過把主機(jī)號全填寫為1他炊,來發(fā)送廣播報文争剿。DHCP服務(wù)器收到這個報文以后,就會發(fā)出DHCP提供報文痊末,告訴這個設(shè)備可以提供IP地址蚕苇。設(shè)備收到DHCP提供報文之后,發(fā)出請求報文凿叠,DHCP服務(wù)器收到之后就回應(yīng)并提供IP地址捆蜀。
線程間的通信方式:
答:線程通信是通過讀寫同一進(jìn)程的數(shù)據(jù)進(jìn)行通信的。
鎖機(jī)制:包括互斥鎖幔嫂、條件變量辆它、讀寫鎖
互斥鎖:提供了以排他方式防止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。
讀寫鎖:允許多個線程同時共享數(shù)據(jù)履恩,而對寫操作是互斥的锰茉。
條件變量:可以以原子的方式阻塞進(jìn)程,直到某個特定條件為真為止切心。對條件的測試是在互斥鎖的保護(hù)下進(jìn)行的飒筑。條件變量始終與互斥鎖一起使用片吊。
信號量機(jī)制(Semaphore):包括無名進(jìn)程信號量和命名線程信號量
信號機(jī)制(Signal):類似進(jìn)程間的信號處理
輸入一個url之后的具體過程:
答:瀏覽器中輸入一個URL:
(1) 首先瀏覽器要將URL解析為IP地址,解析域名就要用到DNS協(xié)議协屡,首先主機(jī)會查詢DNS的緩存俏脊,如果沒有給本地DNS發(fā)送查詢請求。DNS的查詢方式有兩種肤晓,一種是遞歸查詢爷贫,一種是迭代查詢。如果是迭代查詢补憾,本地的DNS服務(wù)器漫萄,向根域名服務(wù)器發(fā)出查詢請求,根域名服務(wù)器告知該域名的一級域名服務(wù)器盈匾,然后本地服務(wù)器給該一級域名服務(wù)器發(fā)送查詢請求腾务,然后依次類推直到查詢到該域名的IP地址。DNS服務(wù)器是基于UDP的削饵,因此會用到UDP協(xié)議岩瘦。
(2) 得到IP地址以后,瀏覽器就要與服務(wù)器建立一個HTTP連接窿撬,因此要用到HTTP協(xié)議启昧,HTTP協(xié)議報文格式上面已經(jīng)提及到。HTTP生成一個get請求報文尤仍,將該報文傳給tcp層處理箫津。如果采用到HTTPS還會對數(shù)據(jù)進(jìn)行加密。TCP層如果有需要先將HTTP數(shù)據(jù)包分片宰啦,分片依據(jù)路徑MTU和MSS苏遥。
(3) TCP的數(shù)據(jù)包然后會發(fā)送給IP層,用到IP協(xié)議赡模。IP層通過路由選擇田炭,一跳一跳發(fā)送到目的地址。當(dāng)然在一個網(wǎng)絡(luò)內(nèi)的尋址是通過以太網(wǎng)協(xié)議實(shí)現(xiàn)漓柑,以太網(wǎng)協(xié)議需要知道目的IP地址的物理地址教硫,有需要ARP協(xié)議。
fork函數(shù)
**答:fork調(diào)用的一個奇妙之處就是它僅僅被調(diào)用一次辆布,卻能夠返回兩次瞬矩,它可能有三種不同的返回值:
在父進(jìn)程中,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID锋玲;
在子進(jìn)程中景用,fork返回0;
如果出現(xiàn)錯誤惭蹂,fork返回一個負(fù)值伞插;
fork出錯可能有兩種原因:
(1)當(dāng)前的進(jìn)程數(shù)已經(jīng)達(dá)到了系統(tǒng)規(guī)定的上限割粮,這時errno的值被設(shè)置為EAGAIN。
(2)系統(tǒng)內(nèi)存不足媚污,這時errno的值被設(shè)置為ENOMEM舀瓢。(關(guān)于errno的意義,請參考本系列的第一篇文章耗美。)
**
fork函數(shù)和vfork函數(shù)的區(qū)別
**
- fork ():子進(jìn)程拷貝父進(jìn)程的數(shù)據(jù)段京髓,代碼段
vfork ():子進(jìn)程與父進(jìn)程共享數(shù)據(jù)段 - fork ()父子進(jìn)程的執(zhí)行次序不確定
vfork 保證子進(jìn)程先運(yùn)行,在調(diào)用exec 或exit 之前與父進(jìn)程數(shù)據(jù)是共享的,在它調(diào)用exec
或exit 之后父進(jìn)程才可能被調(diào)度運(yùn)行幽歼。 - vfork ()保證子進(jìn)程先運(yùn)行朵锣,在她調(diào)用exec 或exit 之后父進(jìn)程才可能被調(diào)度運(yùn)行谬盐。如果在
調(diào)用這兩個函數(shù)之前子進(jìn)程依賴于父進(jìn)程的進(jìn)一步動作甸私,則會導(dǎo)致死鎖。
**
孤兒進(jìn)程飞傀、僵尸進(jìn)程
孤兒進(jìn)程
一個父進(jìn)程退出皇型,而它的一個或多個子進(jìn)程還在運(yùn)行,那么這些子進(jìn)程將成為孤兒進(jìn)程砸烦。
孤兒進(jìn)程將被 init 進(jìn)程(進(jìn)程號為 1)所收養(yǎng)弃鸦,并由 init 進(jìn)程對它們完成狀態(tài)收集工作。
由于孤兒進(jìn)程會被 init 進(jìn)程收養(yǎng)幢痘,所以孤兒進(jìn)程不會對系統(tǒng)造成危害唬格。
僵尸進(jìn)程
一個子進(jìn)程的進(jìn)程描述符在子進(jìn)程退出時不會釋放,只有當(dāng)父進(jìn)程通過 wait() 或 waitpid() 獲取了子進(jìn)程信息后才會釋放颜说。如果子進(jìn)程退出购岗,而父進(jìn)程并沒有調(diào)用 wait() 或 waitpid(),那么子進(jìn)程的進(jìn)程描述符仍然保存在系統(tǒng)中门粪,這種進(jìn)程稱之為僵尸進(jìn)程喊积。
僵尸進(jìn)程通過 ps 命令顯示出來的狀態(tài)為 Z(zombie)。
系統(tǒng)所能使用的進(jìn)程號是有限的玄妈,如果產(chǎn)生大量僵尸進(jìn)程乾吻,將因?yàn)闆]有可用的進(jìn)程號而導(dǎo)致系統(tǒng)不能產(chǎn)生新的進(jìn)程。
要消滅系統(tǒng)中大量的僵尸進(jìn)程拟蜻,只需要將其父進(jìn)程殺死绎签,此時僵尸進(jìn)程就會變成孤兒進(jìn)程,從而被 init 所收養(yǎng)酝锅,這樣 init 就會釋放所有的僵尸進(jìn)程所占有的資源诡必,從而結(jié)束僵尸進(jìn)程。
軟連接和硬鏈接
軟連接屈张,其實(shí)就是新建立一個文件擒权,這個文件就是專門用來指向別的文件的(那就和windows 下的快捷方式的那個文件有很接近的意味)袱巨。軟鏈接產(chǎn)生的是一個新的文件,但這個文件的作用就是專門指向某個文件的,刪了這個軟連接文件,那就等于不需要這個連接停忿,和原來的存在的實(shí)體原文件沒有任何關(guān)系切蟋,但刪除原來的文件,則相應(yīng)的軟連接不可用(cat那個軟鏈接文件抄淑,則提示“沒有該文件或目錄“)
硬連接是不會建立inode的,他只是在文件原來的inode link count域再增加1而已,也因此硬鏈接是不可以跨越文件系統(tǒng)的咒林。相反是軟連接會重新建立一個inode,當(dāng)然inode的結(jié)構(gòu)跟其他的不一樣爷光,他只是一個指明源文件的字符串信息垫竞。一旦刪除源文件,那么軟連接將變得毫無意義蛀序。而硬鏈接刪除的時候欢瞪,系統(tǒng)調(diào)用會檢查inode link count的數(shù)值,如果他大于等于1徐裸,那么inode不會被回收遣鼓。因此文件的內(nèi)容不會被刪除。
硬鏈接實(shí)際上是為文件建一個別名重贺,鏈接文件和原文件實(shí)際上是同一個文件骑祟。可以通過ls -i來查看一下气笙,這兩個文件的inode號是同一個次企,說明它們是同一個文件;而軟鏈接建立的是一個指向健民,即鏈接文件內(nèi)的內(nèi)容是指向原文件的指針抒巢,它們是兩個文件。
多線程和多進(jìn)程的優(yōu)點(diǎn):
答:
多線程的優(yōu)點(diǎn):內(nèi)存和資源共享更為方便秉犹、高效蛉谜,同步和通信簡單。因?yàn)槭菍儆谕粋€進(jìn)程崇堵,地址空間是相同的型诚,所以在上下文切換時更為方便。
多進(jìn)程的優(yōu)點(diǎn):更強(qiáng)的容錯性鸳劳,進(jìn)程之間互不影響狰贯。更好的多核可伸縮性。
在linux中,如果需要進(jìn)行大量共享數(shù)據(jù)或者頻繁通信時涵紊,使用多線程傍妒,其他情況下盡量使用多進(jìn)程,能用多進(jìn)程就用多進(jìn)程摸柄。
select颤练、poll、epoll
**