设备管理(三)

目录

一、输入/输出应用程序接口&设备驱动程序接口

1.输入/输出应用程序接口

(1)字符设备接口

(2)块设备接口

(3)网络设备接口

(4)阻塞/非阻塞I/O

2.设备驱动程序接口

二、IO核心子系统


一、输入/输出应用程序接口&设备驱动程序接口

1.输入/输出应用程序接口

用户应用程序通过系统调用的方式请求使用底层的某一种I/O设备。I/O设备种类多样,上层的应用程序很难通过一个统一的系统调用接口来操作所有类型的I/O设备。

比如:块设备有寻址概念,eg:磁盘,我们可以指定要读磁盘的哪个地址,读写指针就可以指向磁盘的哪个位置,同时块设备支持多个字节的读写,当我们写程序使用read系统调用从块设备中读入数据时,要指明操作哪个块设备、从哪读、读多少数据

字符型设备不可寻址,比如使用系统调用从键盘中读一个字符时,无法指明要从哪个地址读

由于底层设备多种多样,对于各种类型设备的访问,读写所需要提供的系统调用参数也各不相同。用户层的应用程序无法用一个统一的系统调用接口来完成所有类型设备的读写。

设备独立性软件需要对上层的应用程序提供若干种类型的程序接口。字符设备、块设备、网络设备所调用的系统调用接口是各不相同的,我们要学习字符设备的接口、块设备的接口和网络设备的接口

(1)字符设备接口

用户层的应用软件如果要对字符型的设备进行读或写,可以采用get或put这两个系统调用

(2)块设备接口

对块设备(如磁盘)可以用seek系统调用来指定读写指针指向磁盘的地址,然后使用read和write系统调用往读写指针所指位置后面读或写若干个单位的字符

给上层应用程序提供的不同类型的接口是依据设备的特性来定义的。字符型设备没有地址的概念,所以put和get不需要提供地址这个参数,而块设备有地址的概念,所以块设备的访问需要提供一个地址参数指明要读或写哪个地址

(3)网络设备接口

电脑里的网卡就是网络控制器,用于收发网络数据包,可能会收到很多数据包,不同的数据包应该丢给不同的应用程序。

网络设备接口会向上层的应用程序提供socket系统调用,socket系统调用的作用是可以创建一个网络套接字。当创建网络套接字时,需指明要连接的网络协议。创建好网络套接字,就可以使用bind系统调用把套接字绑定到本地的某个端口上。接下来使用connect系统调用把套接字连接到远程的某一个主机上。当网络套接字初始化完毕之后,就可以使用read或write系统调用对网络套接字进行数据的读写了。

通过下图详细展示网络设备接口。

 每台主机都有唯一一个ip地址,每一个进程也有自己的进程用户空间,操作系统内核也会有操作系统内核空间。用户进程如何使用网络设备接口实现网络通信?

主机2的P3进程要进行网络通信,可以使用socket系统调用来创建一个网络套接字(即申请一片内核空间,这片空间用于接收或发送数据),socket系统调用会给用户进程返回一个描述符fd(即指向这个套接字的指针),有了套接字对象后,使用bind将这个套接字绑定到本地6666端口。如此,主机2准备工作完成,等待被连接

主机1做相同操作,P1进程通过socket系统调用申请创建一个套接字对象,通过bind系统将这个套接字绑定到某个端口。

现在两个主机都有了各自的套接字,同时也确定了各自的数据收发的端口号。让主机1的P1进程使用connect系统将fd指向的套接字连接到168.99.xxx.xxxip地址的6666端口(connect系统调用需要ip地址和端口号这两个参数)。

connect系统调用使得这两个套接字之间建立了一个点对点连接(应用层连接),接下来两个主机可以通过套接字来进行通信。P1想给P3发送一个数据包,那么P1先在自己的用户区准备好数据,然后使用write系统调用往套接字中写入数据(设备独立性软件接收到write系统调用好,会把用户进程准备好的数据复制到内核区,也就是套接字所对应的这一片缓冲区中),设备独立性软件调用网络控制器驱动程序把数据输出到网络控制器,这样就可以把数据包发送到网络上。

网络控制器接收到数据包后,会向主机发出一个中断信号,中断处理程序发现中断信号来自于网络控制器,中断处理程序就会调用网络控制器驱动程序把收到的数据复制到6666端口所对应的内核缓冲区中,P3进程使用read系统调用从fd所指的套接字队中读出数据包(设备独立性软件从缓冲区里把数据复制到用户进程的用户区中)

(4)阻塞/非阻塞I/O

阻塞I/O:应用程序发出I/O系统调用,进程需转为阻塞态等待。eg:字符设备接口——从键盘读一个字符get,成功读到之后进程才能执行否则等待

非阻塞I/O:应用程序发出I/O系统调用,系统调用可迅速返回,进程无需阻塞等待。eg:块设备接口——往磁盘写数据,write系统调用可以很快地被处理完,然后迅速地返回到用户进程,让进程继续往下执行。即便磁盘正在忙碌,也不需要用户进程等待,因为进程准备的数据是在用户区,发出的write系统调用想把数据写到磁盘,磁盘忙碌时,设备独立性软件会迅速响应write系统调用请求,把数据复制到内核,内核慢慢把数据写回磁盘

2.设备驱动程序接口

设备独立性软件需要根据实际操作的设备不同去调用不一样的设备驱动程序。比如对罗技公司的设备进程读操作,那么读操作这个函数调用的read,两个参数,而另一个公司的驱动程序接口不一样,需要传入三个参数且类型不一样,这让设备独立性软件需要调用不同公司编写的驱动程序read函数调用代码,也就是频繁修改os内核。

因此,操作系统会统一一个标准,要求设备的厂商按照标准来开发驱动程序。如厂商想要设备在OS上正常被支持使用,那么设备的read系统调用就必须叫read

不同的os对设备驱动程序的接口的标准各不相同;驱动程序需向上层的设备独立性软件提供一个统一标准的接口

二、IO核心子系统

假脱机技术需要使用到磁盘的设备独立性软件这一层的服务,所以假脱机技术一般在用户层软件实现

 I/O调度:用某种算法确定一个好的顺序来处理各个I/O请求。如磁盘调度,当多个磁盘I/O请求到来时,用某种调度算法确定满足I/O请求的顺序。同理,打印机等设备也可以用先来先服务算法、优先级算法、短作业优先等算法来确定I/O调度顺序

设备保护设备被看做是一种特殊的文件,每个设备也会有对应的FCB。当用户请求访问某个设备时,系统根据FCB中记录的信息来判断该用户是否有相应的访问权限,以此实现“设备保护”的功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值