【现代操作系统】之I/O软件原理

I/O软件管理的目标

第一个目标是设备独立性,我们应该编写这样的设备:它能够访问任意I/O设备而无需事先指定设备。也就是说,U盘,磁盘,CD在我们眼里都是文件,至于如何区分这些文件,这是操作系统要考虑的。
第二个目标是错误处理,一般来说,错误应该尽可能地在硬件层面得到处理,或者是在驱动层面得到处理,上层软件很少关心这些事情。

程序控制I/O

I/O可以以三种根本不同的方式实现:程序控制I/O,中断驱动I/O,和使用DMA的I/O。
程序控制I/O就是让CPU做全部的工作,以一个打印机为例。考虑一个用户进程,如果该进程想在打印机上打印8个字符:“ABCDEFG”,它首先要在用户空间的一个缓冲区中组装字符串。然后发出系统调用,如果打印机被其它进程占用,那么系统调用将失败,返回一个错误代码,一旦拥有了打印机,用户进程就发出一个系统调用通知操作系统打印字符串。然后,操作系统将字符串缓冲区复制到内核空间的一个数组中。然后操作系统查看当前打印机是否可用,如果不可用就等待,直到可用,然后就开始打印字符。一个一个地将字符串打印出来,这期间CPU一直被打印字符串这个任务所占用。
这种方法简单但有缺点,因为I/O操作期间要占用CPU的全部时间,如果打印的字符串很短,或者CPU没有其它的事情要做,这种操作时合理的,但是在更加复杂的系统中,CPU是有其它事情要做的,这种设计是不合理的。

中断驱动I/O

如果打印机每秒可以打印100个字符,那么打印每个字符将花费10ms,这意味着,当字符在被打印机打印期间,CPU将一直在循环等待(也就是无事可做),而实际上这10ms足以让CPU完成很多其它操作。
为了避免这种等待的时间浪费,前人通过使用中断的方式来让CPU从这种循环等待中脱离出来去干其它的事情。当一个字符被送到打印机打印后,CPU要调用调度程序启用其它的进程,在当前字符被打印完之前,请求打印字符串的进程将被阻塞,一直到当前字符串被打印完。当打印机打印完当前字符串后,它将会产生一个中断停止当前进程并保存其状态,然后开始运行打印中断服务程序打印下一个字符。

DMA的I/O

中断I/O由于是字符级的中断,所以会浪费很多CPU的时间,DMA的I/O是把CPU的打印任务交给DMA完成,本质上DMA是程序控制I/O,只是这时是由DMA控制打印,而不是CPU控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值