1.進程和線程的區別。
2.死鎖的必要條件,怎么處理死鎖。
3.Window內存管理方式:段存儲,頁存儲,段頁存儲。
4.進程的幾種狀態。
5.IPC幾種通信方式。
6.什么是虛擬內存。
7.虛擬地址、邏輯地址、線性地址、物理地址的區別。
1.進程和線程
線程
?1. 概念:
是進程中執行運算的最小單位,是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。
2. 好處:
1)易于調度。
?2)提高并發性。通過線程可方便有效地實現并發性。進程可創建多個線程來執行同一程序的不同部分。
?3)開銷少。創建線程比創建進程要快,所需開銷很少。
?4)利于充分發揮多處理器的功能。通過創建多線程進程,每個線程在一個處理器上運行,從而實現應用程序的并發性,使每個處理器都得到充分運行。
3. ?線程狀態:
聯系java中線程的幾種狀態 java thread的運行周期中, 有幾種狀態, 在 java.lang.Thread.State 中有詳細定義和說明:
1)NEW狀態是指線程剛創建, 尚未啟動
2)RUNNABLE狀態是線程正在正常運行中,當然可能會有某種耗時計算/IO等待的操作/CPU時間片切換等,這個狀態下發生的等待一般是其他系統資源, 而不是鎖, Sleep等
3)BLOCKED這個狀態下, 是在多個線程有同步操作的場景,比如正在等待另一個線程的synchronized 塊的執行釋放, 或者可重入的 synchronized塊里別人調用wait() 方法,也就是這里是線程在等待進入臨界區
4)WAITING這個狀態下是指線程擁有了某個鎖之后, 調用了他的wait方法, 等待其他線程/鎖擁有者調用 notify / notifyAll 一遍該線程可以繼續下一步操作, 這里要區分 BLOCKED 和 WATING 的區別, 一個是在臨界點外面等待進入, 一個是在理解點里面wait等待別人notify, 線程調用了join方法 join了另外的線程的時候, 也會進入WAITING狀態, 等待被他join的線程執行結束
5)TIMED_WAITING這個狀態就是有限的(時間限制)的WAITING, 一般出現在調用wait(long), join(long)等情況下, 另外一個線程sleep后, 也會進入TIMED_WAITING狀態
6) TERMINATED這個狀態下表示該線程的run方法已經執行完畢了,基本上就等于死亡了(當時如果線程被持久持有, 可能不會被回收)http://www.blogjava.net/santicom/archive/2011/09/01/357765.html
進程
1. ?概念
進程是操作系統的概念,每當我們執行一個程序時,對于操作系統來講就創建了一個進程,在這個過程中,伴隨著資源的分配和釋放。可以認為進程是一個程序的一次執行過程。
2. ?進程與程序的區別
1.進程是程序的一次運行活動,屬于一種動態的概念。程序是一組有序的靜態指令,是一種靜態的概念。
2.一個進程可以執行一個或多個程序。?
3.程序可以作為一種軟件資源長期保持著,而進程則是一次執行過程,它是暫時的,是動態地產生和終止的。?
4.進程更能真實地描述并發,而程序不能。
5.進程由程序和數據兩部分組成,進程是競爭計算機系統有限資源的基本單位?
6.進程具有創建其他進程的功能;而程序沒有。?
7.進程還具有并發性和交往性,這也與程序的封閉性不同
3. 進程的幾種狀態
進程的基本狀態及狀態之間的關系
1)創建狀態(New):進程正在創建過程中,還不能運行。操作系統在創建狀態要進行的工作包括分配和建立進程控制塊表項、建立資源表格(如打開文件表)并分配資源、加載程序并建立地址空間表等。
2)就緒狀態(Ready):進程已獲得除處理器外的所需資源,等待分配處理器資源;只要分配了處理器進程就可執行。就緒進程可以按多個優先級來劃分隊列。例如,當一個進程由于時間片用完而進入就緒狀態時,排人低優先級隊列;當進程由I/O操作完成而進入就緒狀態時,排入高優先級隊列。
3)執行狀態:進程已獲得CPU,其程序正在執行。在單處理機系統中,只有一個進程處于執行狀態; 在多處理機系統中,則有多個進程處于執行狀態。
4)阻塞狀態:正在執行的進程由于發生某事件而暫時無法繼續執行時,便放棄處理機而處于暫停狀態,亦即進程的執行受到阻塞,把這種暫停狀態稱為阻塞狀態,有時也稱為等待狀態或封鎖狀態。致使進程阻塞的典型事件有:請求I/O,申請緩沖空間等。通常將這種處于阻塞狀態的進程也排成一個隊列。有的系統則根據阻塞原因的不同而把處于阻塞狀態的進程排成多個隊列。
5)退出狀態(Exit):進程已結束運行,回收除進程控制塊之外的其他資源,并讓其他進程從進程控制塊中收集有關信息(如記帳和將退出代碼傳遞給父進程)。
4. ?作業(進程)調度算法
1)先來先服務調度算法(FCFS)每次調度都是從后備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,為它們分配資源、創建進程,然后放入就緒隊列。
2)短作業(進程)優先調度算法(SPF)短作業優先(SJF)的調度算法是從后備隊列中選擇一個或若干個估計運行時間最短的作業,將它們調入內存運行。缺點:長作業的運行得不到保證
3)優先權調度算法(HPF)當把該算法用于作業調度時,系統將從后備隊列中選擇若干個優先權最高的作業裝入內存。當用于進程調度時,該算法是把處理機分配給就緒隊列中優先權最高的進程,這時,又可進一步把該算法分成如下兩種。 可以分為:1.非搶占式優先權算法 2.搶占式優先權調度算法
4)高響應比優先調度算法(HRN)每次選擇高響應比最大的作業執行,響應比=(等待時間+要求服務時間)/要求服務時間。?
(1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該算法有利于短作業。?
(2) 當要求服務的時間相同時,作業的優先權決定于其等待時間,等待時間愈長,其優先權愈高,因而它實現的是先來先服務。
?(3) 對于長作業,作業的優先級可以隨等待時間的增加而提高,當其等待時間足夠長時,其優先級便可升到很高,從而也可獲得處理機。簡言之,該算法既照顧了短作業,又考慮了作業到達的先后次序,不會使長作業長期得不到服務。因此,該算法實現了一種較好的折衷。當然,在利用該算法時,每要進行調度之前,都須先做響應比的計算,這會增加系統開銷。
5)時間片輪轉法(RR)在早期的時間片輪轉法中,系統將所有的就緒進程按先來先服務的原則排成一個隊列,每次調度時,把CPU分配給隊首進程,并令其執行一個時間片。時間片的大小從幾ms到幾百ms。當執行的時間片用完時,由一個計時器發出時鐘中斷請求,調度程序便據此信號來停止該進程的執行,并將它送往就緒隊列的末尾;然后,再把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。這樣就可以保證就緒隊列中的所有進程在一給定的時間內均能獲得一時間片的處理機執行時間。換言之,系統能在給定的時間內響應所有用戶的請求。
6)多級反饋隊列調度算法它是目前被公認的一種較好的進程調度算法。?
(1) 應設置多個就緒隊列,并為各個隊列賦予不同的優先級。第一個隊列的優先級最高,第二個隊列次之,其余各隊列的優先權逐個降低。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權愈高的隊列中,為每個進程所規定的執行時間片就愈小。例如,第二個隊列的時間片要比第一個隊列的時間片長一倍,……,第i+1個隊列的時間片要比第i個隊列的時間片長一倍。
?(2) 當一個新進程進入內存后,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可準備撤離系統;如果它在一個時間片結束時尚未完成,調度程序便將該進程轉入第二隊列的末尾,再同樣地按FCFS原則等待調度執行;如果它在第二隊列中運行一個時間片后仍未完成,再依次將它放入第三隊列,……,如此下去,當一個長作業(進程)從第一隊列依次降到第n隊列后,在第n 隊列便采取按時間片輪轉的方式運行。
?(3) 僅當第一隊列空閑時,調度程序才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,才會調度第i隊列中的進程運行。如果處理機正在第i隊列中為某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶占正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。http://blog.csdn.net/luyafei_89430/article/details/12971171
4. 作業與進程的區別
一個進程是一個程序對某個數據集的執行過程,是分配資源的基本單位。作業是用戶需要計算機完成的某項任務,是要求計算機所做工作的集合。一個作業的完成要經過作業提交、作業收容、作業執行和作業完成4個階段。而進程是對已提交完畢的程序所執行過程的描述,是資源分配的基本單位。其主要區別如下。
?1) 作業是用戶向計算機提交任務的任務實體。在用戶向計算機提交作業后,系統將它放入外存中的作業等待隊列中等待執行。而進程則是完成用戶任務的執行實體,是向系統申請分配資源的基本單位。任一進程,只要它被創建,總有相應的部分存在于內存中。
?2) 一個作業可由多個進程組成,且必須至少由一個進程組成,反過來則不成立。 3) 作業的概念主要用在批處理系統中,像UNIX這樣的分時系統中就沒有作業的概念。而進程的概念則用在幾乎所有的多道程序系統中。
http://blog.csdn.net/qq_32744005/article/details/51817637
3. 進程和線程的關系:
(1) 一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。 (2) 資源分配給進程,同一進程的所有線程共享該進程的所有資源。 (3) 處理機分給線程,即真正在處理機上運行的是線程。 (4) 線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。線程是指進程內的一個執行單元,也是進程內的可調度實體.
4. ?進程與線程的區別
1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位
2)并發性:不僅進程之間可以并發執行,同一個進程的多個線程之間也可并發執行
3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源.
4)系統開銷:在創建或撤消進程時,由于系統都要為之分配和回收資源,導致系統的開銷明顯大于創建或撤消線程時的開銷。
?參考:http://blog.csdn.net/dazhong159/article/details/7896070
2.1 IPC幾種通信方式(進程間的通信方式)
管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
命名管道 (named pipe): 命名管道也是半雙工的通信方式,它克服了管道沒有名字的限制,并且它允許無親緣關系進程間的通信。命令管道在文件系統中有對應的文件名,命名管道通過命令mkfifo或系統調用mkfifo來創建。
信號量( semophore ): 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
消息隊列( message queue ): 消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
信號 ( sinal ):信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經發生。除了用于進程通信外,進程還可以發送信號給進程本身。
共享內存( shared memory ):共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量配合使用,來實現進程間的同步和通信。
套接字( socket ): 也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同機器間的進程通信。
3.死鎖的必要條件,怎么處理死鎖。
3.1 死鎖概念
是指兩個或兩個以上的進程在執行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。
3.2 活鎖
活鎖指的是任務或者執行者沒有被阻塞,由于某些條件沒有滿足,導致一直重復嘗試,失敗,嘗試,失敗。
3.3 死鎖條件
互斥條件:一個資源每次只能被一個進程使用
不可剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪
請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放
循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系.
3.4 死鎖預防
破壞互斥條件。允許某些進程(線程)同時訪問某些資源,但有的資源不允許同時被訪問如打印機等。
破壞不可搶占條件:即允許進程強行從占有者那里奪取某些資源。就是說,當一個進程已經占有某些資源,它又重新占有全部資源,以后再重新申請,它所釋放的資源可以分配給其他進程。這種預防方法實現起來困難,會降低系統性能。
破壞占有且申請條件??梢詫嵭蓄A先分配策略,即進程在運行前一次性地向系統申請它所需要的全部資源。如果當前進程所需的全部資源得不到滿足,則不分配任何資源。只有當系統能夠滿足當前的全部資源得到滿足時,才一次性將所有申請的資源全部分配給該進程。由于運行的進程已占有了它所需的全部資源,所以不會發生占有資源又重新申請資源的現象,因此不會發生死鎖。但是有以下缺點: 1) 在許多情況下,一個進程在執行之前不可能知道它所需的全部資源。這是由于進程在執行時是動態的,不可預測的。 2)資源利用率低。無論所分配資源何時用到,一個進程只有在占有所需的全部資源后才能執行。即使有些資源最后才被該進程用到一次,但該進程在生存期間一直占有它們,造成長期占有。 3) 降低了進程的并發性。因為資源有限,又加上存在浪費,能分配到所需全部資源的進程個數必然少了。
破壞循環等待條件。實行資源有序分配策略。采用這種策略即把資源事先分類編號,按號分配。所有進程對資源的請求必須嚴格按資源需要遞增的順序提出。進程占用小好資源,才能申請大號資源,就不會產生環路。這種策略與前面的策略相比,資源的利用率和系統吞吐量都有很大提高,但是也存在以下缺點: 1)限制了進程對資源的請求,同時系統給所有資源合理編號也是件困難事,并增加了系統開銷。
3.4 死鎖的避免
銀行家算法:該算法需要檢查申請者對資源的最大需求量,如果系統現存的各類資源可以滿足申請者的請求,就滿足申請者的請求。這樣申請者就可很快完成其計算,然后釋放它占用的資源,從而保證了系統中的所有進程都能完成,所以可避免死鎖的發生
3.5 死鎖的解除
一旦檢測出死鎖,就應立即釆取相應的措施,以解除死鎖。 死鎖解除的主要方法有: 1)資源剝奪法。掛起某些死鎖進程,并搶占它的資源,將這些資源分配給其他的死鎖進程。但應防止被掛起的進程長時間得不到資源,而處于資源匱乏的狀態。 2)撤銷進程法。強制撤銷部分、甚至全部死鎖進程并剝奪這些進程的資源。撤銷的原則可以按進程優先級和撤銷進程代價的高低進行。 3)進程回退法。讓一(多)個進程回退到足以回避死鎖的地步,進程回退時自愿釋放資源而不是被剝奪。要求系統保持進程的歷史信息,設置還原點。
4. Window內存管理方式:頁存儲、段存儲、段頁存儲。
4.1 分頁存儲管理
4.1.1 基本思想
將程序的邏輯地址空間劃分為固定大小的頁(page),而物理內存劃分為同樣大小的頁框(page frame)。程序加載時,可將任意一頁放人內存中任意一個頁框,這些頁框不必連續,從而實現了離散分配。該方法需要CPU的硬件支持,來實現邏輯地址和物理地址之間的映射。在頁式存儲管理方式中地址結構由兩部構成,前一部分是頁號,后一部分為頁內地址w(位移量)。
邏輯地址道物理地址變化原理:CPU中的內存管理單元(MMU)按邏輯頁號通過查進程頁表得到物理頁框號,將物理頁框號與頁內地址相加形成物理地址(見圖4-4)。
4.1.2 頁式管理方式的優點
1)沒有外碎片,每個內碎片不超過頁大比前面所討論的幾種管理方式的最大進步是, 2)一個程序不必連續存放。 3)便于改變程序占用空間的大小(主要指隨著程序運行,動態生成的數據增多,所要求的地址空間相應增長)。
4.1.3 缺點
要求程序全部裝入內存,沒有足夠的內存,程序就不能執行。
4.2 分段存儲
4.2.1 思想
將用戶程序地址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯信息。存儲分配時,以段為單位,段與段在內存中可以不相鄰接,也實現了離散分配。 在為某個段分配物理內存時,可以采用首先適配法、下次適配法、最佳適配法等方法。 在回收某個段所占用的空間時,要注意將收回的空間與其相鄰的空間合并。
4.2.2 地址映射
在段式 管理系統中,整個進程的地址空間是二維的,即其邏輯地址由段號和段內地址兩部分組成。為了完成進程邏輯地址到物理地址的映射,處理器會查找內存中的段表,由段號得到段的首地址,加上段內地址,得到實際的物理地址(見圖4—5)。這個過程也是由處理器的硬件直接完成的,操作系統只需在進程切換時,將進程段表的首地址裝入處理器的特定寄存器當中。這個寄存器一般被稱作段表地址寄存器。
4.3 分頁和分段的主要區別
a)、頁是信息的物理單位,分頁是為實現離散分配方式,以消減內存的外零頭,提高內存的利用率;段則是信息的邏輯單位,它含有一組其意義相對完整的信息,分段的目的是為了能更好地滿足用戶的需要。 b)、頁的大小固定且由系統決定,由系統把邏輯地址劃分為頁號和頁內地址兩部分,是由機器硬件實現的,因而在系統中只能有一種大小的頁面;而段的長度卻不固定,決定于用戶所編寫的程序,通常由編譯程序在對源程序進行編譯時,根據信息的性質來劃分。 c)、分頁的作業地址空間是一維的,即單一的線性地址空間,程序員只需利用一個記憶符,即可表示一個地址;而分段的作業地址空間則是二維的,程序員在標識一個地址是,即需給出段名,又需給出段內地址。 d)、分頁信息很難保護和共享、分段存儲按邏輯存儲所以容易實現對段的保存和共享。
http://blog.sina.com.cn/s/blog_a46817ff0101hjzp.html
4.4 段頁存儲
它首先將程序按其邏輯結構劃分為若干個大小不等的邏輯段,然后再將每個邏輯段劃分為若干個大小相等的邏輯頁。主存空間也劃分為若干個同樣大小的物理頁。輔存和主存之間的信息調度以頁為基本傳送單位,每個程序段對應一個段表,每頁對應一個頁表。CPU訪問時,段表指示每段對應的頁表地址,每一段的頁表確定頁所在的主存空間的位置,最后與頁表內地址拼接,確定CPU要訪問單元的物理地址。
段頁存儲管理方式綜合了段式管理和頁式管理的優點,但需要經過兩級查表才能完成地址轉換,消耗時間多。
5. 什么是虛擬內存。
物理內存:在應用中,自然是顧名思義,物理上,真實的插在板子上的內存是多大就是多大了。而在CPU中的概念,物理內存就是CPU的地址線可以直接進行尋址的內存空間大小。虛擬內存:它使得應用程序認為它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數據交換。
6. 虛擬地址、邏輯地址、線性地址、物理地址的區別。
虛擬地址:指的是由程序產生的由段選擇符和段內偏移地址兩個部分組成的地址。為什么叫它是虛擬的地址呢?因為這兩部分組成的地址并沒有直接訪問物理內存,而是要通過分段地址的變換機構處理或映射后才會對應到相應的物理內存地址。
邏輯地址:指由程序產生的與段相關的偏移地址部分。不過有些資料是直接把邏輯地址當成虛擬地址,兩者并沒有明確的界限。
線性地址:指的是虛擬地址到物理地址變換之間的中間層,是處理器可尋指的內存空間(稱為線性地址空間)中的地址。程序代碼會產生邏輯地址,或者說是段中的偏移地址,加上相應段的基地址就生成了一個線性地址。如果啟用了分頁機制,那么線性地址可以再經過變換產生物理地址。若是沒有采用分頁機制,那么線性地址就是物理地址。
物理地址:指的是現在CPU外部地址總線上的尋址物理內存的地址信號,是地址變換的最終結果!
7. 操作系統如何進行分頁調度
先進先出算法(FIFO):這種算法的實質是,總是選擇在主存中停留時間最長(即最老)的一頁置換,即先進入內存的頁,先退出內存。理由是:最早調入內存的頁,其不再被使用的可能性比剛調入內存的可能性大。?
2.最優置換算法(OPT):當調入新的一頁而必須預先置換某個老頁時,所選擇的老頁應是將來不再被使用,或者是在最遠的將來才被訪問。采用這種頁面置換算法,保證有最少的缺頁率。 但是最優頁面置換算法的實現是困難的,因為它需要人們預先就知道一個進程整個運行過程中頁面走向的全部情況。
?3.最久未使用算法(LRU)當需要置換一頁時,選擇在最近一段時間里最久沒有使用過的頁面予以置換.LRU算法是經常采用的頁面置換算法,并被認為是相當好的,但是存在如何實現它的問題。LRU算法需要實際硬件的支持。?
4.LRU(最近最少使用)算法如果一個數據在最近一段時間內使用次數很少,那么在將來一段時間內被使用的可能性也很小?
5.時鐘算法():將頁面排成一個時鐘的形狀,該時鐘有一個針臂,每次需要更換頁面時,我們從針臂所指的頁面開始檢查。如果當前頁面的訪問位為0,即從上次檢查到這次,該頁面沒有被訪問過,將該頁面替換。反之,就將其訪問位清零,并順時針移動指針到下一個頁面。重復這些步驟,直到找到一個訪問位為0的頁面。 (1)計數器。最簡單的情況是使每個頁表項對應一個使用時間字段,并給CPU增加一個邏輯時鐘或計數器。每次存儲訪問,該時鐘都加1。在置換頁面時,選擇該時間值最小的頁面。這樣做,不僅要查頁表,而且當頁表改變時(因CPU調度)要維護這個頁表中的時間,還要考慮到時鐘值溢出的問題。
8. 磁盤調度算法:
1.先來先服務(FCFS),按訪問請求到達的先后順序服務。簡單,公平,但是效率不高,相臨兩次請求可能會造成最內到最外柱面尋道,使磁頭反復移動,增加了服務時間,對機器不利。?
2.最短尋道時間優先(SSTF),優先選擇距當前磁頭最近的訪問請求進行服務,主要考慮尋道優先。改善了磁盤平均服務時間,但是造成某些訪問請求長期等待得不到服務。?
3.掃描算法(SCAN),當設備無訪問請求時,磁頭不動;當有訪問請求時,磁頭按一個方向移動,在移動過程中對遇到的訪問請求進行服務,然后判斷該方向上是否還有訪問請求,如果有則繼續?
4.循環掃描算法(CSCAN):循環掃描調度算法是在掃描算法的基礎上改進的。磁臂改為單項移動,由外向里。當前位置開始沿磁臂的移動方向去選擇離當前磁臂最近的哪個柱面的訪問者。如果沿磁臂的方向無請求訪問時,再回到最外,訪問柱面號最小的作業請求。
參考http://www.cnblogs.com/edisonchou/p/5094066.htmlhttp://blog.csdn.net/shinehoo/article/details/5881939http://blog.chinaunix.net/uid-25132162-id-361291.html