System_IO_NIO
2021-05-16 16:56:25 61 举报
系统io
作者其他创作
大纲/内容
IO
stack
三次握手
这个是VIP课!!系统IO原理:linuxVFS FDpagecache【java】1文件系统的io2内存和io关系3网络io
链表FD4
Thread
FD4buffer
JAVA
pc4k
kernel
你不能控制的
性能稍高一些
SELECTsynchronous I/O multiplexingFD_SETSIZE (1024)POLL里面没有1024的限制
buffer
appwhile(){select(fds) O(1)recv(fd O(m)
物理网络
limit
fd9
txtcode10*4KB1
syn
app1-x
C300_123P+S200_80P
1
out
appX
即便你不调用我内核,我内核也会随着中断完成多有FD的状态设置
SELECT POSIXPOLL EPOLL kqueue
ooxx
native维护一个集合
192.168.150.2vm-nat service
为啥ulimit -n 1024但是连接数超过了1024呢?我查查在告诉你们哈
app
on heap
data
TCP 如果双方建立了连接很久都不说话?对方还活着吗?
目的:192.168.150.1 + 10000 192.168.150.11 9090
off heap
OS NONBLOCKINIG
多条 路(IO) 通过一个系统调用,获得其中的IO状态然后,由程序自己对着有状态的IO 进行R/W
表:中断向量表25580 cb
allocateDirect
JDK new io
CAIPCPORT:123
网卡
select(fds)poll(fds)
int 0x80
clonerecv(fd5--> /blocking
page4kB不会全量分配缺页内存优化
cpummu
站在程序的角度什么时候调用select内核什么时候遍历fds修正状态
文件
int : cpu的指令
kernel《深入理解linux内核》《深入理解计算机系统》epoll < 怎么知道数据到达中断2小时
DMA
app1保护现场长可运行
FD6
BUFFER
内核级的
cpu
netstat -natp 0.0.0.0:8090 0.0.0.0:* LISTEN
中断
鼠标dpi100016000
APP
只要程序自己读写,那么,你的IO模型就是同步的
C10K
计组:中断处理延伸:
app1指针 seek 20
ack
网络IO 变化 模型
heap
优势:通过1个或几个线程,来解决N个IO连接的处理问题:C10K每循环一次:O(n)复杂度recv 很多调用是无意义的,浪费的,调用:计组:系统调用*read 无罪 无效的无用的read别调起
windows
根据给出的fd
fd6<红黑树>FD4 -> accept
epoll_wait
FileChannel
TCP
数据包多大MTUMSS
192.168.150.1 + 10000 192.168.150.11 9090
192.168.110.100 + 10000 192.168.150.11 9090
app1-z
内存
Object
即便你不调用accept
ByteBuffer
read(fd8)
资源
3 修改
cap
2
-:普通文件(可执行,图片,文本)REGd: 目录l:连接b:块设备c:字符设备 CHRs:socketp: pipeline[eventpoll]:。。。
selector
进程调度活跃
文件类型
map
目的:192.168.110.100 + 10000 192.168.150.2 19090
NIO
Servermainwhileaccept 系统调用
PUT()不会产生系统调用
page cache优化IO性能丢失数据
channel.readchannel.write
CLIENT
CPUint
Client100,123
服务端 serversocket0.0.0.0:0 0.0.0.0:80 L
pos
硬盘file:appW 10*4kB
90
txt
BIO
epoll_wait == select
fdseek
Linux
java Clinux pro
硬盘
网络IO: TCP 参数
epoll_create-> fd6
物理内存
AIP_CPORT+XIP_XPORT : FD3AIP_BPORT+XIP_XPORT : FD4AIP_APORT+XIP_XPORT : FD5AIP_CPORT+XIP_YPORT : FD3AIP_BPORT+XIP_YPORT : FD4AIP_APORT+XIP_YPORT : FD5
内核中,程序在红黑树中放过一些FD,那么伴随内核基于中断处理完fd的buffer,状态呀,之后,继续把有状态的fd,copy到链表中
磁盘4K
内核
SO,所以,程序只要调用wait,能及时取走有状态fd的结果集
PageCachekernel 折中方案
clone(
S
kernelVFS 树FDinode idpagecache 4kdirty 脏flush
循环遍历
键盘
保护现场切换用户态内核态
多路复用器:select poll的弊端,问题1,每次都要重新,重复传递fds (内核开辟空间)2,每次,内核被调了之后,针对这次调用,触发一个遍历fds全量的复杂度
EPOLL V.S SELECT/POLL
时钟中断硬中断晶振
appW
3root/boot/dev/etc
3次握手
File ifile = new File(\"/ooxx.txt\")out (fd) = new outputstream(ifile)out.write(\"fdsfsdf\")
ooxxdirty
kernelpc
多 路 复用器
EPOLL规避的遍历
-Xmx1Gjvm heap
缓冲区
app 200 80
s
IO中断
软中断陷阱int 80
Mappedmmap()逻辑地址
pagecachedirty
内核底层
内核级开辟资源
受内核映像
syn+ack
app2-y
I/O
SXIPXPORT:80YPORT:9090
app1-y
唯一性
system call
client
ooxx[cache]
冯诺依曼计算器,控制器主存储器输入输出设备 I/O
allocate
/proc/proc/$$$$ 当前bash的pid $BASHPID/proc/$$/fd 命令lsof -op $$重定向:不是命令,机制输入,输出 I/O<>管道 |
面试题
服务端是否需要为client的连接分配一个随机端口号
Client300,123
目录树结构趋向于稳定有一个映射的过程
OS 没有觉得数据可靠性为什么设计pagecache ,减少 硬件 IO 调用,提速,优先使用内存即便你想要可靠性,调成最慢的方式但是单点问题会让你的性能损耗,一毛钱收益都没有主从复制,主备HAkafka/ES 副本(socket io) (同步/异步)。。。
这个理论是对的,只不过要看用户,而且,公司里,生产环境肯定是非root用户启动程序
page cache内核维护 中间层使用多大内存是否淘汰是否延时,是否丢数据
寄存器
面向连接的,可靠的传输协议
app2fd 指针 seek 8
192.168.150.0
keepalive
APPwhile(100000)三次握手
是你能控制的
table 1~10 -》30-4080 -》 222访问80 异常 缺页
BIO的弊端阻塞 BLOCKING
1create
FD22
www.github.com/bjmashibing
抽象一切皆文件
linux : heap
任何程序都有0:标准输入1:标准输出2:报错输出
同步异步阻塞非阻塞strace -ff -o out cmd马老师讲的计组
磁盘
fd8
强行插入
/boot/dev/loop0/mnt/ooxx
协处理器DMA
socket
APP server
C100_123P+S200_80P
全量遍历用户态内核态切换才能实现
yum install man man-pagesman 2 select
目的:192.168.110.100 + 10000 192.168.150.11 9090
C
2swap2G
SELECT(FDS)POLL
1G
APP Serversocket -> fd4bindlisten fd4
1,package2,buffer3,轮询
延伸
VM
c
app2
mydisk.img
四元组(CIP_CPORT+SIP_SPORT)
不传递fds不触发内核遍历
CPU
中断描述符表012128 call back方法255
192.168.150.1
lsof -pnetstat -natp tcpdump
0x80: 1281000 0000值寄存器
dma
pagecache1个
192.168.110.100
txt1个
APP Serversocket -> fd4bindlisten fd4epoll_createepoll_ctl epoll_wait ->fdsacceptrecv
192.168.150.11 9090
收藏
收藏
0 条评论
下一页