目录
3.4 信号驱动IO: 在实现上有他一定的复杂度,我们基本上很少用到他
本节课程主要给大家讲解网络IO的概念
1 网络IO介绍
1.1 内存空间的概念:
我们的应用程序是不能直接操作计算机的需要通过内核来进行中转由内核向上提供api,我们应用程序调用从而达到中转的效果
我们的应用程序刚开始启动的时候就是一个进程,进程的话操作系统就会为我们的进程分配空间和相应的资源以内存资源为例,操作系统为我们分配的内存空间,内存空间分为两部分
一个是内核缓冲区空间,一个是用户空间,
内核缓冲区空间用于存储内核给我们处理任务所产生的任务数据,
用户空间就是应用程序占用的空间,比如我们启动一个jvm,就会在用户空间中开辟相应的堆栈信息。
1.2 网络IO的由来
网络数据到来后先存到网卡的缓冲区容量很小,最后有操作系统内部中转到内核缓冲区,再等待应用程序收走比如应用程序调用内核的Api从操作系统中的某一个socket读取数据,
情况一,如果内核的缓冲区中的某一个socket缓冲区空间有数据那么操作系统就会将socker缓冲区的数据拷贝到用户空间,数据到用户空间以后我们的程序就可以获取该数据进行使用了
情况二,内核缓冲区中没有数据,那么内核就要等待数据的到来,数据来了以后在由内核将数据读取到内核缓冲区中,数据到缓冲区以后在由缓冲区将数据拷贝到用户空间
在上面的执行流程中涉及到了几个拷贝的关键字,
IO就是数据拷贝的过程,我们称之为IO
从网络中读取到的数据称之为网络IO
2 IO模型的概念
根据读写数据时的不同表现形式,会有不同的IO模型
比如,我们调用内核的api读取某个socket内核缓冲区中的数据如果缓冲区中没有数据,那么IO就会有多种做法了
1,没有数据那就一直等,直到有数据到来
2,没有数据那就不管了,过一会再来获取等等
这种IO的多种表现形式就是不同的IO模型
3 linux系统的中IO模型介绍
数据拷贝的过程中,IO模型的不同,数据拷贝的表现形式不同
3.1 同步阻塞IO
下面给大家进行讲解
3.2 同步非阻塞IO
下一章节中进行介绍
3.3 IO多路复用:比较流行
下一章节中进行介绍
3.4 信号驱动IO: 在实现上有他一定的复杂度,我们基本上很少用到他
下一章节中进行介绍
3.5 异步IO; 未来的发展趋势
下一章节中进行介绍
4 同步阻塞IO产生的原因
阻塞:
字面意思是应用程序调用系统函数获取数据但还没有数据时(数据还没返回时)要等待数据的到来 recvfrom 获取数据内核缓冲区没有数据它不会进行返回,会一直等
当客户端将数据发送到网路中我们服务端的内核先接收到数据并存放在内核缓冲区中,如果我们的应用程序不主动调取recvfrom 函数从内核缓冲区中获取数据那数据会一直在内核缓冲区中,我们的应用程序是拿不到数据的 我们的应用程序要想从内核空间获取数据,需要主动调用recvfrom方法,将内核缓冲区的数据同步到用户空间,这个主动调用函数获取数据到用户空间的过程就是同步模型IO异步模型IO是不需要我们主动调的,内核会自动将数据同步到应用程序。
阻塞的原因是什么:
阻塞的状态跟我们调用的函数没有关系当我们查看linux系统网络编程的帮助文档中发现,产生阻塞的原因是我们的socker本身就是阻塞的,无论我们调用哪个函数他都是阻塞的。
我们可以 通过命令的形式来查看 同步阻塞模型的帮助文档 man recvfrom
4.1 小结
结论:
跟调用的函数无关,与socket文件本身的状态标志有关 同步阻塞IO:当前socket文件的状态标志是阻塞的如果我们想要将网络编程的socker变成非阻塞我,我们需要将socker文件的状态标识修改成非阻塞的即可。
5,同步阻塞IO全流程介绍
总结:
同步阻塞IO的对程序的性能有较大的影响
线程资源耗费严重,阻塞的特性导致线程利用率不高,难以支撑高性能高并发且有海量连接的服务端 后面我会给大家介绍其他形式的IO模型介绍方案