操作系统总结Unix环境编程(四) ---- 设备管理(I/O原理)
引子
? ? ?外部設備分為存儲性設備和I/O型設備,設備管理通常采用I/O中斷、緩沖區管理、通道、設備驅動調度等多種技術。通常有以下功能:
? ? ?設備中斷處理
? ? ?緩沖區管理
? ? ?設備分配去配
? ? ?設備驅動管理
? ? ?實現虛擬設備
一、I/O硬件原理
? ? 1、概念:I/O系統 I/O操作 I/O操作特性
? ? 2、I/O控制方式:對CPU和設備的職能進行合理分工
? ? ? ? 輪詢方式:cpu指定交換字節數和起始地址,不斷測試設備直到拿到所有數據,串行工作浪費I/O cpu等待時間
? ? ? ? 中斷方式:cpu與設備間有中斷請求線,需要cpu時刻準備響應設備中斷,若同時有大量設備中斷可能丟數據
? ? ? ? DMA方式:設備通過DMA控制器直接與內存交換數據,周期竊用總線控制權,不需要cpu干預
? ? ? ? 通道方式:I/O處理器,與cpu并行,四級鏈接,三級控制:
? ? ? ? ? ? ? ? ? CPU(I/O指令) ==> 通道(通道命令) ==> 控制器 (動作序列)==> 設備
? ? 3、設備控制器
? ? ? ? I/O設備的硬件:機械部件(設備本身)和電子部件(如:設備控制器或適配器,可插入主板擴充槽的印刷電路板)
? ? ? ? 操作系統實際上是與控制器通信,從磁盤中以字位串讀取頭標(記錄扇區等信息),4096 B扇區和糾錯碼,由控制器裝配成字節,存入控制器內部的緩沖區形成字節快,在確認無錯后,復制到內存。
? ? ?主要功能:
? ? ? ? ?接收和識別CPU或通道發來的命令
? ? ? ? ?實現數據交換
? ? ? ? ?發現和記錄設備及自身的狀態信息,供CPU處理使用
? ? ? ? ? 設備地址識別?
二、I/O軟件原理
? ?2.1 I/O軟件設計需要考慮的問題
? ? ? ? 1.設備無關性;程序員/用戶只需要跟設備抽象打交道
? ? ? ? 2.出錯處理;
? ? ? ? 3.同步/異步傳輸;
? ? ? ? ? ? ?異步傳輸:CPU在啟動I/O操作后,可繼續執行其他工作
? ? ? ? ? ? ?同步傳輸:? 阻塞方式,讓啟動I/O的進程掛起等待,直至數據傳輸完成
? ? ? ? 4.緩沖技術;建立緩沖區,讓數據的到達率和離去率相匹配,以提高系統吞吐率
??2.2? I/O軟件層次/ I/O子系統層次
? ? ? ? 1.? 中斷處理程序;
? ? ? ? 2.? 設備驅動程序;
? ? ? ? 3.? 獨立于設備的I/O軟件;
? ? ? ? 4.? 用戶空間的I/O軟件;
? ?下四層構成內核空間I/O軟件 ,linux系統編寫C程序調用printf()的過程如下圖:
? ? ? ? ?1. 用戶程序調用標準庫函數printf() ;
? ? ? ? ?2.? printf函數中通過一系列系統調用轉到write()函數,write()中有陷阱指令(用戶態->內核態)int 0x80 (IA-32);
? ? ? ? ?3.? 進程進入內核態,系統調用處理程序system_call() --系統調用的唯一入口,開始執行;
? ? ? ? ?4.? 將根據EAX寄存器中的系統調用號跳轉到當前系統調用對應的系統調用服務例程sys_write();
? ? ? ? ?5.? 執行結束后返回用戶態,接著執行后面一條指令。??
//write()封裝函數對應的匯編代碼,AT&T格式write:push1 %ebx // 將EBX入棧movl $4, %eax // 將系統調用號送EAXmovl 8(%esp), %ebx // 將第一個參數fd送EBXmovl 12(%esp), %ecx // 將第二個參數buf送ECXmovl 16(%esp), %edx // 將第三個參數n送EDX int $0x80 // 進入系統調用處理程序system_call執行cmpl $-132, %eax // 檢查返回值,假定最大出錯碼為131 jbe .L1 // 若無錯誤,跳轉至.L1negl %eax // 將返回值取負送EAXmovl %eax, error // 將EAX值送errormovl $-1, %eax // 將write函數返回值置-1 .L1: popl %ebxret? ? ? ? ? ? ?
? ?2.2.1 I/O中斷處理程序
? ?2.2.2 I/O設備驅動程序功能
? ? ? 1.設備初始化;
? ? ? 2.執行設備驅動例程;
? ? ? 3、調用和執行中斷處理程序
? ?2.2.3 獨立于設備的I/O軟件
? ? 執行適用于所有設備的常用功能,并向用戶層軟件提供一致性接口
? ? ? ? ? ? ? 1.設備命名與保護;
? ? ? ? ? ? ? 2.提供與設備無關的快尺寸;
? ? ? ? ? ? ? 3, 緩沖技術;
? ? ? ? ? ? ? 4.設備分配與狀態跟蹤;
? ? ? ? ? ? ? 5.錯誤處理與報告(與設備無關)
? ?2.2.4?用戶空間的I/O軟件
? ? unix高級環境編程中的各種I/O,如標準I/O、 系統級I/O(read.write)?
? ? C標準I/O庫函數的不足:
? ? ? ? ?1.? 不存在加鎖、解鎖保證文件的安全性
? ? ? ? ?2.? 所有I/O是同步的,程序必須執行完I/O后才能繼續執行
? ? ? ? ?3.? 無法使用其完成某些I/O功能
? ? ? ? ?4.? 進行網絡編程易于出現緩沖區溢出
? ?故常常自行封裝系統級I/O構造適合自己的I/O軟件,windows API:CreateFile()..?
三、I/O硬件和軟件的接口
? I/O設備
?設備控制器
? I/O端口及其編址
四、緩沖技術(待補充)
五、驅動調度技術
? 提高磁盤I/O速度的方法
六、設備分配
? ?設備獨立性:邏輯設備 映射為 物理設備
七、虛擬設備:脫機外圍計算機
八、Linux設備管理(待完善)
? 5種I/O模型:
? ? ? ? 阻塞I/O
? ? ? ? 非阻塞I/O
? ? ? ? ?復用型I/O
? ? ? ? ?信號驅動I/O
? ? ? ? ? 異步I/O
? ? 基本過程:數據-> 內核緩沖區 ->進程緩沖區
? 8.1 高級I/O
非阻塞I/O、記錄鎖、I/O多路轉接(select/poll)、異步I/O、readv和writev、存儲映射I/O
指定非阻塞I/O的標志:
? ? ?1. 調用open指定O_NONBLOCK;
? ? ?2. 已經打開的描述符調用fcntl,由該函數打開O_NONBLOCK文件狀態標志;
POSIX.1要求:對于一個非阻塞的描述符,如果無數據可讀,則read返回-1,errno設置為EAGAIN
非阻塞I/O: open、read、write設置為NONBLOCK,通過輪詢的方式讀寫數據;
設備鎖
? 8.2? 終端I/O
工作模式:規范模式輸入處理,以行為單位處理,對于每個讀請求,終端驅動程序最多返回一行
 ? ? ? ? ?非規范模式輸入處理,輸入字符不裝配成行
 ? 終端設備是由通常位于內核中的中斷驅動程序控制的,每個終端設備都有一個輸入隊列和輸出隊列
 ? ? ? ? ?如果打開了回顯功能,則在輸入隊列和輸出隊列之間有一個隱含的鏈接
? ??
c_cflag終端標志
c_iflag終端標志
c_lflag終端標志
c_oflag終端標志
終端I/O函數
與終端有關函數的關系
終端行規程
#include <termios.h> /* 獲取和設置終端屬性 */ int tcgetattr(int fd, struct termios *termptr) int tcsetattr(int fd, int opt, const struct termios *termptr)/* 波特率函數 */ speed_t cfgetispeed(const struct termios *termptr) speed_t cfgetospeed(const struct termios *termptr)int cfsetispeed(const struct termios *termptr, speed_t speed); int cfsetospeed(const struct termios *termptr, speed_t speed);#include <stdio.h> /* 確定控制終端的名字 */ char *ctermid(char *ptr)?
總結
以上是生活随笔為你收集整理的操作系统总结Unix环境编程(四) ---- 设备管理(I/O原理)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 明确测试目标
- 下一篇: 《*** 经济思想学习纲要》学习辅导
