目錄??????開講之前我們先慶祝我國(guó)贏得38金牌。??????中國(guó)加油!!?????? 

??1、前言 操作系統(tǒng)演進(jìn)如下: 1、無(wú)操作系統(tǒng) 人工操作,用戶獨(dú)占,CPU等待人工操作,資源利用率很低。 2、批處理系統(tǒng) 無(wú)需等待人工操作,批量輸入任務(wù),資源利用率提升,多道程序設(shè)計(jì)。 3、分時(shí)系統(tǒng) 人-機(jī)交互,多用戶共享,及時(shí)調(diào)試程序,資源利用率提升。 多道程序設(shè)計(jì)設(shè)計(jì): 早起批處理系統(tǒng)只能一次處理一個(gè)任務(wù),多道程序設(shè)計(jì)使得批處理系統(tǒng)可以一次處理多個(gè)任務(wù)。對(duì)多道程序的管理是操作系統(tǒng)的重要功能。 操作系統(tǒng)對(duì)多道程序的管理分為五大功能: 進(jìn)程管理 存儲(chǔ)管理 作業(yè)管理 文件管理 設(shè)備管理
??2、操作系統(tǒng)概述 ??2.1、操作系統(tǒng)概念 操作系統(tǒng)是管理計(jì)算機(jī)硬件和軟件資源的計(jì)算機(jī)程序;管理配置內(nèi)存、決定資源供需順序、控制輸入輸出設(shè)備等;操作系統(tǒng)提供 讓用戶和系統(tǒng)交互的操作界面。該定義不局限于計(jì)算機(jī)。 ??2.2、操作系統(tǒng)的基本功能 處理器資源、存儲(chǔ)器資源、IO設(shè)備資源、文件資源。操作系統(tǒng)統(tǒng)一管理這這些計(jì)算機(jī)資源。 用戶無(wú)需面向硬件接口編程。 IO設(shè)備管理軟件,提供讀寫接口。 文件管理軟件,提供操作文件接口。 實(shí)現(xiàn)了對(duì)計(jì)算機(jī)資源的抽象。 提供了用戶于計(jì)算機(jī)之間的接口。 圖像窗口形式、命令形式、系統(tǒng)調(diào)用形式。 ??2.3、操作系統(tǒng)的相關(guān)概念 并發(fā)性 并行是指兩個(gè)或多個(gè)事件可以在同一個(gè)時(shí)刻發(fā)生,并發(fā)是指兩個(gè)或多個(gè)事件可以在同一個(gè)時(shí)刻間隔發(fā)生。 對(duì)于單處理器來說,有兩個(gè)程序交替運(yùn)行,兩個(gè)程序并發(fā)關(guān)系;對(duì)雙處理器來說,兩個(gè)程序可同一時(shí)刻運(yùn)行,是并行關(guān)系,但是對(duì)于單個(gè)核心,依然是并發(fā)關(guān)系。 共享性 表現(xiàn)為操作系統(tǒng)中的資源可供多個(gè)并發(fā)的程序共同使用,這種共同使用的形式稱之為資源共享。 資源共享根據(jù)屬性可以分為兩種方式:互斥共享形式、同時(shí)訪問形式。 互斥共享: 當(dāng)資源被程序或進(jìn)程A占用時(shí),只有A使用完之后,其他才可以使用(如打印機(jī)); 同時(shí)訪問: 某種資源在一段時(shí)間內(nèi)并發(fā)地被多個(gè)程序訪問。 虛擬性 虛擬性表現(xiàn)為把一個(gè)物理實(shí)體轉(zhuǎn)變?yōu)槿舾蓚€(gè)邏輯實(shí)體,虛擬的技術(shù)主要有時(shí)分復(fù)用技術(shù)和空分復(fù)用技術(shù)。 時(shí)分復(fù)用技術(shù): 資源在時(shí)間上進(jìn)行復(fù)用,不同程序并發(fā)使用,多道程序分時(shí)使用計(jì)算機(jī)的硬件資源,提高資源的利用率。其中虛擬處理器技術(shù)是借用多道程序設(shè)計(jì)為每個(gè)程序建立進(jìn)程,多個(gè)程序分時(shí)復(fù)用處理器;虛擬設(shè)備技術(shù)是物理設(shè)備虛擬為多個(gè)邏輯設(shè)備,每個(gè)程序占用一個(gè)邏輯設(shè)備,多個(gè)程序并發(fā)訪問。 空分復(fù)用技術(shù): 用來實(shí)現(xiàn)虛擬磁盤、虛擬內(nèi)存等,提高資源的利用率,提升編程效率。 異步性 表現(xiàn)為多道程序環(huán)境下,允許多個(gè)進(jìn)程并發(fā)執(zhí)行;進(jìn)程在使用資源時(shí)可能需要等待或放棄;進(jìn)程的執(zhí)行并不是一氣呵成的,而是以走走停停的形式推進(jìn)。 ??3、進(jìn)程管理之進(jìn)程實(shí)體 ??3.1、為什么需要進(jìn)程 進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。 進(jìn)程作為程序獨(dú)立運(yùn)行的載體保障程序正常執(zhí)行。 進(jìn)程的存在使得操作系統(tǒng)的資源利用率大幅提升。
??3.2、進(jìn)程的實(shí)體 標(biāo)識(shí)符,唯一標(biāo)記一個(gè)進(jìn)程,用于區(qū)別其他進(jìn)程。 狀態(tài),標(biāo)記進(jìn)程的進(jìn)程狀態(tài),如:運(yùn)行態(tài)。 程序計(jì)數(shù)器,程序即將被執(zhí)行的下一條指令的地址。 內(nèi)存指針,程序代碼、進(jìn)程數(shù)據(jù)相關(guān)指針。 上下文數(shù)據(jù),進(jìn)程執(zhí)行時(shí)處理器存儲(chǔ)的數(shù)據(jù)。 IO狀態(tài)信息,被進(jìn)程IO操作所占用的文件列表。 記賬信息,使用處理器時(shí)間、時(shí)鐘數(shù)總和等。 進(jìn)程控制塊(PCB): 用于描述和控制進(jìn)程運(yùn)行的通用數(shù)據(jù)結(jié)構(gòu),記錄進(jìn)程當(dāng)前狀態(tài)和控制進(jìn)程運(yùn)行的全部信息。是使得進(jìn)程能夠獨(dú)立運(yùn)行的基本單位。 PCB是操作系統(tǒng)進(jìn)行調(diào)度進(jìn)程會(huì)被讀取的信息,PCB是常駐內(nèi)存的,存放在系統(tǒng)專門開辟的PCB區(qū)域內(nèi)。 進(jìn)程(Process)與線程(Thread): 一個(gè)進(jìn)程可以有多個(gè)線程。線程是操作系統(tǒng)進(jìn)行運(yùn)行調(diào)度的最小單位,包含在進(jìn)程之中,是進(jìn)程中實(shí)際運(yùn)行工作的單位。一個(gè)進(jìn)程可以并發(fā)多個(gè)線程,每個(gè)線程執(zhí)行不同的任務(wù)。
| 進(jìn)程 | 線程 |
|---|
| 資源 | 資源分配的基本單位 | 不擁有資源 | | 調(diào)度 | 獨(dú)立調(diào)度的基本單位 | 獨(dú)立調(diào)度的最小單位 | | 系統(tǒng)開銷 | 進(jìn)程系統(tǒng)開銷大 | 線程系統(tǒng)開銷小 | | 通信 | 進(jìn)程IPC | 讀寫同一進(jìn)程數(shù)據(jù)通信 |
??4、進(jìn)程管理之五狀態(tài)模型 ??4.1、就緒狀態(tài) 當(dāng)進(jìn)程被分配到除CPU以外所有必要的資源后,只要再獲得CPU的使用權(quán),就可以立即運(yùn)行。 其他資源都準(zhǔn)備好,只差CPU資源的狀態(tài)為就緒狀態(tài)。 在一個(gè)系統(tǒng)中多個(gè)處于就緒狀態(tài)的進(jìn)程通常排成一個(gè)隊(duì)列。
??4.2、執(zhí)行狀態(tài) ??4.2、執(zhí)行狀態(tài) ??4.3、阻塞狀態(tài) ??4.4、創(chuàng)建狀態(tài) 操作系統(tǒng)提供fork函數(shù)接口創(chuàng)建進(jìn)程 ??4.5、終止?fàn)顟B(tài) ??5、進(jìn)程管理之進(jìn)程同步 需要同步的原因:實(shí)現(xiàn)進(jìn)程彼此之間的同步,對(duì)競(jìng)爭(zhēng)資源在多進(jìn)程間進(jìn)行使用次序的協(xié)調(diào),使得并發(fā)執(zhí)行的多個(gè)進(jìn)程之間可以有效使用資源和相互合作。 ??5.1、進(jìn)程間同步的原則 臨界資源: 臨界資源指的是一些雖作為共享資源卻又無(wú)法同時(shí)被多個(gè)線程共同訪問的共享資源。當(dāng)有進(jìn)程在使用臨界資源時(shí),其他進(jìn)程必須依據(jù)操作系統(tǒng)額同步機(jī)制等待占用進(jìn)程釋放該共享資源才可重新競(jìng)爭(zhēng)使用資源。 為了對(duì)臨界資源使用進(jìn)行約束,有四個(gè)使用原則: 空閑讓進(jìn):資源無(wú)占用,允許使用 忙則等待:資源有占用,請(qǐng)求(其他)進(jìn)程等待 有限等待:保證(其他進(jìn)程)有限等待時(shí)間能夠使用資源 讓權(quán)等待:等待時(shí),進(jìn)程需要讓出CPU(即進(jìn)程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài))
同步方法: 消息隊(duì)列 共享存儲(chǔ) 信號(hào)量(詳見下文) ??5.2、線程同步 進(jìn)程內(nèi)多線程也需要同步 線程同步的方法: 互斥量 讀寫鎖 自旋鎖 條件變量(詳見下文) ??6、Linux的進(jìn)程管理 ??6.1、Linux進(jìn)程相關(guān)概念 進(jìn)程的類型: 前臺(tái)進(jìn)程 后臺(tái)進(jìn)程 守護(hù)進(jìn)程。 **前臺(tái)進(jìn)程:**具有終端,可以和用戶交互的進(jìn)程。 **后臺(tái)進(jìn)程:**與前臺(tái)進(jìn)程相對(duì),沒有占用終端的就是后臺(tái)進(jìn)程;后臺(tái)程序基本上不和用戶交互,優(yōu)先級(jí)比前臺(tái)進(jìn)程低,不影響前臺(tái)進(jìn)程。將需要執(zhí)行的命令以“&”符號(hào)結(jié)束。 **守護(hù)進(jìn)程:**守護(hù)(daemon)進(jìn)程是特殊的后臺(tái)進(jìn)程;很多守護(hù)進(jìn)程在系統(tǒng)引導(dǎo)的時(shí)候啟動(dòng),一直運(yùn)行知道系統(tǒng)關(guān)閉。crond hhtpd sshd mysqld等。 進(jìn)程名字以'd’結(jié)尾的一般都是守護(hù)進(jìn)程。 進(jìn)程的標(biāo)記 進(jìn)程ID是進(jìn)程的唯一標(biāo)識(shí),每個(gè)進(jìn)程擁有不同的ID。 進(jìn)程ID表現(xiàn)為一個(gè)非負(fù)整數(shù),最大值由操作系統(tǒng)限定。 top命令查看系統(tǒng)進(jìn)程。 ID為0的進(jìn)程為idle進(jìn)程,是系統(tǒng)創(chuàng)建的第一個(gè)進(jìn)程。 ID為1的進(jìn)程是init進(jìn)程,是0號(hào)進(jìn)程的子進(jìn)程,完成系統(tǒng)初始化。 Init進(jìn)程是所有用戶進(jìn)程的祖先進(jìn)程。 進(jìn)程的狀態(tài)標(biāo)記 | 狀態(tài)符號(hào) | 狀態(tài)說明 |
|---|
| R | (TASK_RUNNING),進(jìn)程正處于運(yùn)行狀態(tài) | | S | (TASK_INTERRUPTIBLE),進(jìn)程正處于睡眠狀態(tài) | | D | (TASK_UNINTERRUPTIBLE),進(jìn)程正處于IO等待的睡眠狀態(tài) | | T | (TASK_STOPPED),進(jìn)程正處于暫停狀態(tài) | | Z | (TASK_DEAD or EXIT_ZOMBIE),進(jìn)程正處于退出狀態(tài),或僵尸進(jìn)程 |
man ps命令顯示進(jìn)程相關(guān)的命令說明 后臺(tái)運(yùn)行一個(gè)python程序,打印該進(jìn)程狀態(tài) S狀態(tài),處于睡眠狀態(tài)  ??6.2、操作Linux進(jìn)程的相關(guān)命令 ps命令: ps列出當(dāng)前的進(jìn)程
ps aux 打印進(jìn)程詳細(xì)信息
ps -u root 查看root用戶進(jìn)程
ps -aux | grep 'pyhton3'查看python3進(jìn)程。
ps -ef --forest可打印進(jìn)程父子狀態(tài)。
ps -aux --sort=pcpu按cpu頻率查看進(jìn)程 pmem 按內(nèi)存排序。
top命令: 1、 2500毫秒刷新一次TOP內(nèi)容,總共5次,輸出內(nèi)容存放到performace.txt文件中 top -b -d 2.5 -n 5 > performace.txt注:要將內(nèi)容輸出到文件中,必須使用-b,表示批處理選項(xiàng)
2、 TOP命令如何快速按%CPU、%MEM、TIME+列排序 a) %CPU:使用大寫字母按鍵:P
b) %MEM:使用大寫字母按鍵:M
c) T IME+使用大寫字母按鍵: T1234512345 注:TOP默認(rèn)排序?yàn)榈剐?,如果確實(shí)需要升序排序,可以使用大寫字母按鍵:R
3、TOP命令中顯示其它列值、將兩列互換等 a). 選擇顯示列或隱藏列:使用小寫字母按鍵:f
c). 交換列顯示順序:使用小寫字母按鍵: o
b). 選擇需要排序的列:使用大寫字母按鍵:Fkill命令:  數(shù)字表示信號(hào)的序號(hào),字符串表示信號(hào)名稱,傳送信號(hào)時(shí)可以使用信號(hào)序號(hào)也可以使用信號(hào)名稱。
◆傳送信號(hào)時(shí)使用kill命令,語(yǔ)法如下: kill -信號(hào)序號(hào) PID,如:kill -9 1234 kill -信號(hào)名稱 PID,如:kill -SIGKILL 1234 或者 kill -KILL 1234 PID是指進(jìn)程號(hào),這樣該進(jìn)程會(huì)收到對(duì)應(yīng)的信號(hào),如果要對(duì)信號(hào)進(jìn)行特殊的處理可以自定義,否則會(huì)按照默認(rèn)的。 ◆常用的信號(hào) | 信號(hào)名稱 | 信號(hào)序號(hào) | 說明 |
|---|
| INT | 2 | 按Ctrl-C鍵產(chǎn)生該信號(hào),中斷程序 | | TERM | 15 | kill命令默認(rèn)傳送該信號(hào)(即kill PID),終止程序 | | KILL | 9 | 強(qiáng)制刪除進(jìn)程,一般kill PID無(wú)效時(shí),使用kill -9 PID強(qiáng)制結(jié)束進(jìn)程 | | TSTP | 20 | 按Ctrl-C鍵產(chǎn)生該信號(hào),在終端中暫停該進(jìn)程。 |
??7、作業(yè)管理之進(jìn)程調(diào)度進(jìn)程調(diào)度是指計(jì)算機(jī)通過決策哪個(gè)就緒進(jìn)程可以獲得CPU使用權(quán)。 進(jìn)程調(diào)度的三種機(jī)制 : 1、就緒隊(duì)列的排隊(duì)機(jī)制 將就緒進(jìn)程按照一定的方式排成隊(duì)列,以便調(diào)度程序可以最快找到就緒進(jìn)程。 2、選擇運(yùn)行進(jìn)程的委派機(jī)制 調(diào)度程序以一定的策略選擇就緒進(jìn)程,將CPU資源分配給它。 3、新老進(jìn)程的上下文切換機(jī)制 保存當(dāng)前進(jìn)程的上下文信息,裝入被委派執(zhí)行進(jìn)程的運(yùn)行上下文。 如果進(jìn)程調(diào)度時(shí)候,老進(jìn)程還沒執(zhí)行完,有兩種調(diào)度方式: 1、非搶占式的調(diào)度搶 處理器一旦分配給某個(gè)進(jìn)程,就讓該進(jìn)程一直使用下去,調(diào)度程序不以任何原因搶占正在被使用的處理器,直到進(jìn)程完成工作或因?yàn)镮O阻塞才會(huì)讓出處理器。 2、搶占式的調(diào) 允許調(diào)度程序以一定的策略暫停當(dāng)前運(yùn)行的進(jìn)程,保存好進(jìn)程的上下文信息,分配處理器給新進(jìn)程。
| 搶占式調(diào)度 | 非搶占式調(diào)度 |
|---|
| 系統(tǒng)開銷 | 頻繁切換、開銷大 | 切換次數(shù)少、開銷小 | | 公平性 | 相對(duì)公平 | 不公平 | | 應(yīng)用 | 通用系統(tǒng) | 專用系統(tǒng) |
??7.1、進(jìn)程調(diào)度的算法先來先服務(wù)調(diào)度算法 優(yōu)先取出隊(duì)列前面的進(jìn)程進(jìn)行調(diào)度。 短進(jìn)程優(yōu)先調(diào)度算法 調(diào)度程序優(yōu)先選擇就緒隊(duì)列中估計(jì)運(yùn)行時(shí)間最短的進(jìn)程,短進(jìn)程優(yōu)先調(diào)度算法不利于長(zhǎng)作業(yè)進(jìn)程的執(zhí)行。 高優(yōu)先權(quán)先調(diào)度算法 進(jìn)程附帶優(yōu)先權(quán),調(diào)度程序優(yōu)先選擇權(quán)重高的進(jìn)程,高優(yōu)先權(quán)優(yōu)先調(diào)度算法使得緊迫的任務(wù)可以優(yōu)先處理。 時(shí)間片輪轉(zhuǎn)調(diào)度算法 按先來先服務(wù)的原則排 列就緒進(jìn)程,每次從隊(duì)列頭部去除待執(zhí)行進(jìn)程,分配一個(gè)時(shí)間片執(zhí)行,是相對(duì)公平的調(diào)度算法,但不能保證及時(shí)響應(yīng)用戶。 ??8、作業(yè)管理之死鎖 **死鎖:**死鎖是指兩個(gè)或兩個(gè)以上的線程在執(zhí)行過程中,由于競(jìng)爭(zhēng)資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。 ??8.1、死鎖的產(chǎn)生1、競(jìng)爭(zhēng)資源:共享資源數(shù)量不滿足各個(gè)進(jìn)程的需求,各個(gè)進(jìn)程之間發(fā)生資源進(jìn)程導(dǎo)致死鎖。 2、調(diào)用順序不當(dāng)。 死鎖產(chǎn)生的四個(gè)必要條件:
1、互斥條件 進(jìn)程對(duì)資源的使用時(shí)排他性的使用,某資源只能由一個(gè)進(jìn)程使用,其他進(jìn)程需要使用只能等待。 2、請(qǐng)求保持條件 進(jìn)程至少保持一個(gè)資源,又提出新的資源請(qǐng)求,新資源被占用,被阻塞的進(jìn)程不釋放自己保持的資源。 3、不可剝奪條件 進(jìn)程獲得的資源在未完成使用前不能被剝奪,獲得的資源只能由進(jìn)程自身釋放。 4、環(huán)路等待條件 發(fā)生死鎖時(shí),必然存在進(jìn)程-資源環(huán)形鏈。 ??8.2、死鎖的處理 預(yù)防死鎖的方法 破壞四個(gè)必要條件之一 1、摒棄請(qǐng)求保持條件 系統(tǒng)規(guī)定進(jìn)程運(yùn)行之前,一次性申請(qǐng)所有需要的資源,進(jìn)程在運(yùn)行期間不會(huì)提出資源請(qǐng)求,從而摒棄請(qǐng)求保持條件。 2、摒棄不可剝奪條件 當(dāng)一個(gè)進(jìn)程請(qǐng)求新的資源得不到滿足時(shí),必須釋放占有的資源,進(jìn)程運(yùn)行時(shí)占有的資源可以被釋放,意味著可以被剝奪。 3、摒棄環(huán)路等待條件 可用資源線性排序,申請(qǐng)必須按照需要遞增申請(qǐng),線性申請(qǐng)不再形成環(huán)路,從而摒棄了環(huán)路等待條件。 銀行家算法 策略原理:客戶申請(qǐng)的貸款是有限的,每次申請(qǐng)需要申請(qǐng)最大資金量,銀行家在能夠滿足貸款時(shí),都應(yīng)該給用戶貸款,客戶在使用貸款后,能夠及時(shí)歸還貸款。 
??9、存儲(chǔ)管理之內(nèi)存分配與回收早期計(jì)算機(jī)編程并不需要過多的存儲(chǔ)管理,隨著計(jì)算機(jī)和程序越來越復(fù)雜,存儲(chǔ)管理成為必要。 存儲(chǔ)管理的作用: 確保計(jì)算機(jī)有足夠的內(nèi)存 處理數(shù)據(jù)。 確保程序可以從可用內(nèi)存中獲取一部分內(nèi)存使用。 確保程序可以歸還使用后的內(nèi)存以供其他程序使用。
??9.1、內(nèi)存分配的過程單一連續(xù)分配是最簡(jiǎn)單的內(nèi)存分配方式,只能在單用戶、單進(jìn)程的操作系統(tǒng)中使用。 固定分區(qū)分配:支持多道程序的最簡(jiǎn)單存儲(chǔ)分配方式,內(nèi)存空間被劃分為若干固定大小的區(qū)域,每個(gè)分區(qū)只提供給一個(gè)程序使用,互不干擾。 **動(dòng)態(tài)分區(qū)分配:**根據(jù)進(jìn)程實(shí)際需要,動(dòng)態(tài)分配內(nèi)存空間,涉及相關(guān)數(shù)據(jù)結(jié)構(gòu)、分配算法。 動(dòng)態(tài)分區(qū)空閑表數(shù)據(jù)結(jié)構(gòu):將內(nèi)存分為若干個(gè)分區(qū),用一張表來表示分區(qū)使用情況:  0表示沒有被占用,1表示被占用。 動(dòng)態(tài)分區(qū)空閑鏈數(shù)據(jù)結(jié)構(gòu): 通過鏈把未被使用的分區(qū)以節(jié)點(diǎn)的形式連接起來,同時(shí)相鄰的分區(qū)節(jié)點(diǎn)可以進(jìn)行合并,節(jié)點(diǎn)需記錄可存儲(chǔ)容量。  動(dòng)態(tài)分區(qū)分配算法: 首次適應(yīng)算法(FF算法):分配內(nèi)存時(shí)從開始順序查找適合內(nèi)存區(qū),若沒有合適的空閑區(qū),則該次分配失敗。每次從頭部開始,使得頭部空間不斷被劃分。 最佳適應(yīng)算法(BF算法):最佳適應(yīng)算法要求空閑鏈表按照容量大小排序,遍歷空閑區(qū)鏈表找到最佳合適空閑區(qū)。  快速適應(yīng)算法(QF算法):快速適應(yīng)算法要求有多個(gè)空閑區(qū)鏈表,每個(gè)空閑區(qū)鏈表存儲(chǔ)一種容量的空閑區(qū)。  ??9.2、內(nèi)存回收的過程
| 情況1 | 情況2 | 情況3 | 情況4 |
|---|
| … | … | … | … |
| 空閑區(qū)1 | 回收區(qū) | 空閑區(qū)1 | … |
| 回收區(qū) | 空閑區(qū)1 | 回收區(qū) | 回收區(qū) |
| … | … | 空閑區(qū)2 | … |
| … | … | … | … | | 解決方案 | 不需要新建空閑鏈表節(jié)點(diǎn),只需要把空閑區(qū)1的容量增大為空閑區(qū)即可 | 將回收區(qū)與空閑區(qū)合并,新的空閑區(qū)使用回收區(qū)的地址 | 將空閑區(qū)1、空閑區(qū)2和回收區(qū)合并,新的空閑區(qū)使用空閑區(qū)1的地址 | 為回收區(qū)創(chuàng)建新的空閑節(jié)點(diǎn),插入到相應(yīng)的空閑區(qū)鏈表中去 |
??10、存存儲(chǔ)管理之段頁(yè)式存儲(chǔ)管理 ??10.1、頁(yè)式存儲(chǔ)管理頁(yè)面和字塊都是大小一樣的一塊內(nèi)存,字塊是相對(duì)物理設(shè)備的定義,頁(yè)面則是相對(duì)邏輯空間的定義。 概念: 將進(jìn)程邏輯空間等分成若干大小的頁(yè)面,相應(yīng)的把物理內(nèi)存空間分成與頁(yè)面大小的物理塊,以頁(yè)面為單位把進(jìn)程空間裝進(jìn)物理內(nèi)存中分散的物理塊。  頁(yè)面大小應(yīng)該適用,過大難以分配,過小內(nèi)存碎片過多,頁(yè)面大小通常是512B~8K 頁(yè)表:記錄進(jìn)程邏輯空間與物理空間的映射 在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,可以支持非常大的邏輯地址空間(232~264),這樣,頁(yè)表就變得非常大,要占用非常大的內(nèi)存空間,如,具有32位邏輯地址空間的分頁(yè)系統(tǒng),規(guī)定頁(yè)面大小為4KB,則在每個(gè)進(jìn)程中的頁(yè)表項(xiàng)可達(dá)1M(220)個(gè),如果每個(gè)頁(yè)表項(xiàng)占用1Byte,故每個(gè)進(jìn)程僅僅頁(yè)表就要占用1MB的內(nèi)存空間。 32位系統(tǒng)進(jìn)程的尋址空間是4G,4G/4KB=220。 將進(jìn)程邏輯空間等分成若干大小的頁(yè)面。 相應(yīng)的把物理內(nèi)存空間分成與頁(yè)面大小的物理塊。 以頁(yè)面為單位把進(jìn)程空間裝進(jìn)物理內(nèi)存中分散的物理塊。
但是如果有一段連續(xù)的邏輯分布在多個(gè)頁(yè)面中,將大大降低執(zhí)行效率。 ??10.2、段式存儲(chǔ)管理 將進(jìn)程邏輯空間劃分成若干段(非等分),段的長(zhǎng)度由連續(xù)邏輯的長(zhǎng)度決定,主函數(shù)MAIN、子程序段X、子函數(shù)Y等。  段表相比頁(yè)表多了段長(zhǎng),用來記錄邏輯長(zhǎng)度。 對(duì)比: 段氏存儲(chǔ)和頁(yè)式存儲(chǔ)都離散地管理了進(jìn)程的邏輯空間 ??10.3、段頁(yè)式存儲(chǔ)管理 分頁(yè)可以有效提高內(nèi)存利用率(雖然說存在頁(yè)內(nèi)碎片),分段可以更好滿足用戶需求,兩者結(jié)合,形成段頁(yè)式存儲(chǔ)管理。 先將邏輯空間按段式管理分成若干段,再把段內(nèi)空間按頁(yè)式管理等分成若干頁(yè)。  ??11、存儲(chǔ)管理之虛擬內(nèi)存有些進(jìn)程實(shí)際需要的內(nèi)存很大,超過物理內(nèi)存的容量。 多道程序設(shè)計(jì),使得每個(gè)進(jìn)程可用物理內(nèi)存更加稀缺。 不可能無(wú)限增加物理內(nèi)存,物理內(nèi)存總有不夠用的時(shí)候。
虛擬內(nèi)存是操作系統(tǒng)內(nèi)存管理的關(guān)鍵技術(shù),使得多道程序運(yùn)行和大程序運(yùn)行成為現(xiàn)實(shí),把程序使用內(nèi)存劃分,將不封暫時(shí)不使用的內(nèi)存放置在輔存。
程序的局部性原理指的是CPU訪問存儲(chǔ)器時(shí),無(wú)論是存取指令還是存取數(shù)據(jù),所訪問的存儲(chǔ)單元都趨于聚集在一個(gè)較小的連續(xù)區(qū)域中。
程序運(yùn)行時(shí),無(wú)需全部裝入內(nèi)存,裝載部分即可,如果訪問頁(yè)不在內(nèi)存,則發(fā)出缺頁(yè)中斷,發(fā)起頁(yè)面置換、從用戶層面看,程序擁有很大的空間,即是虛擬內(nèi)存。 虛擬內(nèi)存實(shí)際是對(duì)物理內(nèi)存的補(bǔ)充,速度接近于內(nèi)存,成本接近于輔存。 虛擬內(nèi)存的置換算法:先進(jìn)先出算法(FIFO)、最不經(jīng)常使用算法(LFU)、最近最少使用算法(LRU)。主存和輔存的替換。
在計(jì)算機(jī)組成原理中有提到這些算法,應(yīng)用于高速緩存與主存的替換。在這里將著重對(duì)比兩種替換而不是算法。 ??12、Linux的存儲(chǔ)管理 ??12.1、Buddy內(nèi)存管理算法Buddy算法是經(jīng)典的內(nèi)存管理算法,算法基于計(jì)算機(jī)處理二進(jìn)制的優(yōu)勢(shì)具有極高的效率,算法主要是為了解決內(nèi)存外碎片的問題,實(shí)際上是將內(nèi)存外碎片問題轉(zhuǎn)移為了內(nèi)存內(nèi)碎片的問題。 頁(yè)內(nèi)碎片是已經(jīng)被分配出去(能明確指出屬于哪個(gè)進(jìn)程)的內(nèi)存空間大于請(qǐng)求所需的內(nèi)存空間,不能被利用的內(nèi)存空間就是內(nèi)部碎片。 頁(yè)外碎片是指還沒有分配出去(不屬于任何進(jìn)程),但是由于太小而無(wú)法分配給申請(qǐng)內(nèi)幕才能空間的新進(jìn)程的內(nèi)存空間塊。 該算法努力讓內(nèi)存分配與相鄰內(nèi)幕才能合并能快速進(jìn)行,內(nèi)存分配原則: 伙伴系統(tǒng): '伙伴’指的是內(nèi)存的'伙伴’,一片連續(xù)內(nèi)存的'伙伴’是相鄰的另一片大小一樣的連續(xù)內(nèi)存。 假設(shè)存儲(chǔ)空間有1M大小,來分配100k的內(nèi)存: 1、100k向上取2的冪; 2、 查詢是否有128k的空閑內(nèi)存塊; 3、 沒有!查詢是否有256k空閑內(nèi)存塊; 4、沒有!查詢是否有512k空閑內(nèi)存塊; 5、沒有!查詢是否有1M的空閑內(nèi)存塊; 6、有,摘下1M空閑內(nèi)存塊,分配出去; 7、拆下512k放在512k的空閑鏈表,其余的分配出去; 8、拆下256k放在256k的空閑鏈表,其余的分配出去; 9、拆下128k的空閑鏈表,其余的分配出去; 10、分配完畢; 回收剛才分配的內(nèi)存: 1、判斷剛才分配的內(nèi)存伙伴在空閑鏈表上嗎? 2、 在!移除伙伴,合并為256k空閑內(nèi)存,判斷 3、 在!移除伙伴,合并為512k空閑內(nèi)存,判斷; 4、 在!移除伙伴,合并為1M空閑內(nèi)存; 5、插入1M空閑鏈表,回收完成; ??13、Linux交換空間交換空間(Swap)是磁盤的一個(gè)分區(qū),Linux物理內(nèi)存滿時(shí),會(huì)把一些內(nèi)存交換至Swap空間,Swap空間是初始化系統(tǒng)時(shí)配置的。top命令可以查詢到: 冷啟動(dòng)內(nèi)存依賴。 系統(tǒng)睡眠依賴。 大進(jìn)程空間依賴。
交換空間與虛擬內(nèi)存對(duì)比: Swap空間存在于磁盤,虛擬內(nèi)存也存在于磁盤。 Swap空間與主存發(fā)生置換 ,虛擬內(nèi)存也是與主存發(fā)生置換。 Swap空間是操作系統(tǒng)概念,虛擬內(nèi)存是進(jìn)程概念。 Swap空間解決系統(tǒng)物理內(nèi)存不足的問題,虛擬內(nèi)存解決物理內(nèi)存不足的問題。
??14、操作系統(tǒng)的文件管理 ??14.1、文件的邏輯結(jié)構(gòu) 有結(jié)構(gòu)文件:有結(jié)構(gòu)內(nèi)容由定長(zhǎng)記錄和可變長(zhǎng)記錄組成,定長(zhǎng)記錄存儲(chǔ)格式、文件描述等結(jié)構(gòu)化數(shù)據(jù)項(xiàng),可變長(zhǎng)記錄存儲(chǔ)文件具體內(nèi)容:
比如png圖片文件,分為png文件標(biāo)記、png數(shù)據(jù)塊和文件結(jié)束標(biāo)記。定長(zhǎng)記錄存儲(chǔ)文件格式、文件描述等結(jié)構(gòu)化數(shù)據(jù)項(xiàng),如png文件標(biāo)記和文件結(jié)束標(biāo)記??勺冮L(zhǎng)記錄存儲(chǔ)文件具體內(nèi)容。 無(wú)結(jié)構(gòu)文件: 也稱為流式文件,文件內(nèi)容長(zhǎng)度以字節(jié)為單位,比如exe,dll,so文件等。 順序文件: 順序文件是指按順序存放在存儲(chǔ)介質(zhì)中的文件,磁帶的存儲(chǔ)特征使得磁帶文件只能存儲(chǔ)順序文件,順序文件是所有邏輯文件當(dāng)中存儲(chǔ)效率最高的。 索引文件: 可變長(zhǎng)文件不適合使用順序文件格式存儲(chǔ),索引文件是為了解決可變長(zhǎng)文件存儲(chǔ)而發(fā)明的一種文件格式,索引文件需要配合索引表完成存儲(chǔ)的操作。 ??15、輔存的存儲(chǔ)空間分配輔存的分配方式  空閑表: 空閑盤區(qū)分分配與內(nèi)存分配類似,首次適應(yīng)算法、循環(huán)適應(yīng)算法等,回收過程也與內(nèi)存回收類似。 空閑鏈表: 空閑鏈表法把所有空閑盤區(qū)組成一個(gè)空閑鏈表,每個(gè)鏈表節(jié)點(diǎn)存儲(chǔ)空閑盤塊和空閑的數(shù)目。 位示圖: 每個(gè)盤塊有0/1比特位表示是否被占用。位示圖維護(hù)成本低,位示圖可以非常容易找到空閑盤塊,位示圖使用0/1比特位,占用空間很小。該方法在輔存中最為常用。 目錄管理  任何文件或目錄都只有唯一路徑 例如 A/D/M ??16、Linux文件基本操作 ??16.1、Linux目錄 Linux一切皆是文件  絕對(duì)路徑 相對(duì)路徑 ??16.2、Linux文件常用操作創(chuàng)建文件 touch 文件名 創(chuàng)建并修改文件 vim 文件名 查看文件vim 也可以使用cat 文件名 刪除文件 rm 文件名 創(chuàng)建文件夾 mkdir名字 刪除文件夾 rm -r 名字 ??16.3、Linux文件類型Linux有這些文件類型:套接字(s)、普通文件(-)、目錄文件(d)、符號(hào)鏈接(l)、設(shè)備文件(b、c)、FIFO§。 通過ls -al可以查看文件屬性,首字母表示文件類型。其中b和c分別表示塊設(shè)備、字符設(shè)備。  ??17、Linux文件類型 ??17.1、文件系統(tǒng)概覽FAT、NTFS、EXT2/3/4 FAT(File Allocation Table),分為FAT16、FAT32等,微軟Dos/Windows使用的文件系統(tǒng),使用一張表來保存盤塊的信息。 NTFS(New Technology File System),WindowsNT環(huán)境的文件系統(tǒng),NTFS對(duì)FAT進(jìn)行了改進(jìn),取代了舊的文件系統(tǒng)。Windows、Linux、MacOS均可識(shí)別。 EXT(Extended file system),擴(kuò)展文件系統(tǒng)。Linux的文件系統(tǒng)。數(shù)字表示第幾代。Window不能識(shí)別。 ??17.2、Ext文件系統(tǒng) Boot Sector:?jiǎn)?dòng)扇區(qū),安裝開機(jī)管理程序。Block Group:塊組,存儲(chǔ)數(shù)據(jù)的實(shí)際位置。
每一個(gè)Block Group有這些信息:  Inode Table:存放文件Inode的地方,每一個(gè)文件(目錄)都有一個(gè)Inode,是每一個(gè)文件(目錄)的索引節(jié)點(diǎn),也是該文件唯一標(biāo)記。Inode存放了文件類型、文件權(quán)限、文件物理地址、文件長(zhǎng)度、文件連接計(jì)數(shù)、文件存取時(shí)間、文件狀態(tài)、索引節(jié)點(diǎn)編號(hào)、訪問計(jì)數(shù)、鏈接指針等等。 需要注意的是文件名不是存放在Inode節(jié)點(diǎn)上的,而是存放在目錄的Inode節(jié)點(diǎn),目的在于列出目錄文件的時(shí)候無(wú)需加載文件的Inode。 Inode bitmap,Inode的位示圖,記錄已分配的Inode和未分配的Inode。 Data block,存放文件內(nèi)容的地方,每個(gè)block都有唯一的編號(hào),文件的block記錄在文件的Inode上 Block bitmap,功能與Inode bitmap類似,記錄Data block的使用情況。 Superblock,記錄整個(gè)文件系統(tǒng)相關(guān)信息的地方,Block和Inode的使用情況,時(shí)間信息、控制信息等。 df -T 查看系統(tǒng)掛載的磁盤信息 dumpe2fs 設(shè)備名 查看其中的文件系統(tǒng)信息。
stat 文件名查看具體的文件信息。 
??18、操作系統(tǒng)的設(shè)備管理 ??18.1、廣義的IO設(shè)備對(duì)CPU而言,凡是對(duì)CPU進(jìn)行數(shù)據(jù)輸入的都是輸入設(shè)備,對(duì)CPU而言,凡是CPU進(jìn)行數(shù)據(jù)輸出的都是輸出設(shè)備。 可以分別按使用特性分類、按設(shè)備的共享屬性分類、按信息交換的單位分類、按傳輸速率分類。 使用特性分類:存儲(chǔ)設(shè)備(內(nèi)存、硬盤等)、交互IO設(shè)備(鍵盤、顯示器等)。 信息交換單位分配:塊設(shè)備(磁盤、SD卡)、字符設(shè)備(打印機(jī)、shell終端)。 共享屬性分類:共享設(shè)備、獨(dú)占設(shè)備、虛擬設(shè)備。 傳輸速率分類:低速設(shè)備、中速、高速。 ??18.2、IO設(shè)備緩沖區(qū)CPU與IO設(shè)備的速率不匹配問題,所以有個(gè)各個(gè)存儲(chǔ)器的層次結(jié)構(gòu)。而緩沖區(qū)也是為了解決這個(gè)問題,它可以減少CPU處理IO請(qǐng)求的頻率,提高CPU與IO設(shè)備之間的并行性。 可以把需要多次交互的請(qǐng)求放入一個(gè)緩沖區(qū),將多個(gè)請(qǐng)求寫入緩沖區(qū),減少交互次數(shù)。 緩沖池:專用緩沖區(qū)只適用于特定的IO進(jìn)程,當(dāng)這樣的IO進(jìn)程比較多時(shí),對(duì)內(nèi)存的消耗也很大,操作系統(tǒng)劃出可供多個(gè)進(jìn)程使用的公共緩沖區(qū),稱之為緩沖池。 ??18.3、SPOOLing技術(shù)是一種慢速字符設(shè)備如何與計(jì)算機(jī)主機(jī)交換信息的一種技術(shù),利用高速共享設(shè)備將低俗的獨(dú)享設(shè)備模擬為高速的共享設(shè)備。邏輯上,系統(tǒng)為每一個(gè)用戶都分配了一臺(tái)獨(dú)立的高速獨(dú)享設(shè)備,所以這是一種虛擬設(shè)備技術(shù)。  假設(shè)有三個(gè)進(jìn)程要使用打印機(jī),同步調(diào)用的效率會(huì)比較低。從磁盤中劃出一部分空間叫輸出井,各個(gè)進(jìn)程將調(diào)用請(qǐng)求放入輸出井,由SPOOLing技術(shù)來完成輸出井到打印機(jī)的交互。
SPOOLing技術(shù)把同步調(diào)用的低速設(shè)備改為異步調(diào)用
總結(jié)起來該技術(shù)就是: 在輸入、輸出之間增加了派對(duì)轉(zhuǎn)存儲(chǔ)環(huán)節(jié)(輸入井、輸出井)。 SPOOLing負(fù)責(zé)輸入(出)井與低速設(shè)備之間的調(diào)用。 邏輯上,進(jìn)程直接與高速設(shè)備交互,減少了進(jìn)程等待時(shí)間。
??19、Linux文本編輯器及軟件安裝Nano文本編輯器 復(fù)制、剪貼和粘貼 復(fù)制一整行:Alt+6 剪貼一整行:Ctrl+K 粘貼:Ctrl+U 如果需要復(fù)制/剪貼多行或者一行中的一部分,先將光標(biāo)移動(dòng)到需要復(fù)制/剪貼的文本的開頭,按Ctrl+6(或者Alt+A)做標(biāo)記,然后移動(dòng)光標(biāo)到 待復(fù)制/剪貼的文本末尾。這時(shí)選定的文本會(huì)反白,用Alt+6來復(fù)制,Ctrl+K來剪貼。若在選擇文本過程中要取消,只需要再按一次Ctrl+6。 搜索 按Ctrl+W,然后輸入你要搜索的關(guān)鍵字,回車確定。這將會(huì)定位到第一個(gè)匹配的文本,接著可以用Alt+W來定位到下一個(gè)匹配的文本。 保存 使用Ctrl+O來保存所做的修改 退出 按Ctrl+X nano file
可以直接路徑,沒有該文件的話,就會(huì)創(chuàng)建一個(gè)再編輯。 配置nano編輯器 單個(gè)用戶配置: 一般通過/home/username路徑下的.nanorc文件修改。nano .nanorc 配置語(yǔ)言以set開頭: # 相當(dāng)于命令后面加 -m 參數(shù) 鼠標(biāo)生效set mouse# 相當(dāng)于 -i 參數(shù) 自動(dòng)縮進(jìn)set autoindent# 激活職能home鍵 -A參數(shù)set smarthome123456123456 全局配置: /etc/nanorc文件中修改(root用戶)sudo nano /etc/nanorc配置終端: 單個(gè)用戶的終端配置文件/home/username/.bashrc nano ~/.bashrc bash其實(shí)是一種shell,shell用于解釋我們輸入終端的各種命令的,是用戶和操作系統(tǒng)之間的一個(gè)命令解釋器。 配置.bashrc文件可以修改終端的各種配置,如命令提示符樣式,創(chuàng)建命令別名 # 創(chuàng)建別名 alias xx='command'alias ll='ls -alF'alias la='ls -A'alias l='ls -CF'12341234 全局配置的路徑:/etc/bash.bashrc,但是家目錄下的優(yōu)先級(jí)高于系統(tǒng)的bash.bashrc文件。 profile配置文件 單個(gè)用戶:~/.profile,全局/etc/profile。 bashrc應(yīng)用于圖形化終端,profile應(yīng)用于TTY1-TTY6這種需要用戶登錄的終端。profile文件會(huì)調(diào)用.bashrc。  bashrc 和 profile二者修改后都是下次登陸生效,需要立即生效使用source命令:
source .bashrcsource .profile ??20、Ubuntu軟件倉(cāng)庫(kù)對(duì)于ubuntu系統(tǒng),在全世界各地分布有軟件倉(cāng)庫(kù)。Linux的.deb軟件包相較于windows的exe安裝包文件,包含了依賴關(guān)系的管理,對(duì)于依賴的軟件會(huì)自動(dòng)下載。 管理軟件倉(cāng)庫(kù) 如果我們要切換軟件倉(cāng)庫(kù),可以通過編輯軟件倉(cāng)庫(kù)列表文件/etc/apt/sources.list(root模式) 一般來說,這個(gè)文件中有作用的行是由以下兩個(gè)指令開頭: # 舉例其中一行deb http://cn.archive./ubuntu/ bionic universe1212 第二個(gè)是倉(cāng)庫(kù)地址,第三個(gè)bionic是Ubuntu版本代號(hào),第三個(gè)universe是軟件倉(cāng)庫(kù)的區(qū)域,也就是要查看的代碼倉(cāng)庫(kù)的不同分區(qū)。 Ubuntu圖形界面中software&update中可以直接切換軟件倉(cāng)庫(kù),更加方便。 ??21、終端包管理工具apt-get/apt管理包命令
aptitude:這個(gè)命令再卸載軟件時(shí)可以卸載不用的依賴
sudo apt update更新軟件包緩存;sudo apt-cache search搜索軟件包;sudo apt install安裝軟件包; sudo apt upgrade升級(jí)所有已安裝軟件包;sudo apt autoremove
dpkg命令時(shí)apt-get和aptitude兩個(gè)命令的后端(backend)命令
依賴鏈:dpkg-->apt-get,aptitude-->Ubuntu Software 使用dpkg可以安裝本地的軟件包:sudo dpkg -i *.deb,卸載:sudo dpkg -r 包名 ??22、閱讀手冊(cè)man命令 例如man ls,會(huì)出現(xiàn)ls命令的使用說明。手冊(cè)的各部分區(qū)域說明: NAME 命令的全稱 SYNOPSIS 概要,使用此命令的方法 ls [OPTION]... [FILE]...  粗體:原封不動(dòng)輸入。
下劃線:用實(shí)際內(nèi)容替代。 [-hvc]中括號(hào)內(nèi)為可選參數(shù)。
a|b輸入a或b選項(xiàng)。
OPTION參數(shù),省略號(hào)表示可輸入多個(gè)參數(shù)。 DESCRIPTION 列出所有參數(shù)和用法 其他區(qū)域:AUTHOR, REPROTIONG BUGS, COPYRIGHT, SEE ALSO apropos查找命令 apropos命令后面添加關(guān)鍵字即可(根據(jù)手冊(cè)中的關(guān)鍵字) 例如需要查找控制音量的方法 apropos sound  ??23、其他查閱手冊(cè)的方法很多命令都支持-h參數(shù) 比man命令的內(nèi)容稍顯簡(jiǎn)便 whatis命令 man的精簡(jiǎn)版,顯示man的NAME區(qū)域 文件查找命令 locate命令 查找速度極快,查找包含關(guān)鍵字的文件。 locate xxx
會(huì)查找并列出xxx(目錄或文件名包含xxx)所在的所有目錄。 缺陷:如果是剛新建的文件locate是查不到的,因?yàn)閘ocate不是查找硬盤,是在數(shù)據(jù)庫(kù)(包含文件的列表和文件的位置)中查找記錄。對(duì)于剛創(chuàng)建的文件,沒有更新進(jìn)數(shù)據(jù)庫(kù)(一般24小時(shí)自動(dòng)更新) 當(dāng)然也可以用updatedb命令強(qiáng)制系統(tǒng)立即更新數(shù)據(jù)庫(kù) sudo updatedb。 find命令深入查找 遍歷實(shí)際的硬盤的文件,還可以對(duì)查找的文件進(jìn)行操作。 查找文件要完全對(duì)應(yīng)關(guān)鍵字,但是可以用正則匹配 功能強(qiáng)大。 find 默認(rèn)當(dāng)前子目錄查找,也可以指定目錄查找;用文件名、創(chuàng)建時(shí)間等查找;最后可以對(duì)找到的文件進(jìn)行操作。 例如:find -name 'new_file'根據(jù)名字查找當(dāng)前目錄的文件 ; find /var/log -name 'syslog'查找其他目錄的文件; 根據(jù)文件大小查找 find /var -size +10M查找/var目錄下大于10m的文件。
根據(jù)文件的最近訪問時(shí)間查找 find -name '*.txt' -atime -7查找7天內(nèi)訪問的txt文件。
僅查找目錄或文件 find -name 'file1' -type d查找名為file1的目錄
操作查找結(jié)果 格式化輸出:find -name 'file1' -printf '%p - %u\n'將查找到的文件格式化輸出為文件名 - 用戶名的形式。 刪除操作:xxx -delete 調(diào)用其他命令: 加上-exec參數(shù)之后就可以接其他命令了,十分強(qiáng)大 # 將/var目錄下的所有txt文件修改權(quán)限為600find /var -name '*.txt' -exec chmod 600 {} \;大括號(hào)表示剛查找到的文件,\;是exec的結(jié)尾。 將-exec參數(shù)換成-ok參數(shù)效果一樣,但是會(huì)對(duì)每個(gè)文件都做確認(rèn)提示!
|