1. 進(jìn)程的常見狀態(tài)伤极?以及各種狀態(tài)之間的轉(zhuǎn)換條件谎懦?
- 就緒:進(jìn)程已處于準(zhǔn)備好運行的狀態(tài)鲫咽,即進(jìn)程已分配到除CPU外的所有必要資源后签赃,只要再獲得CPU谷异,便可立即執(zhí)行。
- 執(zhí)行:進(jìn)程已經(jīng)獲得CPU锦聊,程序正在執(zhí)行狀態(tài)晰绎。
-
阻塞:正在執(zhí)行的進(jìn)程由于發(fā)生某事件(如I/O請求、申請緩沖區(qū)失敗等)暫時無法繼續(xù)執(zhí)行的狀態(tài)括丁。
2. 進(jìn)程同步
進(jìn)程同步的主要任務(wù):是對多個相關(guān)進(jìn)程在執(zhí)行次序上進(jìn)行協(xié)調(diào),以使并發(fā)執(zhí)行的諸進(jìn)程之間能有效地共享資源和相互合作伶选,從而使程序的執(zhí)行具有可再現(xiàn)性史飞。
同步機(jī)制遵循的原則:
(1)空閑讓進(jìn)仰税;
」棺省(2)忙則等待(保證對臨界區(qū)的互斥訪問);
≡纱亍(3)有限等待(有限代表有限的時間吐绵,避免死等);
『诱馈(4)讓權(quán)等待己单,(當(dāng)進(jìn)程不能進(jìn)入自己的臨界區(qū)時,應(yīng)該釋放處理機(jī)耙饰,以免陷入忙等狀態(tài))
3. 進(jìn)程間的通訊方式
1. 管道(pipe):
管道是一種半雙工的通信方式纹笼,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進(jìn)程間使用苟跪。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系廷痘。管道是單向的、先進(jìn)先出的件已、無結(jié)構(gòu)的笋额、固定大小的字節(jié)流,它把一個進(jìn)程的標(biāo)準(zhǔn)輸出和另一個進(jìn)程的標(biāo)準(zhǔn)輸入連接在一起篷扩。寫進(jìn)程在管道的尾端寫入數(shù)據(jù)兄猩,讀進(jìn)程在管道的首端讀出數(shù)據(jù)。
2. 命名管道 (named pipe):
命名管道也是半雙工的通信方式鉴未,它克服了管道沒有名字的限制厦滤,并且它允許無親緣關(guān)系進(jìn)程間的通信。命令管道在文件系統(tǒng)中有對應(yīng)的文件名歼狼,命名管道通過命令mkfifo或系統(tǒng)調(diào)用mkfifo來創(chuàng)建掏导。
3. 信號量( semophore ):
信號量是一個計數(shù)器,可以用來控制多個進(jìn)程對共享資源的訪問羽峰。它常作為一種鎖機(jī)制趟咆,防止某進(jìn)程正在訪問共享資源時添瓷,其他進(jìn)程也訪問該資源。因此值纱,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段鳞贷。
4. 消息隊列( message queue ):
消息隊列是由消息的鏈表結(jié)構(gòu)實現(xiàn),存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識虐唠。有足夠權(quán)限的進(jìn)程可以向隊列中添加消息搀愧,被賦予讀權(quán)限的進(jìn)程則可以讀走隊列中的消息。消息隊列克服了信號傳遞信息少疆偿、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點咱筛。
5. 信號 ( sinal ):
用于通知接收進(jìn)程某個事件已經(jīng)發(fā)生。除了用于進(jìn)程通信外杆故,進(jìn)程還可以發(fā)送信號給進(jìn)程本身迅箩。
6. 共享內(nèi)存( shared memory ):
共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建处铛,但多個進(jìn)程都可以訪問饲趋。共享內(nèi)存是最快的IPC方式,它是針對其他進(jìn)程間通信方式運行效率低而專門設(shè)計的撤蟆。它往往與其他通信機(jī)制奕塑,如信號量配合使用,來實現(xiàn)進(jìn)程間的同步和通信家肯。
7. 套接字( socket ):
也是一種進(jìn)程間通信機(jī)制爵川,與其他通信機(jī)制不同的是,它可用于不同機(jī)器間的進(jìn)程通信息楔。
4.上下文切換
對于單核單線程CPU而言寝贡,在某一時刻只能執(zhí)行一條CPU指令。上下文切換(Context Switch)是一種將CPU資源從一個進(jìn)程分配給另一個進(jìn)程的機(jī)制值依。從用戶角度看圃泡,計算機(jī)能夠并行運行多個進(jìn)程,這恰恰是操作系統(tǒng)通過快速上下文切換造成的結(jié)果愿险。在切換的過程中颇蜡,操作系統(tǒng)需要先存儲當(dāng)前進(jìn)程的狀態(tài)(包括內(nèi)存空間的指針,當(dāng)前執(zhí)行完的指令等等)辆亏,再讀入下一個進(jìn)程的狀態(tài)风秤,然后執(zhí)行此進(jìn)程。
5. 進(jìn)程和線程的區(qū)別
- 進(jìn)程是對運行時程序的封裝扮叨,是系統(tǒng)進(jìn)行資源調(diào)度和分配的的基本單位缤弦,實現(xiàn)了操作系統(tǒng)的并發(fā);
- 線程是進(jìn)程的子任務(wù)彻磁,是CPU調(diào)度和分派的基本單位碍沐,用于保證程序的 實時性狸捅,實現(xiàn)進(jìn)程內(nèi)部的并發(fā);
- 一個程序至少有一個進(jìn)程累提,一個進(jìn)程至少有一個線程尘喝,線程依賴于進(jìn)程而存在;
- 進(jìn)程在執(zhí)行過程中擁有獨立的內(nèi)存單元斋陪,而多個線程共享進(jìn)程的內(nèi)存朽褪。
- 進(jìn)程:每個進(jìn)程都有獨立的代碼和數(shù)據(jù)空間(進(jìn)程上下文),進(jìn)程間的切換會有較大的開銷无虚,一個進(jìn)程包含1–n個線程缔赠。
- 線程:同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨立的運行棧和程序計數(shù)器(PC)骑科,線程切換開銷小。
- 線程和進(jìn)程一樣分為五個階段:創(chuàng)建构拳、就緒咆爽、運行、阻塞置森、終止斗埂。
6. 線程同步的方式
互斥量 Synchronized/Lock:采用互斥對象機(jī)制,只有擁有互斥對象的線程才有訪問公共資源的權(quán)限凫海。因為互斥對象只有一個呛凶,所以可以保證公共資源不會被多個線程同時訪問
信號量 Semphare:它允許同一時刻多個線程訪問同一資源,但是需要控制同一時刻訪問此資源的最大線程數(shù)量
事件(信號)行贪,Wait/Notify:通過通知操作的方式來保持多線程同步漾稀,還可以方便的實現(xiàn)多線程優(yōu)先級的比較操作
7. 什么是死鎖?死鎖產(chǎn)生的條件建瘫?
1). 死鎖的概念
在兩個或者多個并發(fā)進(jìn)程中崭捍,如果每個進(jìn)程持有某種資源而又等待其它進(jìn)程釋放它或它們現(xiàn)在保持著的資源,在未改變這種狀態(tài)之前都不能向前推進(jìn)啰脚,稱這一組進(jìn)程產(chǎn)生了死鎖殷蛇。通俗的講,就是兩個或多個進(jìn)程無限期的阻塞橄浓、相互等待的一種狀態(tài)粒梦。
2). 死鎖產(chǎn)生的四個必要條件
互斥:至少有一個資源必須屬于非共享模式,即一次只能被一個進(jìn)程使用荸实;若其他申請使用該資源匀们,那么申請進(jìn)程必須等到該資源被釋放為止;
占有并等待:一個進(jìn)程必須占有至少一個資源准给,并等待另一個資源昼蛀,而該資源為其他進(jìn)程所占有宴猾;
非搶占:進(jìn)程不能被搶占,即資源只能被進(jìn)程在完成任務(wù)后自愿釋放
循環(huán)等待:若干進(jìn)程之間形成一種頭尾相接的環(huán)形等待資源關(guān)系
3). 死鎖的處理基本策略和常用方法
解決死鎖的基本方法主要有 預(yù)防死鎖叼旋、避免死鎖仇哆、檢測死鎖、解除死鎖 夫植、鴕鳥策略 等讹剔。
(1). 死鎖預(yù)防
死鎖預(yù)防的基本思想是 只要確保死鎖發(fā)生的四個必要條件中至少有一個不成立,就能預(yù)防死鎖的發(fā)生详民,具體方法包括:
打破互斥條件:允許進(jìn)程同時訪問某些資源延欠。但是,有些資源是不能被多個進(jìn)程所共享的沈跨,這是由資源本身屬性所決定的由捎,因此,這種辦法通常并無實用價值饿凛。
打破占有并等待條件:可以實行資源預(yù)先分配策略(進(jìn)程在運行前一次性向系統(tǒng)申請它所需要的全部資源狞玛,若所需全部資源得不到滿足,則不分配任何資源涧窒,此進(jìn)程暫不運行心肪;只有當(dāng)系統(tǒng)能滿足當(dāng)前進(jìn)程所需的全部資源時,才一次性將所申請資源全部分配給該線程)或者只允許進(jìn)程在沒有占用資源時才可以申請資源(一個進(jìn)程可申請一些資源并使用它們纠吴,但是在當(dāng)前進(jìn)程申請更多資源之前硬鞍,它必須全部釋放當(dāng)前所占有的資源)。但是這種策略也存在一些缺點:在很多情況下戴已,無法預(yù)知一個進(jìn)程執(zhí)行前所需的全部資源固该,因為進(jìn)程是動態(tài)執(zhí)行的,不可預(yù)知的糖儡;同時蹬音,會降低資源利用率,導(dǎo)致降低了進(jìn)程的并發(fā)性休玩。
打破非搶占條件:允許進(jìn)程強(qiáng)行從占有者哪里奪取某些資源著淆。也就是說,但一個進(jìn)程占有了一部分資源拴疤,在其申請新的資源且得不到滿足時永部,它必須釋放所有占有的資源以便讓其它線程使用。這種預(yù)防死鎖的方式實現(xiàn)起來困難呐矾,會降低系統(tǒng)性能苔埋。
打破循環(huán)等待條件:實行資源有序分配策略。對所有資源排序編號蜒犯,所有進(jìn)程對資源的請求必須嚴(yán)格按資源序號遞增的順序提出组橄,即只有占用了小號資源才能申請大號資源荞膘,這樣就不回產(chǎn)生環(huán)路,預(yù)防死鎖的發(fā)生玉工。
(2). 死鎖避免的基本思想
死鎖避免的基本思想是動態(tài)地檢測資源分配狀態(tài)羽资,以確保循環(huán)等待條件不成立,從而確保系統(tǒng)處于安全狀態(tài)遵班。所謂安全狀態(tài)是指:如果系統(tǒng)能按某個順序為每個進(jìn)程分配資源(不超過其最大值)屠升,那么系統(tǒng)狀態(tài)是安全的,換句話說就是狭郑,如果存在一個安全序列腹暖,那么系統(tǒng)處于安全狀態(tài)。資源分配圖算法和銀行家算法是兩種經(jīng)典的死鎖避免的算法翰萨,其可以確保系統(tǒng)始終處于安全狀態(tài)脏答。其中,資源分配圖算法應(yīng)用場景為每種資源類型只有一個實例(申請邊亩鬼,分配邊殖告,需求邊,不形成環(huán)才允許分配)辛孵,而銀行家算法應(yīng)用于每種資源類型可以有多個實例的場景丛肮。
(3). 死鎖解除
死鎖解除的常用兩種方法為進(jìn)程終止和資源搶占赡磅。所謂進(jìn)程終止是指簡單地終止一個或多個進(jìn)程以打破循環(huán)等待魄缚,包括兩種方式:終止所有死鎖進(jìn)程和一次只終止一個進(jìn)程直到取消死鎖循環(huán)為止;所謂資源搶占是指從一個或多個死鎖進(jìn)程那里搶占一個或多個資源焚廊,此時必須考慮三個問題:
(I). 選擇一個犧牲品
(II). 回滾:回滾到安全狀態(tài)
(III). 饑餓(在代價因素中加上回滾次數(shù)冶匹,回滾的越多則越不可能繼續(xù)被作為犧牲品,避免一個進(jìn)程總是被回滾)
8. 線程有幾種狀態(tài)
在 Java虛擬機(jī) 中咆瘟,線程從最初的創(chuàng)建到最終的消亡嚼隘,要經(jīng)歷若干個狀態(tài):創(chuàng)建(new)、就緒(runnable/start)袒餐、運行(running)飞蛹、阻塞(blocked)、等待(waiting)灸眼、時間等待(time waiting) 和 消亡(dead/terminated)卧檐。在給定的時間點上,一個線程只能處于一種狀態(tài)
9. 分頁和分段有什么區(qū)別(內(nèi)存管理)
段式存儲管理是一種符合用戶視角的內(nèi)存分配管理方案焰宣。在段式存儲管理中霉囚,將程序的地址空間劃分為若干段(segment),如代碼段匕积,數(shù)據(jù)段盈罐,堆棧段榜跌;這樣每個進(jìn)程有一個二維地址空間,相互獨立盅粪,互不干擾钓葫。段式管理的優(yōu)點是:沒有內(nèi)碎片(因為段大小可變,改變段大小來消除內(nèi)碎片)湾揽。但段換入換出時瓤逼,會產(chǎn)生外碎片(比如4k的段換5k的段,會產(chǎn)生1k的外碎片)
頁式存儲管理方案是一種用戶視角內(nèi)存與物理內(nèi)存相分離的內(nèi)存分配管理方案库物。在頁式存儲管理中霸旗,將程序的邏輯地址劃分為固定大小的頁(page),而物理內(nèi)存劃分為同樣大小的幀戚揭,程序加載時诱告,可以將任意一頁放入內(nèi)存中任意一個幀,這些幀不必連續(xù)民晒,從而實現(xiàn)了離散分離精居。頁式存儲管理的優(yōu)點是:沒有外碎片(因為頁的大小固定),但會產(chǎn)生內(nèi)碎片(一個頁可能填充不滿)潜必。
兩者的不同點:
目的不同:分頁是由于系統(tǒng)管理的需要而不是用戶的需要靴姿,它是信息的物理單位;分段的目的是為了能更好地滿足用戶的需要磁滚,它是信息的邏輯單位佛吓,它含有一組其意義相對完整的信息;
大小不同:頁的大小固定且由系統(tǒng)決定垂攘,而段的長度卻不固定维雇,由其所完成的功能決定;
地址空間不同: 段向用戶提供二維地址空間晒他;頁向用戶提供的是一維地址空間吱型;
信息共享:段是信息的邏輯單位,便于存儲保護(hù)和信息的共享陨仅,頁的保護(hù)和共享受到限制津滞;
內(nèi)存碎片:頁式存儲管理的優(yōu)點是沒有外碎片(因為頁的大小固定),但會產(chǎn)生內(nèi)碎片(一個頁可能填充不滿)灼伤;而段式管理的優(yōu)點是沒有內(nèi)碎片(因為段大小可變触徐,改變段大小來消除內(nèi)碎片)。但段換入換出時饺蔑,會產(chǎn)生外碎片(比如4k的段換5k的段锌介,會產(chǎn)生1k的外碎片)。
10、操作系統(tǒng)中進(jìn)程調(diào)度策略有哪幾種孔祸?
FCFS(先來先服務(wù)隆敢,隊列實現(xiàn),非搶占的):先請求CPU的進(jìn)程先分配到CPU
SJF(最短作業(yè)優(yōu)先調(diào)度算法):平均等待時間最短崔慧,但難以知道下一個CPU區(qū)間長度
優(yōu)先級調(diào)度算法(可以是搶占的拂蝎,也可以是非搶占的):優(yōu)先級越高越先分配到CPU,相同優(yōu)先級先到先服務(wù)惶室,存在的主要問題是:低優(yōu)先級進(jìn)程無窮等待CPU温自,會導(dǎo)致無窮阻塞或饑餓;解決方案:老化
時間片輪轉(zhuǎn)調(diào)度算法(可搶占的):隊列中沒有進(jìn)程被分配超過一個時間片的CPU時間皇钞,除非它是唯一可運行的進(jìn)程悼泌。如果進(jìn)程的CPU區(qū)間超過了一個時間片,那么該進(jìn)程就被搶占并放回就緒隊列夹界。
多級隊列調(diào)度算法:將就緒隊列分成多個獨立的隊列馆里,每個隊列都有自己的調(diào)度算法,隊列之間采用固定優(yōu)先級搶占調(diào)度可柿。其中鸠踪,一個進(jìn)程根據(jù)自身屬性被永久地分配到一個隊列中。
多級反饋隊列調(diào)度算法:與多級隊列調(diào)度算法相比复斥,其允許進(jìn)程在隊列之間移動:若進(jìn)程使用過多CPU時間营密,那么它會被轉(zhuǎn)移到更低的優(yōu)先級隊列;在較低優(yōu)先級隊列等待時間過長的進(jìn)程會被轉(zhuǎn)移到更高優(yōu)先級隊列目锭,以防止饑餓發(fā)生评汰。
11、說一說進(jìn)程同步有哪幾種機(jī)制
原子操作侣集、信號量機(jī)制键俱、自旋鎖管程兰绣、會合世分、分布式系統(tǒng)
12、什么是虛擬內(nèi)存缀辩?
1).內(nèi)存的發(fā)展歷程
沒有內(nèi)存抽象(單進(jìn)程臭埋,除去操作系統(tǒng)所用的內(nèi)存之外,全部給用戶程序使用) —> 有內(nèi)存抽象(多進(jìn)程臀玄,進(jìn)程獨立的地址空間瓢阴,交換技術(shù)(內(nèi)存大小不可能容納下所有并發(fā)執(zhí)行的進(jìn)程)
)—> 連續(xù)內(nèi)存分配(固定大小分區(qū)(多道程序的程度受限),可變分區(qū)(首次適應(yīng)健无,最佳適應(yīng)荣恐,最差適應(yīng)),碎片) —> 不連續(xù)內(nèi)存分配(分段,分頁叠穆,段頁式少漆,虛擬內(nèi)存)
2).虛擬內(nèi)存
虛擬內(nèi)存允許執(zhí)行進(jìn)程不必完全在內(nèi)存中。虛擬內(nèi)存的基本思想是:每個進(jìn)程擁有獨立的地址空間硼被,這個空間被分為大小相等的多個塊示损,稱為頁(Page),每個頁都是一段連續(xù)的地址嚷硫。這些頁被映射到物理內(nèi)存检访,但并不是所有的頁都必須在內(nèi)存中才能運行程序。當(dāng)程序引用到一部分在物理內(nèi)存中的地址空間時仔掸,由硬件立刻進(jìn)行必要的映射脆贵;當(dāng)程序引用到一部分不在物理內(nèi)存中的地址空間時,由操作系統(tǒng)負(fù)責(zé)將缺失的部分裝入物理內(nèi)存并重新執(zhí)行失敗的命令起暮。這樣丹禀,對于進(jìn)程而言,邏輯上似乎有很大的內(nèi)存空間鞋怀,實際上其中一部分對應(yīng)物理內(nèi)存上的一塊(稱為幀双泪,通常頁和幀大小相等),還有一些沒加載在內(nèi)存中的對應(yīng)在硬盤上密似,如圖5所示焙矛。
注意,請求分頁系統(tǒng)残腌、請求分段系統(tǒng)和請求段頁式系統(tǒng)都是針對虛擬內(nèi)存的村斟,通過請求實現(xiàn)內(nèi)存與外存的信息置換。
由圖5可以看出抛猫,虛擬內(nèi)存實際上可以比物理內(nèi)存大蟆盹。當(dāng)訪問虛擬內(nèi)存時,會訪問MMU(內(nèi)存管理單元)去匹配對應(yīng)的物理地址(比如圖5的0闺金,1逾滥,2)。如果虛擬內(nèi)存的頁并不存在于物理內(nèi)存中(如圖5的3,4)败匹,會產(chǎn)生缺頁中斷寨昙,從磁盤中取得缺的頁放入內(nèi)存,如果內(nèi)存已滿掀亩,還會根據(jù)某種算法將磁盤中的頁換出舔哪。
3). 頁面置換算法
FIFO先進(jìn)先出算法:在操作系統(tǒng)中經(jīng)常被用到,比如作業(yè)調(diào)度(主要實現(xiàn)簡單槽棍,很容易想到)捉蚤;
LRU(Least recently use)最近最少使用算法:根據(jù)使用時間到現(xiàn)在的長短來判斷抬驴;
LFU(Least frequently use)最少使用次數(shù)算法:根據(jù)使用次數(shù)來判斷;
OPT(Optimal replacement)最優(yōu)置換算法:理論的最優(yōu)缆巧,理論怎爵;就是要保證置換出去的是不再被使用的頁,或者是在實際內(nèi)存中最晚使用的算法盅蝗。
4). 虛擬內(nèi)存的應(yīng)用與優(yōu)點
虛擬內(nèi)存很適合在多道程序設(shè)計系統(tǒng)中使用鳖链,許多程序的片段同時保存在內(nèi)存中。當(dāng)一個程序等待它的一部分讀入內(nèi)存時墩莫,可以把CPU交給另一個進(jìn)程使用芙委。虛擬內(nèi)存的使用可以帶來以下好處:
在內(nèi)存中可以保留多個進(jìn)程,系統(tǒng)并發(fā)度提高
解除了用戶與內(nèi)存之間的緊密約束狂秦,進(jìn)程可以比內(nèi)存的全部空間還大
Windows下的內(nèi)存是如何管理的灌侣?
Windows提供了3種方法來進(jìn)行內(nèi)存管理:
虛擬內(nèi)存,最適合用來管理大型對象或者結(jié)構(gòu)數(shù)組裂问;
內(nèi)存映射文件侧啼,最適合用來管理大型數(shù)據(jù)流(通常來自文件)以及在單個計算機(jī)上運行多個進(jìn)程之間共享數(shù)據(jù);
內(nèi)存堆棧堪簿,最適合用來管理大量的小對象痊乾。
Windows操縱內(nèi)存可以分兩個層面:物理內(nèi)存和虛擬內(nèi)存。
其中物理內(nèi)存由系統(tǒng)管理椭更,不允許應(yīng)用程序直接訪問哪审,應(yīng)用程序可見的只有一個2G地址空間,而內(nèi)存分配是通過堆進(jìn)行的虑瀑。對于每個進(jìn)程都有自己的默認(rèn)堆湿滓,當(dāng)一個堆創(chuàng)建后,就通過虛擬內(nèi)存操作保留了相應(yīng)大小的地址塊(不占有實際的內(nèi)存舌狗,系統(tǒng)消耗很羞窗隆)。當(dāng)在堆上分配一塊內(nèi)存時痛侍,系統(tǒng)在堆的地址表里找到一個空閑塊(如果找不到朝氓,且堆創(chuàng)建屬性是可擴(kuò)充的,則擴(kuò)充堆大辛等铡)膀篮,為這個空閑塊所包含的所有內(nèi)存頁提交物理對象(在物理內(nèi)存上或硬盤的交換文件上)嘹狞,這時就可以訪問這部分地址岂膳。提交時,系統(tǒng)將對所有進(jìn)程的內(nèi)存統(tǒng)一調(diào)配磅网,如果物理內(nèi)存不夠谈截,系統(tǒng)試圖把一部分進(jìn)程暫時不訪問的頁放入交換文件,以騰出部分物理內(nèi)存。釋放內(nèi)存時簸喂,只在堆中將所在的頁解除提交(相應(yīng)的物理對象被解除)毙死,繼續(xù)保留地址空間。
如果要知道某個地址是否被占用/可不可以訪問喻鳄,只要查詢此地址的虛擬內(nèi)存狀態(tài)即可扼倘。如果是提交,則可以訪問除呵。如果僅僅保留再菊,或沒保留,則產(chǎn)生一個軟件異常颜曾。此外纠拔,有些內(nèi)存頁可以設(shè)置各種屬性。如果是只讀泛豪,向內(nèi)存寫也會產(chǎn)生軟件異常稠诲。
3、Windows消息調(diào)度機(jī)制是诡曙?
A)指令隊列臀叙;B)指令堆棧;C)消息隊列价卤;D)消息堆棧
答案:C
處理消息隊列的順序匹耕。首先Windows絕對不是按隊列先進(jìn)先出的次序來處理的,而是有一定優(yōu)先級的荠雕。優(yōu)先級通過消息隊列的狀態(tài)標(biāo)志來實現(xiàn)的稳其。首先,最高優(yōu)先級的是別的線程發(fā)過來的消息(通過sendmessage)炸卑;其次既鞠,處理登記消息隊列消息;再次處理QS_QUIT標(biāo)志盖文,處理虛擬輸入隊列嘱蛋,處理wm_paint;最后是wm_timer五续。
4洒敏、描述實時系統(tǒng)的基本特性
在特定時間內(nèi)完成特定的任務(wù),實時性與可靠性疙驾。
所謂“實時操作系統(tǒng)”凶伙,實際上是指操作系統(tǒng)工作時,其各種資源可以根據(jù)需要隨時進(jìn)行動態(tài)分配它碎。由于各種資源可以進(jìn)行動態(tài)分配函荣,因此显押,其處理事務(wù)的能力較強(qiáng)、速度較快傻挂。
5乘碑、中斷和輪詢的特點
對I/O設(shè)備的程序輪詢的方式,是早期的計算機(jī)系統(tǒng)對I/O設(shè)備的一種管理方式金拒。它定時對各種設(shè)備輪流詢問一遍有無處理要求兽肤。輪流詢問之后,有要求的绪抛,則加以處理轿衔。在處理I/O設(shè)備的要求之后,處理機(jī)返回繼續(xù)工作睦疫。盡管輪詢需要時間害驹,但輪詢要比I/O設(shè)備的速度要快得多,所以一般不會發(fā)生不能及時處理的問題蛤育。當(dāng)然宛官,再快的處理機(jī),能處理的輸入輸出設(shè)備的數(shù)量也是有一定限度的瓦糕。而且底洗,程序輪詢畢竟占據(jù)了CPU相當(dāng)一部分處理時間,因此咕娄,程序輪詢是一種效率較低的方式亥揖,在現(xiàn)代計算機(jī)系統(tǒng)中已很少應(yīng)用。
程序中斷通常簡稱中斷圣勒,是指CPU在正常運行程序的過程中费变,由于預(yù)先安排或發(fā)生了各種隨機(jī)的內(nèi)部或外部事件,使CPU中斷正在運行的程序圣贸,而轉(zhuǎn)到為響應(yīng)的服務(wù)程序去處理挚歧。
輪詢——效率低,等待時間很長吁峻,CPU利用率不高滑负。
中斷——容易遺漏一些問題,CPU利用率高用含。
6矮慕、什么是臨界區(qū)?如何解決沖突?
每個進(jìn)程中訪問臨界資源的那段程序稱為臨界區(qū),每次只準(zhǔn)許一個進(jìn)程進(jìn)入臨界區(qū),進(jìn)入后不允許其他進(jìn)程進(jìn)入。
(1)如果有若干進(jìn)程要求進(jìn)入空閑的臨界區(qū),一次僅允許一個進(jìn)程進(jìn)入扁藕;
(2)任何時候,處于臨界區(qū)內(nèi)的進(jìn)程不可多于一個。如已有進(jìn)程進(jìn)入自己的臨界區(qū)槽华,則其它所有試圖進(jìn)入臨界區(qū)的進(jìn)程必須等待;
(3)進(jìn)入臨界區(qū)的進(jìn)程要在有限時間內(nèi)退出趟妥,以便其它進(jìn)程能及時進(jìn)入自己的臨界區(qū)猫态;
(4)如果進(jìn)程不能進(jìn)入自己的臨界區(qū),則應(yīng)讓出CPU披摄,避免進(jìn)程出現(xiàn)“忙等”現(xiàn)象亲雪。
7、說說分段和分頁
頁是信息的物理單位疚膊,分頁是為實現(xiàn)離散分配方式义辕,以消減內(nèi)存的外零頭,提高內(nèi)存的利用率寓盗;或者說灌砖,分頁僅僅是由于系統(tǒng)管理的需要,而不是用戶的需要傀蚌。
段是信息的邏輯單位基显,它含有一組其意義相對完整的信息。分段的目的是為了能更好的滿足用戶的需要善炫。
頁的大小固定且由系統(tǒng)確定撩幽,把邏輯地址劃分為頁號和頁內(nèi)地址兩部分,是由機(jī)器硬件實現(xiàn)的箩艺,因而一個系統(tǒng)只能有一種大小的頁面窜醉。段的長度卻不固定,決定于用戶所編寫的程序艺谆,通常由編輯程序在對源程序進(jìn)行編輯時酱虎,根據(jù)信息的性質(zhì)來劃分。
分頁的作業(yè)地址空間是一維的擂涛,即單一的線性空間读串,程序員只須利用一個記憶符,即可表示一地址撒妈。分段的作業(yè)地址空間是二維的恢暖,程序員在標(biāo)識一個地址時,既需給出段名狰右,又需給出段內(nèi)地址杰捂。
8.什么是中斷?中斷時CPU做什么工作棋蚌?
中斷是指在計算機(jī)執(zhí)行期間嫁佳,系統(tǒng)內(nèi)發(fā)生任何非尋常的或非預(yù)期的急需處理事件挨队,使得CPU暫時中斷當(dāng)前正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行相應(yīng)的事件處理程序。待處理完畢后又返回原來被中斷處繼續(xù)執(zhí)行或調(diào)度新的進(jìn)程執(zhí)行的過程蒿往。
9.線程是否具有相同的堆棧盛垦?dll是否有獨立的堆棧?
每個線程有自己的堆棧瓤漏。
dll是否有獨立的堆棧腾夯?這個問題不好回答,或者說這個問題本身是否有問題蔬充。因為dll中的代碼是被某些線程所執(zhí)行蝶俱,只有線程擁有堆棧。如果dll中的代碼是exe中的線程所調(diào)用饥漫,那么這個時候是不是說這個dll沒有獨立的堆棧榨呆?如果dll中的代碼是由dll自己創(chuàng)建的線程所執(zhí)行,那么是不是說dll有獨立的堆棧庸队?
以上講的是堆棧积蜻,如果對于堆來說,每個dll有自己的堆皿哨,所以如果是從dll中動態(tài)分配的內(nèi)存浅侨,最好是從dll中刪除;如果你從dll中分配內(nèi)存证膨,然后在exe中如输,或者另外一個dll中刪除,很有可能導(dǎo)致程序崩潰央勒。
10.什么是緩沖區(qū)溢出不见?有什么危害?其原因是什么崔步?
緩沖區(qū)溢出是指當(dāng)計算機(jī)向緩沖區(qū)內(nèi)填充數(shù)據(jù)時超過了緩沖區(qū)本身的容量稳吮,溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上。
危害:在當(dāng)前網(wǎng)絡(luò)與分布式系統(tǒng)安全中井濒,被廣泛利用的50%以上都是緩沖區(qū)溢出灶似,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區(qū)溢出中瑞你,最為危險的是堆棧溢出酪惭,因為入侵者可以利用堆棧溢出,在函數(shù)返回時改變返回程序的地址者甲,讓其跳轉(zhuǎn)到任意地址春感,帶來的危害一種是程序崩潰導(dǎo)致拒絕服務(wù),另外一種就是跳轉(zhuǎn)并且執(zhí)行一段惡意代碼,比如得到shell鲫懒,然后為所欲為嫩实。通過往程序的緩沖區(qū)寫超出其長度的內(nèi)容,造成緩沖區(qū)的溢出窥岩,從而破壞程序的堆棧甲献,使程序轉(zhuǎn)而執(zhí)行其它指令,以達(dá)到攻擊的目的谦秧。
造成緩沖區(qū)溢出的主原因是程序中沒有仔細(xì)檢查用戶輸入的參數(shù)竟纳。
11.OS如何實現(xiàn)內(nèi)存的管理撵溃?
虛擬內(nèi)存
內(nèi)存頁
1. 并發(fā)
并發(fā)是指宏觀上在一段時間內(nèi)能同時運行多個程序疚鲤,而并行則指同一時刻能運行多個指令。
并行需要硬件支持缘挑,如多流水線集歇、多核處理器或者分布式計算系統(tǒng)。
操作系統(tǒng)通過引入進(jìn)程和線程语淘,使得程序能夠并發(fā)運行诲宇。
2. 共享
共享是指系統(tǒng)中的資源可以被多個并發(fā)進(jìn)程共同使用。
有兩種共享方式:互斥共享和同時共享惶翻。
互斥共享的資源稱為臨界資源姑蓝,例如打印機(jī)等,在同一時刻只允許一個進(jìn)程訪問吕粗,需要用同步機(jī)制來實現(xiàn)互斥訪問纺荧。
3. 虛擬
虛擬技術(shù)把一個物理實體轉(zhuǎn)換為多個邏輯實體。
主要有兩種虛擬技術(shù):時(時間)分復(fù)用技術(shù)和空(空間)分復(fù)用技術(shù)颅筋。
多個進(jìn)程能在同一個處理器上并發(fā)執(zhí)行使用了時分復(fù)用技術(shù)宙暇,讓每個進(jìn)程輪流占用處理器,每次只執(zhí)行一小個時間片并快速切換议泵。
虛擬內(nèi)存使用了空分復(fù)用技術(shù)占贫,它將物理內(nèi)存抽象為地址空間,每個進(jìn)程都有各自的地址空間先口。地址空間的頁被映射到物理內(nèi)存型奥,地址空間的頁并不需要全部在物理內(nèi)存中,當(dāng)使用到一個沒有在物理內(nèi)存的頁時碉京,執(zhí)行頁面置換算法厢汹,將該頁置換到內(nèi)存中。
4. 異步
異步指進(jìn)程不是一次性執(zhí)行完畢收夸,而是走走停停坑匠,以不可知的速度向前推進(jìn)。
基本功能
1. 進(jìn)程管理
進(jìn)程控制卧惜、進(jìn)程同步厘灼、進(jìn)程通信夹纫、死鎖處理、處理機(jī)調(diào)度等设凹。
2. 內(nèi)存管理
內(nèi)存分配舰讹、地址映射、內(nèi)存保護(hù)與共享闪朱、虛擬內(nèi)存等月匣。
3. 文件管理
文件存儲空間的管理、目錄管理奋姿、文件讀寫管理和保護(hù)等锄开。
4. 設(shè)備管理
完成用戶的 I/O 請求,方便用戶使用各種設(shè)備称诗,并提高設(shè)備的利用率萍悴。
主要包括緩沖管理、設(shè)備分配寓免、設(shè)備處理癣诱、虛擬設(shè)備等。
靜態(tài)鏈接庫和動態(tài)鏈接庫的區(qū)別
靜態(tài)連接庫就是把(lib)文件中用到的函數(shù)代碼直接鏈接進(jìn)目標(biāo)程序袜香,程序運行的時候不再需要其它的庫文件撕予。
動態(tài)鏈接就是把調(diào)用的函數(shù)所在文件模塊(DLL)和調(diào)用函數(shù)在文件中的位置等信息鏈接進(jìn)目標(biāo)程序,程序運行的時候再從DLL中尋找相應(yīng)函數(shù)代碼蜈首,因此需要相應(yīng)DLL文件的支持实抡。
靜態(tài)庫和動態(tài)庫的區(qū)別
1、 靜態(tài)鏈接庫的后綴名為lib疾就,動態(tài)鏈接庫的導(dǎo)入庫的后綴名也為lib澜术。不同的是,靜態(tài)庫中包含了函數(shù)的實際執(zhí)行代碼猬腰,而對于導(dǎo)入庫而言鸟废,其實際的執(zhí)行代碼位于動態(tài)庫中,導(dǎo)入庫只包含了地址符號表等姑荷,確保程序找到對應(yīng)函數(shù)的一些基本地址信息盒延;
2、由于靜態(tài)庫是在編譯期間直接將代碼合到可執(zhí)行程序中鼠冕,而動態(tài)庫是在執(zhí)行期時調(diào)用DLL中的函數(shù)體添寺,所以執(zhí)行速度比動態(tài)庫要快一點;
3懈费、 靜態(tài)庫鏈接生成的可執(zhí)行文件體積較大计露,且包含相同的公共代碼,造成內(nèi)存浪費;
4票罐、 使用動態(tài)鏈接庫的應(yīng)用程序不是自完備的叉趣,它依賴的DLL模塊也要存在,如果使用載入時動態(tài)鏈接该押,程序啟動時發(fā)現(xiàn)DLL不存在疗杉,系統(tǒng)將終止程序并給出錯誤信息。而使用運行時動態(tài)鏈接蚕礼,系統(tǒng)不會終止烟具,但由于DLL中的導(dǎo)出函數(shù)不可用,程序會加載失數斓拧朝聋;
5、 DLL文件與EXE文件獨立罩润,只要輸出接口不變(即名稱玖翅、參數(shù)翼馆、返回值類型和調(diào)用約定不變)割以,更換DLL文件不會對EXE文件造成任何影響,因而極大地提高了可維護(hù)性和可擴(kuò)展性应媚,適用于大規(guī)模的軟件開發(fā)严沥,使開發(fā)過程獨立、耦合度小中姜,便于不同開發(fā)者和開發(fā)組織之間進(jìn)行開發(fā)和測試消玄。