【网络编程技术】并发服务器I/O复用与套接字选项

I/O

Linux中,广义上来讲一个文件就是一个字节序列,而非我们直觉上的一个文件或目录。这个字节序列也并没有确定的存储,可能在网络上、可能在磁盘上或缓冲区中。I/O操作都是针对这个字节序列进行,比如read调用就是从这个字节序列读到字节到内存缓冲区中,write调用就是把字节加到这个字节序列后面。

文件I/O(文件描述符0 对应标准输入,和read, write 等配合使用 )、网络数据包 IO(套接字)、标准I/O(对于标准I/O库,它们的操作则是围绕流进行的,预定义了三个标准I/O流,分别为三个文件指针stdin,stdout和stderr ,函数fread, fwrite )

系统调用是如何完成一个I/O操作的呢?

Linux系统将内存分为内核区和用户区,Linux内核给管理所有的硬件资源,应用程序通过系统调用与内核交互,达到使用硬件资源的目的。例如,应用程序通过系统调用read对文件描述符fd发起一个读操作,这时候内核通过驱动程序向硬件发送读指令,并将读到的数据放在这个fd对应结构体的缓存区中,但这个结构体是在内核内存区的,需要将这个数据读到用户区,这样就完成了一次读操作。

一个输入操作一般有两个阶段

1.等待数据准备好

2.从内核到进程(应用程序)拷贝数据

对于一个socket上的操作

第一步:一般是等待数据到达网络,当分组到达时,它被拷贝到内核中某个缓冲区。

第二步:将数据从内核缓冲区拷贝到应用程序缓冲区

I/O模型

Unix下可用的I/O模型

-阻塞i/o

-非阻塞i/o

-i/o复用(select和poll)

-信号驱动i/o(SIGIO)

-异步i/o(posix.1的aio_系列函数)

你可能感兴趣的:(【网络编程技术】并发服务器I/O复用与套接字选项)