Java文件与网络IO

在上一章中我们聊到了网络相关的知识,这一章先不深究,我们说说IO吧。首先要知道有4种数据操作模式:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞。

  1. 同步阻塞:当前一个获锁线程可操作、执行任务期间内核系统只能等待。
  2. 同步非阻塞:当前一个获锁线程可操作、执行任务期间内核系统可以运行。
  3. 异步阻塞:当前线程阻塞等待时、期间可执行多个其他线程但都在等待。
  4. 异步非阻塞:当前线程阻塞等待时、期间可执行多个其他线程且可正常运行。

IO是基于这4种数据操作的。

文件IO类型又分以下几类:

  1. 缓冲IO/非缓冲IO:缓冲IO利用缓冲块存储,当缓冲块满时再进行IO操作,减少IO次数(如BufferWrite); 非缓冲IO直接调系统进行IO操作,上下文切换多。
  2. 直接IO/非直接IO:直接IO是直接访问磁盘进行IO操作(如调用Sync); 非直接IO是将数据加载到内存页后发起IO操作。
  3. 同步阻塞IO、异步阻塞IO(IO多路复用)、异步非阻塞IO(异步IO)。
  1. IO包括2过程:CPU准备数据过程、读写(拷贝)数据过程。
  2. (BIO)同步阻塞IO:准备数据和拷贝数据都阻塞,while循环read方式仍属于。
  3. 同步非阻塞IO:严格意义上不存在。
  4. (NIO)异步阻塞IO:准备数据时不阻塞,用户线程可执行,但拷贝数据时阻塞。
  5. (AIO)异步非阻塞IO:准备数据和拷贝数据都不阻塞,期间用户线程都可执行。

网络IO (1个文件描述符代表1个连接):

  1. 网络IO负责监听连接事件,线程池负责提供线程,锁负责线程间数据安全。
  2. NIO通过select/poll/epoll获取网络事件:获取事件时,先把连接传给内核,再由内核检测:无事件发生则线程只需阻塞在这个系统调用;有事件发生则内核返回产生事件的连接并从阻塞状态返回去处理对应业务。
  1. select:通过不断轮询监听socket实现。poll相似。
  2. epoll:当socket变化时,回调,主动通知用户进程来实现。
  3. BIO:轮询调用read操作来判断是否有连接事件。
  1. select时间参数:设为NULL则一直等待有连接事件后返回、设非0则等待固定时间后返回、设为0则立即返回。select的文件描述符有限,默认1024个。
  2. poll:包含文件且能备份、读写事件(pollin读事件,pollout写事件),有3个返回值代表信息:0为无事件发生、-1为发生错误、小于0为事件永远等待。
  3. epoll监听多个注册描述符并进行IO事件分发,比poll新增边缘触发。
  1. epoll是线程安全的,而select和poll 不是。epoll自旋互斥维护
  2. epoll 监听文件描述符个数突破1024限制(可达十万),连接的最大数
  3. epoll 内部用mmap 共享用户和内核的部分空间,避免数据多次拷贝(零拷贝)。
  4. epoll 基于事件驱动,epoll_ctl注册事件并注册callback 回调函数,epoll_wait只返回发生的事件,避免像select和poll轮寻整个事件。
  5. 通过红黑树就绪链表实现:红黑树存储所有的文件描述符(连接),就绪链表存储有事件发生的文件描述符(触发的连接)。epoll_ctl可(增删改查)文件描述符结点,通知内核注册callback(事件),文件描述符有事件发生,此文件描述符插入到就绪链表,此时epoll_wait收到消息将数据拷贝到用户空间。
  6. 水平触发:只要套接字可读或可写,都会将描述符返回。即发送或接收时缓冲区有数据就返回(默认触发机制)。
  7. 边缘触发:当套接字的缓冲状态发生变化时返回。读缓冲区有新数据添加时触发,写缓冲区的容量发生变更时触发。          
  1. epoll读到一半又有新事件时:应避免主进程epoll再监听同一读事件,对应描述符设为EPOLL_ONESHOT:监听一次就从集合中删除,读完再手动入。
  2. epoll哈希表结构、poll链表结构、select数组结构。但都是IO多路复用的机制,Nginx使用epoll,因为连接多时epoll性能更好,但在连接数少且活跃时select和poll性能更好。
  3. C10K问题:10000并发问题 (文件句柄描述符不足,无法对应新连接会丢弃新连接),解决:进程分配、考虑阻塞/非阻塞IO等。                     
  1. 进程分配:缺点是效率低、扩展差、资源占用高、如果创建子进程未回收会造成僵尸进程,需要其退出注册并执行清除回收 。
  2. 阻塞IO+线程、非阻塞IO+readiness与notification+单线程或多线程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值