当前位置: 首页 > news >正文

威海网站建设 孔tp框架做网站xml地图

威海网站建设 孔,tp框架做网站xml地图,苏州刚刚发生的大事,个人域名推荐文章目录1、 Java IO读写原理1.1 内核缓冲与进程缓冲区1.2 java IO读写的底层流程2、 四种主要的IO模型3、 同步阻塞IO#xff08;Blocking IO#xff09;4、 同步非阻塞NIO#xff08;None Blocking IO#xff09;5、 IO多路复用模型(I/O multiplexing#xff09;6、 异步… 文章目录1、 Java IO读写原理1.1 内核缓冲与进程缓冲区1.2 java IO读写的底层流程2、 四种主要的IO模型3、 同步阻塞IOBlocking IO4、 同步非阻塞NIONone Blocking IO5、 IO多路复用模型(I/O multiplexing6、 异步IO模型asynchronous IO7、一个通俗例子读懂BIO、NIO、AIO8、小结一下1、 Java IO读写原理 无论是Socket的读写还是文件的读写在Java层面的应用开发或者是linux系统底层开发都属于输入input和输出output的处理简称为IO读写。在原理上和处理流程上都是一致的。区别在于参数的不同。 用户程序进行IO的读写基本上会用到readwrite两大系统调用。可能不同操作系统名称不完全一样但是功能是一样的。 先强调一个基础知识read系统调用并不是把数据直接从物理设备读数据到内存。write系统调用也不是直接把数据写入到物理设备。 read系统调用是把数据从内核缓冲区复制到进程缓冲区而write系统调用是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换是由操作系统kernel内核完成的。 1.1 内核缓冲与进程缓冲区 缓冲区的目的是为了减少频繁的系统IO调用。大家都知道系统调用需要保存之前的进程数据和状态等信息而结束调用之后回来还需要恢复之前的信息为了减少这种损耗时间、也损耗性能的系统调用于是出现了缓冲区。 有了缓冲区操作系统使用read函数把数据从内核缓冲区复制到进程缓冲区write把数据从进程缓冲区复制到内核缓冲区中。等待缓冲区达到一定数量的时候再进行IO的调用提升性能。至于什么时候读取和存储则由内核来决定用户程序不需要关心。 在linux系统中系统内核也有个缓冲区叫做内核缓冲区。每个进程有自己独立的缓冲区叫做进程缓冲区。 所以用户程序的IO读写程序大多数情况下并没有进行实际的IO操作而是在读写自己的进程缓冲区。 1.2 java IO读写的底层流程 用户程序进行IO的读写基本上会用到系统调用readwriteread把数据从内核缓冲区复制到进程缓冲区write把数据从进程缓冲区复制到内核缓冲区它们不等价于数据在内核缓冲区和磁盘之间的交换。 首先看看一个典型Java 服务端处理网络请求的典型过程 1客户端请求 Linux通过网卡读取客户断的请求数据将数据读取到内核缓冲区。 2获取请求数据 服务器从内核缓冲区读取数据到Java进程缓冲区。 1服务器端业务处理 Java服务端在自己的用户空间中处理客户端的请求。 2服务器端返回数据 Java服务端已构建好的响应从用户缓冲区写入系统缓冲区。 3发送给客户端 Linux内核通过网络 I/O 将内核缓冲区中的数据写入网卡网卡通过底层的通讯协议会将数据发送给目标客户端。 2、 四种主要的IO模型 服务器端编程经常需要构造高性能的IO模型常见的IO模型有四种 1同步阻塞IOBlocking IO 首先解释一下这里的阻塞与非阻塞 阻塞IO指的是需要内核IO操作彻底完成后才返回到用户空间执行用户的操作。阻塞指的是用户空间程序的执行状态用户空间程序需等到IO操作彻底完成。传统的IO模型都是同步阻塞IO。在java中默认创建的socket都是阻塞的。 其次解释一下同步与异步 同步IO是一种用户空间与内核空间的调用发起方式。同步IO是指用户空间线程是主动发起IO请求的一方内核空间是被动接受方。异步IO则反过来是指内核kernel是主动发起IO请求的一方用户线程是被动接受方。 2同步非阻塞IONon-blocking IO 非阻塞IO指的是用户程序不需要等待内核IO操作完成后内核立即返回给用户一个状态值用户空间无需等到内核的IO操作彻底完成可以立即返回用户空间执行用户的操作处于非阻塞的状态。 简单的说阻塞是指用户空间调用线程一直在等待而且别的事情什么都不做非阻塞是指用户空间调用线程拿到状态就返回IO操作可以干就干不可以干就去干的事情。 非阻塞IO要求socket被设置为NONBLOCK。 强调一下这里所说的NIO同步非阻塞IO模型并非Java的NIONew IO库。 3IO多路复用IO Multiplexing 即经典的Reactor设计模式有时也称为异步阻塞IOJava中的Selector和Linux中的epoll都是这种模型。 4异步IOAsynchronous IO 异步IO指的是用户空间与内核空间的调用方式反过来。用户空间线程是变成被动接受的内核空间是主动调用者。 这一点有点类似于Java中比较典型的模式是回调模式用户空间线程向内核空间注册各种IO事件的回调函数由内核去主动调用。 3、 同步阻塞IOBlocking IO 在linux中的Java进程中默认情况下所有的socket都是blocking IO。在阻塞式 I/O 模型中应用程序在从IO系统调用开始一直到到系统调用返回这段时间是阻塞的。返回成功后应用进程开始处理用户空间的缓存数据。 举个栗子发起一个blocking socket的read读操作系统调用流程大概是这样 1当用户线程调用了read系统调用内核kernel就开始了IO的第一个阶段准备数据。很多时候数据在一开始还没有到达比如还没有收到一个完整的Socket数据包这个时候kernel就要等待足够的数据到来。 2当kernel一直等到数据准备好了它就会将数据从kernel内核缓冲区拷贝到用户缓冲区用户内存然后kernel返回结果。 3从开始IO读的read系统调用开始用户线程就进入阻塞状态。一直到kernel返回结果后用户线程才解除block的状态重新运行起来。 所以blocking IO的特点就是在内核进行IO执行的两个阶段用户线程都被block了。 BIO的优点 程序简单在阻塞等待数据期间用户线程挂起。用户线程基本不会占用 CPU 资源。 BIO的缺点 一般情况下会为每个连接配套一条独立的线程或者说一条线程维护一个连接成功的IO流的读写。在并发量小的情况下这个没有什么问题。但是当在高并发的场景下需要大量的线程来维护大量的网络连接内存、线程切换开销会非常巨大。因此基本上BIO模型在高并发场景下是不可用的。 4、 同步非阻塞NIONone Blocking IO 在linux系统下可以通过设置socket使其变为non-blocking。NIO 模型中应用程序在一旦开始IO系统调用会出现以下两种情况 1在内核缓冲区没有数据的情况下系统调用会立即返回返回一个调用失败的信息。 2在内核缓冲区有数据的情况下是阻塞的直到数据从内核缓冲复制到用户进程缓冲。复制完成后系统调用返回成功应用进程开始处理用户空间的缓存数据。 举个栗子。发起一个non-blocking socket的read读操作系统调用流程是这个样子 1在内核数据没有准备好的阶段用户线程发起IO请求时立即返回。用户线程需要不断地发起IO系统调用。 2内核数据到达后用户线程发起系统调用用户线程阻塞。内核开始复制数据。它就会将数据从kernel内核缓冲区拷贝到用户缓冲区用户内存然后kernel返回结果。 3用户线程才解除block的状态重新运行起来。经过多次的尝试用户线程终于真正读取到数据继续执行。 NIO的特点 应用程序的线程需要不断的进行 I/O 系统调用轮询数据是否已经准备好如果没有准备好继续轮询直到完成系统调用为止。 NIO的优点每次发起的 IO 系统调用在内核的等待数据过程中可以立即返回。用户线程不会阻塞实时性较好。 NIO的缺点需要不断的重复发起IO系统调用这种不断的轮询将会不断地询问内核这将占用大量的 CPU 时间系统资源利用率较低。 总之NIO模型在高并发场景下也是不可用的。一般 Web 服务器不使用这种 IO 模型。一般很少直接使用这种模型而是在其他IO模型中使用非阻塞IO这一特性。java的实际开发中也不会涉及这种IO模型。 再次说明Java NIONew IO 不是IO模型中的NIO模型而是另外的一种模型叫做IO多路复用模型 IO multiplexing 。 说明本文会以pdf格式持续更新更多最新尼恩3高pdf笔记请从下面的链接获取语雀 或者 码云 5、 IO多路复用模型(I/O multiplexing 如何避免同步非阻塞NIO模型中轮询等待的问题呢这就是IO多路复用模型。 IO多路复用模型就是通过一种新的系统调用一个进程可以监视多个文件描述符一旦某个描述符就绪一般是内核缓冲区可读/可写内核kernel能够通知程序进行相应的IO系统调用。 目前支持IO多路复用的系统调用有 selectepoll等等。select系统调用是目前几乎在所有的操作系统上都有支持具有良好跨平台特性。epoll是在linux 2.6内核中提出的是select系统调用的linux增强版本。 IO多路复用模型的基本原理就是select/epoll系统调用单个线程不断的轮询select/epoll系统调用所负责的成百上千的socket连接当某个或者某些socket网络连接有数据到达了就返回这些可以读写的连接。因此好处也就显而易见了——通过一次select/epoll系统调用就查询到到可以读写的一个甚至是成百上千的网络连接。 举个栗子。发起一个多路复用IO的的read读操作系统调用流程是这个样子 在这种模式中首先不是进行read系统调动而是进行select/epoll系统调用。当然这里有一个前提需要将目标网络连接提前注册到select/epoll的可查询socket列表中。然后才可以开启整个的IO多路复用模型的读流程。 1进行select/epoll系统调用查询可以读的连接。kernel会查询所有select的可查询socket列表当任何一个socket中的数据准备好了select就会返回。 当用户进程调用了select那么整个线程会被block阻塞掉。 2用户线程获得了目标连接后发起read系统调用用户线程阻塞。内核开始复制数据。它就会将数据从kernel内核缓冲区拷贝到用户缓冲区用户内存然后kernel返回结果。 3用户线程才解除block的状态用户线程终于真正读取到数据继续执行。 多路复用IO的特点 IO多路复用模型建立在操作系统kernel内核能够提供的多路分离系统调用select/epoll基础之上的。多路复用IO需要用到两个系统调用system call 一个select/epoll查询调用一个是IO的读取调用。 和NIO模型相似多路复用IO需要轮询。负责select/epoll查询调用的线程需要不断的进行select/epoll轮询查找出可以进行IO操作的连接。 另外多路复用IO模型与前面的NIO模型是有关系的。对于每一个可以查询的socket一般都设置成为non-blocking模型。只是这一点对于用户程序是透明的不感知。 多路复用IO的优点 用select/epoll的优势在于它可以同时处理成千上万个连接connection。与一条线程维护一个连接相比I/O多路复用技术的最大优势是系统不必创建线程也不必维护这些线程从而大大减小了系统的开销。 Java的NIOnew IO技术使用的就是IO多路复用模型。在linux系统上使用的是epoll系统调用。 多路复用IO的缺点 本质上select/epoll系统调用属于同步IO也是阻塞IO。都需要在读写事件就绪后自己负责进行读写也就是说这个读写过程是阻塞的。 如何充分的解除线程的阻塞呢那就是异步IO模型。 6、 异步IO模型asynchronous IO 如何进一步提升效率解除最后一点阻塞呢这就是异步IO模型全称asynchronous I/O简称为AIO。 AIO的基本流程是用户线程通过系统调用告知kernel内核启动某个IO操作用户线程返回。kernel内核在整个IO操作包括数据准备、数据复制完成后通知用户程序用户执行后续的业务操作。 kernel的数据准备是将数据从网络物理设备网卡读取到内核缓冲区kernel的数据复制是将数据从内核缓冲区拷贝到用户程序空间的缓冲区。 1当用户线程调用了read系统调用立刻就可以开始去做其它的事用户线程不阻塞。 2内核kernel就开始了IO的第一个阶段准备数据。当kernel一直等到数据准备好了它就会将数据从kernel内核缓冲区拷贝到用户缓冲区用户内存。 3kernel会给用户线程发送一个信号signal或者回调用户线程注册的回调接口告诉用户线程read操作完成了。 4用户线程读取用户缓冲区的数据完成后续的业务操作。 异步IO模型的特点 在内核kernel的等待数据和复制数据的两个阶段用户线程都不是block(阻塞)的。用户线程需要接受kernel的IO操作完成的事件或者说注册IO操作完成的回调函数到操作系统的内核。所以说异步IO有的时候也叫做信号驱动 IO 。 ​ 异步IO模型缺点 需要完成事件的注册与传递这里边需要底层操作系统提供大量的支持去做大量的工作。 目前来说 Windows 系统下通过 IOCP 实现了真正的异步 I/O。但是就目前的业界形式来说Windows 系统很少作为百万级以上或者说高并发应用的服务器操作系统来使用。 而在 Linux 系统下异步IO模型在2.6版本才引入目前并不完善。所以这也是在 Linux 下实现高并发网络编程时都是以 IO 复用模型模式为主。 7、一个通俗例子读懂BIO、NIO、AIO 同步阻塞(blocking-IO)简称BIO同步非阻塞(non-blocking-IO)简称NIO异步非阻塞(asynchronous-non-blocking-IO)简称AIO 一个经典生活的例子 小明去吃同仁四季的椰子鸡就这样在那里排队等了一小时然后才开始吃火锅。(BIO) 小红也去同仁四季的椰子鸡她一看要等挺久的于是去逛会商场每次逛一下就跑回来看看是不是轮到她了。于是最后她既购了物又吃上椰子鸡了。NIO 小华一样去吃椰子鸡由于他是高级会员所以店长说你去商场随便逛会吧等下有位置我立马打电话给你。于是小华不用干巴巴坐着等也不用每过一会儿就跑回来看有没有等到最后也吃上了美味的椰子鸡AIO 8、小结一下 再如假设有这么一个场景有一排水壶客户在烧水 同步阻塞 IO的做法是叫一个线程停留在一个水壶那直到这个水壶烧开才去处理下一个水壶。IO 多路复用或非阻塞 IO 的做法是叫一个线程不停的循环观察每一个水壶根据每个水壶当前的状态去处理。异步 IO 的做法是每个水壶上装一个开关当水开了以后会提醒对应的线程去处理。 四种 IO 模型理论上越往后阻塞越少效率也是最优。在这四种 I/O 模型中前三种属于同步 I/O因为其中真正的 I/O 操作将阻塞线程。只有最后一种才是真正的异步 I/O 模型可惜目前 Linux 操作系统尚欠完善。
http://www.hkea.cn/news/14265440/

相关文章:

  • 网站开发 哪些技术太原网站建设pnjfw
  • 廊坊网站seo服务怎样做网站检索数据分析
  • 怎么建设局域网站微信最火的公众号排行
  • 做招聘网站怎么设计框架google商店
  • 做俄罗斯外贸网站推广中山服装网站建设
  • 怎么做网站界面分析网站运营需要什么条件
  • 音乐网站建设论文佛山网站建设联系电话
  • ppt免费模板大全网站小型网站建设方案
  • 网站视频怎么做如何修改网站备案号
  • 网站 的特效微网站设计与开发竞赛
  • 企业网站制作教程中国建设银行广东分行网站
  • 网站产品推广网站制作服务合同
  • 班级网站建设模板网站开发文档要求
  • 电商网站平台有哪些功能模块网站改版计划
  • 汕头集团做网站方案wordpress主题开发导航制作
  • 网站整体规划方案平面设计主要做的是什么
  • 上市设计网站wordpress上传到阿里云
  • 龙华网站建设价格网站收费模板
  • 网站建设书籍资料购物商城网站开发目的文档
  • 网站设计与实现菏泽炫佑网站建设
  • 网站建设方案 文库网站首页怎样排版
  • 安居客网站怎么做如何看网站的流量
  • 建网站服务开发软件需要哪些技术
  • 建设信用卡银行积分商城网站建设网站需要的资金清单
  • 网站建设好了还要收取维护费站长之家域名解析
  • 在别人的网站做域名跳转辛集网站建设
  • 职业院校专题建设网站他人盗用公司资料建设网站怎么处理
  • 道客网站建设推广ps设计素材网站
  • 有没有网站做字体变形美食地图网站开发
  • 负责网站建设推广合肥网站建设哪里好