IO

正文

  • socket
  • 网络IO模型
  • NIO
  • SELECT/POLL/EPOLL
  • RPC
  • NETTY

有两个程序,想打开同一个文件,pagecache给他们共享,虚拟内存命中了,就可以返回了。pagecache是内存的数据缓存。对内存数据修改,会改为dirty脏。目录树结构趋向于稳定,但有一个映射的过程。抽象,一切皆文件。in a.txt b.txt用户前的2为硬链接引用的数量。任何程序都有0:标准输入,1:标准输出,2:报错输出,proc; KaTeX parse error: Can't use function '$' in math mode at position 13: 当前bash的pid或者$̲BASHPID;/proc/fd lsof -op $$;head -8 a.txt | tail -1.
page属于硬件设备与进程之间的抽象层。pagecache使用的时候,程序在不停的写文件,超过了参数设定后,percent会下降,文件被命名了也不影响里面的数据;当再次开启个程序写文件,上一个page会逐渐降低。内核会充分利用自己的可用空间,尽量维护访问过的数据在内存里。cp pcstat /bin /usr/bin。pagecache降低是LRU刷盘的缘故。DMA写磁盘。allocateDirect“堆外”(jvm堆-堆外(java进程堆里)-内核)。mapped映射:是mmap调用的一个进程和内核共享的内存区域。这个区域是pagecache到文件的映射。position偏移指针,limit大小限制,capacity总大小。bytebuffer可以放数据,但是不能只放数据而不去读取,读取的时候pos会回到开始位置,但是又怕读取过了,索引limit会占pos位置。OS没有绝对的数据可靠性,为什么设计pagecache,减少硬件IO的调用,优先使用内存。可靠性与速度之间的权衡–主从复制,主备HA,kafk/ES(socket)同步异步IO。on heap会有一个on heap到off head的过程,不能直接到pagecache。on heap是JVM虚拟机的内存直接可以访问的。office keep就对外是java进程可以直接访问的数据,然后page cache是内核的概念,jvm里的数据要放到java进程,这种的是进程,可以访问内存,然后通过系统调用把java这个进程可以访问,数据就是对外的数据,然后传递给内核的pagecache。
lsof -p【pid】。socket参数,delay优化,数据先放缓冲区,再刷过去;还是放一个写一个。

socket

四元组(C:IP/PORT,S:IP/PORT)。内核级的,即便不调用accpet,也会根据资源完成连接建立,数据接受。服务器端一个端口足够,四元组唯一就行。客户端来了,服务端没必要在开辟端口。每个四元组一个FD,代表唯一性。

网络IO模型

同步,异步,阻塞,非阻塞;没有异步阻塞。POLL/EPOLL是同步非阻塞IO。linux没有通用的异步处理方案。同步:程序自己R/W。异步:内核完成R/W。阻塞:BLOCKING。非阻塞:NONBLOCKING。
BIO,连接、读取都阻塞:弊端:BLOCKING.
strace -ff -o out cmd.
ifconfig eth0:11 192.1.1.110/24
单机-11万连接:来的时候192.168.110.100(原地址)192.168.150.11(目标地址),route-n 192.168.150.0-0.0.0.0(1);0.0.0.0-192.168.150.2(2)。返回的时候原与目标地址互换,会扔给(2),(2)会进行NAT地址转换,把150.11转换成150.2,回到window不会认,三次握手第二次回去的包被丢弃。调整方案:route add-host 192.168.110.100 gw 192.168.150.1.

NIO

socket:服务端的isten socket 连接请求三次握手后,得到连接的socket,由连接的socket进行连接后的数据读写使用。
ulimit-a;ulimite -SHN 500000(受制于file mask);ulimite-a==sh 表示软硬资源限制;root用户的文件修饰符虽然为1024但是可以超过,普通用户不行;cat /proc/sys/fs/file-max kernel级的文件描述符的个数;es /etc/security/limits.conf;问题,C10K:连接超过1万个,每循环一次O(N)的recv,很多调用是无意义的,浪费的。调用:系统调用;优势,通过一个或几个线程,来解决N个IO连接的问题。

SELECT/POLL/EPOLL

都要遍历所有io,询问状态。NIO遍历过程是在用户态和内核态切换。select,poll:这个遍历过程触发了一次调用,用户态内核的切换过程中,把fds传递给内核,内核重新根据用户这次调用传过来的fds遍历,修改状态,内核级的遍历要比NIO的遍历快的多。(即便不调用内核,内核也会随着中断完成有FD的状态设置)。select synchronous I/O multiplexing FD_SETSIZE(1024).POLL里面没有1024的限制。select、poll弊端:1每次都要重新,重复传递fds(EPOLL:内核开辟空间epoll_create)2每次内核背调了之后,针对这次调用,触发一个遍历fds全量fds全量的复杂度。站在程序的角度什么时候调用select内核什么时候遍历fds修正。
EPOLL:内核中,程序在红黑树中放过一些FD,那么伴随内核基于中断处理完fd的buffer,之后继续把有状态的fdcopy到链表中。所以程序只要调用wait能及时取走有状态fd结果集。epoll_create,epoll_ctl,epoll_wait(依然是同步模型,因为取到fds后,仍然需要accept,recv;不传递fds,不触发内核遍历;约等于select)。/pro/sys/fs/epoll/max_user_watches。sysctl-a |grep reuse 配置1可以重复使用。
多路复用器:多条路IO通过一个系统调用,获得其中多个IO状态,然后程序自己对着有状态的IO进行R/W。只要程序自己读写,那么IO模型就是同步的。POSIX通用兼容标准框架。
select,poll都是单调用。1 package级2 buffer级3 轮训。最终:中断-》回调callback event时间-》回调处理事件。在epoll之前的cb:只是完成了将网卡发来的数据走内核网路协议栈。,234步最终关联到FD的buffer,所以,某一时间如果从app询问内核耨一个或者某些FD是有可能R.W,会有状态返回。yum install man man-pages man 2 select。

RPC

PC寻址,sc中断int 0x80.rpc socket,IPC管道,信号,socket

NETTY

nc -l ip port开启一个服务器。报错:@Sharable,poolebytebufallocator越界,not registered to an event 1 loop,thread.register(client),sync.channel().CLOSEFUTER().SYNC();readcharsquence指针移动。

你可能感兴趣的:(IO,内核,网络,java,epoll,linux)