散布聚集IO是一种可以在三次系统调用中操作多个缓冲区IO的方法,可以将单个数据流的内容写到多个缓冲区,或者把单个数据流读到多个缓冲区中。这样命名是应为数据被散布到一个缓冲区向量或者从一个缓冲区向量聚集,这种方法的另一个名字叫向量IO,这种方法在少量IO的时候体现不出来优势,但是在大量IO的时候优势就非常明显了。请注意应用场景
散布聚集IO有如下优势:
1.效率:单个向量IO操作能替代多个线性IO操作
2.性能:除了系统调用次数的降低,由于内部优化,向量IO比线性IO提供更好的性能
3.原子性,不同于多个线性IO操作,一个进程可以执行单个向量IO操作而且避免了与其他进程交叉操作的风险
#include <sys/uio.h>
ssize_t readv (int fd, const struct iovec *iov, int count);
ssize_t writev (int fd, const struct iovec *iov, int count);
struct iovec {
void *iov_base;
size_t iov_len;
};
下面我们用一段简单的代码来看一下
int main(int argc,char *argv[])
{
ssize_t size;
char buf1[20] = "helloworld\n";
char buf2[20] = "creazy snail\n";
char buf3[20] = {0};
char buf4[20] = {0};
struct iovec iov[2];
int fd1=open("source1.txt",O_RDWR | O_CREAT,0766);
int fd2=open("source2.txt",O_RDWR | O_CREAT,0766);
int fd3=open("source3.txt",O_RDWR | O_CREAT,0766);
iov[0].iov_base=buf1;
iov[0].iov_len=sizeof(buf1);
iov[1].iov_base=buf2;
iov[1].iov_len=sizeof(buf2);
size=writev(fd3,iov,2); //聚集写入
lseek(fd3,0,SEEK_SET); //将指针指向最开始的地方
iov[0].iov_base=buf3;
iov[0].iov_len=20;
iov[1].iov_base=buf4;
iov[1].iov_len=20;
int re =readv(fd3,iov,2); //分布读取
printf(" %s %s %d\n",buf3,buf4,re);
write(fd1,buf3,20);
write(fd2,buf4,20);
close(fd1);
close(fd2);
close(fd3);
}