优秀是一种习惯,生命是一个过程,不求进步很大,只求每天进步一点点,无为之道!

《unix环境高级编程》通读学习笔记(四)(第12章)

上一篇 / 下一篇  2007-12-13 20:40:42 / 个人分类:UNIX 编程学习

《unix环境高级编程》通读学习笔记(四)(第12章)

2007-07-28 17:40:27 / 个人分类:unix环境高级编程的学习记录

第12章 高级I/O

12.1 引言
12.2 非阻塞I/O

低速系统调用是可能会使进程永远阻塞的一类系统调用.
非阻塞I/O使我们可以调用不会永远阻塞的I/O操作,例如open,read和write。如果这种操作不能完成,则立即出错返回,表示该操作如继续执行将继续阻塞下去。

12.3 记录锁
记录锁(record locking)的功能是:一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区。
12.3.1 历史
12.3.2 fcntl记录锁
fcntl函数的原型
---------------------------------------------------------------------
#include <sys/types.h>
#include <unistd.h>
#include <fcnt1.h>
int fcnt1(int filedes,int cmd,.../* struct flock *flockptr */);
返回:若成功则依赖于c m d(见下),若出错则为- 1
---------------------------------------------------------------------
12.3.3 锁的隐含继承和释放
关于记录锁的自动继承和释放有三条规则:
(1) 锁与进程、文件两方面有关。
(2) 由fork产生的子程序不继承父进程所设置的锁。
(3) 在执行exec后,新程序可以继承原执行程序的锁。
12.3.4 4.3+BSD的实现
12.3.5 建议性锁和强制性锁
考虑数据库存取例程序。如果该库中所有函数都以一致的方法处理记录锁,则称使用这些函数存取数据库的任何进程集为合作进程(cooperating process)。如果这些函数是唯一的用来存取数据库的函数,那么它们使用建议性锁是可行的。
强制性锁机制中,内核对每一个open、read和write都要检查调用进程对正在存取的文件是否违背了某一把锁的作用。

12.4 流
流是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法。
流在用户进程和设备驱动程序之间提供了一条全双工通路。流无需和实际硬件设备直接对话—流也可以用作为伪设备驱动程序。图12-5示出了一个简单流的基本结构。
图12-6示出了一个包含一个处理模块的流。
12.4.1 流消息
流的所有输入和输出都基于消息。流首和用户进程使用read、write、getmsg、getpmsg、putmsg和putpmsg交换消息。在流首、各处理模块和设备驱动程序之间,消息可以顺流而下,也可以逆流而上。
有约2 5种不同类型的消息,但是只有少数几种用于用户进程和流首之间。其余的则只在内核中顺流、逆流传送。
12.4.2 putmsg和 putpmsg函数
putmsg和putpmsg函数用于将流消息(控制信息或数据,或两者)写至流中。
12.4.3 流ioct1操作
ioctl函数,它能做其他I / O函数不能处理的事情。流系统中继续采用了该函数。
12.4.4 write至流设备
12.4.5 写方式
12.4.6 getmsg和 getpmsg函数
12.4.7 读方式

12.5 I/O多路转接
当从一个描述符读,然后又写到另一个描述符时。如果必须读两个描述符又将如何呢?如果仍旧使用阻塞I / O,那么就可能长时间阻塞在一个描述符上,而另一个描述符虽有很多数据却不能得到及时处理。所以为了处理这种情况显然需要另一种不同的技术
一种比较好的技术是使用I/O多路转接(I/O multiplexing)。其基本思想是:先构造一张有关描述符的表,然后调用一个函数,它要到这些描述符中的一个已准备好进行I/O时才返回。在返回时,它告诉进程哪一个描述符已准备好可以进行I/O。
12.5.1 select函数
select函数使我们在SVR4和4.3+BSD之下可以执行I/O多路转接。
12.5.2 poll函数
SVR4的poll函数类似于select,但是其调用形式则有所不同。我们将会看到,poll与流系统紧紧相关。

12.6 异步I/O
使用select和poll可以实现异步I/O。关于描述符的状态,系统并不主动告诉我们任何信息,我们需要主动地进行查询(调用select或poll)。SVR4和4.3+BSD提供了使用一个信号(在SVR4中是SIGPOLL,在4.3+BSD中是SIGIO)的异步I/O方法,该信号通知进程,对某个描述符所关心的某个事件已经发生。
12.6.1 SVR4
12.6.2 4.3+BSD

12.7 readv和writev函数
readv和writev函数用于在一个函数调用中读、写多个非连续缓存。
--------------------------------------------------------------------
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/types.h>
#include <sys/uio.h>
ssize_t readv(int filedes,const struct ioveciov[ ],int iovcnt);
ssize_t writev(int filedes,const struct ioveciov[ ],int iovcnt);
两个函数返回:已读、写的字节数,若出错则为-1
--------------------------------------------------------------------

12.8 readn和 writen函数
12.9 存储映射I/O

存储映射I/O使一个磁盘文件与存储空间中的一个缓存相映射。于是当从缓存中取数据,就相当于读文件中的相应字节。与其类似,将数据存入缓存,则相应字节就自动地写入文件。这样,就可以在不使用read和write的情况下执行I/O。为了使用这种功能,应首先告诉内核将一个给定的文件映射到一个存储区域中。这是由mmap函数实现的。
------------------------------------------------------------------------------------
#include <sys/types.h>
#include <sys/mman.h>
caddr_t mmap(caddr_t addr, size_tlen,int prot,int flag,int filedes,off_t off);
返回:若成功则为映射区的起始地址,若出错则为 - 1
------------------------------------------------------------------------------------


TAG:

 

评分:0

我来说两句

日历

« 2024-05-15  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

  • 访问量: 7639
  • 日志数: 10
  • 书签数: 4
  • 建立时间: 2007-12-10
  • 更新时间: 2007-12-20

RSS订阅

Open Toolbar