leiyahui

纸上得来终觉浅,绝知此事要躬行
I/O软件原理

一 I/O设计的目标

1 设备独立性

对于I/O软件来说,它应该能够访问任意的I/O设备而不用去制定设备的类型,也就是说同样的一个I/O软件可以去访问任意一个I/O设备上读取数据,而无需修改程序。

与设备独立性相关的是同一命名,一个文件或者是一个设备的名字都应该是一个简单的字符串或者是一个数字,而不应该依赖于哪个设备

2 错误处理

当发生错误的时候,错误应该尽量在靠近硬件的地方进行,如果说设备控制器发现那么就应该在设备控制器那里纠正,设备驱动程序发现那么设备驱动程序就应该处理

很多错误是偶然发生的,一般来说只有底层处理不了错误的时候才将错误提交给上层程序。

3 同步(即阻塞)和异步问题,大多数的物理I/O是异步的,当发生I/O的时候,cpu启动传输之后就去做其他的事情了,同步的话当发生I/O的时候进程被挂起,直到I/O结束,发起中断,

4 缓存 当一个I/O发生的时候,数据一般不会直接存到最终的位置,而是经过缓冲区进行纠错之类,但是某些数据具有极大的实时性,比如说视频之类的,那么数据就必须放到输出缓冲区,从而减小时差

5 还有一个问题是共享和独占的问题,有些设备比如说磁盘能够同时右多个用户占用,但是某些设备比如说鼠标,磁带机只能够一个用户占用,这个用完之后另一个才能够打开。

下面是三种I/O方式

1程序控制I/O

当一个进程需要I/O的时候,比如说要打印字符串abcd,首先需要在用户的缓冲区中组装字符串,然后发起系统调用看是否打印机可用,如果可用的话,进程就发起系统调用通知操作系统打印,

然后操作系统通常首先将字符串复制到内核空间中(否则的话还要修改内存映射才能到达用户的内存空间),接着操作系统查看打印机是否可用如果说可用的话就复制一个字符串到打印机,否则的话就忙等待,当复制第一个字符串完毕之后,操作系统就接着不停的查看

打印机是否可用,如果可用的话就接着复制到打印机,这样的话cpu进入忙等待,这种方式会浪费cpu大量的时间。

2 中断I/O

这种方式的前半部分同上,当字符串复制到内核空间的时候操作系统讲一个字符串复制到打印机,然后操作系统调用进程调度程序,运行另一个进程,当打印机打印完成后,就产生中断,然后调用中断处理程序。

如果说没有字符串打印了,那么就将用户进程解除阻塞,否则它将输出下一个字符串,并返回到中断前运行的程序。

3 DMAI/O

使用cpu来控制I/O太浪费时间了,因此使用DMA来控制I/O,但是有可能DMA会非常的慢,如果这时cpu没有其他事情要做的话,也没有必要使用dma

 

posted on 2015-12-15 09:55  雷大叔  阅读(1158)  评论(0编辑  收藏  举报