引言
这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
写了好久的JVM,我们来写写新的技术-网络IO,提到网络IO大家并不陌生,都知道IO模型,但你们知道,我并不知道,所以我决定把自己不会的部分写成文章,由于是自己不会的嘛,写出来就是成就,话不多说我们开始。
读完本篇文章,你能了解最基本的IO底层原理。
IO读写的系统调用
在学习IO之前,我们需要清楚IO是操作系统帮我们完成的,主要就是这么两个系统调用write和read,无论是读还是写,都要和一个区域进行打交道,这个区域就是内存缓冲区,网络数据发送和接收都是通过网卡,也就是我们发送和传输数据都是通过读写网卡的方式完成的,但你们有没有疑问,就是我们为啥要内存缓冲区呢?我们直接读写网卡不是更方便嘛?
内存缓冲区
是啊,直接读写网卡确实更方便,但是我们有没有想过直接读写网卡会发生什么问题?网卡是硬件对吧,你要读写网卡必然触发系统的中断,那发生系统中断时,原来的进程状态和数据是不是要保存,中断完成之后,保存的数据和进程状态是不是还要恢复,那是不是会带来额外的内存和时间消耗呢?
那我们怎么办呢?就引入了内存缓冲区,有了缓冲区,我们只需要触发一次中断,将网卡里的数据读到内存缓冲区中,其实这个缓冲区是内核的数据缓冲区,然后还要切换一下状态,将数据从内核数据区复制到应用进程的缓冲区。
那要是数据发送也是一样,先把数据从进程缓冲区复制到内核缓冲区,然后系统会对内存缓冲区进行监控,等到内核缓冲区的数据达到一定大小时,就触发一次中断,进行写网卡的操作。
系统的调用过程
系统的调用过程如下:
一共就是两个阶段:当数据从网络中到达网卡时,它就被复制到内核缓冲区,这个过程用户程序无感知,是操作系统自动完成的。
下一个阶段就是将数据拷贝给用户进程。