關於操作系統和網絡編程的一些小面試題目~

1.作業、進程、線程和管道之間的關係:
作業:用戶在一次解題或一個事務處理中要求計算機系統所做工作的集合。它包含了用戶程序、所需要的數據及控制命令等;作業是由一系列有序的步驟組成的;

進程:一個程序在一個數據集合上的一次運行過程。所以一個程序在不同的數據集合上運行,乃至一個程序在同樣數據集合上的多次運行都是不同的進程;

線程:線程是進程中一個實體,是被系統獨立調度和執行的基本單位;

管道:管道實際上是定義了一個數據結構和在該數據結構上的能爲併發進程所執行的一組操作,這組操作能同步進程和改變管道中的數據。

2.進程和線程的差別:
進程是程序的一次執行;線程可以理解爲進程中執行的程序片段。
進程間是獨立的,主要體現在內存空間、上下文環境上;線程運行在進程空間內。一般來講,進程無法突破進程邊界獲取其他進程的存儲空間;而線程可以;因爲同一進程內的多個線程是共享一個內存空間的;

同一個進程中的兩段代碼不能夠同時執行,除非引入線程;

線程是屬於進程的,當進程退出時該進程所產生的線程都會被強制退出並清除其資源。

線程和進程都有優先級。

進程間可以通過IPC通信,但線程不可以。

3.指針和引用的差別?
(1)非空區別:在任何情況下都不能使用指向空值的引用。一個引用必須總是指向某些對象。因此如果你使用一個變量並讓它指向一個對象,但是變量在某些時候也可能不值任何對象,這是你應該把變量聲明爲指針。因爲這樣你可以賦空值給該變量。

(2)合法性區別:在使用引用之前不需要測試它的合法性,相反,指針則應該總是被測試,防止其爲空;

(3)可修改性區別:指針和引用的另外一個重要的區別是指針可以重新被賦值並指向另外一個不同的對象;但是引用則總是旨在初始化時被指定的對象,以後也不能改變,但是指定的對象其內容可以改變;

(4)應用區別:總的來說,在以下情況下應該使用指針:一是考慮到存在不指向任何對象的可能(在這種情況下,能夠設置指針爲空),二是需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指針的指向)。如果總是指向一個對象並且一旦指向一個對象後就不會改變指向,那麼應該使用引用。

4.OSI參考模型分爲物理層、數據鏈路層、網絡層、會話層、表示層和應用層:
物理層涉及在信道上傳輸的原始比特流;
數據鏈路層的主要任務是加強物理層傳輸原始比特流的功能,使之對應的網絡顯現爲一條無錯線路。發送包把輸入數據封裝在數據幀,按順序傳送出去並處理接受黨會送的確認幀;
網絡層關係到子網的運行控制,其中一個關鍵問題是確認從源端到目的端如何選擇路由;
傳輸層的基本功能是從會話層接受數據並且把其分成較小的單元傳遞給網絡層;
會話層允許不同機器上的用戶建立會話關係;
表示層用來數據格式化、數據轉化;
應用層爲應用程序提供服務,包含着大量人們普遍需要的協議。

5.如何編寫Socket套接字?
服務端程序編寫:
(1)調用ServerSocket(int port)創建一個服務器端套接字,並綁定到指定端口上;
(2)調用accept(),監聽連接請求;
(3)調用Socekt類的getOutStream()和getInputStrem()獲取輸出流和輸入流,並開始網絡數據的發送和接收;
(4)關閉通信套接字Socket.close()。

客戶端程序編寫:
(1)調用Socket()創建一個流套接字,並連接到服務器端;
(2)調用Socekt類的getOutStream()和getInputStrem()獲取輸出流和輸入流,並開始網絡數據的發送和接收;
(3)關閉通信套接字Socket.close()。

6.TCP的三次握手和四次揮手:
三次握手:
第一次握手:起初兩端都處於CLOSED關閉狀態,Client將標誌位SYN置爲1,隨機產生一個值seq=x,並將該數據包發送給Server,Client進入SYN-SENT狀態,等待Server確認;
第二次握手:Server收到數據包後由標誌位SYN=1得知Client請求建立連接,Server將標誌位SYN和ACK都置爲1,ack=x+1,隨機產生一個值seq=y,並將該數據包發送給Client以確認連接請求,Server進入SYN-RCVD狀態,此時操作系統爲該TCP連接分配TCP緩存和變量;
第三次握手:Client收到確認後,檢查ack是否爲x+1,ACK是否爲1,如果正確則將標誌位ACK置爲1,ack=y+1,並且此時操作系統爲該TCP連接分配TCP緩存和變量,並將該數據包發送給Server,Server檢查ack是否爲y+1,ACK是否爲1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client和Server就可以開始傳輸數據。
在這裏插入圖片描述
四次揮手:
(1)Client的應用進程先向其TCP發出連接釋放報文段(FIN=1,序號seq=u),並停止再發送數據,主動關閉TCP連接,進入FIN-WAIT-1(終止等待1)狀態,等待Server的確認。B收到連接釋放報文段後即發出確認報文段,(ACK=1,確認號ack=u+1,序號seq=v),Server進入CLOSE-WAIT(關閉等待)狀態,此時的TCP處於半關閉狀態,Client到Server的連接釋放。
(2)Client收到Serve的確認後,進入FIN-WAIT-2(終止等待2)狀態,等待Serve發出的連接釋放報文段。
(3)在Serve沒有要向Client發出的數據的情況下,Serve發出連接釋放報文段(FIN=1,ACK=1,序號seq=w,確認號ack=u+1),B進入LAST-ACK(最後確認)狀態,等待A的確認。
(4)Client收到Serve的連接釋放報文段後,對此發出確認報文段(ACK=1,seq=u+1,ack=w+1),Client進入TIME-WAIT(時間等待)狀態。此時TCP未釋放掉,需要經過時間等待計時器設置的時間2MSL後,Client才進入CLOSED狀態。

在這裏插入圖片描述

爲什麼連接的時候是三次握手,關閉的時候卻是四次握手?
答:因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章