面試參考別人總結

2021-08-08 08:42:44 字數 3416 閱讀 2019

1. 程序和執行緒的區別是什麼?程序間通訊如何實現,執行緒間通訊如何實現?

程序通訊的方式:1管道、有名管道2訊號3訊號量4共享記憶體5訊息佇列6套接字;

# 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。

# 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。

# 訊號量( semophore ) : 訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。

# 訊息佇列( message queue ) : 訊息佇列是由訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

# 訊號 ( sinal ) : 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。

# 共享記憶體( shared memory ) :共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問。共享記憶體是最快的 ipc 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步和通訊。

# 套接字( socket ) : 套接字也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同主機間的程序通訊。

程序間通訊的缺點:程序間通訊較為複雜,需要通過作業系統(也就是核心)呼叫;多執行緒共享位址空間和資料空間,所以多個執行緒間的通訊是乙個執行緒的資料可以直接提供給其他執行緒使用,而不必通過作業系統(也就是核心的排程)。

執行緒通訊方式:1鎖機制   2訊號量    3訊號;

由於同乙個程序之間的執行緒共享程序的全域性變數和記憶體,因此執行緒間通訊簡單,可以直接通訊。但正是因為執行緒之間共享資料,所以會造成某些共享資料的互斥問題。

# 鎖機制:包括互斥鎖、條件變數、讀寫鎖

*互斥鎖提供了以排他方式防止資料結構被併發修改的方法。

*讀寫鎖允許多個執行緒同時讀共享資料,而對寫操作是互斥的。

*條件變數可以以原子的方式阻塞程序,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變數始終與互斥鎖一起使用。

# 訊號量機制(semaphore):包括無名執行緒訊號量和命名執行緒訊號量

# 訊號機制(signal):類似程序間的訊號處理

執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程序通訊中的用於資料交換的通訊機制。

2.死鎖

程序之間由於競爭資源而造成的一種互相等待的狀態。

4個必要條件

獨佔、不可剝奪、請求和保持、迴圈等待;

思死鎖的處理策略:

1.預防死鎖  :破壞四個必要條件之一即可 預先靜態分配資源(破壞請求和保持);順序資源分配法(破壞迴圈等待)

2.死鎖避免: 銀行家演算法

3.死鎖檢測和解除: 資源剝奪法(掛起某些死鎖程序,將資源分配給其他死鎖程序);撤銷程序法(撤銷乙個或一部分死鎖程序並剝奪資源);程序回退法(乙個或多個程序回退到足以避免死鎖的地步,回退時資源放棄資源)

3.socket通訊基本原理

1. 本機上,區分兩個程序是用pid; 但在網路上,是用ip位址+協議+埠號來區分兩個不同程序。

2.利用socket建立連線的過程: 

(1)伺服器監聽(伺服器端處於等待鏈結);

(2)客戶端請求(客戶端發出連線請求);

(3)連線確認 (伺服器端收到請求後響應此請求,建立乙個執行緒,把套接字描述傳送給客戶端,客戶端確認此描述,連線建立)

3. 伺服器端: 建立socket;為socket繫結ip位址和埠號(bind);伺服器端監聽埠(listen);當伺服器收到客戶端連線請求後,被動開啟,開始                       接受客戶端請求,並進入阻塞狀態(accept方法會阻塞伺服器端直到 收到客戶端傳送過來的連線狀態資訊,才能開始連線下乙個客戶端)

伺服器端讀取資訊(recv)    ; 伺服器端關閉(close);

客戶端: 客戶端建立socket;根據伺服器端的ip位址和埠連線伺服器端socket(connect); 連線成功,向伺服器傳送連線狀態資訊;客戶端向socket寫入資訊(send);客戶端關閉(close)

4。 accept函式詳解:

accept函式主要用於伺服器端,一般位於listen函式之後,缺省會阻塞程序,直到有乙個客戶請求連線,建立好連線後,它返回的乙個新的套接字 socketfd_new ,此後,伺服器端即可使用這個新的套接字socketfd_new與該客戶端進行通訊,而sockfd 則繼續用於監聽其他客戶端的連線請求。

伺服器端的埠在bind的時候已經繫結到了監聽套接字socetfd所描述的物件上,accept函式新建立的socket物件其實並沒有進行埠的占有,而是複製了socetfd的本地ip和埠號,並且記錄了連線過來的客戶端的ip和埠號。

由於tcp/ip協議棧是維護著乙個接收和傳送緩衝區的。在接收到來自客戶端的資料報後,伺服器端的tcp/ip協議棧應該會做如下處理:如果收到的是請求連線的資料報,則傳給監聽著連線請求埠的socetfd套接字,進行accept處理;如果是已經建立過連線後的客戶端資料報,則將資料放入接收緩衝區。這樣,當伺服器端需要讀取指定客戶端的資料時,則可以利用socketfd_new 套接字通過recv或者read函式到緩衝區裡面去取指定的資料(因為socketfd_new代表的socket物件記錄了客戶端ip和埠,因此可以鑑別)。

5. listen()維護兩個佇列,乙個是未完成三次握手的,乙個是已完成三次握手的,accept()是從已完成三次握手的佇列中取出乙個而已!

backlog引數的意義:預設最大的等待佇列長度

listen只是把套接字從主動變為被動,並限制鏈結數;剩下的問題就是accept的,它會檢測的;listen意思是監聽:但是它不是一直在監聽,accept才是;

理解:listen函式不會阻塞,它只是相當於把socket的屬性更改為被動連線,可以接收其他程序的連線。listen偵聽的過程並不是一直阻塞,直到有客戶端請求連線才會返回,它只是設定好socket的屬性之後就會返回。監聽的過程實質由作業系統完成。但是accept會阻塞(也可以設定為非阻),如果listen的套接字對應的連線請求隊列為空(沒有客戶端連線請求),它會一直阻塞等待。

6.多路復用:

io多路復用,用於解決併發情況下socket通訊問題。也即解決對多個i/o監聽時,乙個i/o阻塞影響其他i/o的問題。典型應用nginx

7.處理客戶端的併發請求

(1)使用多執行緒/多程序模型

(2)使用io多路復用模型

(3)使用多執行緒 + io多路復用模型 8

. select需要驅動程式的支援,驅動程式實現fops內的poll函式。select通過每個裝置檔案對應的poll函式提供的資訊判斷當前是否有資源可用(如可讀或寫),如果有的話則返回可用資源的檔案描述符個數,沒有的話則睡眠,等待有資源變為可用時再被喚醒繼續執行。

別人技術面試總結 一

技術面試官一所提 0.談談物件導向及對繼承 多型 封裝的認識 1.虛方法的作用 2.使用多執行緒常見的問題 3.委託及其呼叫 4.remoting webservice wcf的實現原理 技術面試官二所提 5.常見的資料庫安全方面的問題,及其解決方法 6.sql server資料庫中的事務 7.物件...

訊號量的分類(參考別人,自己總結)

首先,訊號量分為核心訊號量和使用者程序訊號量。一 核心訊號量 1 初始化 void sema init struct semaphore sem,int val void init mutex struct semaphore sem 將sem的值置為1,表示資源空閒 void init mutex...

CCF 201409 4 參考別人 100

201409 4 試題名稱 最優配餐 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 棟棟最近開了一家餐飲連鎖店,提供外賣服務。隨著連鎖店越來越多,怎麼合理的給客戶送餐成為了乙個急需解決的問題。棟棟的連鎖店所在的區域可以看成是乙個n n的方格圖 如下圖所示 方格的格點上的位置上可...