Linux网络I/O模型简介

一、I/O基础入门

java1.4之前的早期版本,java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要问题如下。

1、没用数据缓冲区,I/O性能存在问题;

2、没有C或者C++中的Channel概念,只有输入和输出流;

3、同步阻塞式I/O通信(BIO),通常会导致通信线程被长时间阻塞;

4、支持字符集有限,硬件可移植性不好。

二、Linux网络I/O模型简介

Linux的内核讲所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。

而对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。

根据unix网络编程对I/O模型的分类,UNIX提供了5种I/O模型。

1、阻塞IO模型:默认情况下,所有文件操作都是阻塞的。在进程空间中调用recvfrom,其系统调用知道数据包到达且被复制到应用进程的缓冲区或者发生错误时才返回,

在此期间一直会等待,进程在从调用recvfrom开始到它返回的整段时间内都是被阻塞的,因此被称为阻塞I/O模型。

2、非阻塞IO模型:recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞IO模型进行轮询检查这个状态,

看内核是不是有数据到来。

原文地址:https://www.cnblogs.com/wangpin/p/6986458.html