嵌入式筆試面試題目系列(一)
本系列將按類別對(duì)題目進(jìn)行分類整理,重要的地方標(biāo)上星星,這樣有利于大家打下堅(jiān)實(shí)的基礎(chǔ)。
本文均為嵌入式筆試面試高頻題目
一、進(jìn)程與線程
1、什么是進(jìn)程、線程,有什么區(qū)別?
進(jìn)程是資源(CPU、內(nèi)存等)分配的基本單位,線程是CPU調(diào)度和分配的基本單位(程序執(zhí)行的最小單位)。同一時(shí)間,如果CPU是單核,只有一個(gè)進(jìn)程在執(zhí)行,所謂的并發(fā)執(zhí)行,也是順序執(zhí)行,只不過由于切換速度太快,你以為這些進(jìn)程在同步執(zhí)行而已。多核CPU可以同一時(shí)間點(diǎn)有多個(gè)進(jìn)程在執(zhí)行。
2、多進(jìn)程、多線程的優(yōu)缺點(diǎn)
說明:一個(gè)進(jìn)程由進(jìn)程控制塊、數(shù)據(jù)段、代碼段組成,進(jìn)程本身不可以運(yùn)行程序,而是像一個(gè)容器一樣,先創(chuàng)建出一個(gè)主線程,分配給主線程一定的系統(tǒng)資源,這時(shí)候就可以在主線程開始實(shí)現(xiàn)各種功能。當(dāng)我們需要實(shí)現(xiàn)更復(fù)雜的功能時(shí),可以在主線程里創(chuàng)建多個(gè)子線程,多個(gè)線程在同一個(gè)進(jìn)程里,利用這個(gè)進(jìn)程所擁有的系統(tǒng)資源合作完成某些功能。
優(yōu)缺點(diǎn):1)一個(gè)進(jìn)程死了不影響其他進(jìn)程,一個(gè)線程崩潰很可能影響到它本身所處的整個(gè)進(jìn)程。2) 創(chuàng)建多進(jìn)程的系統(tǒng)花銷大于創(chuàng)建多線程。3)多進(jìn)程通訊因?yàn)樾枰缭竭M(jìn)程邊界,不適合大量數(shù)據(jù)的傳送,適合小數(shù)據(jù)或者密集數(shù)據(jù)的傳送。多線程無需跨越進(jìn)程邊界,適合各線程間大量數(shù)據(jù)的傳送。并且多線程可以共享同一進(jìn)程里的共享內(nèi)存和變量。
3、什么時(shí)候用進(jìn)程,什么時(shí)候用線程
1)創(chuàng)建和銷毀較頻繁使用線程,因?yàn)閯?chuàng)建進(jìn)程花銷大。2)需要大量數(shù)據(jù)傳送使用線程,因?yàn)槎嗑€程切換速度快,不需要跨越進(jìn)程邊界。3)安全穩(wěn)定選進(jìn)程;快速頻繁選線程;
4、多進(jìn)程、多線程同步(通訊)的方法
進(jìn)程間通訊:
(1)有名管道/無名管道(2)信號(hào)(3)共享內(nèi)存(4)消息隊(duì)列(5)信號(hào)量(6)socket
線程通訊(鎖):
(1)信號(hào)量(2)讀寫鎖(3)條件變量(4)互斥鎖(5)自旋鎖
5、進(jìn)程線程的狀態(tài)轉(zhuǎn)換圖
(1)就緒狀態(tài):進(jìn)程已獲得除CPU外的所有必要資源,只等待CPU時(shí)的狀態(tài)。一個(gè)系統(tǒng)會(huì)將多個(gè)處于就緒狀態(tài)的進(jìn)程排成一個(gè)就緒隊(duì)列。
(2)執(zhí)行狀態(tài):進(jìn)程已獲CPU,正在執(zhí)行。單處理機(jī)系統(tǒng)中,處于執(zhí)行狀態(tài)的進(jìn)程只一個(gè);多處理機(jī)系統(tǒng)中,有多個(gè)處于執(zhí)行狀態(tài)的進(jìn)程。
(3)阻塞狀態(tài):正在執(zhí)行的進(jìn)程由于某種原因而暫時(shí)無法繼續(xù)執(zhí)行,便放棄處理機(jī)而處于暫停狀態(tài),即進(jìn)程執(zhí)行受阻。(這種狀態(tài)又稱等待狀態(tài)或封鎖狀態(tài))
通常導(dǎo)致進(jìn)程阻塞的典型事件有:請(qǐng)求I/O,申請(qǐng)緩沖空間等。
一般,將處于阻塞狀態(tài)的進(jìn)程排成一個(gè)隊(duì)列,有的系統(tǒng)還根據(jù)阻塞原因不同把這些阻塞集成排成多個(gè)隊(duì)列。

(1) 就緒→執(zhí)行
處于就緒狀態(tài)的進(jìn)程,當(dāng)進(jìn)程調(diào)度程序?yàn)橹峙淞颂幚頇C(jī)后,該進(jìn)程便由就緒狀態(tài)轉(zhuǎn)變成執(zhí)行狀態(tài)。
(2) 執(zhí)行→就緒
處于執(zhí)行狀態(tài)的進(jìn)程在其執(zhí)行過程中,因分配給它的一個(gè)時(shí)間片已用完而不得不讓出處理機(jī),于是進(jìn)程從執(zhí)行狀態(tài)轉(zhuǎn)變成就緒狀態(tài)。
(3) 執(zhí)行→阻塞
正在執(zhí)行的進(jìn)程因等待某種事件發(fā)生而無法繼續(xù)執(zhí)行時(shí),便從執(zhí)行狀態(tài)變成阻塞狀態(tài)。
(4) 阻塞→就緒
處于阻塞狀態(tài)的進(jìn)程,若其等待的事件已經(jīng)發(fā)生,于是進(jìn)程由阻塞狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)。
6、父進(jìn)程、子進(jìn)程
父進(jìn)程調(diào)用fork()以后,克隆出一個(gè)子進(jìn)程,子進(jìn)程和父進(jìn)程擁有相同內(nèi)容的代碼段、數(shù)據(jù)段和用戶堆棧。父進(jìn)程和子進(jìn)程誰先執(zhí)行不一定,看CPU。所以我們一般我們會(huì)設(shè)置父進(jìn)程等待子進(jìn)程執(zhí)行完畢。
7、說明什么是上下文切換?
你可以有很多角度,有進(jìn)程上下文,有中斷上下文。
進(jìn)程上下文:一個(gè)進(jìn)程在執(zhí)行的時(shí)候,CPU的所有寄存器中的值、進(jìn)程的狀態(tài)以及堆棧中的內(nèi)容,當(dāng)內(nèi)核需要切換到另一個(gè)進(jìn)程時(shí),它需要保存當(dāng)前進(jìn)程的所有狀態(tài),即保存當(dāng)前進(jìn)程的進(jìn)程上下文,以便再次執(zhí)行該進(jìn)程時(shí),能夠恢復(fù)切換時(shí)的狀態(tài),繼續(xù)執(zhí)行。
中斷上下文:由于觸發(fā)信號(hào),導(dǎo)致CPU中斷當(dāng)前進(jìn)程,轉(zhuǎn)而去執(zhí)行另外的程序。那么當(dāng)前進(jìn)程的所有資源要保存,比如堆棧和指針。保存過后轉(zhuǎn)而去執(zhí)行中斷處理程序,快讀執(zhí)行完畢返回,返回后恢復(fù)上一個(gè)進(jìn)程的資源,繼續(xù)執(zhí)行。這就是中斷的上下文。