linux socket read 接受缓存为空_Linux直接IO、缓存IO、阻塞与同步?
Linux 基础知识回顾
用户空间和内核空间
现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内存的地址),再通过总线的传递,最后处理器拿到某个物理地址返回的字节。
对 32 位操作系统而言,它的寻址空间(虚拟存储空间)为 4G(2 的 32 次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。
为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。
针对 linux 操作系统而言:将最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF)供内核使用,称为内核空间。而将较低的 3G 字节(从虚拟地址 0x00000000 到 0xBFFFFFFF)供各个进程使用,称为用户空间。
直接 I/O 和缓存 I/O
文件系统 IO 分为 DirectIO(直接I/O)和 BufferIO(缓存 I/O),其中 BufferIO 也叫 Normal IO(标准 I/O)。大多数文件系统的默认 I/O 操作都是缓存 I/O。
缓存 I/O
读操作:操作系统检查内核的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回;否则从磁盘中读取,然后缓存在操作系统的缓存中。
写操作:将数据从用户空间复制到内核空间的缓存中。这时对用户程序来说写操作就已经完成,至于什么时候再写到磁盘中由操作系统决定,除非显示地调用了sync同步命令。
以 write 为例,数据会先被拷贝进程缓冲区,在拷贝到操作系统内核的缓冲区中,然后才会写到存储设备中。
![](/assets/blank.gif)
直接 I/O(少了拷贝到应用进程缓冲区这一步)
![](/assets/blank.gif)
阻塞与同步
阻塞(Block) / 非租塞(NonBlock)
阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,比如当数据没有准备就绪的时候。
阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。
非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。
同步(Synchronization) / 异步(Asynchronization)
同步和异步都是基于应用程序私操作系统处理 IO 事件所采用的方式,比如:
同步:是应用程序要直接参与 IO 读写的操作。
异步:所有的 IO 读写交给操作系统去处理,应用程序只需要等待通知。
同步方式在处理 IO 事件的时候,必须阻塞在某个方法上面等待我们的 IO 事件完成(阻塞 IO 事件或者通过轮询 IO 事件的方式)。
对于异步来说,所有的 IO 读写都交给了操作系统。这个时候,我们可以去做其他的事情,并不需要去完成真正的 IO 操作,当操作完成 IO 后会给我们的应用程序一个通知。
常见 IO 模型
对于一次 IO 访问,它会经历两个阶段:等待数据准备就绪 (Waiting for the data to be ready);将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)。
举例来说:
读函数:分为等待系统可读和真正的读。
写函数:分为等待网卡可以写和真正的写。
说明:
等待就绪的阻塞是不使用 CPU 的,是在“空等”。而真正的读写操作的阻塞是使用 CPU 的,真正在“干活”,而且这个过程非常快,属于 memory copy,宽带通常在 1GB/s 级别以上,可以理解为基本不耗时。
下图是几种常见 I/O 模型的对比:
![](/assets/blank.gif)
以 socket.read() 为例子:
传统的 BIO 里面 socket.read(),如果 TCP RecvBuffer 里没有数据,函数会一直阻塞,直到收到数据,返回读到的数据。
对于 NIO,如果 TCP RecvBuffer 有数据,就把数据从网卡读到内存,并且返回给用户;反之则直接返回 0,永远不会阻塞。
最新的 AIO(Async I/O) 里面会更进一步:不但等待就绪是非阻塞的,就连数据从网卡到内存的过程也是异步的。
换句话说,BIO 里用户最关心“我要读”,NIO 里用户最关心"我可以读了",在 AIO 模型里用户更需要关注的是“读完了”。
NIO 一个重要的特点是:socket 主要的读、写、注册和接收函数,在等待就绪阶段都是非阻塞的,真正的 I/O 操作是同步阻塞的(消耗 CPU 但性能非常高)。
linux socket read 接受缓存为空_Linux直接IO、缓存IO、阻塞与同步?相关推荐
- socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空
socket传输结构体,c++,发送OK,recv返回字节大小正确但接受数据为空 服务端在ubuntu服务器下,客户端在windows下,采用socket进行通信,在客户端接收数据时,出现了诡异的情况 ...
- linux刷新dns缓存_Linux刷新文件系统缓存
linux刷新dns缓存 We may drop the file system caches on Linux to free up memory for applications. Kernels ...
- linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...
- Linux Socket网络编程UDP、TCP 阻塞与非阻塞 断线重连机制
三种非阻塞模式的方法: (1) fcntl函数 int Mode = fcntl(sockfd, F_GETFL, 0); //获取文件的Mode值 fcntl(sockfd, F ...
- linux中负载值为多少正常_Linux load average负载量分析与解决思路
一.load average top命令中load average显示的是最近1分钟.5分钟和15分钟的系统平均负载.系统平均负载表示 系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或 ...
- linux socket高性能服务器处理框架
这个博客很多东西 http://blog.csdn.net/luozhonghua2014/article/details/37041765 思考一种高性能的服务器处理框架 1.首先需要一个内存池,目 ...
- Linux Socket详解 大全 基础知识
1. Socket基础概念: 1.1:形象类比: Socket和电话网络的概念可以做一个很好的类比: Linux 编程中所说的socket就如同一个端点,类比到电话网中,它就如同一个电话机. 而Soc ...
- Linux Socket接口使用方法
Linux内核net/socket.c定义了一套socket的操作api.图1展示了socket层所处与TCP/IP协议栈之上和应用层之下. socket()函数 socket函数对应于普通文件的打开 ...
- Linux Socket编程
IP socket 是在其上建立高级Internet 协议的最低级的层:从HTTP到SSL到POP3到Kerberos再到UDP-Time,每种Internet协议都建立在它的基础上.为了实现自定义的 ...
最新文章
- 使用poi进行数据的导出Demo
- 简明代码介绍类激活图CAM, GradCAM, GradCAM++
- Java如何查看死锁?
- jquery mobile用代码弹出dialog
- 我最开始学dancing link的HTML5的时候
- 保险的现金价值是什么意思?
- C#中const和readonly有什么区别?
- 疯狂Java讲义(一)
- Web网页设计规范详细介绍
- springBoot做后台实现微信小程序图片上传和下载
- 嵌入式软件开发笔试面试知识点总结-操作系统部分
- 个人作业 Alpha项目测试
- Android Studio编写Xposed模块
- ConnectBot连接Linux服务器手机端工具
- 计算机五笔字型编码方法,无字型五笔编码计算机中文输入法
- shell获取当前执行脚本的路径和文件名
- html 超链接 ppt,《用HTML建立超链接》PPT课件.ppt
- Windows 7防火墙设置详解(一)
- canvas loadImage图片加载
- 让世界爱上中国原创!
热门文章
- 【java】java JUC 同步器框架 AQS AbstractQueuedSynchronizer源码图文分析
- 【Redis】redis JedisDataException: ERR Client sent AUTH, but no password is set
- 78-spark2.2的编译
- 95-120-042-源码-Cluster-SessionClusterEntrypoint
- Spring : BeanFactoryPostProcessor 子类 BeanDefinitionRegistryPostProcessor
- wireshark抓包怎么找访问网址
- div iframe 显示html,IE中iframe标签显示在DIV之上的问题解决方案
- SpringBoot部署Jar文件,瘦身优化指南!
- 一般单元测试不可以并行进行_铝型材配件可以不可以进行二次加工
- debug最常用的快捷键