計(jì)算機(jī)專業(yè)基礎(chǔ)知識(shí)
計(jì)算機(jī)的字符與編碼集
使用unicode
中文編碼集,windows默認(rèn)使用GBK
編程推薦使用UTF-8
文件的編碼集 GB2312 支持中文
馮諾依曼機(jī)
輸入設(shè)備
輸出設(shè)備
存儲(chǔ)器
運(yùn)算器
控制器
計(jì)算機(jī)硬件:CPU 內(nèi)存 硬盤 鼠標(biāo) 鍵盤 顯示器 網(wǎng)卡 電源 顯卡 聲卡 主板
CPU:存儲(chǔ)器,運(yùn)算器,控制器(里面有高速緩存)
計(jì)算機(jī)總線和IO設(shè)備
計(jì)算機(jī)的總線,計(jì)算機(jī)的輸入/輸出設(shè)備
總線的概述:USB(通用串行總線)
作用:提供了對(duì)外鏈接的接口,不同設(shè)備可以通過(guò)USB鏈接,促使外圍設(shè)備接口的統(tǒng)一
PCI總線:顯卡
沒(méi)有總線需要各自設(shè)備之間的互相鏈接,有了總線就可以通過(guò)總線進(jìn)行鏈接
總線的分類:片內(nèi)總線,系統(tǒng)總線
片內(nèi)總線:芯片內(nèi)部的總線(高速緩存,控制器,中斷系統(tǒng),運(yùn)算器)
總線可以簡(jiǎn)化 內(nèi)部的電路結(jié)構(gòu)
片內(nèi)總線:高集成度芯片內(nèi)部的信息傳輸線
系統(tǒng)總線:鏈接w外部設(shè)備的總線
系統(tǒng)總線:數(shù)據(jù)總線,地址總線 控制總線
數(shù)據(jù)總線:雙向傳輸各個(gè)部件的數(shù)據(jù)信息
地址總線:傳輸數(shù)據(jù)的地址,尋址的作用,地址總線的位數(shù)與存儲(chǔ)單元的位數(shù)有關(guān)
控制總線:監(jiān)視不同組件的狀態(tài),是否準(zhǔn)備就緒
總線的仲裁
主存和硬盤,IO設(shè)備交換數(shù)據(jù) ,總線通過(guò)控制優(yōu)先級(jí)來(lái)爭(zhēng)奪資源,解決總線使用權(quán)的沖突問(wèn)題
總線仲裁的方法:鏈?zhǔn)讲樵兎?計(jì)時(shí)器定時(shí)查詢法 獨(dú)立請(qǐng)求法
鏈?zhǔn)讲樵儯?
問(wèn)題:如果設(shè)備1,2同時(shí)發(fā)出仲裁請(qǐng)求,先到設(shè)備1,再到2
優(yōu)點(diǎn):電路復(fù)雜度低,仲裁方式簡(jiǎn)單
缺點(diǎn):優(yōu)先級(jí)低的設(shè)備難以獲得總線的使用權(quán)
計(jì)時(shí)器定時(shí)查詢
通過(guò)仲裁控制器發(fā)出1,2,3,4等信息,匹配到第幾個(gè)第幾個(gè)響應(yīng)
獨(dú)立請(qǐng)求法
每個(gè)設(shè)備均有總線獨(dú)立鏈接仲裁器
設(shè)備科單獨(dú)向沖裁器發(fā)送請(qǐng)求和接受請(qǐng)求
當(dāng)同時(shí)收到多個(gè)請(qǐng)求信號(hào),仲裁器有權(quán)限優(yōu)先級(jí)分配使用權(quán)
優(yōu)點(diǎn):響應(yīng)速度快,優(yōu)先順序可以改變
缺點(diǎn):設(shè)備連線多,總線控制復(fù)雜
CPU與IO設(shè)備通信
輸入輸出接口的通用設(shè)計(jì)
CPU與IO設(shè)備的通信
程序程序中斷
DMA(直接存儲(chǔ)器訪問(wèn))
CPU速度與IO設(shè)備速度不一致
程序中斷:當(dāng)外圍s設(shè)備IO準(zhǔn)備就緒時(shí),向CPU發(fā)出中斷信號(hào)
程序中斷:提供了設(shè)備通知CPU的一種異步的方式,CPU可以高速運(yùn)轉(zhuǎn)的同時(shí)兼顧低俗設(shè)備響應(yīng)
頻繁打斷CPU會(huì)降低效率
DMA(直接存儲(chǔ)訪問(wèn)) DMA直接連接主存與I設(shè)備
DMA工作時(shí)不需要CPU的參與
有了DMA不需要打斷CPU 工作,類似于脊髓
硬盤 顯卡都有DMA的設(shè)備
計(jì)算機(jī)的存儲(chǔ)器
計(jì)算機(jī)的存儲(chǔ)器概覽,計(jì)算機(jī)的高速存儲(chǔ)器,計(jì)算機(jī)的主存儲(chǔ)器與輔助存儲(chǔ)器
存儲(chǔ)器的分類:內(nèi)存,U盤,固態(tài)硬盤,磁帶,磁盤
存儲(chǔ)介質(zhì)分類
隨機(jī)存儲(chǔ)器(RAM)可讀可寫,與位置無(wú)關(guān)
串行存儲(chǔ)器 與位置有關(guān)
只讀存儲(chǔ)器(ROM) 只讀不寫
計(jì)算機(jī)存儲(chǔ)概覽
1.緩存(容量最低,速度最快)
2.主存(內(nèi)存)
3.輔存(硬盤)
計(jì)算機(jī)的CPU
計(jì)算機(jī)機(jī)的指令系統(tǒng),計(jì)算機(jī)的運(yùn)算器,計(jì)算機(jī)的控制器,指令的執(zhí)行過(guò)程
由于CPU和存儲(chǔ)器速度不一樣所以引入cache
CPU—cache—主存—輔存
緩存—主存 將常用的軟件進(jìn)行內(nèi)存置換(解決速度不匹配)
主存—輔存 解決主存容量不足的問(wèn)題
主存儲(chǔ)器(內(nèi)存)----本質(zhì)是RAM 隨機(jī)存取存儲(chǔ)器
為什么內(nèi)存斷電就會(huì)失去數(shù)據(jù)呢?
RAM是通過(guò)電容存儲(chǔ)數(shù)據(jù)的,必須每隔一段時(shí)間刷新一次,刷新需要有電的存在,沒(méi)有電,電子就會(huì)丟失
CPU里面的:
主存數(shù)據(jù)寄存器(MDR)----數(shù)據(jù)總線
主存地址寄存器(MAR)----地址總線
連接內(nèi)存和CPU
32位最多只有4G的地址尋址空間 所以加再多的內(nèi)存條沒(méi)有用
64位操作系統(tǒng)地址范圍有,支持2的34次方GB
電梯算法(磁盤的讀取)
先來(lái)先服務(wù)算法
最短尋道時(shí)間算法
掃描算法(電梯算法):每次只往一個(gè)方向移動(dòng),到達(dá)一個(gè)方向需要服務(wù)的勁頭再反方向
循環(huán)掃描算法:只往一個(gè)方向讀取到勁頭置到最開(kāi)始的地方
計(jì)算機(jī)的高速緩存
高速緩存的原理
字:放在存儲(chǔ)單元中二進(jìn)制代碼的組合(計(jì)算機(jī)的最小的單位)
字塊:可以理解為一組字(字塊包含多個(gè)字)
主存:2的n次方個(gè)字,一個(gè)存儲(chǔ)單元可以理解為一個(gè)字。一組字塊就是字塊。
尋址過(guò)程:所尋找的字屬于哪個(gè)字塊,字,字塊的地址
字的地址:前m位指字塊的地址
后b位指定字在字塊中的地址
一個(gè)字塊共B個(gè)字,主存共M個(gè)字塊
字塊數(shù)和地址之間的關(guān)系:2的對(duì)數(shù)之間的關(guān)系
字節(jié):B(byte) 1kb = 1024byte 位:bit(0,1)
計(jì)算地址的時(shí)候需要log2操作
主存的容量大于緩存的容量,說(shuō)明主存的字塊數(shù)大于緩存的字塊數(shù)
CPU所需要的數(shù)據(jù)在緩存中就從cache中拿,不在就在主存中拿
量化CPU從cache中的幾率:緩存命中率(衡量緩存的性能指標(biāo))
從主存中替換到cache中的策略:
隨機(jī)算法:隨機(jī)選取一個(gè)位置來(lái)替換
先進(jìn)先出算法(FIFO):看做是一個(gè)先進(jìn)先出的隊(duì)列,cache滿了之后淘汰1號(hào)位,進(jìn)來(lái)9號(hào)位
最不經(jīng)常使用算法(LFU):使用額外的空間記錄字塊使用的頻率,計(jì)數(shù)法
最近最少使用算法(LRU):優(yōu)先淘汰一段時(shí)間沒(méi)有使用的字塊,可以使用雙向鏈表,將當(dāng)前訪問(wèn)節(jié)點(diǎn)置于鏈表前面(保證頭部節(jié)點(diǎn)是最近使用的),滿了之后就開(kāi)始淘汰,每次最近使用就將其置到最前面
計(jì)算機(jī)的指令系統(tǒng)
操作碼字段 :操作碼指明指令要完成的操作,操作碼的位數(shù)反映了機(jī)器的操作種類
地址碼字段:指定數(shù)據(jù)的地址
三地址指令,二地址指令,一地址指令
機(jī)器指令的操作類型:寄存器之間,寄存器與存儲(chǔ)單元之間,存儲(chǔ)單元之間
數(shù)據(jù)讀寫,jiaohua 地址數(shù)據(jù),清零置一等操作
計(jì)算機(jī)尋址系統(tǒng)
機(jī)器指令的尋址方式:順序?qū)ぶ罚S尋址
數(shù)據(jù)尋址:立即尋址,直接尋址,間接尋址
計(jì)算機(jī)的控制器(CPU)
控制器是協(xié)調(diào)控制計(jì)算機(jī)的運(yùn)行的
程序計(jì)數(shù)器用來(lái)存儲(chǔ)下一條指令的地址,循環(huán)從程序計(jì)數(shù)器中拿出指令,當(dāng)指令被拿出時(shí)指向下一條指令
時(shí)序發(fā)生器:發(fā)送時(shí)序脈沖,CPU根據(jù)不同的時(shí)序脈沖進(jìn)行工作
指令譯碼器:是控制器主要部件之一,計(jì)算機(jī)指令由操作碼和地址碼組成,翻譯操作碼對(duì)應(yīng)的操作以及控制傳輸?shù)刂反a對(duì)應(yīng)的數(shù)據(jù)
指令寄存器:從主存或高緩取計(jì)算機(jī)指令
主存地址寄存器:保存當(dāng)前CPU正要訪問(wèn)的內(nèi)存單元地址
主存數(shù)據(jù)寄存器:保存當(dāng)前CPU正要讀寫的主存數(shù)據(jù)
通用寄存器:用于暫時(shí)存放或傳送數(shù)據(jù)的
計(jì)數(shù),發(fā)生,譯碼, 寄存,總線
計(jì)算機(jī)的運(yùn)算器
數(shù)據(jù)緩沖器,ALU,通用寄存器,狀態(tài)字寄存器,總線
數(shù)據(jù)緩沖器:分為輸入緩沖和輸出緩沖
輸入緩沖暫時(shí)存放外設(shè)送來(lái)的數(shù)據(jù)
輸出緩沖暫時(shí)存放送往外設(shè)的數(shù)據(jù)
ALU
算數(shù)邏輯單元,是運(yùn)算器的重要組成
完成常見(jiàn)的位運(yùn)算,算數(shù)運(yùn)算(加減乘除)
計(jì)算機(jī)指令的執(zhí)行過(guò)程
取指令-----分析指令-----執(zhí)行指令
從指令緩存中取指令-----送到指令寄存器-----送到指令譯碼器進(jìn)行譯碼-----發(fā)出控制信號(hào)-----程序計(jì)數(shù)器+1指向下一條指令-----裝載數(shù)據(jù)到寄存器------ALU處理數(shù)據(jù)-----記錄運(yùn)算狀態(tài)------送出運(yùn)算結(jié)果
CPU的流水線設(shè)計(jì)(類似于工廠裝配線)
流水線效率提升3倍
進(jìn)制運(yùn)算的基礎(chǔ)知識(shí):進(jìn)制運(yùn)算的基礎(chǔ)
二進(jìn)制數(shù)據(jù)的表示方法:有符號(hào)數(shù)與無(wú)符號(hào)數(shù),二進(jìn)制的補(bǔ)碼表示法,二進(jìn)制的反碼表示法,小數(shù)的二進(jìn)制補(bǔ)碼表示
二進(jìn)制數(shù)據(jù)的運(yùn)算:定點(diǎn)數(shù)與浮點(diǎn)數(shù),定點(diǎn)數(shù)的加減法運(yùn)算,浮點(diǎn)數(shù)的減法運(yùn)算,浮點(diǎn)數(shù)的乘除法運(yùn)算
操作系統(tǒng)
操作系統(tǒng)的演進(jìn):無(wú)操系統(tǒng)
人工操作
用戶獨(dú)占
CPU等待人工操作
資源利用率很低
批處理系統(tǒng)
無(wú)需等待人工操作
批量處理任務(wù)
資源利用率提升
多道程序設(shè)計(jì)
分時(shí)系統(tǒng):
人機(jī)交互
多用戶共享
即時(shí)調(diào)試程序
資源利用率提升
多道程序設(shè)計(jì):早期批處理系統(tǒng)一次只能處理一個(gè)任務(wù)
多道程序設(shè)計(jì):計(jì)算機(jī)內(nèi)存中可以存放多個(gè)程序,多道程序在計(jì)算機(jī)的管理程序下互相穿插運(yùn)行
五大功能
進(jìn)程管理(進(jìn)程管理之進(jìn)程實(shí)體,進(jìn)程管理之五狀態(tài)模型,進(jìn)程管理之進(jìn)程同步,Linux的進(jìn)程管理)
存儲(chǔ)管理(內(nèi)存的分配與回收,段夜式存儲(chǔ)管理,虛擬內(nèi)存,Linux的存儲(chǔ)管理)
作業(yè)管理(進(jìn)程調(diào)度,死鎖)
文件管理(操作系統(tǒng)的文件管理,Linux的文件系統(tǒng),Linux的文件的基本操作)
設(shè)備管理
操作系統(tǒng)概覽
what & why
操作系統(tǒng)是管理硬件和軟件資源的計(jì)算機(jī)程序。
管理配置內(nèi)存,決定供需順序,控制輸入輸出設(shè)備。
操作系統(tǒng)提供讓用戶和系統(tǒng)交互的的操作界面。
在不同的設(shè)備上,操作系統(tǒng)可以向用戶呈現(xiàn)不同的狀態(tài)。
管理硬件,提供用戶交互軟件的系統(tǒng)
我們不能直接操作硬件
提供了統(tǒng)一的操作界面
操作系統(tǒng)也使更多人使用了計(jì)算機(jī)
操作系統(tǒng)的基本功能
處理器資源
存儲(chǔ)器資源
IO設(shè)備資源
文件資源
用戶無(wú)需面向硬件接口編程
IO設(shè)備管理軟件,提供讀寫文件接口
文件管理軟件,提供文件接口
操作系統(tǒng)實(shí)現(xiàn)了對(duì)計(jì)算機(jī)資源的抽象
操作系統(tǒng)提供了用戶與計(jì)算機(jī)之間的接口
操作系統(tǒng)的基本功能
圖像窗口形式
命令形式
系統(tǒng)調(diào)用形式
操作系統(tǒng)的相關(guān)概念
并發(fā)性
多道程序概念是并發(fā)的基礎(chǔ)
共享性
多個(gè)程序可以同時(shí)使用主存資源
共享根據(jù)屬性可分為兩種方式:互斥共享形式,同時(shí)訪問(wèn)形式
當(dāng)A占用資源,等釋放了之后才能使用
同時(shí)是宏觀的,看上去是同時(shí)訪問(wèn)
短時(shí)間看還是互斥的
虛擬性
虛擬性表現(xiàn)為把一個(gè)物理實(shí)體轉(zhuǎn)變?yōu)槿舾蓚€(gè)邏輯實(shí)體
物理實(shí)體是真實(shí)存在的,邏輯實(shí)體是虛擬的
虛擬的技術(shù)主要有時(shí)分復(fù)用技術(shù),空分復(fù)用技術(shù)
時(shí)分復(fù)用技術(shù):資源在時(shí)間上進(jìn)行復(fù)用,不同程序并發(fā)使用
多道程序分時(shí)使用計(jì)算機(jī)資源
時(shí)分復(fù)用技術(shù)
空分復(fù)用技術(shù)
空分復(fù)用技術(shù)用來(lái)實(shí)現(xiàn)虛擬磁盤,虛擬內(nèi)存等
提高資源利用率,提升編程效率
虛擬磁盤技術(shù)
物理磁盤虛擬為邏輯磁盤C,D,E等邏輯盤
使用起來(lái)更加方便
虛擬內(nèi)存技術(shù)
在邏輯上擴(kuò)大程序的存儲(chǔ)容量
使用比實(shí)際內(nèi)存更大的容量
大大提升編程效率
異步性
在多道程序下面允許多個(gè)程序并發(fā)執(zhí)行
進(jìn)程在使用資源時(shí)可能等待或放棄
進(jìn)程執(zhí)行不是一氣呵成,是走走停停的
進(jìn)程管理之進(jìn)程實(shí)體
為什么需要進(jìn)程
進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位
進(jìn)程作為獨(dú)立運(yùn)行的載體保障程序的正常運(yùn)行
進(jìn)程的存在使操作系統(tǒng)資源利用率大大提升
進(jìn)程實(shí)體
主存中的進(jìn)程形態(tài):標(biāo)識(shí)符,狀態(tài),優(yōu)先級(jí),程序計(jì)數(shù)器,內(nèi)存指針,上下文數(shù)據(jù),IO狀態(tài)信息,記賬信息
標(biāo)識(shí)符:標(biāo)識(shí)唯一的進(jìn)程(進(jìn)程ID)
狀態(tài):標(biāo)記進(jìn)程的狀態(tài)(運(yùn)行態(tài),阻塞態(tài))
程序計(jì)數(shù)器:進(jìn)程即將被執(zhí)行的下一條指令的地址
內(nèi)存指針:程序代碼,進(jìn)程數(shù)據(jù)相關(guān)的指針
上下文數(shù)據(jù):進(jìn)程執(zhí)行時(shí)處理器存儲(chǔ)的數(shù)據(jù)(寄存器,cache)
IO狀態(tài)信息:被進(jìn)程IO操作所占用的文件列表
記賬信息:使用處理器時(shí)間,時(shí)鐘總和等
總結(jié)起來(lái):進(jìn)程的標(biāo)識(shí)符,處理機(jī)的狀態(tài),進(jìn)程調(diào)度信息,進(jìn)程控制信息
進(jìn)程控制塊
用于描述和控制進(jìn)程運(yùn)行的通用數(shù)據(jù)結(jié)構(gòu)(每個(gè)進(jìn)程都有PCB進(jìn)程控制塊)
記錄進(jìn)程當(dāng)前狀態(tài)和控制進(jìn)程運(yùn)行的全部信息
PCB的使得進(jìn)程能夠獨(dú)立運(yùn)行的基本單位
PCB是操作系統(tǒng)進(jìn)行調(diào)度經(jīng)常會(huì)被讀取到的信息
PCB是常駐內(nèi)存的,存放在系統(tǒng)專門開(kāi)辟的PCB區(qū)域內(nèi)
操作系統(tǒng)對(duì)進(jìn)程的調(diào)度其實(shí)是對(duì)線程的調(diào)度
進(jìn)程:資源分配的基本單位,獨(dú)立調(diào)度的基本單位,進(jìn)程系統(tǒng)開(kāi)銷大,進(jìn)程IPC
線程:不擁有資源,獨(dú)立調(diào)度的最小單位,線程系統(tǒng)開(kāi)銷小,讀寫同一進(jìn)程數(shù)據(jù)通信
進(jìn)程管理之無(wú)狀態(tài)模型
創(chuàng)建 就緒 終止 阻塞 執(zhí)行
當(dāng)進(jìn)程被分配到除CPU以外所必要的資源后
只要再獲得CPU的使用權(quán),就可以立即運(yùn)行
其他資源都準(zhǔn)備好,只差CPU資源的狀態(tài)就為就緒狀態(tài)
就緒進(jìn)程就會(huì)排成就緒隊(duì)列
進(jìn)程獲得CPU,其程序正在執(zhí)行成為執(zhí)行狀態(tài)
在單核處理器時(shí),在某個(gè)時(shí)刻只能有一個(gè)進(jìn)程處于執(zhí)行狀態(tài)
進(jìn)程的阻塞狀態(tài)
進(jìn)程因某種原因:其他設(shè)備為準(zhǔn)備就緒而無(wú)法繼續(xù)執(zhí)行,從而CPU放棄的狀態(tài)為阻塞狀態(tài)
阻塞隊(duì)列:存放阻塞的進(jìn)程
創(chuàng)建狀態(tài):分配PCB,插入就緒隊(duì)列
創(chuàng)建進(jìn)程時(shí)擁有PCB但其他資源尚未就緒的狀態(tài)為創(chuàng)建狀態(tài)
操作系統(tǒng)提供fork函數(shù)接口創(chuàng)建進(jìn)程
系統(tǒng)清理,PCB歸還
進(jìn)程結(jié)束由系統(tǒng)清理或者歸還PCB的狀態(tài)稱為終止?fàn)顟B(tài)
進(jìn)程管理之進(jìn)程同步
進(jìn)程間同步:
為什么需要進(jìn)程間同步
進(jìn)程間同步的原則
線程同步
生產(chǎn)者消費(fèi)者問(wèn)題
進(jìn)程的同步:
空閑等待
忙則等待
有限等待
讓權(quán)等待
進(jìn)程間同步的方法:
消息隊(duì)列
共享存儲(chǔ)
信號(hào)量
進(jìn)程間同步:
互斥量
讀寫鎖
自旋鎖
條件變量
Linux分為前臺(tái)進(jìn)程,后臺(tái)進(jìn)程,守護(hù)進(jìn)程
占用終端:前臺(tái)進(jìn)程
沒(méi)有占用終端,不和用戶進(jìn)行交互 & 符號(hào)結(jié)束就可以
可以將內(nèi)容重定向到文件里面
linux中以d結(jié)尾的一般為守護(hù)進(jìn)程(sshd,httpd,mysqld)
linux中進(jìn)程的狀態(tài)
R:運(yùn)行狀態(tài)
S:睡眠狀態(tài)
D:IO等待狀態(tài)
T:暫停狀態(tài)
Z:退出狀態(tài)(僵尸進(jìn)程)
作業(yè)管理之進(jìn)程調(diào)度
進(jìn)程調(diào)度的概述
進(jìn)程調(diào)度是值計(jì)算機(jī)通過(guò)決策決定哪個(gè)就緒程序可以獲得CPU使用權(quán)(多道程序設(shè)計(jì))
保存舊進(jìn)程的運(yùn)行信息,請(qǐng)出舊進(jìn)程
選擇新進(jìn)程,準(zhǔn)備運(yùn)行換將并分配CPU
進(jìn)程的調(diào)度
就緒隊(duì)列的排隊(duì)機(jī)制
為了提高進(jìn)程調(diào)度的效率(排隊(duì))
選擇運(yùn)行進(jìn)程的委派機(jī)制
調(diào)度進(jìn)程按照一定的策略選擇就緒進(jìn)程,將CPU資源分配給它
新老進(jìn)程的上下文切換機(jī)制
進(jìn)程的調(diào)度
搶占式,非搶占式
搶占式切換頻繁,開(kāi)銷大,相對(duì)公平
非搶占式切換次數(shù)少,開(kāi)銷小,不公平
進(jìn)程調(diào)度的算法
先來(lái)先服務(wù)
短進(jìn)程優(yōu)先調(diào)度算法
高優(yōu)先權(quán)優(yōu)先調(diào)度算法(前臺(tái)進(jìn)程的優(yōu)先級(jí)會(huì)高于后臺(tái)進(jìn)程)
時(shí)間片輪轉(zhuǎn)算法
作業(yè)管理之死鎖
死鎖的產(chǎn)生:競(jìng)爭(zhēng)資源,進(jìn)程調(diào)度順序不當(dāng)
競(jìng)爭(zhēng)資源不夠共享資源的數(shù)量不滿足各個(gè)進(jìn)程的需求
會(huì)因?yàn)楣蚕碣Y源的競(jìng)爭(zhēng)造成死鎖
死鎖的必要條件
互斥條件
請(qǐng)求保持條件(可以一次性申請(qǐng)所有需要的資源)
不可剝奪條件(當(dāng)一個(gè)進(jìn)程請(qǐng)求新的資源得不到滿足,必須釋放資源)
環(huán)路等待條件(按照線性排序,申請(qǐng)必須按照需要遞增申請(qǐng),按照順序申請(qǐng))
銀行家算法
客戶申請(qǐng)貸款有限,每次申請(qǐng)需要聲明最大的資金量
銀行家能在滿足貸款時(shí),都應(yīng)該給用戶貸款
客戶在使用貸款后,能夠及時(shí)歸還
存儲(chǔ)管理之內(nèi)存分配與回收
單一連續(xù)分配的方法(只能在單用戶,單進(jìn)程的操作系統(tǒng)中使用)
固定分區(qū)分配方法
固定分區(qū)分配支持多道程序最簡(jiǎn)單的存儲(chǔ)分配方式
內(nèi)存空間被劃分為若干固定大小的區(qū)域
每個(gè)分區(qū)只提供給一個(gè)程序使用,互不干擾
動(dòng)態(tài)分區(qū)分配
內(nèi)存分配的過(guò)程
首次適應(yīng)算法(FF算法)(循環(huán)適應(yīng)算法)
分配內(nèi)存是從開(kāi)始順序查找適合內(nèi)存區(qū)(鏈表),遍歷鏈表若沒(méi)有合適的空閑區(qū),則該次分配失敗
最佳適應(yīng)算法(BF算法)
按照內(nèi)存大小進(jìn)行排序(避免一些大材小用的情況)
快速適應(yīng)算法(QF算法)
操作系統(tǒng)如何管理進(jìn)程的空間
頁(yè)式存儲(chǔ)管理
段式存儲(chǔ)管理
段頁(yè)式存儲(chǔ)管理
存儲(chǔ)管理之虛擬內(nèi)存
虛擬內(nèi)存概述
有些進(jìn)程實(shí)際需要內(nèi)存很大,超過(guò)物理內(nèi)存的容量
多道程序設(shè)計(jì),使得每個(gè)程序可用的物理內(nèi)存更加稀缺
不可能無(wú)線增加物理內(nèi)存,物理內(nèi)存總有不夠的時(shí)候
把程序的內(nèi)存劃分,將暫時(shí)不使用的內(nèi)存放在輔存中
程序的局部性原理
CPU訪問(wèn)存儲(chǔ)器時(shí),無(wú)論是存儲(chǔ)指令還是存取數(shù)據(jù),所訪問(wèn)的存儲(chǔ)單元都趨于聚集在一個(gè)較小的連續(xù)趨于中
程序運(yùn)行時(shí),無(wú)需全部轉(zhuǎn)載至內(nèi)存,裝載部分即可
從用戶層面來(lái)看,程序擁有很大的空間(虛擬內(nèi)存
)
虛擬內(nèi)存的置換算法
先入先出
最不經(jīng)常使用算法
最近最少使用的算法
主存頁(yè)面替換的時(shí)機(jī):當(dāng)主存缺頁(yè)的時(shí)候就會(huì)進(jìn)行替換
虛擬內(nèi)存的置換算法
替換策略發(fā)生在cache-主存層次,主存-輔存層次
cache-主存層次的替換策略主要是為了解決速度問(wèn)題
主存-輔存層次主要是為了解決容量問(wèn)題
linux的存儲(chǔ)管理
buddy內(nèi)存管理算法
buddy算法是經(jīng)典的內(nèi)存管理算法
算法基于計(jì)算機(jī)處理二進(jìn)制的優(yōu)勢(shì)具有極高的效率
算法主要為了解決內(nèi)存碎片的問(wèn)題
內(nèi)存頁(yè)內(nèi)碎片,內(nèi)存頁(yè)外碎片
頁(yè)內(nèi)碎片:已經(jīng)被分出去不能再利用了
頁(yè)外碎片:沒(méi)有被分出去也不能被利用了
向上取整2的冪大小
伙伴系統(tǒng)buddy
回收分配的內(nèi)存,找伙伴內(nèi)存。
buddy算法是經(jīng)典的內(nèi)存管理算法
算法基于計(jì)算機(jī)處理二進(jìn)制的具有極高的效率
算法主要為了解決內(nèi)存外碎片的問(wèn)題
將內(nèi)存外碎片問(wèn)題轉(zhuǎn)化為內(nèi)存內(nèi)碎片問(wèn)題
linux交換空間
swap(交換空間)是磁盤的一個(gè)分區(qū)
linux物理內(nèi)存滿時(shí),會(huì)把一些內(nèi)存交換swap空間
linux中輸入 top命令
是冷啟動(dòng)的依賴,啟動(dòng)需要大量的內(nèi)存,將不怎么使用的內(nèi)存交換到物理內(nèi)存中
系統(tǒng)睡眠依賴
大進(jìn)程空間依賴
swap空間 VS 虛擬內(nèi)存
操作系統(tǒng)的文件管理
文件的邏輯結(jié)構(gòu)
輔存的存儲(chǔ)空間分配(磁盤)
目錄管理
邏輯結(jié)構(gòu)文件的類型
有結(jié)構(gòu)文件(文本文件,文檔,媒體文件)
無(wú)結(jié)構(gòu)文件(二進(jìn)制文件,鏈接庫(kù))
文件的邏輯結(jié)構(gòu)
文件內(nèi)容由定長(zhǎng)記錄和可變長(zhǎng)記錄組成
定長(zhǎng)記錄存儲(chǔ)文件格式,文件描述等結(jié)構(gòu)化數(shù)據(jù)項(xiàng)
可變長(zhǎng)記錄存儲(chǔ)文件的具體內(nèi)容
無(wú)結(jié)構(gòu)文件
也成流式文件
文件內(nèi)容長(zhǎng)度以字節(jié)為單位
例:EXE文件 dll文件 so文件
順序文件
順序文件是按照順序存放在介質(zhì)中的文件
磁帶的存儲(chǔ)特性使得磁帶文件只能順序存儲(chǔ)文件
順序文件是所有邏輯文件中存儲(chǔ)效率最高的
但是對(duì)順序文件的增刪改查效率比較低
為了解決此問(wèn)題引出了索引文件
有一張索引表
輔存的存儲(chǔ)空間分配
鏈接分配可以將文件存儲(chǔ)在離散的盤塊中
需要額外的存儲(chǔ)空間存儲(chǔ)文件盤塊的鏈接順序
FAT表:FAT文件系統(tǒng) 類似于路由表
讀取文件需要將整個(gè)文件加載到內(nèi)存然后進(jìn)行檢索
索引分配
把文件的所有盤塊集中存儲(chǔ)(索引)
讀取某個(gè)文件時(shí),將文件索引讀取進(jìn)內(nèi)存即可
輔存的存儲(chǔ)空間分配
主存和輔存都用了空閑表和空閑鏈表
將所有空閑的盤塊存在一個(gè)鏈表
每個(gè)鏈表節(jié)點(diǎn)存儲(chǔ)空閑盤塊和空閑數(shù)目
重點(diǎn):位示圖
位示圖的優(yōu)點(diǎn):
維護(hù)成本低
位示圖可以非常容易找到空閑盤塊
位置圖使用0/1比特位,占用空間小
進(jìn)階補(bǔ)充
生產(chǎn)者,消費(fèi)者模型/哲學(xué)家進(jìn)餐問(wèn)題
保護(hù)臨界資源,進(jìn)行通信
線程間同步:互斥量,讀寫鎖,自旋鎖,條件變量
進(jìn)程間同步:共享內(nèi)存,域套接字
用戶態(tài)與內(nèi)核態(tài)
上下文切換
協(xié)程
編寫性能良好的程序指南
線程同步之互斥量
兩個(gè)線程爭(zhēng)搶共享資源,互斥使用。
原子性,一系列操作不可中斷的特性
互斥量又稱互斥鎖(解鎖和加鎖)
互斥量是最簡(jiǎn)單的線程同步的方法
兩個(gè)狀態(tài)可以保證訪問(wèn)資源的串行
操作系統(tǒng)直接提供了互斥量的API
開(kāi)發(fā)者可以直接使用API完成資源的加鎖解鎖的操作
自旋鎖
自旋鎖的模型和互斥鎖模型一樣
自旋鎖也是一種多線程同步的變量
使用自旋鎖的線程會(huì)反復(fù)檢查鎖變量是否可用
自旋鎖不會(huì)讓出CPU
自己死循環(huán)等待鎖的釋放
自旋鎖避免了進(jìn)程或線程的上下文(因?yàn)槭亲约核姥h(huán))的開(kāi)銷
操作系統(tǒng)內(nèi)部很多地方使用自旋鎖
自旋鎖不適合在單核CPU使用(因?yàn)樗姥h(huán))
讀寫鎖
對(duì)互斥資源和自旋鎖的改良
當(dāng)臨界資源(數(shù)據(jù)庫(kù)),是一種特殊的自旋鎖
臨界資源多讀少寫
不會(huì)改變臨界資源
讀和寫互斥,讀和讀不互斥
線程同步之條件變量
緩沖區(qū)沒(méi)有數(shù)據(jù)時(shí),消費(fèi)者不許消費(fèi),必須等待
緩沖區(qū)滿了時(shí),不允許生產(chǎn)者往緩沖區(qū)生產(chǎn),生產(chǎn)者必須等待
可以更加嚴(yán)謹(jǐn)?shù)募s束
條件變量也提供了API
條件變量是一種相對(duì)復(fù)雜的線程同步方法
條件變量允許線程睡眠,直到滿足某種條件
當(dāng)滿足條件時(shí),生產(chǎn)者可以向該線程(消費(fèi)者)發(fā)信號(hào),通知喚醒
線程同步方法總結(jié)
互斥量 自旋鎖 讀寫鎖
先加鎖,使用臨界資源,后解鎖
加鎖后其他不能訪問(wèn)臨界資源
解鎖后,其他消費(fèi)者才能訪問(wèn)臨界資源
使用fork系統(tǒng)調(diào)用創(chuàng)建進(jìn)程
c語(yǔ)言的系統(tǒng)調(diào)用
fork創(chuàng)建的進(jìn)程初始化狀態(tài)與父進(jìn)程一樣
父進(jìn)程調(diào)用時(shí)子進(jìn)程也會(huì)調(diào)用,fork函數(shù)會(huì)返回兩次
用fork可以創(chuàng)建一個(gè)新的進(jìn)程
所有語(yǔ)言底層創(chuàng)建進(jìn)程都是fork系統(tǒng)調(diào)用的
進(jìn)程同步之共享內(nèi)存
多進(jìn)程共享物理內(nèi)存的
由于操作系統(tǒng)的進(jìn)程管理,進(jìn)程間的內(nèi)存空間是相互獨(dú)立的
進(jìn)程空間通過(guò)頁(yè)表映射到共享內(nèi)存的一片分區(qū)中去
共享存儲(chǔ)允許不相關(guān)的進(jìn)程訪問(wèn)同一片物理內(nèi)存(原理:將物理內(nèi)存映射到進(jìn)程的頁(yè)表里面去,使得進(jìn)程通過(guò)頁(yè)表訪問(wèn)內(nèi)存)
共享內(nèi)存是兩個(gè)進(jìn)程之間共享和傳遞數(shù)據(jù)最快的方式
后臺(tái)很多高性能服務(wù)都是通過(guò)共享內(nèi)存實(shí)現(xiàn)
缺點(diǎn):共享內(nèi)存未提供同步機(jī)制,需要借助其他機(jī)制管理訪問(wèn),以避免并發(fā)訪問(wèn)帶來(lái)的問(wèn)題
使用共享內(nèi)存的四個(gè)步驟
向操作系統(tǒng)申請(qǐng)共享內(nèi)存-----連接到進(jìn)程空間------使用共享內(nèi)存------脫離進(jìn)程空間(刪除)
client 共享內(nèi)存 server
共享內(nèi)存是傳遞數(shù)據(jù)最快的方式
Unix域套接字
客戶端創(chuàng)建套接字,綁定套接字,監(jiān)聽(tīng)套接字,接受處理信息
創(chuàng)建套接字,鏈接套接字,發(fā)送信息
進(jìn)程同步之UNIX域套接字
提供了單機(jī)簡(jiǎn)單可靠的進(jìn)程同步服務(wù)
只能在單機(jī)使用,不能跨機(jī)器使用
雙向鏈表實(shí)現(xiàn)原理
往頭部加入節(jié)點(diǎn)
往頭部插入節(jié)點(diǎn):將新的節(jié)點(diǎn)指向第一個(gè)節(jié)點(diǎn),將第一個(gè)節(jié)點(diǎn)的上一個(gè)指向前一個(gè)節(jié)點(diǎn),將頭部指針指向新的節(jié)點(diǎn)
# 實(shí)現(xiàn)鏈表節(jié)點(diǎn)
class Node:
def __init__(self,key,value):
self.key = key
self.value = value
self.prev = None
self.next = None
def __str__(self):
val = {{}: {}}.format(self.key,self.value)
return val
def __repr__(self):
val = {{}: {}}.format(self.key,self.value)
return val
# 雙向鏈表實(shí)現(xiàn)head指針 tail指針 鏈表的容量
class DoubleLinkList:
def __init__(self, cap = 0xffff):
self.cap = cap
self.head = None
self.tail = None
self.size = 0 # 當(dāng)前鏈表存儲(chǔ)了多少個(gè)節(jié)點(diǎn)
# 從頭部添加
def __add_head(self,node):
if not self.head:
self.head = node
self.tail = node
self.head.next = None
self.tail.next = None
else:
node.next = self.head
self.head.prev = node
self.head = node
self.head.prev = None
self.size += 1
return node
# 從尾部添加
def __add_prev(self,node):
if not self.tail:
self.head = node
self.tail = node
self.head.next = None
self.tail.next = None
else:
self.prev.next = node
node.prev = self.tail
self.tail = node
self.tail.next = None
self.size += 1
return node
# 刪除任意節(jié)點(diǎn)
def __del_node(self,node):
if not node:
node = self.tail
if node == self.tail:
pass
elif node == self.head:
pass
else:
node.prev.next = node.next
node.next.prev = node.prev
self.size -= 1
return node
# 彈出頭部節(jié)點(diǎn)
def __del_head(self):
pass
# 彈出尾部節(jié)點(diǎn)
def __del_prev(self):
pass