精华内容
下载资源
问答
  • 直接IO是略过操作系统层面,直接访问文件进行文件的读写,减少了磁盘缓冲到操作系统层面。Java中是由DirectByteBuffer,但是这种机制的缺点也是有的,对于没有做好一个好的程序缓存管理,或者一直需要读取新的文件的...

    标准IO 是通过new File的方式访问, 这种方式的访问会先把磁盘的文件缓存到操作系统层面,再有操作系统缓存到应用程序层面(Java程序层面),这种访问最慢。

    直接IO是略过操作系统层面,直接访问文件进行文件的读写,减少了磁盘缓冲到操作系统层面。Java中是由DirectByteBuffer,但是这种机制的缺点也是有的,对于没有做好一个好的程序缓存管理,或者一直需要读取新的文件的时候,还是需要直接从磁盘读取文件。

    内存映射的方式是通过一个内存映射文件,这个文件映射了操作系统内存与磁盘文件的映射的关系,比如 内存a1-a100区间 对应 1-100M文件地址。 每一次访问内存就是要访问磁盘文件。当然这是由操作系统完成的,操作系统会预加载一些数据到缓冲区。这种也没有操作系统到应用程序的复制。因为操作系统和应用程序共享这一段的数据,可以进行一些大文件的处理。

    参考:
    1. http://www.cnblogs.com/androidsuperman/p/7083049.html
    2. http://www.cnblogs.com/hapjin/p/5736188.html
    3. http://blog.csdn.net/qq_29134495/article/details/51519334
    4. http://www.cnblogs.com/huanxiyun/articles/5443754.html

    展开全文
  • 磁盘IO:缓存IO、直接IO内存映射

    万次阅读 2013-04-09 18:40:16
    磁盘IO的几种访问方式如下: 缓存IO  缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序...

    磁盘IO的几种访问方式如下:


    缓存IO

           缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间。

           读操作:操作系统检查内核的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回;否则从磁盘中读取,然后缓存在操作系统的缓存中。

           写操作:将数据从用户空间复制到内核空间的缓存中。这时对用户程序来说写操作就已经完成,至于什么时候再写到磁盘中由操作系统决定,除非显示地调用了sync同步命令。

           缓存I/O的优点:1)在一定程度上分离了内核空间和用户空间,保护系统本身的运行安全;2)可以减少读盘的次数,从而提高性能。

           缓存I/O的缺点:数据在传输过程中需要在应用程序地址空间和缓存之间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU以及内存开销是非常大的。


    图 1. 以标准的方式对文件进行读写

     图 1. 以标准的方式对文件进行读写


    直接IO

           直接IO就是应用程序直接访问磁盘数据,而不经过内核缓冲区,这样做的目的是减少一次从内核缓冲区到用户程序缓存的数据复制。比如说数据库管理系统这类应用,它们更倾向于选择它们自己的缓存机制,因为数据库管理系统往往比操作系统更了解数据库中存放的数据,数据库管理系统可以提供一种更加有效的缓存机制来提高数据库中数据的存取性能。

           直接IO的缺点:如果访问的数据不在应用程序缓存中,那么每次数据都会直接从磁盘加载,这种直接加载会非常缓存。通常直接IO与异步IO结合使用,会得到比较好的性能。(异步IO:当访问数据的线程发出请求之后,线程会接着去处理其他事,而不是阻塞等待)


     图2. 数据传输不经过操作系统内核缓冲区

    图 4. 数据传输不经过操作系统内核缓冲区


    内存映射

           内存映射是指将硬盘上文件的位置与进程逻辑地址空间中一块大小相同的区域一一对应,当要访问内存中一段数据时,转换为访问文件的某一段数据。这种方式的目的同样是减少数据在用户空间和内核空间之间的拷贝操作。当大量数据需要传输的时候,采用内存映射方式去访问文件会获得比较好的效率。

           使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。


    图 3. 内存映射方式访问

    图 3. 利用 mmap 代替 read


    参考:

    Linux 中直接 I/O 机制的介绍:http://www.ibm.com/developerworks/cn/linux/l-cn-directio/

    内存映射文件原理探索:http://blog.csdn.net/mg0832058/article/details/5890688

    展开全文
  • 1. 缓冲IO 在介绍缓冲IO之前需要先了解一下常用的机械硬盘的原理与特点: 一个机械硬盘中装有多个盘片,每个盘片上有多个同心圆(磁道),每个同心圆又由多个弧(扇区)组成,每个弧上都记录了等量的数据(比方说...

    1. 缓冲IO

    在介绍缓冲IO之前需要先了解一下常用的机械硬盘的原理与特点:

    一个机械硬盘中装有多个盘片,每个盘片上有多个同心圆(磁道),每个同心圆又由多个弧(扇区)组成,每个弧上都记录了等量的数据(比方说512byte)

    如果发起一个随机读写请求,磁头需要先找到对应的磁道,然后等待对应的扇区旋转到磁头正下方才能开始读取数据(民用机械硬盘的转速一般在5400或者7200RPM,工业界倒是经常使用10000RPM的机械硬盘。但是它们的寻道时间大概都在几ms到十几ms左右)

    机械硬盘的顺序读写很快(一般在100-200MB/s),但是随机读写很慢(寻道时间在十几ms,导致随机读写的iops只有几十)

    假定我们不做任何额外的优化处理,在用户发起读数据请求的时候,直接调用硬盘驱动读取磁盘数据并返回

    设想一个场景:循环调用read方法读取文件,但是每次只读取较少的数据(比方说每次只读一个byte)。那么每次read请求都对应于一次对磁盘的随机读写(两次读请求之前需要重新寻道),也就是说read操作的tps只有几十。

    也就是说此时磁盘占用率为100%,但是只能提供不到100byte/s的数据读取率,这显然是不可接受的。

    Linux对此有个很简单的优化,就是在内核中维护一块缓冲区(buffer cache),在用户第一次调用read读取数据的时候,无论用户想要读取的数据有多小,都会一次性从磁盘中加载一段数据放到缓冲区中,这样用户下一次调用read方法的时候可以直接从缓冲区中返回数据,不用再次访问磁盘了。

    write方法也是同理,用户写入的数据不是直接落盘,而是先写到kernel中的缓冲区里,按照一定的策略批量刷盘。当然也可以调用flush方法强制将缓存区的数据落盘。

    这个优化极大的提高了顺序读写的效率。由于直接读写的是kernel中的缓冲区而不是磁盘,这种IO被称为缓冲IO

    2. 直接IO

    一般来说,上面介绍的缓冲IO已经足够应付日常需求了。但是像数据库这种极度依赖IO的应用程序,为了追求极致的性能,往往更加愿意自己直接操作磁盘。

    直接IO可以直接将数据从磁盘复制到用户空间,或者将数据从用户空间写到磁盘,减少了kernel中的缓冲区这一环节,这是直接IO可以提高性能的原理。

    但是如果用得不好就悲剧了,所以直接IO只在少数场景下使用。

    3. 内存映射mmap

    前提概念

    虚拟内存系统通过将虚拟内存分割为称作虚拟页(Virtual Page,VP)大小固定的块,一般情况下,每个虚拟页的大小默认是4096字节。同样的,物理内存也被分割为物理页(Physical Page,PP),也为4096字节。

    3.1 基本概念

    mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图所示:

    由上图可以看出,进程的虚拟地址空间,由多个虚拟内存区域构成。虚拟内存区域是进程的虚拟地址空间中的一个同质区间,即具有同样特性的连续地址范围。上图中所示的text数据段(代码段)、初始数据段、BSS数据段、堆、栈和内存映射,都是一个独立的虚拟内存区域。而为内存映射服务的地址空间处在堆栈之间的空余部分。

    linux内核使用vm_area_struct结构来表示一个独立的虚拟内存区域,由于每个不同质的虚拟内存区域功能和内部机制都不同,因此一个进程使用多个vm_area_struct结构来分别表示不同类型的虚拟内存区域。各个vm_area_struct结构使用链表或者树形结构链接,方便进程快速访问,如下图所示:

    vm_area_struct结构中包含区域起始和终止地址以及其他相关信息,同时也包含一个vm_ops指针,其内部可引出所有针对这个区域可以使用的系统调用函数。这样,进程对某一虚拟内存区域的任何操作需要用要的信息,都可以从vm_area_struct中获得。mmap函数就是要创建一个新的vm_area_struct结构,并将其与文件的物理磁盘地址相连。具体步骤请看下一节。

    3.2 mmap内存映射原理

    mmap内存映射的实现过程,总的来说可以分为三个阶段:

    (一)进程启动映射过程,并在虚拟地址空间中为映射创建虚拟映射区域

    1. 进程在用户空间调用库函数mmap,原型:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
    2. 在当前进程的虚拟地址空间中,寻找一段空闲的满足要求的连续的虚拟地址
    3. 为此虚拟区分配一个vm_area_struct结构,接着对这个结构的各个域进行了初始化
    4. 将新建的虚拟区结构(vm_area_struct)插入进程的虚拟地址区域链表或树中

    (二)调用内核空间的系统调用函数mmap(不同于用户空间函数),实现文件物理地址和进程虚拟地址的一一映射关系

    1. 为映射分配了新的虚拟地址区域后,通过待映射的文件指针,在文件描述符表中找到对应的文件描述符,通过文件描述符,链接到内核“已打开文件集”中该文件的文件结构体(struct file),每个文件结构体维护着和这个已打开文件相关各项信息。
    2. 通过该文件的文件结构体,链接到file_operations模块,调用内核函数mmap,其原型为:int mmap(struct file *filp, struct vm_area_struct *vma),不同于用户空间库函数。
    3. 内核mmap函数通过虚拟文件系统inode模块定位到文件磁盘物理地址。
    4. 通过remap_pfn_range函数建立页表,即实现了文件地址和虚拟地址区域的映射关系。此时,这片虚拟地址并没有任何数据关联到主存中。

    (三)进程发起对这片映射空间的访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝

    注:前两个阶段仅在于创建虚拟区间并完成地址映射,但是并没有将任何文件数据的拷贝至主存。真正的文件读取是当进程发起读或写操作时。

    1. 进程的读或写操作访问虚拟地址空间这一段映射地址,通过查询页表,发现这一段地址并不在物理页面上。因为目前只建立了地址映射,真正的硬盘数据还没有拷贝到内存中,因此引发缺页异常。
    2. 缺页异常进行一系列判断,确定无非法操作后,内核发起请求调页过程。
    3. 调页过程先在交换缓存空间(swap cache)中寻找需要访问的内存页,如果没有则调用nopage函数把所缺的页从磁盘装入到主存中。
    4. 之后进程即可对这片主存进行读或者写的操作,如果写操作改变了其内容,一定时间后系统会自动回写脏页面到对应磁盘地址,也即完成了写入到文件的过程。

    注:修改过的脏页面并不会立即更新回文件中,而是有一段时间的延迟,可以调用msync()来强制同步, 这样所写的内容就能立即保存到文件里了。

    3.3 mmap映射关系

    映射关系可以分为两种

    1. 文件映射:磁盘文件映射进程的虚拟地址空间,使用文件内容初始化物理内存。
    2. 匿名映射:初始化全为0的内存空间。

    而对于映射关系是否共享又分为

    1. 私有映射(MAP_PRIVATE):多进程间数据共享,修改不反应到磁盘实际文件,是一个copy-on-write(写时复制)的映射方式。
    2. 共享映射(MAP_SHARED):多进程间数据共享,修改反应到磁盘实际文件中。

    因此总结起来有4种组合

    1. 私有文件映射:多个进程使用同样的物理内存页进行初始化,但是各个进程对内存文件的修改不会共享,也不会反应到物理文件中
    2. 私有匿名映射:mmap会创建一个新的映射,各个进程不共享,这种使用主要用于分配内存(malloc分配大内存会调用mmap)。例如开辟新进程时,会为每个进程分配虚拟的地址空间,这些虚拟地址映射的物理内存空间各个进程间读的时候共享,写的时候会copy-on-write。
    3. 共享文件映射:多个进程通过虚拟内存技术共享同样的物理内存空间,对内存文件 的修改会反应到实际物理文件中,他也是进程间通信(IPC)的一种机制。
    4. 共享匿名映射:这种机制在进行fork的时候不会采用写时复制,父子进程完全共享同样的物理内存页,这也就实现了父子进程通信(IPC).

    这里值得注意的是,mmap只是在虚拟内存分配了地址空间,只有在第一次访问虚拟内存的时候才分配物理内存。

    在mmap之后,并没有在将文件内容加载到物理页上,只上在虚拟内存中分配了地址空间。当进程在访问这段地址时,通过查找页表,发现虚拟内存对应的页没有在物理内存中缓存,则产生"缺页",由内核的缺页异常处理程序处理,将文件对应内容,以页为单位(4096)加载到物理内存,注意是只加载缺页,但也会受操作系统一些调度策略影响,加载的比所需的多。

    3.4 mmap在write和read时会发生什么

    1.write

    • 1.进程(用户态)将需要写入的数据直接copy到对应的mmap地址(内存copy)
    • 2.若mmap地址未对应物理内存,则产生缺页异常,由内核处理
    • 3.若已对应,则直接copy到对应的物理内存
    • 4.由操作系统调用,将脏页回写到磁盘(通常是异步的)

    因为物理内存是有限的,mmap在写入数据超过物理内存时,操作系统会进行页置换,根据淘汰算法,将需要淘汰的页置换成所需的新页,所以mmap对应的内存是可以被淘汰的(若内存页是"脏"的,则操作系统会先将数据回写磁盘再淘汰)。这样,就算mmap的数据远大于物理内存,操作系统也能很好地处理,不会产生功能上的问题。

    2.read

     

    读的过程对比

    从图中可以看出,mmap要比普通的read系统调用少了一次copy的过程。因为read调用,进程是无法直接访问kernel space的,所以在read系统调用返回前,内核需要将数据从内核复制到进程指定的buffer。但mmap之后,进程可以直接访问mmap的数据(page cache)。

    3.5 性能优势

    为什么说内存映射效率比缓冲IO要高?

    我们回忆一下缓冲IO的工作流程:

    1. 用户调用read方法
    2. 调用系统调用,触发中断,进程从用户态进入内核态
    3. 从硬盘中读取数据并复制到kernel缓冲区
    4. 将数据从kernel缓存区复制到用户提供的byte数组中
    5. 进程从内核态返回到用户态

    从上面的流程中我们可以看到,调用一次read方法,最多可能会引起两次用户态与内核态之间的切换,以及两次数据复制

    而内存映射呢?

    1. 用户试图访问ptr指向的数据
    2. MMU解析失败,触发缺页中断,程序从用户态进入到内核态
    3. 从硬盘中读取数据并复制到进程空间中ptr指向的逻辑空间里
    4. 进程从内核态返回到用户态

    可以看出,试图访问内存映射文件,最多可能会引起两次用户态与内核态之间的切换,以及一次数据复制。也就是说,内存映射与缓冲IO相比,可以节省数据复制带来的开销,因此效率较高。

    优点如下:

    1. 对文件的读取操作跨过了页缓存,减少了数据的拷贝次数,用内存读写取代I/O读写,提高了文件读取效率。
    2. 实现了用户空间和内核空间的高效交互方式。两空间的各自修改操作可以直接反映在映射的区域内,从而被对方空间及时捕捉。
    3. 提供进程间共享内存及相互通信的方式。不管是父子进程还是无亲缘关系的进程,都可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。同时,如果进程A和进程B都映射了区域C,当A第一次读取C时通过缺页从磁盘复制文件页到内存中;但当B再读C的相同页面时,虽然也会产生缺页异常,但是不再需要从磁盘中复制文件过来,而可直接使用已经保存在内存中的文件数据。
    4. 可用于实现高效的大规模数据传输。内存空间不足,是制约大数据操作的一个方面,解决方案往往是借助硬盘空间协助操作,补充内存的不足。但是进一步会造成大量的文件I/O操作,极大影响效率。这个问题可以通过mmap映射很好的解决。换句话说,但凡是需要用磁盘空间代替内存的时候,mmap都可以发挥其功效。

    缺点如下:

    1. 文件如果很小,是小于4096字节的,比如10字节,由于内存的最小粒度是页,而进程虚拟地址空间和内存的映射也是以页为单位。虽然被映射的文件只有10字节,但是对应到进程虚拟地址区域的大小需要满足整页大小,因此mmap函数执行后,实际映射到虚拟内存区域的是4096个字节,11~4096的字节部分用零填充。因此如果连续mmap小文件,会浪费内存空间。
    2. 对变长文件不适合,文件无法完成拓展,因为mmap到内存的时候,你所能够操作的范围就确定了。
    3. 如果更新文件的操作很多,会触发大量的脏页回写及由此引发的随机IO上。所以在随机写很多的情况下,mmap方式在效率上不一定会比带缓冲区的一般写快。


     

    展开全文
  • 1. 内存映射  一直以为,映射设备的IO的资源到内存上,读写这段内存地址就是等于直接读写设备的IO资源了。  实际这是大错特错的,从CPU的引脚连线角度去看,设备IO根本就没直接连接到CPU上,试问这可能直接就读...

            1.   内存映射

            一直以为,映射设备的IO的资源到内存上,读写这段内存地址就是等于直接读写设备的IO资源了。

          实际这是大错特错的,从CPU的引脚连线角度去看,设备IO根本就没直接连接到CPU上,试问这可能直接就读写设备的IO呢?这显然是不可能的。

          内存映射实际上是操作系统提供的一种机制,这种机制的在于:将读写映射内存空间的操作转化对被映射的物理地址读写操作。由于物理条件所限制,这种 “转化” 肯定不是以硬件的方式转化,就像虚拟地址通过MMU转化为物理地址那样的“直接”。这转化实际是由内核将这片内存空间的数据搬移到设备的IO之上的,可见其并不是直接的,通常都内核的缓冲页作传送的。

           说到底,内存映射就是映射到内存,读写的始终是内存而不是设备IO,之所以会有作用,是因为内核帮我们操作转化了。

           内存映射的实现是在内核空间的,如ioremap将设备IO映射到某内核空间上,mmap通过建页表使设备的IO映射的用户空间上。

           在用ioremap之前,一般都要使用申请IO端口/内存子资源函数(request_region()和request_mem_region())。两个函数使用的都是物理地址,目的是为检测这段物理的在当前是否已经被使用。

           具体实现过程如下:若是申请IO端口,调用__reques_region(&ioport_resource, start,size,name),其中那ioport_resource是为根结点,内核把所有IO端口资源都挂载到其下,这颗树称为IO端口资源树,内核。在通过常规性的检错后,遍历资源树,看所申请的IO端口资源是否在树上,若在则返回NULL,反之则返回所申请的资源结构体指针。

           而IO内存的申请也是类似的,只不过遍历的不是IO端口资源树,而是IO内存树。

           在通过申请后,ioremap便可以通过更改内核页表的形式,把这个地址段的映射的内核地址空间之上,以便于访问。然而对于IO端口和IO内存这两种不同类型的资源而言,访问方式是不一样的。出于边际效应和对常规内存操作的优化,若以常规内存形式去操作IO端口可能会发生一些难以预计的错误,故不能这样去做,应用writel/roadl等函数,其实现:

    writel(val,addr)   --->  outl((val),(unsigned long)(addr)) --> __raw_writel  

    最终宏展开后:__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v)

          而IO内存操作与常规内存无异。


             2. 直接IO

            直接IO,简而言之就是将用户空间上用于缓存设备数据的缓冲区映射到内核之上,即不通过内核缓冲区,而"直接"用自己的缓冲区将数据传送到设备IO上。

            理解不深,待续再补上吧。。。

            3.DMA

            话说起来,DMA跟上面两种完全是不相关的。怎么拉到这里来说明了,原因就在于前几天没理解好内存映射的概念。毕竟按我的误解来理解的话,我们就根不需要DMA这种玩意了。

            无论是内存映射和直接IO,都是通过内核复制映射区的内存到设备上,若这种复制的实现若是硬件的方式去的实现的话,那就是DMA了。

            DMA,Direct memory access,直接内存访问,是外设与内存的一种交互模式,指外设与内存之间数据传输不需要经过CPU,直接通过DMA控制器完成IO数据传输,CPU将有更多的时间用于计算操作,以此提高CPU效率。

           


          我的理解大概就是这样子吧,有错的话,希望大家能指出来,让我纠正吧。

           

    展开全文
  • 但是到这里这些技术同样有不足的地方:不论是读或者写文件,都需要将内容拷贝到IO缓冲区以及页高速缓冲区,这就增加了数据拷贝的次数,无形之中增加了CPU和内存的开销。 有没有一种办法既可以减少系统调用的次数同时...
  • 在引入NIO和内存映射文件后,Java中拥有了非常快的IO操作能力,这也是为什么高性能Java应用程序使用内存映射文件来持久化数据的主要原因。它已经在高频交易系统中非常流行了,其中电子交易系统需要超快速,并且单向...
  • 内存映射图( 网络IO和磁盘IO详解)

    千次阅读 2020-04-14 10:56:30
    网络IO和磁盘IO详解 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间。 ...
  • 在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。物理地址空间,一部分给物理RAM(内存)用,一部分给总线用,这是由硬件设计来决定的,因此在32 bits地址...
  • 详细解释https://www.cnblogs.com/huanxiyun/articles/5443754.html
  • 一、用户空间与内核空间 二、标准IO/缓存IO 缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。标准IO中,用户进程中的一个完整IO分为两个阶段: ...三、直接IO ...
  • Linux IO模型Linux系统中的磁盘文件访问方式包括:缓存IO(Buffer IO)...直接IO(Direct IO),此模式下,应用程序读写文件时直接访问磁盘数据,不经过内核缓冲区,适用于数据库等程序自己管理缓冲的场景。内存映射(Mem...
  • 一 页高速缓存(页缓存)? 1.1 什么是页高速缓存(page cache)? 为什么需要页高速缓存?...1.1.2.1 内存和磁盘的速度差异 因为读取内存的速度远快于读取磁盘的速度,所以从内存访问数据比从磁盘读数据快
  • 下面是今天看到两篇关于linux中的 IO端口映射和IO内存映射的文章,时间关系,没来得及深入理解,有空好好看看CPU地址空间CPU地址空间(一)地址的概念1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。...
  • 内存分配的原理malloc(brk,sbrk)mmap分配内存方式的比较Java 中的直接内存三个场景场景一:将一个文件通过网络发送出去传统方式java mmapjava的sendfile场景二:将应用程序中的内存中的数据通过网络发送出去(非...
  • 为什么内存映射要比IO读写更加快速

    千次阅读 2017-10-31 23:54:19
    而使用mmap操作文件中,创建新的虚拟内存区域建立文件磁盘地址虚拟内存区域映射这两步,没有任何文件拷贝操作。而之后访问数据时发现内存中并无数据而发起的缺页异常过程,可以通过已经建立好的映射关系,只使用...
  • 上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现。...JAVA虚拟机内部便会调用OS底层的 read()系统调用完成操作,在调用 in.read()的时候就是从内核缓冲区直接返回数据了。...
  • 1:静态映射方法的特点:  内核移植时以代码的形式硬编码,如果要更改必须改源代码后重新编译内核在内核启动时建立静态映射表,到内核关机时销毁,中间一直有效对于移植好的内核,你用不用他都在那里   2:动态...
  • ap技术,也就是内存映射直接将磁盘文件数据映射到内核缓冲区,这个映射的过程是基于DMA引擎拷贝的,同时用户缓冲区是跟内核缓冲区共享一块映射数据的,建立共享映射之后,就不需要从内核缓冲区拷贝到用户缓冲区了...
  • 下面是今天看到两篇关于linux中的 IO端口映射和IO内存映射的文章,时间关系,没来得及深入理解,有空好好看看CPU地址空间 CPU地址空间 (一)地址的概念1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体...
  • IO空间映射

    2021-05-20 11:44:56
    I/O空间-----I/O端口I/O内存  首先上图,如下:外设中的寄存器被称为I/O端口,外设中的内存被称为I/O内存。二者合起来统称为I/O空间。 设备驱动程序要直接访问外设或其接口卡上的物理电路,这部分通常都是以...
  • NIO效率高的原理之零拷贝与直接内存映射

    万次阅读 多人点赞 2019-07-31 08:00:00
    首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并且这两个技术并不是等价的。 零拷贝 零拷贝是指避免在用户态(User-space) 与内核态(Kernel-space) 之间来回拷贝数据的技术。 传统IO 传统IO读取数据并...
  • IO端口和IO内存区别及分别使用的函数接口   每个外设都是通过读写其寄存器来控制的。外设寄存器也称为I/O端口,通常包括:控制寄存器、状态寄存器数据寄存器三大类。根据访问外设寄存器的不同方式,可以把...
  • 缓冲IO在介绍缓冲IO之前需要先了解一下常用的机械硬盘的原理与特点一个机械硬盘中装有多个盘片每个盘片上有多个同心圆(磁道)每个同心圆又由多个弧(扇区)组成,每个弧上都记录了等量的数据(比方说512byte)如果发起一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,304
精华内容 51,721
关键字:

内存映射和直接io区别