Linux网络IO模型简介

Linux网络IO模型简介


Linux的内核将所有外设看作一个文件来操作,对于一个文件的读写操作,会调用内核提供的系统命令,返回一个fd (file description 文件描述符),而对于一个socket的读写也会有相应的描述符,称为socketfd(socket 描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。

一、阻塞IO模型

java进程读取数据,调用recvfrom,其系统调用直到数据包到达(磁盘到内核缓冲区),且被复制(从内核缓冲区到进程缓冲区)或者发生错误,才返回,在此期间进程一致阻塞,因此称为阻塞IO模型。

eg:钓鱼的时候,一直拿着鱼竿,等鱼儿咬钩将鱼儿拉上来。鱼儿相当于数据包,钓鱼者相当于进程。

二、非阻塞IO模型

recvfrom调用后,如果内核缓冲区没有数据,则返回一个error,然后直接返回,等待一段时间再去看内核缓冲区有没有数据,如此这般轮询。

eg:钓鱼的时候,可以去喝喝水,聊聊天,隔段时间看看鱼竿有没有动静。

三、IO复用信号模型

Linux提供select/poll,进程通过将一个或多个fd传递个select或poll系统调用,阻塞在select操作上,这样select/poll可以同时侦测多个fd是否处于就绪状态,某个fd就绪就将内核缓冲区的数据拷贝到进程缓冲区。

eg:同时摆上多个鱼竿,由垂钓者看着,某个有动静就将某个拉上来。

、四、信号驱动IO模型

进程读取数据时,系统调用recvfrom直接返回,此时进程是非阻塞的,当内核缓冲区数据准备好后,通知recvfrom进行数据的复制。(会注册一个信号处理函数),

eg:买了一个带有提醒功能的鱼竿钓鱼。

五、异步IO模型

进程读取数据,在整个操作完成之后(磁盘到内核缓冲区,内核缓冲区到进程缓冲区)通知进程IO操作已经完成。

eg:鱼竿具有自动钓鱼功能,可以将鱼儿收到鱼篓中。

信号驱动与异步IO的比较

信号驱动的内核缓冲区到进程缓冲区这个过程依然是同步的,它的通知,仅是代表IO操作可以进行。

异步IO整个过程都是异步的,它的通知代表IO操作已经完成。

猜你喜欢

转载自blog.csdn.net/weixin_43213517/article/details/104478305