
I/O
文章平均质量分 94
JAVA探索
对知识的贪婪是我前进的动力
展开
-
IO那些事儿(1)基础概念
操作系统冯诺依曼体系结构一个计算机是由计算器,控制器,主存储器,输入设备,输出设备五个模块组成的。linuxLinux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。在linux操作系统中,一切皆文件。kernel操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和原创 2021-07-09 19:58:57 · 216 阅读 · 0 评论 -
网络io测试用到的工具
查看进程fdlsof -p <pid>抓包tcpdump tcp -i 网卡 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型(2)-i eth1 : 只抓经过接口eth1的包(3)-t : 不显示时间戳(4)-s 0 : 抓取数据包时默认抓原创 2020-11-13 14:01:25 · 382 阅读 · 0 评论 -
NIO多路复用器基本原理
看大图:https://www.processon.com/view/link/5f26da28f346fb5cdcb377a3原创 2020-08-03 00:20:08 · 874 阅读 · 0 评论 -
HeapByteBuffer DirectByteBuffer
上图描述的是数据从网络获取,然后写入本地磁盘的过程。当服务器与端口建立链接后,内核将网卡接收到的数据写入buffer cache,然后JVM通过FD将这部分数据从内核态转入用户态JVM虚拟机中,最后写入java程序的堆内存中,这时我们的应用程序就读到了端口传来的数据。然后为了将数据写入磁盘,我们需要将数据拷入JVM虚拟机,然后再通过80中断将数据传给内核,内核写入page cache中,最后通过pc机制将数据刷入磁盘。至此一个完整的网络数据存入本地磁盘的流程就算完成了。堆内内存堆内内存是...原创 2020-08-02 17:10:05 · 198 阅读 · 0 评论 -
网络BIO NIO 多路复用
同步阻塞IO模型下,网络IO的交互流程。客户端向服务器端申请建立连接 服务端同意建立连接 服务端调用accept,接受客户端连接,生成文件描述符fd 客户端发送消息给服务器 网卡接收到消息,写入连接的buffer中 然后调用IO中断,将消息通过IO中断写入内核中对应的fd的buffer中,完成内核态的交互 服务器端效用read函数,通过软中断(80中断)调用内核函数,读取fd buffer中的数据。如果fd的buffer中没有数据,将会阻塞read直到有数据进来。同步非阻塞IO模型下,网络原创 2020-08-02 00:34:27 · 271 阅读 · 0 评论 -
linux系统中一次网络连接的建立过程中的连接状态 文件描述符 以及抓包详解
使用到的命令lsof -p <pid> 查看一个进程中的文件描述符分配情况netstat -antp |grep <pid>/<port>查看一个进程的网络连接情况tcpdump -nn -i eth0 port <port> 监听一个端口的包首先用socket启动一个服务端端口,不接受客户端tcp抓包开始,此时没有连接请求:[root@node01 ~]# tcpdump -nn -i eth0 port 9090tcpdump.原创 2020-08-01 16:52:33 · 848 阅读 · 0 评论 -
BufferedOutputStream 原理及追踪内核调用
BufferedOutputStream是采用装饰器模式对FileOutputStream进行一些功能的添加。UML类图FileOutputStreamwrite方法源码: /** * Writes <code>b.length</code> bytes from the specified byte array * to this file output stream. * * @param b .原创 2020-08-01 14:40:05 · 429 阅读 · 0 评论 -
page cache 回写机制
JAVA写文件的基本流程在不使用堆外内存的情况下,java在写文件时,先将字节写入应用程序的堆中;然后调用jvm的写文件函数,将字节写入jvm的heap中,jvm再调用系统内核的写文件函数,将字节写入内核的heap中;然后内核将字节写入page cache中,将page cache状态改为dirty,根据page cache的回写机制在合适的时机将字节写入磁盘。page cache 自动回写机制page cache的回写时机由系统配置/etc/sysctl.conf中的几个参数决定,分别是.原创 2020-08-01 13:06:42 · 1485 阅读 · 0 评论 -
IO学习笔记
1.kernel ,vfs, inode id,pagecache 4k,dirty,flush2./proc内核映射目录 3./proc/pid/fd/ 文件描述符 可用命令: lsof -op pid4.任何一个进程都有0u 1u 2u这三个文件描述符,分别代表标准输入,标准输出,错误输出5.关于重定向输入输出< 和>,由上个知识点可知任何一个命令都有三个文件描述符,那么如何去重定向这三个文件描述符?联想一个问题:如何把项目输出日志扔进黑洞?首先标准输出指向黑...原创 2020-06-20 00:46:20 · 299 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java 之 RandomAccessFile
RandomAccessFile是脱离InputStream和OutputStream单独存在的类。他实现了DataOutput, DataInput, Closeable三个类,封装了类似装饰器DataInputStream和DataOutputStream的数据类型转换功能,以及独有的在文件中寻找切入点的功能。它可以在一个文件中向前或向后移动,获取当前所处的文件位置,移动到某个位置,判断文件的...原创 2019-12-23 18:11:22 · 178 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java 之 Reader和Writer
Reader和Writer是java1.1为了支持面向国际化的字符操作而出现的。老的I/O流继承层次结构仅支持8位字节流,不能很好的处理16位的Unicode字符,而Unicode用于字符国际化(java本身的char也是16位的Unicode),所以添加了Reader和Writer来支持。因此Reader/Writer和InputSream/OutputStream之间最大的区别在于前者适用于字...原创 2019-12-23 13:51:35 · 188 阅读 · 0 评论 -
JAVA I/O 回退装饰器 PushbackInputStream
回退装饰器 PushbackInputStream,这个装饰器是可以将读取到的无用字节回退到缓冲区中。PushbackInputStreamAPI:方法 注释 public PushbackInputStream(InputStream in, int size) 创建一个PushbackInputStream,缓冲区大小为size。 public Pushbac...原创 2019-12-20 20:07:46 · 269 阅读 · 0 评论 -
JAVA I/O 缓冲装饰器 BufferedInputStream和BufferedOutputStream
BufferedInputStream和BufferedOutputStream是一种缓冲装饰器,它能让我们将输入流中的数据暂时写入缓存中,再将缓存中的数据再写入输出流中。从而避免了多次真实的I/O操作,节省CPU,网络开销。1.BufferedInputStreamAPI:方法名 注释 public BufferedInputStream(InputStream in) ...原创 2019-12-18 19:39:14 · 340 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java 之 装饰器FilterInputStream/FilterOutputStream
Java I/O系统中有个装饰器模式设计,对装饰器模式不太了解的同学,戳这里。FilterInputStream和FilterOutputStream是装饰器的两个父类,这两个父类继承了InputStream和OutputStream的所有方法。这两个父类下面提供了不同的子装饰类,这些子装饰类是我们真正需要用到的。我们这里来介绍几个经常用到的。1.数据类型装饰器DataInputStrea...原创 2019-12-17 21:11:22 · 189 阅读 · 0 评论 -
JAVA I/O 数据类型装饰器 DataInputStream和DataOutputStream
DataInputStream和DataOutputStream是两个比较常用的装饰器,主要功能是将输入流中的字节读取为基本数据类型和将基本数据类型写入输出流。1.DataInputStream:方法名 注释 int read(byte b[]) 将输入流的所有字节存入到缓冲字节数组b[]中,返回读取的字节总数,如果输入流中没有字节,则返回0;如果输入流处于文件末尾,则返回...原创 2019-12-17 20:59:14 · 223 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java 之 输入/输出
“流”代表了任何可以产出数据的数据源对象(输入流)和可以接收数据的接收端对象(输出流),这一点当你从程序的角度来说就不难理解了,当你想要读取数据的时候,需要从一个数据源那里读取数据输入到程序内存中,当你想要写数据的时候,需要将程序内存中的数据输出到一个接收端中。“流”屏蔽了实际的I/O设备中处理数据的细节,让java开发者不用关注具体的数据处理,只需要使用jdk提供的类来进行数据操作。java...原创 2019-12-12 12:29:04 · 195 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java 之 File类
File类的文件具有一定的误导性,我们可能会认为它指代的是文件,实际上并非如此。它技能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。如果它指的是一个文件集,我们就可以对此集合调用list()方法,从而获取一个目录下的所有文件名称。实际上,FilePath是一个更好的名字。1.目录列表器这里尝试获取一个目录下的全部文件和部分文件,首先获取目录下所有的文件名称。 publ...原创 2019-12-10 21:10:19 · 229 阅读 · 0 评论 -
JAVA I/O系统 Thinking in Java
对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务 。 --《Thinking in Java》JAVA I/O对java开发者来说一直是一个重点中的重点,复杂的JAVA I/O系统常常让初学者望而却步。在充分理解并运用JAVA I/O之前,我们需要学习大量的类。本文是根据Thinking in Java的章节来学习的,有条件的同学可以看一看原著,会对本文有更详细的理...原创 2019-12-10 21:10:39 · 192 阅读 · 0 评论