1. 假設(shè)物理機內(nèi)存大小為8GB,我現(xiàn)在系統(tǒng)剩余可用內(nèi)存4GB。申請一個連續(xù)4GB的空間為什么一定能夠申請成功座韵?有沒有可能物理內(nèi)存中根本沒有連續(xù)可用的4GB空間介陶?
有可能堤舒。虛擬內(nèi)存,將物理內(nèi)存中的內(nèi)存碎片映射到一個連續(xù)完整的地址空間哺呜。
2. 兩個進程里有指向同樣地址的指針舌缤,對他們求值會不會得到同樣的值?什么情況下可以得到同樣的值某残,什么情況下不可以国撵?
指針指向的是虛擬地址。不同進程的虛擬地址沒有相關(guān)性玻墅。
頁表由系統(tǒng)生成介牙,決定映射關(guān)系。
公用內(nèi)存的情況:用戶主動申請共享內(nèi)存澳厢,用于進程通信环础;兩個進程使用相同的動態(tài)鏈接庫
3. 兩個進程同時運行在一臺物理機上,一個進程能否訪問另一個進程的變量赏酥?通常情況是能還是不能喳整,為什么?如果能裸扶,通過什么方法框都?
不能,進程之前是相互隔離的。
如果要訪問另一個進程的變量魏保,可以通過進程間的通信實現(xiàn)熬尺。
常用的進程間通信有socket,共享內(nèi)存谓罗,消息隊列等粱哼。
4. 很多程序都共享大量的動態(tài)鏈接庫,比如基礎(chǔ)的數(shù)學(xué)庫檩咱,glibc等揭措,啟動多個進程的時候,這些庫占用系統(tǒng)內(nèi)存嗎刻蚯?是啟動一個進程這些庫也要多使用一份內(nèi)存嗎绊含?為什么?
在編譯的時候炊汹,將動態(tài)鏈接庫編譯進去之后躬充,在elf文件中為留下該動態(tài)鏈接庫的依賴關(guān)系。在程序的啟動的時候讨便,linux也只是為其分配一段線性空間充甚,但不分配具體內(nèi)存,當(dāng)具體使用的時候霸褒,才分配物理內(nèi)存伴找。
如果不同進程使用相同的ddl,操作系統(tǒng)會把dll映射到相同的內(nèi)存傲霸。
5. 當(dāng)使用交換文件的時候疆瑰,進程可用的內(nèi)存也許比物理內(nèi)存更大眉反,因為有些數(shù)據(jù)可以被交換到磁盤上昙啄。那么此時,用戶的程序需要自行讀取物理磁盤嗎寸五?這個技術(shù)是怎么實現(xiàn)的梳凛?
在交換文件的時候,cpu會在頁表上做標(biāo)記已移到磁盤梳杏,在cpu訪問頁表時發(fā)現(xiàn)標(biāo)記韧拒,會請求CPU把數(shù)據(jù)移到內(nèi)存。
分頁:等間隔十性,連續(xù)的
6. 我們知道叛溢,在單核處理器上,多個程序可以并發(fā)(多個進程交替運行)劲适,那么一個程序如何交出對CPU的控制權(quán)楷掉?
時間片用盡時,進程交出CPU的控制權(quán)霞势。
進程自己調(diào)用一個系統(tǒng)調(diào)用烹植。
CPU中斷。
一個進程在運行純數(shù)學(xué)計算的時候,操作系統(tǒng)在做什么创南?
什么都不做
有些操作系統(tǒng)能夠保證一個進程一次至多連續(xù)占用50msCPU赃梧,操作系統(tǒng)是如何做到的?為什么能防止進程持續(xù)運行下去而其他進程無法運行墩虹?
時間片輪轉(zhuǎn)算法嘱巾。
所有就緒進程被放在隊列里,每個進程被分配一個時間片诫钓。如果在時間片用盡時進程還在運行浓冒,則CPU將被剝奪并分配給另一個進程。如果在時間片未用盡但進程已經(jīng)結(jié)束尖坤,則CPU立刻分給下一個進程稳懒。
每個進程用完時間片或者結(jié)束后,被移至隊尾慢味。
時間片太短會導(dǎo)致過多進程切換场梆,降低CPU效率,太長會影響短的交互請求的響應(yīng)速度纯路。一般為50-100ms或油。
7. 一個線程能不能在兩個核心上運行?能不能用計算充分利用(占滿)處理器的兩個核心驰唬?為什么顶岸?
可以交替的用兩個核心。
不可以叫编。因為線程是CPU調(diào)度的基本單位辖佣。多個線程可以分別運行在不同的核心上。
8. 為什么要使用多線程搓逾?使用多進程和多線程的區(qū)別在于什么卷谈?各有什么優(yōu)點?多線程解決了多進程的什么問題霞篡?
好處:減少IO延遲和利用多核提高效率
多進程涉及到內(nèi)存世蔗、CPU及其他資源的切換,開銷比線程切換大朗兵。
進程間的通信比線程通信復(fù)雜污淋。
但進程的隔離性好,各進程間相互獨立余掖,一個進程出問題不會影響另一個進程寸爆,但線程共享資源,一個線程出問題很可能影響其他線程。并且多線程的設(shè)計更復(fù)雜而昨,錯誤更難復(fù)現(xiàn)救氯。
共用數(shù)據(jù)內(nèi)存。
9. 為什么線程切換有開銷歌憨,這個開銷是什么着憨?
上下文切換。比如A線程切換到B線程务嫡,需要進行的操作有:保存線程A的執(zhí)行現(xiàn)場(寄存器)甲抖,然后再載入B線程的執(zhí)行現(xiàn)場。這個開銷并不小心铃。
上下文切換開銷可以分為:
a. 直接開銷:CPU完成切換所用的時間(保存准谚,恢復(fù)寄存器,切換地址空間)
b. 間接開銷:高速緩存去扣,緩沖區(qū)緩存柱衔,TLB(translation lookup buffer)失效