章节一:文件IO
2021-09-14 10:17:24 0 举报
造成系统层面文件io
作者其他创作
大纲/内容
call read(fd8)
app2
postion
字节数组对象off heap
每次切换均存在寄存器保护该应用程序现场
[root@huang /]# read a 0< huang.txt与read a <& 8的区别原先read a这个命令 需要等待键盘输入 键盘输入也是输入到0<中 也就是通过bash这个程序自有的文件描述符接受键盘数据 现在使用huang.txt用作数据源[root@huang /]# ls ./ /huanbgls: cannot access /huanbg: No such file or directory./:$ boot etc huang.txt lib64 ls01.out media niu.out proc run src sys tmp var zhao.outbin dev home lib liu.txt ls02.out mnt opt root sbin srv testIO.txt usr www zhao.txt此时输出分别使用了1u 2u 输出[root@huang /]# ls ./ /huanbg 1>test.txt 2>error.txt
疑问:通过app程序创建的FD 如何与pagecache勾搭上的 File file = new File(\"xxoo.txt\")out=new OutPutStream(file);//out 在操作系统层面为文件描述符FD
DMA协处理器
3
挂载:访问目录的时候相当于访问这块物理硬盘
父子进程
⑤:app挂起状态到可运行转态
一个线程的成本:①:基于jvm的一个线程对应一个栈 如果一个栈大小为1M 当1000个线程出现的时候占用内存1G②:关于栈 在运行时常量池 当有线程开启的时候会创建一个栈 栈只有等方法执行结束之后才会失效 所以开启的线程会一直挂起,线程的执行是通过时间分片执行 线程的切换也是需要时间 线程高度会导致cpu频繁调度③:几核cpu 几个线程 4核cpu 意思为:4核cpu表示可以同时并行处理4个线程所以应该控制线程数量
①:system call读取磁盘数据
code
flip的时候
程序角度
running状态
栈
内核空间
int ox80为中断 表示int为cpu指令0x80为128对应二进制 1000 0000该二进制存放寄存器
MappedByteBuffer
蓝线为请求获取数据的流程
分配的时候
flush写回脏页
性能:onheap < offHeap < mappedByteBuffer(这里仅在文件中使用)
综合:多机 多副本 性能差不多即可
物理内存:真实内存条中存储的数据
0
一台机器上安装一个Redis实例 分配10G内存 和安装10个实例 每个实例1G内存的区别:AKF集群拆分原则 Y轴的拆分(微服务涉及)
操作系统进程分配
PageCache主要目的也是充当缓存
协处理器在数据读取完毕之后发送的中断
app1
[root@huang demo]# pstree //执行pstree这个程序├─sshd─┬─sshd───bash───pstree上述bash为父进程 (pstree为在父进程的创建子进程)父进程为/bin/bash可执行文件 [root@huang fd]# pcstat -pid $$ [root@huang fd]# pcstat -pid $$ +--------------------------------------+----------------+------------+-----------+---------+| Name | Size (bytes) | Pages | Cached | Percent ||--------------------------------------+----------------+------------+-----------+---------|| /usr/bin/bash | 960377 | 235 | 235 | 100.000 || /usr/lib/locale/locale-archive | 106176928 | 25923 | 512 | 001.975 || /usr/lib64/libnss_files-2.17.so | 61560 | 16 | 16 | 100.000 || /usr/lib64/libc-2.17.so | 2156240 | 527 | 527 | 100.000 || /usr/lib64/libdl-2.17.so | 19248 | 5 | 5 | 100.000 || /usr/lib64/libtinfo.so.5.9 | 174520 | 43 | 43 | 100.000 || /usr/lib64/ld-2.17.so | 163312 | 40 | 40 | 100.000 || /usr/lib64/gconv/gconv-modules.cache | 26970 | 7 | 7 | 100.000 |+--------------------------------------+----------------+------------+-----------+---------+ [root@huang fd]# pcstat /bin/bash+-----------+----------------+------------+-----------+---------+| Name | Size (bytes) | Pages | Cached | Percent ||-----------+----------------+------------+-----------+---------|| /bin/bash | 960377 | 235 | 235 | 100.000 |+-----------+----------------+------------+-----------+---------+
磁盘io/网络io第二节
capacity
pipeline管道
在{}中存放许多指令使用;隔离 可以一次性执行
NIO与之前的缓冲和基本区别
关于D:\\huangproject\\bjmashbing-sysio-master\\bjmashbing-sysio-master\\src\\main\\java\\com\\bjmashibing\\system\\io\\OSFileIO.java①:普通字节流 当前后台dirty_background_radio和dirty_radio阈值较高的时候 发生宕机情况 此时来不及flush书写会磁盘 容易丢失较多数据 //执行pcstat 后面的precent均是100% ②:buffer字节流 与上面的基本字节流相比 (stream均是字节流)buffer要快 的原因:用户态和内核态切换频率不一样,buffer在jvm中的APP缓冲区开辟一个8k的空间用于缓存发送的数据 虽然存在write(data)但是并没有直接交给内核 而是交给了一个容量为8k的缓存(该容器为数组),在8k满了之后执行一次系统调用 而对于基本字节流 每次write(data)的时候会执行一次系统调用 // 此时执行pcstat 后面的+---------+----------------+------------+-----------+---------+ pcstat out.txt| Name | Size (bytes) | Pages | Cached | Percent ||---------+----------------+------------+-----------+---------|| out.txt | 540540 | 132 | 132 | 100.000 |+---------+---------------- +------------+-----------+---------+
当读取的时候 将postion回到0 limit等于之前的postion
对于kenel:存在一个vfs(虚拟文件系统) 结构为树 树上的不同节点映射到不同的物理位置,每个物理位置可以是不同的具体文件系统eg:挂载磁盘的时候 需要更新vfsvfs结构:(inode pagecache dirty)存在一个inode(eg:打开磁盘的时候每个文件对应一个inode(看成id))来代表这个在磁盘上的文件,此时app程序想读取硬盘数据的时候 先有kenal去读取到内存(内存存储临时数据通过pagecache来保存默认4k) 该pagecache在内存中可以给多个用户app共享dirty:如果程序将磁盘中的文件读取到内存中且用pagechache缓存了,此时用户app更改了某个pagecache中的数据,那么将该pagecache标记为dirtyflush:当内存中的pagechache被标记为dirty之后,可以通过flush将已修改的pagechache回写保存到磁盘中
此时想读取fd8这个文件描述符
保护现场:在用户态转为内核态的时候发送
[root@huang temp]# a=1[root@huang temp]# { a=9 ; echo \"aaaaa\"; } | cat//此时这里echo具有输出能力 通过管道将其输出结果作为管道的cat输入aaaaa[root@huang temp]# { echo $a ; echo \"aaaaa\"; } | cat1aaaaa [root@huang temp]# { a=9 ; echo \"aaaaa\"; } | cataaaaa[root@huang temp]# echo $a//这里为什么是1? 原因bash解释执行 分词分析看到 | 管道此时在左侧和右侧分别启动一个子进程1 此时a=9为子进程赋值 父进程打印a还是等于1[root@huang temp]# echo $BASHPID | cat //在管道中获取进程id号需$BASHPID25797 [root@huang temp]# { echo $BASHPID ; read a; } | { cat ; echo $BASHPID ; }26643111 //read在么有换行符的时候会阻塞等待26644 执行流程为 解释执行想看到 管道| 左侧创建一个子进程 打印26643 之后等待输入111 左侧二个指令均存在输入和输出所以通过管道将左侧的输出 作为右侧进程的输入cat 打印出26643和111 之后执行
kernel进程
JVM为代码 运行的时候会分配出堆
free的使用
nio新的io体系存在二个概念①:channel和bytebuffer在没有抽象出channel之前存在输入和输出(outputstream和inputstream):抽象出channel之后 只需要一个channel完成输入和输出(基于buffer 在buffer基础上扩展出 MappedByteBuffer和directbuffer )bytebuffer看成字节数组: ByteBuffer buffer = ByteBuffer.allocate(1024);//分配方式一 分配到堆上 ByteBuffer buffer = ByteBuffer.allocateDirect(1024);//分配方式二 分配到堆外 存在 属性 postion limit capacity buffer.put(\"123\".getBytes()); buffer.flip(); //读写交替 buffer.get(); buffer.compact(); buffer.clear();
这里的bytebuffer充当的依然是缓冲区;需要创建FD 建立channel完成读写
https://blog.csdn.net/wangfeng2500/article/details/42821297
磁盘
验证
存放code
需要channel.readchannel.write必然存在系统调用
ps -ef的使用 ps-ef |grep 554433 查看进程
pos
指令块
centos中的sysctl -a的使用[root@huang fd]# sysctl -a | grep vm.dirtyvm.dirty_background_bytes = 0//background_radio和dirty_ratio 这里设置是保证内存的利用率 不会将所有的内存用于存储pagecache vm.dirty_background_ratio = 10 //假设kernel中假设可用还有10G内存 在从磁盘读取数据到内核 达到1G的时候 此时程序不会阻塞 而是使用剩下的9G 继续从磁盘读取写到内存 且还会分配一个线程回写脏页到磁盘 比率越高断电宕机的时候丢失的越多vm.dirty_bytes = 0vm.dirty_expire_centisecs = 3000//均是除以100 过期时间 该pagecache 30秒不用就回写vm.dirty_ratio = 30 //这个为前台 还是程序在往内核书写 到3G的时候 阻塞程序 此时会将脏页的数据写回到磁盘上 减少pagecache占用的空间 (这个在)vm.dirty_writeback_centisecs = 500 //管道:原先sysctl存在输入输出 -a为输入 输出全部的centos参数 流向管道经过过滤出包含vm.dirty 输出 管道在词法解析 解释执行 看到 | 则通过父进程bash创建左右二个子进程
堆
kernel内核
③
概念
内核中的中断向量表(0--255)为表结构 存在key ---valuekey为1000 0000 value为call back(该地址为一个在内核中的函数)比如正常关机的时候 产生中段 调用内核关机(会存在dirty pagecahe回写的过程)直接关机 dirty会丢失
下面的所有pageCache是内核维护的
①:allocate Direct 如果存在一个object对象 该对象是我自己写的 可以使用堆外的 也就是该对象本人可以控制 ;也就是(在方法中传入一个object 做序列化转成字节数组)②:allocate 如果该object
磁盘硬件
dd命令的使用dd if=/dev/sda3 of=./sda3.bak.img 相当于将sda3这个源 做了一个压缩文件的一个备份dd if=/dev/zero of=./sda3.bak.img //将.img用0填充 创建空的磁盘对象源 目标硬盘 硬盘 拷贝文件 硬盘 恢复(将文件中的数据拷贝到硬盘)硬盘 文件 备份
system call系统调用
D:\\huangproject\\io
put的时候
这里缓存了100% 已将bash这个程序从磁盘完全读取到程序内存中的文本中 并且缓存
pipeline应用及重定向机制
//原因$$的优先级高于管道 此时先执行$$ 然后将pid替换$$ 在执行管道左右各创建一个进程 将具体的pid指向cat对于$BASHPID而言 优先级低于 | 先创建子进程 将子进程pid替换$BASHPID 在创建右侧的子进程 将具体的pid流向cat
启动java代码 java xxxx -Xmx 1G此时启动java 创建进程 分配内存 (该空间内核态和用户态均可以访问)此时xxxx -Xmx 1G为在jvm中分配的堆内存 仅仅可以用户态访问 所以通过allocate分配的数组对象需要用户态到内核态的切换而在off heap上的通过allocateDirect分配的不需要经过内核态和用户态的切换(原因:对于c程序来说访问off heap中的数据是直接访问 原因该off heap所在的地址就是进程的线性地址空间)=====》从off heap到kernelpagecache依然存在系统调用但是onheap的地址不在进程的线性地址空间中(存在于jvm线性地址空间) 所以对于c程序而言 访问该字节数组 需要先拷贝到进程分配的堆内存 才可以使用-----》以后的零拷贝====》从on heap到kernelpagecache依然存在系统调用 且还需要将jvm堆中的拷贝到off heap对于MappedByteBuffer 该区域的逻辑地址直接映射到内核的逻辑地址 此时无需系统调用
为strace追踪的应用程序对内核的系统调用 每一行均是一次系统调用
此时app程序读取数据从内存中的pagechache中读取,当再次读取的时候效率很高,在修改某一个pagecache之后,该pg标记为dirty
app1该程序也是碎片化存在于物理内存 通过mmu将其映射为逻辑内存(此时由原先存在于物理内存中碎片变为线性的地址,也就是该程序在逻辑地址中占用的空间时连续的 每个内存地址均是4K)注意这里不是全量加载 当缺页的时候依然需要中断 去磁盘加载放到pagecache中;这里的程序也是用户态的,在需要执行的时候该app的时候 先从磁盘加载程序代码(也是基于pagecache的)此时并不是全量加载,懒加载:当执行代码片段缺页的时候 也会发生中断 由用户态到内核态切换 通过内核态查找使用存在该pagecache是否存在 不存在则需要通过协处理去磁盘:整个过程依然遵循 用户态到内核态切换的五个步骤
jvm中的heap
d被标记为dirty的pg回写会磁盘
limit
pagecache
pagecache粗俗的理解
验证:基本输出流 缓存输出 用户态到内核态的切换
FD
buffer
关于swap(存在于磁盘中) 如果内存是一个G 但是内存中所有在运行的程序 占用的空间可以大于1G:原因就在于swap的使用 也就是当前没有正在使用的程序存放在swap区域中,由于进程也是存在时间分片的概念 所以当在内存中运行的程序 不在使用了,现在使用了swap中存放的app那么整个系统会卡顿一下(用于将swap的交换到内存)
1
当将需要的数据读取完毕全部缓存到内存中的pagecache中之后,协处理器也会存在一个中断 此时再讲app1的进程转态改为可运行转态
文件IO:基本流 缓冲流 bytebuffer 直接内存 的使用Socket网络编程IO: 阻塞BIO 非阻塞NIO 多路复用器(可以通过参数配比要求JDK使用epoll还是poll) netty epoll如何知道数据到达?还是中断写时复制
文件类型:- :普通文件(可执行文件 图片 文本)D:目录b:块设备 读取的时候可以读取到该去的和当前的 存在偏移量 选择性读取(硬盘)c:字符设备 读取的时候只能读取当前的 (键盘 摄像头 网卡)s: sokectp:pepline 管道eventpoll: 为内核提供的epol内存区域l:链接 软连接和硬链接硬链接:[root@huang test]# ln ./huag.txt(源) ./huangs.txt(目标)创建完毕之后-rw-r--r--. 2 root root 15 Aug 12 05:05 huag.txt-rw-r--r--. 2 root root 15 Aug 12 05:05 huangs.txt2表示相关联的 且修改huangs.txt huag.txt也会更改 删除任何一个另一个还会存在此时查看硬链接的stat 二个均查看 发现inode号码一致,每个文件均存在一个INODE 硬链接为二个一个绝对路径为变量名执行同一个磁盘的物理位置软连接:[root@huang test]# ln -s huangs.txt hu.txtlrwxrwxrwx. 1 root root 10 Aug 12 05:32 hu.txt -> huangs.txt软连接的二个文件的inode不一样
内存
java使用c语言系开发的程序
总结 执行java 启动该进程
执行二进制文件 -Xmx1G (不给这个参数就是用默认的参数)
kernel
io设备(磁盘,鼠标,网卡等)
1 2 3
kenel操作系统内核(程序)
app程序
上面用户空间的该部分逻辑地址直接映射到kernel内存的pagecahceh逻辑地址同时也是直接映射到磁盘文件
硬件角度
当出现Pages>Cached的时候表示 pages为out.txt可拆分的大小 Cached表示内存可缓存的大小,那么此时那么肯定存在向磁盘写的过程(通过dirty_background_radio和dirty_radio) 写完后的Cached会通过lru淘汰回收淘汰时机为更具lru算法 会优先处理在内存时间久的pc 此时就会出现第一次写到xxoo.txt的放到磁盘中 以及出现precent不是100%(也就是可拆分出的4k大于可被内存缓存的cached) 当书写out.txt的时候 上面xxoo.txt的precent持续降低 原因就是lru算法特点 优先处理时间久的脏页 -----》此时根据dirty_background_radio 的比率在达到设置的阈值为10%的时候 会先将标记dirty的pc 回写到磁盘,此时的pagecache没有dirty 但是依然缓存之前的数据 此时会根据lru算法 将其淘汰 dirty_background_radio 不会阻塞 依然可以分配pagecache动态 之前的根据lru动态删除 dirty_radio为防止增长过快 此时阻塞不容许在书写可以通过用户调用flush将pagecache中的脏页会写到磁盘,但是 如果pc原先是4k 但是仅仅保留了1k 也会将整个4k全部回写到磁盘
此时jvm在磁盘中
关于何时使用上述三种
用户空间
pcstat的使用
$1 表示执行./mysh.sh 1 后面的1为参数 $0表示的是./mysh.sh
上述二种仅仅是分配了字节数组 可以填充;span style=\"font-size: inherit;\
PS为进程
从低地址到高地址分别内存区分别为:代码段、数据段(初始化)、数据段(未初始化)(BSS)、堆、栈、命令行参数和环境变量。其中,堆向高内存地址生长,栈向低内存地址生长。字啊系统新建一个进程的时候32位的操作系统会分配4G的内存 0-3G内核态和用户态均可以访问3g-4g仅内核态可以访问
[root@huang ~]# exec 8<> huang.txt 8u终端为huang.txt
[root@huang fd]# vim /etc/sysctl.conf 修改上述参数 sysctl -p执行让其生效
使用rafchannel.map方式创建
对于bytebuffer而言 相当于存在三个指针的数组
落地实现:netty(onheap offheap(侧重于)) 为什么netty没有使用mappedByteBuffer
上一章节的补充
/bin 原先的path中就包含bin目录 当执行命令的时候 原先就会在path目录中寻找所以可以将pcstat放到/bin目录下
只有内核才可以直接操作磁盘和网络还是pagecache体系
此时使用了bytebufferByteBuffer.allocate(8192);方式创建的 直接将字节数组分被到jvm堆上
stack
kenel
cpu+内存+硬盘+其他设备
sokcet应用
查看文件的源数据信息:包含INODE[root@huang test]# stat huangs.txt File: ‘huangs.txt’ Size: 20 Blocks: 8 IO Block: 4096 regular fileDevice: fd00h/64768d Inode: 412442(stat也属于用户程序 执行的时候 也需要从内存中获取) Links: 1(如果存在链接则为2)Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Context: unconfined_u:object_r:admin_home_t:s0Access: 2021-08-12 05:12:28.041596076 -0400Modify: 2021-08-12 05:12:28.041596076 -0400Change: 2021-08-12 05:12:28.116596542 -0400
cpu 读取程序中的指令执行
//该进程下的pagecache
1被get了
关于启动程序主线程的out的解读
pagecache存储在kernel中 做缓存,通过App的FD(使用迭代器模式 存在偏移量最终回去自己程序想要的那部分数据,在操作同一个pagecache的时候需要使用锁)
为什么使用堆外?
对于重定向的不需要书写&(由原先的默认流向)如果流向文件描述符 <>右侧+&
strace -ff -o out java xxx.class args[0]参数的使用 输出的out为发生系统调用的线程
关于io阻塞:对于app1和app2 二个程序(进程是有状态的)cpu调度 存在运行状态和
字节数组对象on heap
cpu
heap操作系统进程分配
中断机制:开始执行的是App程序;当系统调用的时候该运行的App程序中断 (保护app程序现场 从用户态切换到内核态)去执行内核中的程序
jps查看java程序 55848 Jpskill -9 进程id //销毁这个进程
协处理器的寄存器从硬盘读数据
txt文本区
从硬盘读取数据通过协处理器的寄存器
pagecache 4K
byte b = buffer.get(); System.out.println((char)b);单字节变为字符打印 原先输出对应的acsll码
FD指针seek(偏移量)
操作系统 没有绝对的数据可靠性 均是基于pagecache体系 ; 存在pagecache的原因是减少硬件IO的调用 优先使用内存 提高效率所以在追求性能的时候 需要在 可靠性 一致性 可用性 做权衡,即使要求高可靠性 (flush较多 此时的性能最差) 但是单点问题会让 该可用性完犊子(主从复制 主备HA)这也就是kafka和es 均存在副本的概念(通过socket得到的)
将需要的数据读取到内存,在内存中通过pagecache缓存
当写入的时候 移动postion limit与capacity一个位置
使用lru淘汰算法
挂起转态:也就是 该app不在系统内核进程调度队列中此时会调用其他进程
线程
测试结果
①:buffer缓冲②:pagecache缓冲 不会主动释放占用的的内存 比较费内存③:磁盘缓冲区
基于文件的nio
compact
[root@huang temp]# echo $$19961[root@huang temp]# /bin/bash //在启动一个bash进程 使用exit退出[root@huang temp]# echo $$23727 [root@huang temp]# pstree //查看进程├─sshd───sshd───bash───bash───pstree 19961 23727 //进程的父子关系[root@huang temp]# ps -ef | grep $$UID PID PPID C STIME TTY TIME CMDroot 19961 19956 0 21:50 pts/0 00:00:00 -bashroot 23843 19961 0 23:03 pts/0 00:00:00 /bin/bashroot 24111 23843 0 23:08 pts/0 00:00:00 grep --color=auto 19961ppid为父进程pid为当前进程 对应后面的程序/bin/bashcmd为执行的命令进程隔离:[root@huang temp]# x=100[root@huang temp]# echo $x100[root@huang temp]# /bin/bash[root@huang temp]# echo $x //此时由于进程隔离 在该线程下获取不到x的值此时使用export:使得环境变量y有导出能力先退出后面申请的进程 exit[root@huang temp]# export y=50[root@huang temp]# echo $y50[root@huang temp]# /bin/bash [root@huang temp]# echo $y50
0t17
一切皆文件 基于文件应用到I/O流
①:是需要的code文件是懒加载到pagecache中的,也就是code 不是一次性全部加载到内存的pc中 ;②:在发生系统调用的时候 用户态切换到内核态
②执行读取指令
sokcet和pipeline
app
APP
App结构基于C语言 在内存中的
sysctl -a 显示cenos中的控制项
执行的时候分配出data
④:将需要的数据读取完毕之后,app又重新变为可运行阶段
通过kenel中的vfs找到对应的文件
关于pagecache(内核维护缓存在内存)是否淘汰?是一次性全部加载进来还是懒加载?当程序修改pagecahce中的数据回写磁盘永久化策略?从时间上的立刻回写持久化还是延时持久化(丢失数据的多少)
[root@huang java-1.8.0]# find / -name java//查找文件/home/huang/testosFile
重点:
②:用户态到内核态之间的切换阶段
切换到内核态路径
buffer为引用到缓冲而减少系统嗲用的损耗
恢复到初始状态pos为0 limit=capacity
[root@huang testosFile]# pcstat -bname out.txt +---------+----------------+------------+-----------+---------+| Name | Size (bytes) | Pages | Cached | Percent ||---------+----------------+------------+-----------+---------|| out.txt | 3125060 | 763 | 763 | 100.000 |+---------+----------------+------------+-----------+---------+rm -rf *out*/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/bin/javac OSFileIO.javastrace -ff -o out /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre/bin/java OSFileIO 0(0为参数args[0]) ll -h && pcstat out.txtpcstat 后面可以接 名称和pid
df命令:[root@huang ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/mapper/centos-root 18307072 4762724 13544348 27% /devtmpfs 494008 0 494008 0% /devtmpfs 504636 0 504636 0% /dev/shmtmpfs 504636 6996 497640 2% /runtmpfs 504636 0 504636 0% /sys/fs/cgroup/dev/sda1 508588 129300 379288 26% /boot表示 某个硬件被挂载到vfs中/boot挂载到 /dev/sda1(表示设备硬盘的1分区) 中 这里虽然/挂载到root中仅仅在根目录下的/boot挂载到sda1分区下(覆盖掉原先/下面的boot)之所以覆盖是:加载顺序 先挂载的是/到root中 其中包括boot 之后在挂载/boot的到/dev/sda1z之后覆盖掉/目录中的bootmount /dev/sda1 /boot 则可以进行挂载 (这里直接将/dev/sda1中存储了内容当挂载到/boot的时候 boot就可以访问了)eg:当上线时间长了之后存放日志文件越来越多,此时可以安装一个硬盘 分区之后先将原先的日志文件内容拷贝到新的硬盘 然后在使用mount /dev/newDisk /log也就是使用型硬盘存放日志文件(与boot一样可覆盖)
一个pagecache在内存一开始申请就是脏页;脏页淘汰前需要回写到磁盘上;该脏页已经写回过磁盘了可以通过lru在内存淘汰掉
kenel程序
①:当访问io设备的硬件的时候流程
③:app进程挂起阶段
通过mmap系统调用创建
txt二进制文件
使用ByteBuffer.allocateDirect(1024);方式创建,将返回的字节数组 分配到java进程的堆空间
如何查看进程 echo $$ 查看当前bash进程id
get的时候
在发生系统调用的时候,触发int80切换到内核态原先在appi内部处理,的那个读取FileInPutStream的对象执行read的时候,那么触发int80,此时保护app1进程现场,进入内核态执行(为什么需要经过cpu? 原因int80为cpu指令 执行该指令此时kernel中存在中断向量表 key为int80对应的二进制,value为call back函数执行 也就是切换到内核态)此时app的转态由原先的Running转态在切换到内核转态之后 保护现场(原先的cpu寄存器的数据保存在app的系统栈中)状态变换为内核态的时候 在kernel执行系统调用读取数据,此时想在pagecache中查找有没有,没有则触发缺页此时在走DMA写处理器(从磁盘读取数据(从磁盘到内存的数据必须经过处理器慢慢捣腾))
切换到内接态路径
方法区
jvm代码
2
上述为重定向 打破之前默认的标准输入和输出
liunx操作系统的vfs(虚拟文件系统) 输入指令 cd / ll 打印的就是虚拟文件系统 根目录下的一级目录
这里的put() 不会发生系统调用
NOTE:通过被标识为dirty的pg回写到磁盘文件中的时间和方式决定io模型
[root@huang testosFile]# free total used free shared buff/cache availableMem: 1009276 157584 311232 10188 540460 612660Swap: 2097148 39596 2057552 free为可用的
运行时数据区data
可用空间
head xxoo.txt 显示文件的前10行tail xxoo.txt 显示末尾10行head -2 ooxx.txt 显示头文件的前二行但是现在没有指令直接可以显示第8行的,只存在显示前8行,如何处理?[root@huang temp]# head -8 test.txt [root@huang temp]# head -8 test.txt | tail -1管道的应用:前面的输出 作为后面的输入
寄存器
此时可以继续往里面写
磁盘缓冲区
挂起状态:在pc中没有找到数据之后经过协处理器从磁盘读取数据的时候发生
1024
lsof -op jps进程id
0 条评论
下一页