皮皮网

【支持文档预览的网盘源码】【nodejs实战 源码】【maven 源码下载】shm open 源码

2024-12-29 00:48:05 来源:惠云油源码

1.java mmap
2.System v 和Posix

shm open 源码

java mmap

       java mmap是什么,让我们一起了解一下?

        mmap是将一个文件或者其它对象映射进内存,文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。

        目前Java提供的mmap只有内存文件映射,其他IO操作还没有内存映射功能。

        Java内存映射文件(Memory Mapped Files)就已经在java.nio包中,但它对很多程序开发者来说仍然是一个相当新的概念。引入NIO后,Java IO已经相当快,而且内存映射文件提供了Java有可能达到的最快IO操作,这也是为什么那些高性能Java应用应该使用内存映射文件来持久化数据。

       mmap在Java中的用途是什么?

        1、对普通文件使用mmap提供内存映射I/O,以避免系统调用(read、write、lseek)带来的性能开销。同时减少了数据在内核缓冲区和进程地址空间的拷贝次数。

       2、使用特殊文件提供匿名内存映射。

        3、使用shm_open以提供无亲缘关系进程间的Posix共享内存区。

        mmap在Java中是如何使用的?(具体参考kafka源码中的OffsetIndex这个类)

       æ“ä½œæ–‡ä»¶ï¼Œå°±ç›¸å½“于操作一个ByteBuffer一样。 public class TestMmap { undefined public static String path = "C:\\Users\\\\Desktop\\mmap"; public static void main(String[] args) throws IOException { undefined File file1 = new File(path, "1"); RandomAccessFile randomAccessFile = new RandomAccessFile(file1, "rw"); int len = ; // æ˜ å°„为2kb,那么生成的文件也是2kb MappedByteBuffer mmap = randomAccessFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, len); System.out.println(mmap.isReadOnly()); System.out.println(mmap.position()); System.out.println(mmap.limit()); // å†™æ•°æ®ä¹‹åŽï¼ŒJVM é€€å‡ºä¹‹åŽä¼šå¼ºåˆ¶åˆ·æ–°çš„ mmap.put("a".getBytes()); mmap.put("b".getBytes()); mmap.put("c".getBytes()); mmap.put("d".getBytes()); // System.out.println(mmap.position()); // System.out.println(mmap.limit()); // // mmap.force(); // å‚考OffsetIndex强制回收已经分配的mmap,不必等到下次GC, unmap(mmap); // åœ¨Windows上需要执行unmap(mmap); å¦åˆ™æŠ¥é”™ // Windows won't let us modify the file length while the file is mmapped // java.io.IOException: è¯·æ±‚的操作无法在使用用户映射区域打开的文件上执行 randomAccessFile.setLength(len/2); mmap = randomAccessFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, len/2); // A mapping, once established, is not dependent upon the file channel // that was used to create it. Closing the channel, in particular, has no // effect upon the validity of the mapping. randomAccessFile.close(); mmap.put(, "z".getBytes()[0]); } // copy from FileChannelImpl#unmap(私有方法) private static void unmap(MappedByteBuffer bb) { undefined Cleaner cl = ((DirectBuffer)bb).cleaner(); if (cl != null) cl.clean(); } }

System v 和Posix

       在Linux系统中进行进程间通信时,我们常常会遇到System v和POSIX两种类型的接口。POSIX,全称Portable Operating System Interface for Computing Systems,支持文档预览的网盘源码是由IEEE和ISO/IEC合作制定的一套标准,旨在确保应用程序在不同操作系统上源代码级别的移植性。它源于年代早期的UNIX用户组工作,旨在统一System V(由AT&T开发)和Berkeley BSD系统之间的调用接口,最终在年发布了POSIX.1标准(IEEE .1-)。

       System V,最初称为AT&T System V,nodejs实战 源码是Unix众多版本中的一员,由AT&T开发于年,历经多个版本,其中SVR4(System V Release 4)最为成功,影响了诸如初始化脚本(/etc/init.d)等UNIX共同特性。maven 源码下载System V不仅仅局限于AT&T的硬件,许多转售版本如Dell SVR4和Bull SVR4也基于其。如今,SCO OpenServer基于System V Release 3,而SUN Solaris和SCO UnixWare则基于SVR4。tvb gotv源码System V被视为UNIX两种主要风格(另一是BSD)之一,但随着Linux和QNX等非传统实现的出现,这一分类不再准确。标准化努力如POSIX致力于减少不同实现之间的差异。

       System V和POSIX在Linux/unix系统编程中扮演着接口协议的qt 布局源码角色,POSIX相对System V更新,语法简洁。进程间通信(IPC)是两者共同关注的领域,POSIX IPC中对象有名称,如mq_open、sem_open、shm_open中的名称并不一定对应文件系统。创建或打开IPC对象时,需要指定操作模式,如读写权限。而System V IPC中,key_t类型在msget、semget、shmget等函数中扮演关键角色。