操作系统 IO管理
學(xué)什么?
- I/O? input / output??
- 輸入:鼠標(biāo) 鍵盤 手柄 觸摸屏 攝像頭 MTC? 掃描儀
- 輸出:顯示器 打印機(jī)? 耳機(jī)? 音響?
- 既是輸入也是輸出:光驅(qū)? 網(wǎng)卡? 磁盤? U盤
- 硬件:設(shè)備如何把數(shù)據(jù)返回到PC機(jī),但是不同種類的設(shè)備,適合不同的控制方式,引出了I/O控制方式(數(shù)據(jù)怎么輸入輸出)
- 軟件:輸入輸出時(shí)面對(duì)的多種問(wèn)題,CPU與I/O速度不匹配,基本數(shù)據(jù)單元大小也不匹配 引出了,緩存技術(shù);緩沖技術(shù)(內(nèi)存);假脫機(jī)技術(shù);spooling技術(shù)? ;因?yàn)槭褂糜布倪M(jìn)程數(shù)量很多,但是硬件設(shè)備比較少,如何對(duì)設(shè)備進(jìn)行分配和回收?
- I/O系統(tǒng)層次管理 ->? 代碼實(shí)現(xiàn)框架? ??各司其職,低耦合性,便于代碼的修改和軟件的更新、高效移植
IO管理硬件知識(shí)
IO管理設(shè)備分類(硬件分類)
- 按照數(shù)據(jù)的傳輸速度進(jìn)行分類(使用場(chǎng)合決定的 -> 人類設(shè)計(jì))
- 高速設(shè)備? ? ?以MB/GB為單位? ? ?磁帶、磁盤、光盤、U盤、網(wǎng)卡等
- 中速設(shè)備? ? ?以KB為單位? ? ? ? ? ? 打印機(jī)(串口設(shè)備)
- 低速設(shè)備? ? ?以B為單位? ? ? ? ? ? ? 鍵盤、鼠標(biāo)、手柄等
- 注意事項(xiàng):
- 和人類接觸的設(shè)備為低速設(shè)備
- 中速設(shè)備: 機(jī)械設(shè)備,速度介于電子設(shè)備(CPU、內(nèi)存)和人類之間
- 高速設(shè)備:盡可能快
- 按照信息交換的單位分
- 塊設(shè)備? ? ? ? ?以數(shù)據(jù)塊為單位傳輸? ? U盤、硬盤、SD卡、網(wǎng)卡等? ? 高速設(shè)備
- 字符設(shè)備? ? ?以字符為單位傳輸? ? ?鍵盤、鼠標(biāo)、手柄、打印機(jī)等? ? 低速/中速設(shè)備
IO控制方式
控制方式的發(fā)展過(guò)程
- 程序直接控制方式:cpu主動(dòng)詢問(wèn)? ? ?費(fèi)時(shí)費(fèi)力,cpu利用率很低
- 中斷驅(qū)動(dòng)方式:CPU被動(dòng)通知,cpu利用率稍微提高,cpu取數(shù)據(jù)? ? 最為常用
- DMA方式:CPU被動(dòng)通知,DMA控制器硬件,dma取數(shù)據(jù),cpu利用取回的數(shù)據(jù);dma需要知道取幾個(gè)數(shù)據(jù),以及數(shù)據(jù)取完之后,不同數(shù)據(jù)的存放地址,取數(shù)據(jù)操作結(jié)束之后,通知CPU進(jìn)行下一步操作;減少了cpu被通知的次數(shù),減少cpu中斷的次數(shù);缺點(diǎn):cpu需要對(duì)DMA下達(dá)很多的指令,進(jìn)一步優(yōu)化
- 通道方式:cpu的被動(dòng)通知,減少cpu對(duì)dma下達(dá)的指令數(shù);cpu利用率進(jìn)一步提高;使用協(xié)處理器對(duì)DMA施加命令,整體完成之后才通知cpu
- 從上往下 CPU的利用率提高,設(shè)計(jì)復(fù)雜度提高,成本也提高
程序直接控制方式
- cpu周期性運(yùn)行輸入進(jìn)程(50ms),當(dāng)輸入進(jìn)程檢測(cè)到鍵盤輸入的數(shù)據(jù)之后,利用進(jìn)程間通信的方式將數(shù)據(jù)傳輸給需要的進(jìn)程
- 該方式效率很低,幾乎不再使用
- mcu dsp 等還在使用
- 通常用在低速設(shè)備中,高速設(shè)備容易丟失數(shù)據(jù)(鍵盤輸入速度趕不上 cpu處理速度)
中斷類控制方式
中斷驅(qū)動(dòng)方式
- 新增控制總線 (中斷信號(hào)在其中傳輸,提高成本)
- 中斷處理程序不是 進(jìn)程
- 鍵盤輸入程序,引發(fā)控制總線的中斷,中斷會(huì)觸發(fā)中斷處理程序,中斷處理程序會(huì)從數(shù)據(jù)總線獲取數(shù)據(jù),將數(shù)據(jù)傳給其他進(jìn)程
- 廣泛使用,使用在低速設(shè)備,比如鍵盤、手柄、鼠標(biāo)等
- 中斷控制總線? 數(shù)量有限,如果沒(méi)有了,只能使用程序直接控制的方式
DMA方式
- DMA 一般用于塊設(shè)備、高速設(shè)備
- DMA控制器的四個(gè)寄存器
- 內(nèi)存地址寄存器MAR? 記錄內(nèi)存開(kāi)始的地址? ? ? ? ? ? ? ? ? ? ? ? ?地址
- 數(shù)據(jù)計(jì)數(shù)寄存器DC? ?一次需要從外設(shè)讀取的數(shù)據(jù)字節(jié)數(shù)? ? ?長(zhǎng)度
- 數(shù)據(jù)寄存器DR? 接收物理外設(shè)輸入的數(shù)據(jù),將接收的數(shù)據(jù)再傳給對(duì)應(yīng)需要的進(jìn)程,起到緩存的占用
- 命令狀態(tài)寄存器CR? 控制讀,讀完執(zhí)行的指令
- 步驟
- 1,磁盤向CPU發(fā)出DMA傳輸請(qǐng)求
- 2,cpu接收請(qǐng)求,執(zhí)行DMA配置程序,對(duì)四個(gè)寄存器的地址進(jìn)行設(shè)置
- 3,DMA控制器讀取磁盤(設(shè)備)數(shù)據(jù)到數(shù)據(jù)寄存器DR,一個(gè)一個(gè)字節(jié)的讀
- 4,DMA控制器根據(jù)MAR的數(shù)值,尋找內(nèi)存存放的位置,開(kāi)始搬運(yùn)數(shù)據(jù)
- 5,DMA控制器開(kāi)始搬運(yùn)數(shù)量為 數(shù)據(jù)寄存器DC 存儲(chǔ)的數(shù)值大小的值
- 6,一組數(shù)據(jù)搬運(yùn)完成之后,則DMA控制器產(chǎn)生中斷信號(hào)給cpu
- 7,cpu執(zhí)行中斷程序,利用信號(hào)量通知其他程序 數(shù)據(jù)傳輸完一組
- 8,如果數(shù)據(jù)全部傳輸完畢,則傳輸自動(dòng)結(jié)束;如果還有需要傳輸?shù)臄?shù)據(jù),則重新執(zhí)行 1-8
- 優(yōu)勢(shì)
- 減少了CPU被通知的次數(shù)? 具體體現(xiàn)在上述流程的? 4-5
- 只有所有數(shù)據(jù)讀完才執(zhí)行一次中斷處理程序 而不會(huì)每來(lái)一個(gè)數(shù)據(jù)就會(huì)產(chǎn)生一個(gè)字段?
通道方式
- 新增通道協(xié)處理器
- 每傳輸一次數(shù)據(jù) 會(huì)進(jìn)行一次DMA配置
- 步驟
- 1,磁盤(設(shè)備)向cpu發(fā)出通道傳輸請(qǐng)求
- 2,cpu接收請(qǐng)求,激活通道協(xié)處理器,并告知通道協(xié)處理器的位置
- 3,通道協(xié)處理器執(zhí)行通道程序進(jìn)行DMA配置
- 4,DMA控制器 開(kāi)始讀取數(shù)據(jù)到?數(shù)據(jù)寄存器DR
- 5,DMA控制器根據(jù)MAR的數(shù)值,尋找內(nèi)存存放的位置,開(kāi)始搬運(yùn)數(shù)據(jù)
- 6,DMA控制器開(kāi)始搬運(yùn)數(shù)量為 數(shù)據(jù)寄存器DC 存儲(chǔ)的數(shù)值大小的值
- 7,如果還有下一組數(shù)據(jù) 則繼續(xù)執(zhí)行 3-7
- 8,如果沒(méi)有下一組數(shù)據(jù),則說(shuō)明幾組數(shù)據(jù)傳輸完成,通道協(xié)處理器向cpu發(fā)出中斷信號(hào)
- 9,中斷程序通知其他進(jìn)程,幾組數(shù)據(jù)全部傳輸完成
?
緩存技術(shù)
- 緩存的原因:通過(guò)在高速存儲(chǔ)器里面保存低速存儲(chǔ)器的副本,來(lái)提高cpu對(duì)數(shù)據(jù)的訪問(wèn)速度
- 例如
- 快表是頁(yè)表的緩存
- 請(qǐng)求分頁(yè)中,cache中的頁(yè)面是內(nèi)存中工作集頁(yè)面的緩存
- 內(nèi)存中工作集頁(yè)面是磁盤中程序頁(yè)面的緩存
- 現(xiàn)在 快速 的里面找,如果沒(méi)有才會(huì)到慢速的設(shè)備里面尋找
為什么引入緩存技術(shù)
- 對(duì)低速設(shè)備產(chǎn)生的數(shù)據(jù)進(jìn)行堆積,放在緩存區(qū)中,積少成多,然后cpu對(duì)其進(jìn)行集中性處理
- 目的和好處
- 緩和cpu和IO設(shè)備速度不匹配的矛盾
- 解決基本數(shù)據(jù)單元大小不匹配的問(wèn)題?
- 減少IO對(duì)cpu中斷頻率(緩沖區(qū)大小 如DMA傳輸)
- 提高cpu與IO設(shè)備的并行性
單緩沖區(qū)
- 設(shè)置緩沖區(qū)和工作區(qū),比如播放器是將緩沖區(qū)的內(nèi)容取到工作區(qū)之后,對(duì)工作區(qū)的數(shù)據(jù)進(jìn)行操作,然后緩沖區(qū)繼續(xù)緩沖數(shù)據(jù)。就可以實(shí)現(xiàn),播放器一邊播放,一邊緩沖數(shù)據(jù)。播放和緩存同時(shí)進(jìn)行
- 軟存區(qū)為空的時(shí)候,才可以輸入數(shù)據(jù),直到充滿為止
- 緩存區(qū)滿的時(shí)候,才可以取出,直到為空的時(shí)候?yàn)橹?/li>
- 生產(chǎn)時(shí)間 > 消費(fèi)時(shí)間 ->? 處理一塊緩存區(qū)數(shù)據(jù)的平均時(shí)間 = 取用時(shí)間 + 生產(chǎn)時(shí)間
- 生產(chǎn)時(shí)間 <?消費(fèi)時(shí)間 ->? 處理一塊緩存區(qū)數(shù)據(jù)的平均時(shí)間 = 取用時(shí)間 + 消費(fèi)時(shí)間
- 處理一塊緩存區(qū)數(shù)據(jù)的平均時(shí)間 = 取用時(shí)間 + MAX(消費(fèi)時(shí)間 , 生產(chǎn)時(shí)間)
- 處理一塊緩存區(qū)數(shù)據(jù)的平均時(shí)間 = MAX(生產(chǎn)時(shí)間,消費(fèi)時(shí)間 + 取用時(shí)間)
雙緩沖區(qū)
- 相較于先前 單緩沖區(qū),利用了 播放器將數(shù)據(jù)從緩沖區(qū)到工作區(qū)這段時(shí)間? ?(取時(shí)間)
- 生產(chǎn)時(shí)間 > 取用時(shí)間 + 消費(fèi)時(shí)間 ->? 取用時(shí)間 + 生產(chǎn)時(shí)間
- 生產(chǎn)時(shí)間 <?取用時(shí)間 + 消費(fèi)時(shí)間(產(chǎn)生斷層,數(shù)據(jù)中斷) -
- 結(jié)論一致??處理一塊緩存區(qū)數(shù)據(jù)的平均時(shí)間 = MAX(生產(chǎn)時(shí)間,消費(fèi)時(shí)間 + 取用時(shí)間)
- 生產(chǎn)時(shí)間 > 取用時(shí)間 + 消費(fèi)時(shí)間 IO設(shè)備可以連續(xù)輸入數(shù)據(jù),cpu會(huì)等待
- 生產(chǎn)時(shí)間 <?取用時(shí)間 + 消費(fèi)時(shí)間?IO設(shè)備不可以連續(xù)輸入數(shù)據(jù),cpu繁忙
循環(huán)緩沖區(qū)?
- 使用循環(huán)鏈表 的形式首尾相連,每個(gè)緩沖區(qū)的大小相等
- 兩個(gè)指針 in 和 out,in負(fù)責(zé)輸入數(shù)據(jù),out負(fù)責(zé)取出數(shù)據(jù)
- 會(huì)產(chǎn)生追趕問(wèn)題,in和out指針
- 生產(chǎn) > 輸出,不可以連續(xù)輸入,cpu忙,處理數(shù)據(jù)
- 生產(chǎn) < 輸出,可以連續(xù)輸入,cpu等待
緩沖池
- 緩沖池中的緩沖區(qū)是公用的
- 分別設(shè)置 輸入隊(duì)列、輸出隊(duì)列和空閑隊(duì)列
- 收容輸入 取空閑隊(duì)列的頭部的容器塊,裝載來(lái)自服務(wù)器的數(shù)據(jù);
- 提取輸入 將裝載數(shù)據(jù)的容器塊,送到指定的進(jìn)程工作區(qū),然后將沒(méi)有數(shù)據(jù)的容器塊重新放到排隊(duì)隊(duì)列等待裝載數(shù)據(jù)
- 收容輸出 取空閑隊(duì)列的頭部的容器塊,裝載來(lái)自進(jìn)程工作區(qū)產(chǎn)生的數(shù)據(jù)
- 提取輸出 將裝載數(shù)據(jù)的容器塊,送到指定的進(jìn)程服務(wù)器,然后將沒(méi)有數(shù)據(jù)的容器塊重新放到排隊(duì)隊(duì)列等待裝載數(shù)據(jù)
SpooLing技術(shù)
- 輸入設(shè)備 將數(shù)據(jù)放到內(nèi)存中的輸入緩沖區(qū),當(dāng)緩沖區(qū)滿的時(shí)候,由spi進(jìn)程將緩沖區(qū)的數(shù)據(jù)保存到磁盤中的輸入井中的脫機(jī)輸入文件里。如果其他進(jìn)程要使用,則讀取脫機(jī)輸入文件即可
- 其他進(jìn)程輸出數(shù)據(jù)的時(shí)候,先將其保存到輸入井中的脫機(jī)輸出文件里,再由SPO進(jìn)程依次將輸出文件數(shù)據(jù)輸出到內(nèi)存的輸出緩沖區(qū),再輸出到輸出設(shè)備里面
- 例子 共享打印機(jī)
- 優(yōu)勢(shì):掉電不會(huì)丟失
設(shè)備的分類
- 從軟件思維對(duì)設(shè)備分類
- 獨(dú)占式設(shè)備 -> 打印機(jī)??
- 虛擬設(shè)備 -> spooling虛擬出來(lái)的設(shè)備
- 分時(shí)共享設(shè)備 -> 磁盤網(wǎng)卡?
設(shè)備的數(shù)據(jù)結(jié)構(gòu)
- OS 內(nèi)核
- 硬件系統(tǒng)
- 設(shè)備 = 機(jī)械部分 + 電子部分
- 查詢過(guò)程? SDT -> DCT -> COCT -> CHCT
- SDT 系統(tǒng)設(shè)備表? PC機(jī)已有設(shè)備
- DCT 設(shè)備控制表? 具體設(shè)備,比如鍵盤、鼠標(biāo)
- COCT 控制器控制表
- CHCT 通道控制表
IO層級(jí)結(jié)構(gòu)
- 軟件分層思想
- 用戶層IO軟件? ? ? ->api接口
- 設(shè)備獨(dú)立性軟件? ?->將不同的設(shè)備進(jìn)行封裝,統(tǒng)一接口,如linux將所有的設(shè)備都視為文件 Dev目錄下,設(shè)備的文件
- 設(shè)備驅(qū)動(dòng)軟件? ? ? ->控制設(shè)備的程序 不同的設(shè)備 需要不同的操作程序
- 中斷處理程序? ? ? ->中斷處理 IO控制方式
- 硬件? ? ? ? ? ? ? ? ? ? ->機(jī)械部分 + 電子部分 = 設(shè)備
?
總結(jié)
- 上一篇: C语言指针-字符指针整型指针char*s
- 下一篇: 信用卡自由分期怎么取消?这些事项要注意