1 進程和線程的區別
進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,它是系統進行資源分配的一個獨立單位。例如,用戶運行自己的程序,系統就創建一個進程,並為它分配資源,包括各種表格、內存空間、磁盤空間、I/O設備等,然后該進程被放入到進程的就緒隊列,進程調度程序選中它,為它分配CPU及其他相關資源,該進程就被運行起來。
線程是進程的一個實體,是CPU調度和分配的基本單位,線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器、一組寄存器和棧),但是它可以與同屬一個進程的其他線程共享進程所擁有的全部資源。
引入線程主要有以下4個方面的優點:
1 易於調度
2 提高並發性。通過線程可以方便有效地實現並非
3 開銷小。創建線程比創建進程要快,所需要的開銷也更少。
4 有利於發揮多處理器的功能。通過創建多線程,每個線程都在一個處理器上運行,從而實現應用程序的並行,使每個處理器都得到充分運行。
需要注意的是,盡管線程與進程很相似,但兩者也存在很大的不同,區別如下:
1)一個線程必定屬於也只能屬於一個進程;而一個進程可以擁有多個線程並且至少擁有一個線程
2)屬於一個進程的所有線程共享該進程的所有資源,包括打開的文件、創建的socket等。不同的進程相互獨立。
3)線程又被稱為輕量級進程。進程有進程控制塊,線程也有線程控制塊。但線程控制塊比進程控制塊小很多。線程間切換代價小,進程間切換代價大。
4)進程是程序的一次執行,線程可以理解為程序中一段程序片段的執行。
5)每個進程都有獨立的內存空間,而線程共享其所屬進程的內存空間。
2 線程同步有哪些機制
現在流行的線程同步互斥的控制機制有4種方法實現:臨界區、互斥量、信號量和事件。
1)臨界區:通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。
2)互斥量:為協調共同對一個共享資源的單獨訪問而設計。只有擁有互斥對象的線程才有權去訪問系統的公共資源,因為互斥對象只有一個,所以能夠保證資源不會同時被多個線程訪問。互斥不僅能實現統一應用程序的公共資源安全共享,還能實現不同應用程序的公共資源安全共享。
3)信號量:為控制一個具有有限數量的用戶資源而設計。它允許多個現在在同一時刻去訪問同一資源,但一般需要限制同一時刻訪問此資源的最大線程數目。
4)事件:用來通知線程有一些事件已發生,從而啟動后繼任務的開始。
1 臨界區和互斥量與信號量的區別
臨界區和互斥量與信號量的區別在於,互斥量和信號量在系統中任何進程里都是可見的,也就是說,一個進程創建了一個互斥量或信號量,另一個進程試圖去獲取該鎖是合法的。然而,臨界區的作用范圍僅限於本進程,其他的進程無法獲取該鎖。除此之外,臨界區具有和互斥量相同的性質。即兩者的區別是mutex可以用於進程之間互斥,critical section是線程之間的互斥。
3 內核線程和用戶線程的區別以及系統進程和用戶進程的區別
根據對操作系統內核是否對線程感知,可以把線程分為內核線程和用戶線程。
內核線程建立和銷毀都是由操作系統負責、通過系統調用完成的,操作系統在調度時,參考各進程的線程運行情況作出調度決定。如果一個進程中沒有就緒態的線程,那么這個進程也不會被調度占用CPU。
和內核線程相對應的是用戶線程,用戶線程指不需要內核支持而在用戶程序中實現的線程,其不依賴於操作系統核心,用戶進程利用線程庫提供創建、同步、調度和管理線程的函數來控制用戶線程。
引入用戶線程有以下4方面的優勢:
1)可以在不支持線程的操作系統中實現。
2)創建和銷毀線程、線程切換等線程管理的代價比內核線程少得多
3)允許每個線程定制自己的調度算法,線程管理比較靈活
4)線程能夠利用的表空間和堆棧空間比內核級線程多
用戶線程的缺點主要有以下兩點:
1)同一進程中只能同時有一個線程在運行,如果一個線程使用了系統調用而阻塞,那么整個進程都會被掛起
2)頁面失效也會產生類似的問題。
系統進程和用戶進程
系統進程:可以執行內存資源分配和進程切換等管理工作;而且,該進程的運行不受用戶的干預,即使是root用戶也不能干預系統進程的運行。
用戶進程:通過執行用戶程序、應用程序或內核之外的系統程序而產生的進程,此類進程可以在用戶的控制下運行或關閉。
4 用戶態和核心態的區別
內核態與用戶態是操作系統的兩種運行級別,當程序運行在3級特權級上時,就可以稱之為運行在用戶態,因為這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;反之,當程序運行在0級特權級上時,就可以稱之為運行在內核態。運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。當我們在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其需要操作系統幫助完成某些它沒有權力和能力完成的工作時就會切換到內核態。通常來說,以下三種情況會導致用戶態到內核態的切換:
1)系統調用
這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,比如前例中fork()實際上就是執行了一個創建新進程的系統調用。而系統調用的機制其核心還是使用了操作系統為用戶特別開放的一個中斷來實現,例如Linux的int 80h中斷。
2)異常
當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。
3)外圍設備的中斷
當外圍設備完成用戶請求的操作后,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那么這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行后續操作等。
這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用可以認為是用戶進程主動發起的,異常和外圍設備中斷則是被動的。
5 內核棧和用戶棧的區別
操作系統中,每個進程會有兩個棧,一個用戶棧,存在於用戶空間,一個內核棧,存在於內核空間。當進程在用戶空間運行時,cpu堆棧指針寄存器里面的內容是用戶堆棧地址,使用用戶棧;當進程在內核空間時,cpu堆棧指針寄存器里面的內容是內核棧空間地址,使用內核棧。
內核棧是內存中屬於操作系統空間的一塊區域,其主要用途為:
1)保存中斷現場,對於嵌套中斷,被中斷程序的現場信息依次壓入系統棧,中斷返回時逆序彈出;
2)保存操作系統子程序間相互調用的參數、返回值、返回點以及子程序(函數)的局部變量。
用戶棧是用戶進程空間中的一塊區域,用於保存用戶進程的子程序間相互調用的參數、返回值、返回點以及子程序(函數)的局部變量。
PS:那么為什么不直接用一個棧,何必浪費那么多的空間呢?
1)如果只用系統棧。系統棧一般大小有限,如果中斷有16個優先級,那么系統棧一般大小為15(只需保存15個低優先級的中斷,另一個高優先級中斷處理程序處於運行),但用戶程序子程序調用次數可能很多,那樣15次子程序調用以后的子程序調用的參數、返回值、返回點以及子程序(函數)的局部變量就不能被保存,用戶程序也就無法正常運行了。
2)如果只用用戶棧。我們知道系統程序需要在某種保護下運行,而用戶棧在用戶空間(即cpu處於用戶態,而cpu處於核心態時是受保護的),不能提供相應的保護措施(或相當困難)。
6 進程的調度算法
1)先來先服務調度算法。先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度, 也可用於進程調度。FCFS算法比較有利於長作業(進程),而不利於短作業(進程)。由此可知,本算法適合於CPU繁忙型作業, 而不利於I/O繁忙型的作業(進程)。
2)短作業(進程)優先調度算法。短作業(進程)優先調度算法(SJ/PF)是指對短作業或短進程優先調度的算法,該算法既可用於作業調度, 也可用於進程調度。但其對長作業不利;不能保證緊迫性作業(進程)被及時處理;作業的長短只是被估算出來的。
3) 優先權調度算法的類型。為了照顧緊迫性作業,使之進入系統后便獲得優先處理,引入了最高優先權優先(FPF)調度算法。
4) 高響應比優先調度算法
5)基於時間片的輪轉調度算法
6)多級反饋隊列調度算法
7 Windows內存管理的方式(塊式、頁式、段式、段頁式)
塊式管理
把主存分為一大塊、一大塊的,當所需的程序片斷不在主存時就分配一塊主存空間,把程序片斷載入主存,就算所需的程序片度只有幾個字節也只能把這一塊分配給它。這樣會造成很大的浪費,但時易於管理。
頁式管理
把主存分為一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,顯然這種方法的空間利用率要比塊式管理高很多。
段式
把主存分為一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高很多,但是也有另外一個缺點。一個程序片斷可能會被分為幾十段,這樣很多時間就會被浪費在計算每一段的物理地址上(計算機最耗時間的大家都知道是I/O吧)。
段頁式管理。(現在常用)
結合了段式管理和頁式管理的優點。把主存分為若干頁,每一頁又分為若干段。
8 分段和分頁的區別是什么
頁是信息的物理單位,分頁是為了實現離散分配方式,以消減內存的零頭,提高內存的利用率;或者說,分頁僅僅是由於系統管理的需要,而不是用戶的需要。
段是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是為了能更好地滿足用戶的需要。頁的大小固定且由系統確定,把邏輯地址划分為頁號和頁內地址兩部分,是由機器硬件實現的,因而一個系統只有一種大小的頁面。段的長度卻不固定,決定於用戶所編寫的程序,通常由編輯程序在對源程序進行編輯時,根據信息的性質來划分。
9 什么是虛擬內存?
虛擬內存簡稱虛存,是計算機系統內存管理的一種技術。它是相對於物理內存而言的,可以理解為”假的“內存。它使得應用程序認為它擁有連續可用的內存(一個連續完整的地址空間),允許程序員編寫並運行比實際系統擁有的內存大得多的程序。
虛存比實存有以下好處:
1)擴大地址空間。
2)內存保護。每個進程運行在各自的虛擬內存空間,互相不能干擾對方。
3)公平分配內存。采用了虛存之后,每個進程都相當於有通用大小的虛存空間。
4)當進程需要通信時,可采用虛存共享的方式實現。
不過,使用虛存也是有代價的,主要表現在以下幾個方面:
1)虛存的管理需要建立很多數據結構,這些數據結構也占用額外的內存
2)虛擬地址到物理地址的轉換,增加了指令的執行時間
3)頁面的換入換出需要磁盤I/O,這是很耗時的
4)如果一頁中只有一部分數據,會浪費內存
10 什么是內存碎片?什么是內碎片?什么是外碎片?
內存碎片是由於多次內存分配造成的,當進行內存分配時,內存格式一般為:(用戶使用段)(空白段)(用戶使用段),當空白段很小的時候可能不能提供給用戶足夠需要的空間,可能夾在中間的空白段的不能分配而產生空隙。
內碎片是處於區域內部或頁面內部的存儲塊,占有這些區域或頁面的進程並不使用這個存儲塊,而在進程占有這塊存儲塊時,系統無法利用它,直到進程釋放它,或進程結束時,系統才能利用這個存儲塊。
外部碎片是出於任何已分配區域或頁面外部的空閑存儲塊,這些存儲塊的總和可以滿足當前申請的長度要求,但是由於它們的地址不連續或其他原因,使得系統無法滿足當前申請。
11 虛擬地址、邏輯地址、線性地址、物理地址有什么區別?
12 庫函數與系統調用由什么不同
13 靜態鏈接與動態鏈接有什么區別?
14 靜態鏈接庫與動態鏈接庫有什么區別?