注意:(重點 必須從cpu排程,上下文切換,資料共享,多核cup利用率,資源占用,等等各方面回答,然後有乙個問題必須會被問到:哪些東西是乙個執行緒私有的?答案中必須包含暫存器,否則悲催)!
1)程序資料是分開的:共享複雜,需要用ipc(程序間通訊),同步簡單;多執行緒共享程序資料:共享簡單,同步複雜
2)程序建立、銷毀、切換複雜,速度慢 ;執行緒建立、銷毀、切換簡單,速度快
3)程序占用記憶體多, cpu利用率低;執行緒占用記憶體少, cpu利用率高
4)程序程式設計簡單,除錯簡單;執行緒程式設計複雜,除錯複雜
5)程序間不會相互影響 ;執行緒乙個執行緒掛掉將導致整個程序掛掉
6)程序適應於多核、多機分布;執行緒適用於多核
執行緒所私有的:
執行緒id、暫存器的值、棧、執行緒的優先順序和排程策略、執行緒的私有資料、訊號遮蔽字、errno變數(存放錯誤碼的全域性變數 errno)
a.互斥鎖(mutex)b.遞迴鎖 c.自旋鎖 d.讀寫鎖
當鎖被其他執行緒占用時,其他執行緒並不是睡眠狀態,而是不停的消耗cpu,獲取鎖;互斥鎖則不然,保持睡眠,直到互斥鎖被釋放啟用。
自旋鎖,遞迴呼叫容易造成死鎖,對長時間才能獲得到鎖的情況,使用自旋鎖容易造成cpu效率低,只有核心可搶占式或smp(對稱多處理器)情況下才真正需要自旋鎖。
1).管道 2)訊息佇列 3)共享記憶體 4)訊號量 5)套接字 6)條件變數
應盡量和cpu核數相等或者為cpu核數+1的個數
原子操作是指不會被執行緒排程機制打斷的操作;這種操作一旦開始,就一直執行到結束,中間不會有任何 context switch。
7.網路程式設計設計模式,reactor/proactor/半同步半非同步模式?
reactor模式:同步阻塞i/o模式,註冊對應讀寫事件處理器,等待事件發生進而呼叫事件處理器處理事件。 proactor模式:非同步i/o模式。reactor和proactor模式的主要區別就是真正的讀取和寫入操作是有誰來完成的,reactor中需要應用程式自己讀取或者寫入資料,proactor模式中,應用程式不需要進行實際讀寫過程。
reactor是:
主線程往epoll核心上註冊socket讀事件,主線程呼叫epoll_wait等待socket上有資料可讀,當socket上有資料可讀的時候,主線程把socket可讀事件放入請求佇列。睡眠在請求佇列上的某個工作執行緒被喚醒,處理客戶請求,然後往epoll核心上註冊socket寫請求事件。主線程呼叫epoll_wait等待寫請求事件,當有事件可寫的時候,主線程把socket可寫事件放入請求佇列。睡眠在請求佇列上的工作執行緒被喚醒,處理客戶請求。
proactor:
主線程呼叫aio_read函式向核心註冊socket上的讀完成事件,並告訴核心使用者讀緩衝區的位置,以及讀完成後如何通知應用程式,主線程繼續處理其他邏輯,當socket上的資料被讀入使用者緩衝區後,通過訊號告知應用程式資料已經可以使用。應用程式預先定義好的訊號處理函式選擇乙個工作執行緒來處理客戶請求。工作執行緒處理完客戶請求之後呼叫aio_write函式向核心註冊socket寫完成事件,並告訴核心寫緩衝區的位置,以及寫完成時如何通知應用程式。主線程處理其他邏輯。當使用者快取區的資料被寫入socket之後核心向應用程式傳送乙個訊號,以通知應用程式資料已經傳送完畢。應用程式預先定義的資料處理函式就會完成工作。
半同步半非同步模式:
上層的任務(如:資料庫查詢,檔案傳輸)使用同步i/o模型,簡化了編寫並行程式的難度。
而底層的任務(如網路控制器的中斷處理)使用非同步i/o模型,提供了執行效率。
有可能乙個執行緒更新的資料已經被另外乙個執行緒更新了,更新的資料就會出現異常,可以加鎖,保證資料更新只會被乙個執行緒完成。
某個套接字集合中沒有準備好,可能會select記憶體用fd_clr清為0.
1.使用定時器;(最常用也最有效的一種方法)
2.採用非阻塞模式:設定非阻塞,返回之後用select檢測狀態。
keepalive,是在tcp中乙個可以檢測死連線的機制。
1).如果主機可達,對方就會響應ack應答,就認為是存活的。
2).如果可達,但應用程式退出,對方就發rst應答,傳送tcp撤消連線。
3).如果可達,但應用程式崩潰,對方就發fin訊息。
4).如果對方主機不響應ack, rst,繼續傳送直到超時,就撤消連線。預設二個小時。
1.socket接收緩衝區中已經接收的資料的位元組數大於等於socket接收緩衝區低潮限度的當前值;對這樣的socket的讀操作不會阻塞,並返回乙個大於0的值(準備好讀入的資料的位元組數).
2.連線的讀一半關閉(即:接收到對方發過來的fin的tcp連線),並且返回0;
3.socket收到了對方的connect請求已經完成的連線數為非0.這樣的soocket處於可讀狀態;
4.異常的情況下socket的讀操作將不會阻塞,並且返回乙個錯誤(-1)。
1).因為udp可以是一對一,多對一,一對多,或者多對多的通訊,所以每次呼叫sendto()/recvfrom()時都必須指定目標ip和埠號。通過呼叫connect()建立乙個端到端的連線,就可以和tcp一樣使用send()/recv()傳遞資料,而不需要每次都指定目標ip和埠號。但是它和tcp不同的是它沒有三次握手的過程。
2).可以通過在已建立連線的udp套接字上,呼叫connect()實現指定新的ip位址和埠號以及斷開連線。
使用定時器(適合有資料流動的情況);
使用socket選項so_keepalive(適合沒有資料流動的情況);
1)自己編寫心跳包程式,簡單的說就是自己的程式加入一條執行緒,定時向對端傳送資料報,檢視是否有ack,根據ack的返回情況來管理連線。此方法比較通用,一般使用業務層心跳處理,靈活可控,但改變了現有的協議;
2)使用tcp的keepalive機制,unix網路程式設計不推薦使用so_keepalive來做心)跳檢測。
keepalive原理:tcp內嵌有心跳包,以服務端為例,當server檢測到超過一定時間(/proc/sys/net/ipv4/tcp_keepalive_time 7200 即2小時)沒有資料傳輸,那麼會向client端傳送乙個keepalive packet。
程序相關的面試題
管道 有名無名 訊號,訊號量,訊息佇列,共享記憶體。所謂程序間通訊,就是指乙個程序和另乙個程序有聯絡,不僅僅指傳遞訊息,還包括其他操作,有簡單也有複雜。不過他們使用的方法是基本相同的。訊號和訊號量是兩種不同的方式,他們都可以用來實現同步和互斥,但前者是使用訊號處理器來進行的,後者是使用pv操作來實現...
騰訊後台開發C C 面試題
參考 後台開發高頻面試題目 面試分為以下幾大塊 一 c c const 多型什麼類不能被繼承 二 網路 網路的位元組序 網路知識 tcp三次握手 各種細節 timewait狀態 tcp 與 udp 區別 概念 適用範圍 tcp四次揮手講一下過程,最後一次ack如果客戶端沒收到怎麼辦,為什麼揮手不能只...
面試題 程序 執行緒的區別
程序通訊方式 ipc 管道 訊息佇列 共享記憶體 訊號量 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 sem...