I/O基础 1、java1.4之前,java对I/O支持不完善,存在以下问题: 没有数据缓冲区,I/O性能存在问题。 没有C或者C++的channel概念,只有输入输出流。 同步式阻塞式I/O通信,通常会导致通信线程被长时间阻塞。 支持的字符集有限,硬件可移植性不好。 2、Linux网络I/O模型 Linux内核将所有外部设备都看作一个文件来操作,对文件的操作都会调用内核提供的系统命令,返回一个fd(文件描述符)。 描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等属性)。 fd演示:
I/O问题一般不会被大多数人关注,因为大多数开发都是在做“业务”,也就是在搞计算节点的事情,通常遇到的I/O问题,也就是日志打的有点多了,磁盘写起来有点吃力,所以iowait这个指标,关注的人也不多。
传统IO的工作方式是,数据读取和写入是从用户空间和内核空间来回复制,内核空间的数据时通过操作系统层面的IO接口从磁盘读取或写入。
POSIX AIO 是在用户控件模拟异步 IO 的功能,不需要内核支持,而 linux AIO 则是 linux 内核原声支持的异步 IO 调用,行为更加低级。
当一个女生让你替她抓100只萤火虫,她一定不是为了折磨你,而是因为她爱上了你。当你们之间经历了无数的恩恩怨怨和彼此伤害,她再次让你替她抓100只萤火虫,那一定是因为她还爱着你。
mpcap 是利用mmap 文件映射的方式把抓包文件映射进程的虚拟地址空间。从而减少了write函数一次内存拷贝到页缓存的过程,从而提高效率。
Linux 操作系统中的 " 堆内存 “ 是通过 malloc 等函数 ” 动态分配 " 的 内存区域 ;
在容器逃逸技术概览一文中我们提到,由于容器与宿主机共享内核,内核漏洞成为容器逃逸的四大原因之一。由于潜在后果的严重性(提升至系统最高权限)和影响的广泛性(一个漏洞会影响相当多的计算机设备),系统开发者陆续在内核实现了一系列的漏洞缓解技术,以减小内核被攻破的可能性。
同步阻塞IO在等待数据就绪上花去太多时间,而传统的同步非阻塞IO虽然不会阻塞进程,但是结合轮询来判断运维
epoll是一种I/O事件通知机制,是linux 内核实现IO多路复用的一个实现。IO多路复用是指,在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。 epoll有两种工作方式, LT-水平触发 和ET-边缘触发(默认工作方式),主要区别是: LT,内核通知你fd是否就绪,如果没有处理,则会持续通知。而ET,内核只通知一次。 什么是I/O? 输入输出(input/output)的对象可以是文件(file), 网络(socket),进程之间的管道(pipe)。在linux系统中,都用文件描述符(fd)来表示。 什么是事件? IO中涉及到的行为,建立连接、读操作、写操作等抽象出一个概念,就是事件,在jdk中用类SelectionKey.java来表示,例如:可读事件,当文件描述符关联的内核读缓冲区可读,则触发可读事件(可读:内核缓冲区非空,有数据可以读取);可写事件,当文件描述符关联的内核写缓冲区可写,则触发可写事件(可写:内核缓冲区不满,有空闲空间可以写入)。 什么是通知机制? 通知机制,就是当事件发生的时候,则主动通知。通知机制的反面,就是轮询机制。
常见的内存分配函数有malloc,mmap等,但大家有没有想过,这些函数在内核中是怎么实现的?换句话说,Linux内核的内存管理是怎么实现的?
c/s架构,客户端要找得到服务端。 Binder使用Client-Server通信方式:一个进程作为Server提供诸如视频/音频解码,视频捕获,地址本查询,网络连接等服务;多个进程作为Client向Server发起服务请求,获得所需要的服务。要想实现Client-Server通信据必须实现以下两点:一是server必须有确定的访问接入点或者说地址来接受Client的请求,并且Client可以通过某种途径获知Server的地址;二是制定Command-Reply协议来传输数据。例如在网络通信中Server的访问接入点就是Server主机的IP地址+端口号,传输协议为TCP协议。对Binder而言,Binder可以看成Server提供的实现某个特定服务的访问接入点, Client通过这个‘地址’向Server发送请求来使用该服务;对Client而言,Binder可以看成是通向Server的管道入口,要想和某个Server通信首先必须建立这个管道并获得管道入口。
Binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe)、信号(Signal)和跟踪(Trace)、插口(Socket)、报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore)。本文详细介绍Binder作为Android主要IPC方式的优势。 Binder机制概述: 基于Client-Server的通信方式广泛应用于从互联网和数据库访问到嵌
如今几乎每个人都听说过Linux中所谓的”零拷贝”特性,然而我经常碰到没有充分理解这个问题的人们。因此,我决定写一些文章略微深入的讲述这个问题,希望能将这个有用的特性解释清楚。在本文中,将从用户空间应用程序的角度来阐述这个问题,因此有意忽略了复杂的内核实现。 什么是”零拷贝” 为了更好的理解问题的解决法,我们首先需要理解问题本身。首先我们以一个网络服务守护进程为例,考虑它在将存储在文件中的信息通过网络传送给客户这样的简单过程中,所涉及的操作。下面是其中的部分简单代阿: read(file, tmp_buf, len); write(socket, tmp_buf, len); 看起来不能更简单了。你也许认为执行这两个系统调用并未产生多少开销。实际上,这简直错的一塌糊涂。在执行这两个系统调用的过程中,目标数据至少被复制了4次,同时发生了同样多次数的用户/内核空间的切换(实际上该过程远比此处描述的要复杂,但是我希望以简单的方式描述之,以更好的理解本文的主题)。 为了更好的理解这两句代码所涉及的操作,请看图1。图的上半部展示了上下文切换,而下半部展示了复制操作。
使用 malloc 函数申请内存原理 : " 堆内存 " 动态分配 的 系统调用 过程 ;
进程是指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。程序本身只是指令、数据及组织形式的描述,而进程才是程序真正的运行实体。在Linux内核中,进程又称为任务(task),进程的虚拟地址空间可以分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,又各自拥有独立的用户虚拟地址空间。
4月26日收到了腾讯的offer,终于安心了,很多小伙伴们要我写面经介绍下,其实自己能拿到腾讯的offer 99%是运气~, 这里就介绍下自己的面经跟总结自己的看的书跟学习方法, 自己来自一所非985垫底的211大学~大三本科,主要学习的是Linux内核/C++,投的岗位都是后台开发, 自己的项目也就2个demo,一个简易kernel,一个很简单的网络库. 因为学校位置不方便,只投了腾讯跟美团.不可以投那么多互联网公司(路费.一出疆就上千),美团各种原因放弃了, 然后就这次到西安参加腾讯面试花了1800左右
分配 虚拟内存页 : 应用进程 调用 mmap 函数后 , 在 Linux 系统中 创建 " 内存映射 “ 时 , 会在 ” 用户虚拟地址空间 “ 中 , 分配一块 ” 虚拟内存区域 " ;
通过前两篇文章(系统调用mmap的内核实现分析,Linux下Page Fault的处理流程)我们可以知道,虚拟内存是在我们向操作系统申请内存(比如malloc或mmap)时分配的,而物理内存是在我们使用(比如读或写)虚拟内存时通过page fault分配的。
glibc 提供的 ptmalloc 函数 , FreeBSD 提供的 jemalloc 函数 , Google 提供的 tcmalloc 函数 ,
① 用户应用程序调用 : 开发者 在 " 用户空间 “ 的 应用程序 中调用 malloc 等函数 , 申请 动态分配 ” 堆内存 " ,
但是在 arm 64 体系架构中 , 没有实现 mmap2 , 只实现了 mmap 系统调用 ;
在接入日志组件xlog的工作中,对mmap内存映射加深了了解,分享一下学习心得。 1.一个Linux进程的虚拟内存 如图展示了一个Linux进程的虚拟内存。 虚拟的意思是进程以为自己有这么一
我们知道,linux系统中用户空间和内核空间是隔离的,用户空间程序不能随意的访问内核空间数据,只能通过中断或者异常的方式进入内核态,一般情况下,我们使用copy_to_user和copy_from_user等内核api来实现用户空间和内核空间的数据拷贝,但是像显存这样的设备如果也采用这样的方式就显的效率非常底下,因为用户经常需要在屏幕上进行绘制,要消除这种复制的操作就需要应用程序直接能够访问显存,但是显存被映射到内核空间,应用程序是没有访问权限的,如果显存也能同时映射到用户空间那就不需要拷贝操作了,于是字符设备中提供了mmap接口,可以将内核空间映射的那块物理内存再次映射到用户空间,这样用户空间就可以直接访问不需要任何拷贝操作,这就是我们今天要说的0拷贝技术。
PBLE: Physical Buffer List Entry 物理缓冲区列表条目
在开始介绍go sys call 库之前先介绍下Linux syscall的几个概念
mmap是linux操作系统提供给用户空间调用的内存映射函数,很多人仅仅只是知道可以通过mmap完成进程间的内存共享和减少用户态到内核态的数据拷贝次数,但是并没有深入理解mmap在操作系统内部是如何实现的,原理是什么。
本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux 算是比较基础的技术,所以,学好 Linux 对于云计算的学习会有比较大的帮助。
以交友平台用户中心的user表为例,单表数据规模达到千万级别时,你可能会发现使用用户筛选功能查询用户变得非常非常慢,明明查询命中了索引,但是,部分查询还是很慢,这时候,我们就需要考虑拆分这张user表了。
主要是驱动设备的初始化(binder_init),打开 (binder_open),映射(binder_mmap),数据操作(binder_ioctl)。
调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ;
select的本质是采用32个整数的32位,即32*32= 1024来标识,fd值为1-1024。当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小。这个时候就可以标识32*max值范围的fd。
本文探讨Linux中 主要的几种零拷贝技术 以及零拷贝技术 适用的场景 。为了迅速建立起零拷贝的概念,我们拿一个常用的场景进行引入:
在 Linux 系统中一切皆文件,除了通常所说的狭义的文件以外,目录、设备、套接字和管道等都是文件。
在《一文看懂零拷贝技术》中我们介绍了 零拷贝技术 的原理,而且我们知道 mmap 也是零拷贝技术的一种实现。在本文中,我们主要介绍 mmap 的原理。
一、共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区,当这
本文从操作系统的角度来解释BIO,NIO,AIO的概念,含义和背后的那些事。本文主要分为3篇。 第一篇 讲解BIO和NIO以及IO多路复用 第二篇 讲解磁盘IO和AIO 第三篇 讲解在这些机制上的一些应用的实现方式,比如nginx,nodejs,Java NIO等 磁盘IO 磁盘IO,简单来说就是读取硬盘一类设备的IO。这类设备包括传统的磁盘、SSD、闪存、CD等。操作系统将其统一抽象为”块设备“。所以磁盘IO又可以叫做”块IO“。这些设备上的数据一般用文件系统来组织,所以又可以成为”文件IO“。本文统
磁盘IO,简单来说就是读取硬盘一类设备的IO。这类设备包括传统的磁盘、SSD、闪存、CD等。操作系统将其统一抽象为”块设备“。所以磁盘IO又可以叫做”块IO“。这些设备上的数据一般用文件系统来组织,所以又可以成为”文件IO“。本文统一用”磁盘IO“这个术语。
在 Linux 系统中,我们经常用 free 命令来查看系统内存的使用状态。在个 RHEL6 的系统上,free 命令的显示内容大概是这样一个状态: 这里的默认显示单位是 kb,我的服务器是 128
本文旨在深入探讨Linux操作系统的虚拟内存管理机制。我们将从基本概念开始,逐步深入到内核级别的实现细节。为了达到这个目标,本文将结合理论讨论和实际的代码分析。我们希望通过这种方式,使读者对Linux虚拟内存管理有更深入的理解。
本文列举四个比较经典的 Linux 收包引擎,如果还有其他你觉得ok的可以留言。这四个分别是:
编辑手记:很多人都认为,Linux中buffers和cached所占用的内存空间是可以在内存压力较大的时候被释放当做空闲空间用的。但真的是这样么?今天我们重新来认识。 作者介绍 邹立巍 Linux系
基本操作就是循环的从磁盘读入文件内容到缓冲区,再将缓冲区的内容发送到socket。但是由于Linux的I/O操作默认是缓冲I/O。这里面主要使用的也就是read和write两个系统调用,我们并不知道操作系统在其中做了什么。实际上在以上I/O操作中,发生了多次的数据拷贝。
零拷贝(Zero-copy)是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。
mmap(memory map)即内存映射,用于将一个文件或设备映射到进程的地址空间,或者创建匿名的内存映射。
零拷贝是老生常谈的问题啦,大厂非常喜欢问。比如Kafka为什么快,RocketMQ为什么快等,都涉及到零拷贝知识点。最近技术讨论群几个伙伴分享了阿里、虾皮的面试真题,也都涉及到零拷贝。因此本文将跟大家一起来学习零拷贝原理。
Kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不是kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝。下面我就画图讲解零拷贝,如果对你有帮助请点个赞支持。
领取专属 10元无门槛券
手把手带您无忧上云