(一)什么是操作系統(tǒng)
操作系統(tǒng)管理著計算機的硬件和軟件坐慰,它是軟件和硬件能夠交互的基礎。從本質(zhì)上來講用僧,操作系統(tǒng)還是一個運行在計算機上的程序结胀。操作系統(tǒng)需要處理如管理與配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序责循、控制輸入設備與輸出設備糟港、操作網(wǎng)絡與管理文件系統(tǒng)等基本事務。操作系統(tǒng)也提供一個讓用戶與系統(tǒng)交互的操作界面院仿。
(二)用戶態(tài)和系統(tǒng)態(tài)是什么
所謂用戶態(tài)和系統(tǒng)態(tài)秸抚,其實是cpu的一種狀態(tài)速和。
用戶態(tài)也稱為普通態(tài),用戶態(tài)運行的進程可以直接讀取用戶程序的數(shù)據(jù)剥汤,我們運行的程序基本都是在用戶態(tài)健芭。
內(nèi)核態(tài)也叫特權態(tài),cpu可以訪問計算機的任何資源秀姐。
區(qū)分為用戶態(tài)和系統(tǒng)態(tài)是最主要原因是要把用戶程序和系統(tǒng)程序區(qū)分開慈迈,以利于程序的共享和保護。
用戶態(tài)訪問內(nèi)核態(tài)的功能的方式叫做系統(tǒng)調(diào)用省有,用戶態(tài)進程通過系統(tǒng)調(diào)用申請使用操作系統(tǒng)提供的服務程序完成工作痒留,比如fork()實際上就是執(zhí)行了一個創(chuàng)建新進程的系統(tǒng)調(diào)用。
系統(tǒng)調(diào)用按功能大致可以區(qū)分為:
1蠢沿、設備管理伸头。完成設備的請求或釋放,以及設備啟動等功能舷蟀。
2恤磷、文件管理。完成文件的讀野宜、寫扫步、創(chuàng)建及刪除等功能。
3匈子、進程控制河胎。完成進程的創(chuàng)建、撤銷虎敦、阻塞及喚醒等功能游岳。
4、進程通信其徙。完成進程之間的消息傳遞或信號傳遞等功能胚迫。
5、內(nèi)存管理唾那。完成內(nèi)存的分配访锻、回收以及獲取作業(yè)占用內(nèi)存區(qū)大小及地址等功能。
(三)進程通贞、線程和程序的區(qū)別
程序是指含有指令和數(shù)據(jù)的文件朗若,或者說程序是靜態(tài)的代碼。
進程是系統(tǒng)運行程序的基本單位昌罩,一個進程就是一個執(zhí)行中的程序哭懈。進程是獨立運行的個體。
線程是比進程更小的執(zhí)行調(diào)度單位茎用,一個進程在執(zhí)行中可以產(chǎn)生多個線程遣总,多個線程共享同一塊內(nèi)存空間和系統(tǒng)資源睬罗。
在 Java 中,當我們啟動 main 函數(shù)時其實就是啟動了一個 JVM 的進程旭斥,而 main 函數(shù)所在的線程就是這個進程中的一個線程容达,也稱主線程。
(四)進程有哪幾種狀態(tài)
操作系統(tǒng)的進程有五種狀態(tài):
創(chuàng)建狀態(tài)(new):進程正在被創(chuàng)建垂券,還未到就緒狀態(tài)
就緒狀態(tài)(ready):這是指進程已經(jīng)準備好運行的狀態(tài)花盐,即進程已分配到除CPU以外所有的必要資源后,只要再獲得CPU菇爪,便可以立刻執(zhí)行算芯。這是指進程已經(jīng)準備好運行的狀態(tài),即進程已分配到除CPU以外所有的必要資源后凳宙,只要再獲得CPU熙揍。
運行狀態(tài)(running):進程正在處理器上上運行(單核 CPU 下任意時刻只有一個進程處于運行狀態(tài))。
阻塞狀態(tài)(waiting):正在執(zhí)行的進程由于發(fā)生某事件(如I/O請求氏涩、申請緩沖區(qū)失敗等)暫時無法繼續(xù)執(zhí)行的狀態(tài)届囚,即進程執(zhí)行受到阻塞。即使此時cpu處于空閑也無法執(zhí)行是尖。
結束狀態(tài)(terminated):進程正在從系統(tǒng)中消失意系。可能是進程正常結束或其他原因中斷退出運行
(五)進程間的通信方式有哪些
每個進程都有自己的地址空間析砸,不同進程之間是不可見的昔字,如果進程間需要通信的話必須通過內(nèi)核,在內(nèi)核中開辟一塊緩沖區(qū)首繁,一個進程把數(shù)據(jù)拷貝到內(nèi)核緩沖區(qū),其他進程把數(shù)據(jù)從內(nèi)核態(tài)讀取到用戶態(tài)陨囊。這種機制稱為進程間通信弦疮。
進程間通信的方式有多種:
管道/匿名管道(pipes):用于父子進程和兄弟進程之間數(shù)據(jù)的傳遞,管道的本質(zhì)是一個內(nèi)核緩沖區(qū)蜘醋,管道一端的進程將數(shù)據(jù)順序?qū)懭刖彌_區(qū)胁塞,另一端的進程將數(shù)據(jù)順序讀入。
有名管道(Name pipes):有名管道通過FIFO的方式進行傳遞压语,有名管道的文件形式存在于文件系統(tǒng)中啸罢,可以實現(xiàn)本機任意兩個進程之間的通信。
信號(signal):Linux系統(tǒng)中用于進程間互相通信或者操作的一種機制胎食,信號可以在任何時候發(fā)給某一進程扰才,而無需知道該進程的狀態(tài)。
消息隊列(Message Queuing):消息隊列是消息的鏈表,具有特定的格式,存放在內(nèi)存中并由消息隊列標識符標識厕怜、消息隊列允許一個或多個進程向它寫入與讀取消息衩匣、消息隊列可以實現(xiàn)消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取.比FIFO更有優(yōu)勢蕾总。消息隊列克服了信號承載信息量少,管道只能承載無格式字 節(jié)流以及緩沖區(qū)大小受限等缺琅捏。
共享內(nèi)存(share memory):使得多個進程可以可以直接讀寫同一塊內(nèi)存空間生百,是最快的可用IPC形式。由于多個進程共享一段內(nèi)存柄延,因此需要依靠某種同步機制(如信號量)來達到進程間的同步及互斥蚀浆。
信號量(Signal):信號量是一個計數(shù)器,用于多進程對共享數(shù)據(jù)的訪問搜吧,信號量的意圖在于進程間同步
套接字(Socket):套接字是一種通信機制蜡坊,憑借這種機制,客戶/服務器(即要進行通信的進程)系統(tǒng)的開發(fā)工作既可以在本地單機上進行赎败,也可以跨網(wǎng)絡進行秕衙。也就是說它可以讓不在同一臺計算機但通過網(wǎng)絡連接計算機上的進程進行通信。
(六)操作系統(tǒng)中進程的調(diào)度算法
操作系統(tǒng)中的進程調(diào)度算法目的是為了確定進程的執(zhí)行順序僵刮,從而最大化利用CPU資源
先到先服務(FCFS):從就緒隊列中選擇等待時間最長的進程(就是最早進來的進程)据忘,等待進程執(zhí)行完成或者放棄CPU時再重新選擇。
輪轉法(Round Robin):也叫做時間片輪轉法搞糕,每個進程被分配一個時間片勇吊,輪流執(zhí)行。
短作業(yè)優(yōu)先(SJF):從就緒隊列中選擇預計運行時間最短的進程窍仰,等待進程執(zhí)行完成或者放棄CPU時再重新選擇汉规。
優(yōu)先級調(diào)度:給每個進程分配一個優(yōu)先級,從就緒隊列中選擇優(yōu)先級最高的進程驹吮,等待進程執(zhí)行完成或者放棄CPU時再重新選擇针史。
多級反饋隊列調(diào)度算法:
(1)設置多個就緒隊列。在系統(tǒng)中設置多個就緒隊列碟狞,并為每個隊列賦予不同的優(yōu)先級啄枕,從第一個開始逐個降低。不同隊列進程中所賦予的執(zhí)行時間也不同族沃,優(yōu)先級越高频祝,時間片越小。
(2)每個隊列都采用FCFS(先來先服務)算法脆淹。輪到該進程執(zhí)行時常空,若在該時間片內(nèi)完成,便撤離操作系統(tǒng)盖溺,否則調(diào)度程序?qū)⑵滢D入第二隊列的末尾等待調(diào)度......漓糙。若進程最后被調(diào)到第N隊列中時,便采用RR方式運行咐柜。
(3)按隊列優(yōu)先級調(diào)度兼蜈。調(diào)度按照優(yōu)先級最高隊列中諸進程運行攘残,僅當?shù)谝魂犃锌臻e時才調(diào)度第二隊列進程執(zhí)行。若優(yōu)先級低隊列執(zhí)行中有優(yōu)先級高隊列進程執(zhí)行为狸,應立刻將此進程放入隊列末尾歼郭,把處理機分配給新到高優(yōu)先級進程。
(七)操作系統(tǒng)的內(nèi)存管理機制
操作系統(tǒng)的內(nèi)存管理主要負責內(nèi)存的分配與回收(malloc 函數(shù):申請內(nèi)存辐棒,free 函數(shù):釋放內(nèi)存)病曾,操作系統(tǒng)中內(nèi)存的分配可以簡單分為連續(xù)分配和非連續(xù)分配:
連續(xù)分配為用戶分配一個連續(xù)的內(nèi)存空間,可以將一個進程分散的裝入內(nèi)存分區(qū)漾根。常見的如塊式管理泰涂。
非連續(xù)分配根據(jù)分區(qū)的大小是否固定可以分成分頁存儲管理(固定)與分段存儲管理(不固定),為了避免兩者的缺點辐怕,還可以二者混用成段頁式存儲管理逼蒙。
頁式管理:把主存分為大小相等且固定的一頁一頁的形式,頁較小寄疏,相對相比于塊式管理的劃分力度更大是牢,提高了內(nèi)存利用率,減少了碎片陕截。頁式管理通過頁表對應邏輯地址和物理地址驳棱。
段式管理:段式管理在頁式管理的基礎上,將內(nèi)存劃分為更小的段农曲,段式管理把主存分為一段段的社搅,每一段的空間又要比一頁的空間小很多 。但是乳规,最重要的是段是有實際意義的形葬,每個段定義了一組邏輯信息,例如,有主程序段 MAIN驯妄、子程序段 X荷并、數(shù)據(jù)段 D 及棧段 S 等。 段式管理通過段表對應邏輯地址和物理地址青扔。
段頁式管理:段頁式管理機制結合了段式管理和頁式管理的優(yōu)點。簡單來說段頁式管理機制就是把主存先分成若干段翩伪,每個段又分成若干頁微猖,也就是說 段頁式管理機制 中段與段之間以及段的內(nèi)部的都是離散的
分頁和分段的區(qū)別:
1、頁是信息的物理單位缘屹,分頁的主要目的是為了實現(xiàn)離散分配凛剥,提高內(nèi)存的利用率。分頁僅僅是系統(tǒng)管理上的需求轻姿,安全是系統(tǒng)行為對用戶是不可見的犁珠;段是信息的邏輯單位逻炊,分段的主要目的是更好地滿足用戶需求,一個段通常包含一組數(shù)語一個邏輯板塊的信息犁享。分段是用戶可見的余素,用戶編程時需要顯示的給出段名。
2炊昆、頁的大小是固定的桨吊,系統(tǒng)決定;段的大小是不固定的凤巨,取決于系統(tǒng)程序
3视乐、分頁的用戶地址空間是一維的,程序員只需要給出一個記憶符就可以表示一個地址敢茁,分段存儲管理的地址空間是二維的佑淀,程序員需要在標識一個地址的時候,既要給出段名彰檬,也要給出段內(nèi)地址
4伸刃、分段比分頁更容易實現(xiàn)信息的共享和保護 注意:不能修改的代碼稱為純代碼(可重入代碼),這樣的代碼段不是臨界資源僧叉,可以共享奕枝。可修改的代碼是不可以共享的(比如由很多變量的代碼段) 比如:生產(chǎn)者進程的一個進程段瓶堕,是用來判斷該緩沖區(qū)此時是否可以訪問隘道,這個時候消費者進程的段表項也可以指向這里 為什么分業(yè)管理不方便實現(xiàn)代碼共享? 因為將生產(chǎn)者進程分段郎笆,由于頁面的空間有限谭梗,一段可能被裝入多個空間,一個空間也可能有多個代碼段被裝進來宛蚓,所以適合共享激捏,達不到安全的效果
5、分頁:內(nèi)存空間利用率高凄吏,不會產(chǎn)生外部碎片远舅,只有少量的內(nèi)部碎片;不方便按照邏輯模塊實現(xiàn)信息的共享與保護
分段:方便按照邏輯模塊實現(xiàn)信息的共享與保護痕钢;如果段太長图柏,為其分配很大的存儲空間很不方便,容易產(chǎn)生外部碎片(這個雖然可以用前面的一些緊湊技術解決一部分任连,但是時間代價很大)
(八)什么是虛擬內(nèi)存
虛擬內(nèi)存是計算機系統(tǒng)內(nèi)存管理的一種技術蚤吹。它使得應用程序認為它擁有連續(xù)可用的內(nèi)存(一個連續(xù)完整的地址空間),而實際上,它通常是被分隔成多個物理內(nèi)存碎片裁着,還有部分暫時存儲在外部磁盤存儲器上繁涂,在需要時進行數(shù)據(jù)交換。
虛擬內(nèi)存為每個進程提供了一個一致的二驰、私有的地址空間扔罪,它讓每個進程產(chǎn)生了一種自己在獨享主存的錯覺(每個進程擁有一片連續(xù)完整的內(nèi)存空間)。這樣會更加有效地管理內(nèi)存并減少出錯诸蚕。
(九)頁面置換算法
在地址映射過程中步势,若在頁面中發(fā)現(xiàn)所要訪問的頁面不在內(nèi)存中,則產(chǎn)生缺頁中斷背犯。當發(fā)生缺頁中斷時坏瘩,如果操作系統(tǒng)內(nèi)存中沒有空閑頁面,則操作系統(tǒng)必須在內(nèi)存選擇一個頁面將其移出內(nèi)存漠魏,以便為即將調(diào)入的頁面讓出空間倔矾。而用來選擇淘汰哪一頁的規(guī)則叫做頁面置換算法。
常見的頁面置換算法有如下幾種:
OPT頁面置換算法:
這種算法選擇永不使用或者最長時間內(nèi)不會被訪問的頁面進行替換柱锹,但是現(xiàn)在無法預知哪個頁面在未來是最長時間內(nèi)不會被訪問的哪自,因此這種算法只能算作理論上。
FIFO頁面置換算法:先進先出禁熏,淘汰最先進入內(nèi)存的頁面壤巷。
LRU(Least Currently Used)頁面置換算法:最近最久未使用,淘汰最近最久未使用的頁面瞧毙。
LFU(Least Frequently Used)頁面置換算法:最少使用頁面置換算法胧华,淘汰之前使用時間中使用最少的頁面。
這篇文章我會持續(xù)更新宙彪,有任何錯誤指出或者更多相關知識推薦歡迎在評論區(qū)留言矩动,我是魚仔,我們下期再見释漆!