嵌入式C語言面試題剖析(6/100)
題一,同步和異步有啥區(qū)別?
題一答案:
同步(Sync):所有的操作都做完,才返回給用戶。這樣用戶在線等待的時間太長,給用戶一種卡死了的感覺(比如系統(tǒng)遷移中,點擊了遷移,界面就不動了,但是程序還在執(zhí)行,卡死了的感覺)。
這種情況下,用戶不能關閉界面,如果關閉,那么遷移程序也會中斷,用戶體驗不好。
異步(Async):將用戶請求放入消息隊列,并反饋給用戶,比如系統(tǒng)遷移程序已經(jīng)啟動,提示你可以關閉瀏覽器了。然后程序再慢慢地寫入數(shù)據(jù)庫。但是用戶沒有卡死的感覺,用戶體驗較好。
題二,TCP與UDP有啥區(qū)別?
題二答案:
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接
2、TCP提供可靠的服務。它通過校驗和,丟包時的重傳控制,序號標識,滑動窗口、確認應答,次序亂掉的分包進行順序控制實現(xiàn)可靠傳輸。即通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復,且按序到達; UDP盡最大努力交付,即不保證可靠交付。
3、UDP具有較好的實時性,工作效率比TCP高,適用于對高速傳輸和實時性有較高要求的通信或廣播通信場景。
4、每一條TCP連接只能是點到點的; UDP支持一對一,一對多,多對一和多對多的交互通信方式。
5、TCP對系統(tǒng)資源要求較多,UDP對系統(tǒng)資源要求較少。
UDP有時比TCP更有優(yōu)勢:
UDP以其簡單、傳輸快的優(yōu)勢,在越來越多場景下取代了TCP, 如實時游戲。
(1)網(wǎng)速的提升給UDP的穩(wěn)定性提供可靠網(wǎng)絡保障,丟包率很低,如果使用應用層重傳,能夠確保傳輸?shù)目煽啃浴?/p>
(2)TCP為了實現(xiàn)網(wǎng)絡通信的可靠性,使用了復雜的擁塞控制算法,建立了繁瑣的握手過程,由于TCP在內(nèi)置的系統(tǒng)協(xié)議棧中,極難對其進行改進。
采用TCP,一旦發(fā)生丟包,TCP會將后續(xù)的包緩存起來,等前面的包重傳并接收到后再繼續(xù)發(fā)送,延時會越來越大。
基于UDP對實時性要求較為嚴格的情況下,采用自定義重傳機制,能夠把丟包產(chǎn)生的延遲降到最低,盡量減少網(wǎng)絡問題造成的影響。
題三,進程和線程有啥區(qū)別?
題三答案:
進程是資源分配的最小單位。
線程是程序執(zhí)行的最小單位,也是處理器調(diào)度的基本單位,但進程不是,兩者均可并發(fā)執(zhí)行。
進程有自己的獨立地址空間,每啟動一個進程,系統(tǒng)就會為它分配地址空間,建立數(shù)據(jù)表來維護代碼段、堆棧段和數(shù)據(jù)段,這種操作非常昂貴。而線程是共享進程中的數(shù)據(jù),使用相同的地址空間,因此,CPU切換一個線程的花費遠比進程小很多,同時創(chuàng)建一個線程的開銷也比進程小很多。
線程之間的通信更方便,同一進程下的線程共享全局變量、靜態(tài)變量等數(shù)據(jù),而進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也跟著死掉了,而一個進程死掉并不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
進程切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用線程要好于進程。同樣如果要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程不能用進程。
執(zhí)行過程:每個獨立的進程有一個程序運行的入口、順序執(zhí)行序列和程序入口。但是線程不能獨立執(zhí)行,必須依存在應用程序中,由應用程序提供多個線程執(zhí)行控制。
優(yōu)缺點:
線程執(zhí)行開銷小,但是不利于資源的管理和保護。線程適合在SMP機器(雙CPU系統(tǒng))上運行。
進程執(zhí)行開銷大,但是能夠很好的進行資源管理和保護,可以跨機器遷移。
何時使用多進程,何時使用多線程?
對資源的管理和保護要求高,不限制開銷和效率時,使用多進程。
要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多線程。