APUE-第十四章 高级I/O

本文介绍了非阻塞I/O的概念及实现方式,记录锁的工作原理及其API使用方法,讨论了死锁的产生条件与避免策略,同时涵盖了I/O多路复接、异步I/O、读写缓冲区操作、指定字节数读写、存储映射I/O等高级I/O操作。

1、非阻塞I/O

不会永远阻塞的I/O操作。

对于一个给定的文件描述符,有两种方法指定非阻塞I/O

①调用open指定O_NONBLOCK标志。

②对已经打开的描述符,调用fcntl,修改一打开文件描述符的O_NONBLOCK标志。

 

2、记录锁。

record locking

当第一个进程正在读或修改文件的某个部分时,使用记录锁可以阻止其他进程修改同一文件区。(字节范围锁)

apue.h

请求和释放一把锁

int               lock_reg(int,int, int, off_t, int, off_t);

 

#define       read_lock(fd,offset, whence, len) \

                            lock_reg((fd),F_SETLK, F_RDLCK, (offset), (whence), (len))

#define       readw_lock(fd,offset, whence, len) \

                            lock_reg((fd),F_SETLKW, F_RDLCK, (offset), (whence), (len))

#define       write_lock(fd,offset, whence, len) \

                            lock_reg((fd),F_SETLK, F_WRLCK, (offset), (whence), (len))

#define       writew_lock(fd,offset, whence, len) \

                            lock_reg((fd),F_SETLKW, F_WRLCK, (offset), (whence), (len))

#define       un_lock(fd,offset, whence, len) \

                            lock_reg((fd),F_SETLK, F_UNLCK, (offset), (whence), (len))

测试一把锁

pid_t lock_test(int,int, off_t, int,off_t);            

 

#define       is_read_lockable(fd,offset, whence, len) \

                            (lock_test((fd),F_RDLCK, (offset), (whence), (len)) == 0)

#define       is_write_lockable(fd,offset, whence, len) \

                            (lock_test((fd),F_WRLCK, (offset), (whence), (len)) == 0)

记录锁的自动继承和释放3条规则:

²  锁与进程和文件两者相关联

²  fork产生的子进程不继承父进程所设置的锁

²  在执行exec后,新程序可以继承原执行程序的锁

在文件尾端加锁

Writew_lock(fd,o,SEEK_END,O)

Write(fd,buf,1);

Unclock(fd,o,SEEK_END);

Write(fd,buf,1);

 

建议性锁:

强制性锁:让内核检查每一个openreadwrite,验证调用进程是否违背了正在访问的文件上的某一把锁。

 

一般的Unix系统文本编辑器并不使用记录锁。(该文件的最后结果取决于写该文件的最后一个进程)

 

3、死锁

1)条件:要有一个或多个线程、一个或多个资源,每个线程都在等待其中的一个资源,但所有的资源都已经被占用。所有线程都在互相等待,但他们永远不会释放已经占有的资源。

2)避免死锁的规则:

  • 按顺序加锁。
  • 防止发生饥饿
  • 不重复请求同一个锁
  • 设计应力求简单

 

4I/O多路转接

先构造一个我们所关心的描述符列表,然后调用函数(selectpselectpoll)直到这些描述符中的一个已经准备好进行I/O时,该函数才返回。

#include

Int select(int maxfdl,

fd_set *restrict readfds,

fd_set *restrict writefds,

fd_set *restrict exceptfds,

struct timeval *restricttvptr);

 

 

5、异步I/O

POSIX异步I/O接口使用AIO控制块来描述I/O操作。

Struct aiocb

{

}

 

6、函数readv  writev

用于在一次函数调用中读、写多个非连续缓冲区。---散布读、聚集写

#include

Ssize_t readv(int fd, const struct iovec*iov, int iovcnt);

Ssize_t writev(int fd, const struct iovec*iov, int iovcnt);

 

Struct iovec{

                   Void*iov_base;   //starting addressof buffer

                   Size_tiov_len;    //sizeof buffer

}

 

7、函数readn  written

读写指定的N字节数据,并处理返回值可能小于要求值的情况。

#include “apue.h”

Ssize_t readn(int fd, void *buf, size_tnbytes);

Ssize_t writen(int fd, void *buf,size_tnbytes);

 

8、存储映射I/O

Memory-mapped I/O

将一个磁盘文件映射到存储空间中的一个缓冲区上,当从缓冲区中取数据时,就相当于读文件中的相应字节。与此类似,将数据存入缓冲区时,相应字节就自动写入文件。

#include

告诉内核将一个给定文件映射到一个存储区域中,返回映射区的起始地址。

Void *mmap(void *addr, size_t len, intprot, int flag, int fd, off_t off);

更改现有映射的权限

Int mprotect(void *addr, size_t len, intprot);

将已经修改的页“冲洗”到被影射的文件中。

Int msync(void *addr, size_t len, intflags);

解除存储映射区的映射

Int munmap(void *addr, size_tlen);


本 PPT 介绍了制药厂房中供配电系统的总体概念与设计要点,内容包括: 洁净厂房的特点及其对供配电系统的特殊要求; 供配电设计的一般原则与依据的国家/行业标准; 从上级电网到工厂变电所、终端配电的总体结构与模块化设计思路; 供配电范围:动力配电、照明、通讯、接地、防雷与消防等; 动力配电中电压等级、接地系统形式(如 TN-S)、负荷等级与可靠性、UPS 配置等; 照明的电源方式、光源选择、安装方式、应急与备用照明要求; 通讯系统、监控系统在生产管理与消防中的作用; 接地与等电位连接、防雷等级与防雷措施; 消防设施及其专用供电(消防泵、排烟风机、消防控制室、应急照明等); 常见高压柜、动力柜、照明箱等配电设备案例及部分设计图纸示意; 公司已完成的典型项目案例。 1. 工程背景与总体框架 所属领域:制药厂房工程的公用工程系统,其中本 PPT 聚焦于供配电系统。 放在整个公用工程中的位置:与给排水、纯化水/注射用水、气体与热力、暖通空调、自动化控制等系统并列。 2. Part 01 供配电概述 2.1 洁净厂房的特点 空间密闭,结构复杂、走向曲折; 单相设备、仪器种类多,工艺设备昂贵、精密; 装修材料与工艺材料种类多,对尘埃、静电等更敏感。 这些特点决定了:供配电系统要安全可靠、减少积尘、便于清洁和维护。 2.2 供配电总则 供配电设计应满足: 可靠、经济、适用; 保障人身与财产安全; 便于安装与维护; 采用技术先进的设备与方案。 2.3 设计依据与规范 引用了大量俄语标准(ГОСТ、СНиП、SanPiN 等)以及国家、行业和地方规范,作为设计的法规基础文件,包括: 电气设备、接线、接地、电气安全; 建筑物电气装置、照明标准; 卫生与安全相关规范等。 3. Part 02 供配电总览 从电源系统整体结构进行总览: 上级:地方电网; 工厂变电所(10kV 配电装置、变压
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值