花了一晚上的時(shí)間讀了幾章形病,挑一些印象深刻的寫(xiě)下來(lái)mark下紧阔。
單內(nèi)核和微內(nèi)核
單內(nèi)核:內(nèi)核是一個(gè)大過(guò)程,同時(shí)運(yùn)行在一個(gè)單獨(dú)的地址空間烤黍。因此知市,這樣的內(nèi)核通常以單個(gè)靜態(tài)二進(jìn)制文件的形式存放于磁盤(pán)(如果裝過(guò)Ubuntu這種玩過(guò)傻盟,通常也能看到內(nèi)核是一個(gè)文件)。因?yàn)檎麄€(gè)系統(tǒng)是一個(gè)統(tǒng)一的內(nèi)核嫂丙,所以其內(nèi)部調(diào)用效率很高娘赴。缺點(diǎn)各模塊之間的界限并不特別清晰,模塊間的調(diào)用比較容易跟啤,不太容易維護(hù)诽表。
書(shū)上說(shuō) Linux是單內(nèi)核,但是因?yàn)樵O(shè)計(jì)的非常好隅肥,模塊化依然非常清晰竿奏。
微內(nèi)核:微內(nèi)核的功能被劃分為獨(dú)立的過(guò)程,每個(gè)過(guò)程叫做一個(gè)服務(wù)器武福。所有的服務(wù)器都保持獨(dú)立并運(yùn)行在各自的地址空間议双。因此痘番,就不可能像單模塊內(nèi)核那樣直接調(diào)用 函數(shù)捉片,而是通過(guò)消息傳遞處理微內(nèi)核通信。優(yōu)點(diǎn)就是服務(wù)之間不會(huì)互相影響汞舱,缺點(diǎn)就是性能沒(méi)有單內(nèi)核都高伍纫。
內(nèi)核中沒(méi)有標(biāo)準(zhǔn)C庫(kù),比如沒(méi)有printf昂芜,只有printk
進(jìn)程
vfork和fork
vfork 不會(huì)復(fù)制父進(jìn)程的頁(yè)莹规,但父進(jìn)程阻塞,直到子進(jìn)程退出或者exec()(子進(jìn)程進(jìn)入自己的新空間)泌神,子進(jìn)程不能寫(xiě)父進(jìn)程內(nèi)存空間良漱。但這樣效率不是特別高。
fork 會(huì)復(fù)制父進(jìn)程的頁(yè)欢际,內(nèi)核會(huì)有意讓子進(jìn)程(非保證的)先執(zhí)行母市,但是 linux現(xiàn)在有寫(xiě)時(shí)復(fù)制機(jī)制,所以區(qū)別不大损趋。
寫(xiě)時(shí)復(fù)制是指父子進(jìn)程在寫(xiě)共享的空間的時(shí)候患久,如果誰(shuí)要寫(xiě),發(fā)現(xiàn)這個(gè)共享區(qū)還有其他進(jìn)程占用浑槽,就會(huì)自己復(fù)制一份蒋失。所以這也是為什么內(nèi)核要有意讓子進(jìn)程先運(yùn)行,因?yàn)樽舆M(jìn)程往往是執(zhí)行exec函數(shù)桐玻,可以避免父進(jìn)程先執(zhí)行導(dǎo)致的寫(xiě)時(shí)復(fù)制的開(kāi)銷(xiāo)篙挽。
進(jìn)程和線程
進(jìn)程:用task_struct保存,保存在內(nèi)核棧尾端镊靴,用匯編計(jì)算它都位置非常容易铣卡,根據(jù)不同CPU有做匯編優(yōu)化观腊,x86僅需要指針就可以計(jì)算出來(lái),不需要用寄存器算行。
線程:從內(nèi)核角度看梧油,Linux是沒(méi)有線程這個(gè)概念的。Linux內(nèi)核沒(méi)有專(zhuān)門(mén)表征線程都數(shù)據(jù)結(jié)構(gòu)州邢,實(shí)際上也是把線程當(dāng)進(jìn)程來(lái)實(shí)現(xiàn)的儡陨。線程的創(chuàng)建和進(jìn)程類(lèi)似,只不過(guò)clone的時(shí)候使用了一些參數(shù)來(lái)表示需要共享資源量淌。
任務(wù)調(diào)度
Linux是搶占式多任務(wù)(非搶占就是當(dāng)前任務(wù)必須執(zhí)行完T_T)骗村,支持內(nèi)核搶占。最重要的就是優(yōu)先級(jí)調(diào)度策略了呀枢,這個(gè)大學(xué)的操作系統(tǒng)書(shū)里面都有講胚股。
系統(tǒng)調(diào)用
用戶(hù)空間訪問(wèn)系統(tǒng)空間都接口,提供機(jī)制而不是策略裙秋,系統(tǒng)調(diào)用是有一張表的琅拌,可以自己去修改表,增加系統(tǒng)調(diào)用摘刑,系統(tǒng)調(diào)用的id也不允許重復(fù)使用进宝,即使卸載了,這個(gè)Id也不會(huì)回收利用枷恕。內(nèi)核提供系統(tǒng)調(diào)用党晋,所以可以控制應(yīng)用程序的訪問(wèn)資源權(quán)限。
中斷
中斷程序分為上下兩部分徐块,上半部分做一些響應(yīng)實(shí)時(shí)性都操作未玻,下半部分做一些實(shí)際耗時(shí)都處理性操作。下半部有軟中斷胡控、tasklet和工作隊(duì)列三種機(jī)制扳剿。
中斷上下文是指當(dāng)執(zhí)行一個(gè)中斷處理程序或下半部,內(nèi)核處于中斷上下文铜犬。中斷上下文和進(jìn)程上下文是有區(qū)別的舞终,它沒(méi)有current宏關(guān)聯(lián)當(dāng)前進(jìn)程。進(jìn)程上下文是以進(jìn)程上下文的形式鏈接到內(nèi)核中都癣猾,所以進(jìn)程上下文是可以睡眠敛劝、調(diào)用調(diào)度程序。中斷上下文是不可以睡眠的纷宇。
自旋鎖和信號(hào)量
自旋鎖是一種輪詢(xún)鎖(輪詢(xún)標(biāo)記位)夸盟,不會(huì)引起進(jìn)程睡眠,不能遞歸調(diào)用像捶。優(yōu)點(diǎn)是效率高上陕,適合短時(shí)間等待的場(chǎng)景桩砰。
信號(hào)量會(huì)引起進(jìn)程睡眠,適合長(zhǎng)時(shí)間(相對(duì))等待的場(chǎng)景
中斷上下文中是不能睡眠的释簿,所以只能使用自旋鎖亚隅。
KVM和Docker
KVM是基于硬件的虛擬化,虛擬化分為全虛擬化(軟件/硬件輔助的虛擬化)庶溶,半虛擬化煮纵。
Docker則是基于操作系統(tǒng)級(jí)的,基于Linux Namespace實(shí)現(xiàn)的(太深入的就不懂了@_@)偏螺。