IO模型

作者: 秋元_92a3 | 来源:发表于2021-11-18 09:50 被阅读0次
// 查看文件的缓存状态
~ pcstat out.txt
//查看文件张多大了
~ ll -h
//查看文件长多大了同时查看文件的缓存状态
~ ll -h & pcstat out.txt

pcstat 结果说明,size 文件大小,pages总页数,cached已缓存的页数


image.png

程序访问内存的时候,只要内存空间足够,cache会一直不断的缓存

page cache优化IO性能,但是会导致数据丢失

//最基本的file写,直接进行系统调用,进行写操作
@Test
public static void testBasicFileIo() throws Exception{
  File file = new File(path);
  FileOutputStream out = new FileOutPutStream(file);
  while(true){
    out.write(data);
  }
}
/**buffer文件IO,jvm会自己留出8k的缓存,buffer write的时候,会先往缓存中写,8kb满了之后,
  再进行系统调用写操作,把jvm缓存区的内容写入到系统中
jvm 8kb syscall write(8KBbyte[])
*/
@Test
public static void testBufferedFileIO() throws Exception{
  File file = new File(path);
  BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
  while(true){
    out.write(data);
  }
}
FileChannel rafChannel = raf.getChannel();
// mmap 堆外和文件映射的
MappedByteBuffer map = rafChannel.map(FileChannel.MapMode.READ_WRITE,0,4096);
map.put("@@@".getBytes()); // 不是系统调用 但是数据会到达内核的pagecache
// 曾经我们是需要out.write() 这样的系统调用,才能让程序的data进入内核的pagecache
// 曾经必须有用户态内核太切换
// 虽然此处不在需要用户态与内核太进行切换,通过这种mmap的内存映射,依然是受内核的pagecache体系所约束的!!!换言之,这种方式也会出现断电丢数据的情况
@Test
public void whatByteBuffer(){
// 还有一个要注意的地方,ByteBuffer是jdk中提供的,ByteBuf是Netty中提供的,ByteBuf是对ByteBuffer的封装
  //  ByteBuffer buffer = ByteBuffer.allocate(1024);
  ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
  System.out.println("position:" + buffer.position());
  System.out.println("limit:" + buffer.limit());
  System.out.println("capacity:" + buffer.capacity());
  buffer.put("123".getBytes());
  System.out.println("------------------------put:123-----");
  System.out.println("mark:" + buffer);
  buffer.filp();
  System.out.println("mark:" + buffer);
  buffer.get();
  System.out.println("mark:" + buffer);
  buffer.compact();
  System.out.println("mark:" + buffer);
  buffer.clear();
  System.out.println("mark:" + buffer);

  

}

jvm文件处理在linux中的内存模型


IO模型2.png

模型图片的脚上的内容是磁盘,内部包含一个文件
模型图片的头上是个Object对象,一个圆圈

io模型.jpeg

相关文章

  • 1.Nette入门第一章——IO演进

    1. IO 基础 1.1. linux网络IO模型 阻塞IO模型 非阻塞IO模型 IO多路复用模型(NIO) 信...

  • 细谈Select,Poll,Epoll

    阻塞 io 模型 blocking IO非阻塞 io 模型 nonblocking IOio多路复用模型 IO m...

  • 2.五种IO模型

    0.IO介绍1.阻塞IO模型2.非阻塞IO模型3.IO多路复用模型4.信号驱动IO模型5.异步IO模型6.五种IO...

  • 网络IO模型

    网络IO的模型大致包括下面几种 同步模型(synchronous IO)阻塞IO(bloking IO)非阻塞IO...

  • 「基础知识总结」 IO模型

    IO模型 五种IO模型包括:阻塞IO、非阻塞IO、信号驱动IO、IO多路转接、异步IO。其中,前四个被称为同步IO...

  • 五种 IO 模型

    五种 IO 模型 参考链接 一共有五种 IO 模型 阻塞 IO 非阻塞 IO 多路复用 IO 信号驱动 IO 异步...

  • Java中的IO模型

    Java中的IO模型 Java中的IO模型有四种: 同步阻塞IO 同步非阻塞IO IO多路复用 异步IO 其中IO...

  • 23、pythonIO模型

    python之路——IO模型 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步、异步、阻塞、非阻塞 ...

  • IO模型

    IO模型 五种模型

  • 2018-07-03

    Netty实践与NIO原理 一、阻塞IO与非阻塞IO Linux网络IO模型(5种) (1)阻塞IO模型 所有文件...

网友评论

      本文标题:IO模型

      本文链接:https://www.haomeiwen.com/subject/bncrtrtx.html