java i o 模型简述_操作系统—I/O 模型

1. 什么是 I / O ?

在Unix系统中,一切都是文件,都是二进制流。在信息交换的过程中,我们都是对这些流进行操作,即我们通常所说的 I/O(input output)操作,计算机通过对每个流记录一个文件描述符——fd(file descriptor)来区分对每个文件的操作!

2. I / O 如何操作?

下图为最基本的 I/O 操作

bd584d2df6ba29617c860f6e5796bec2.png

下图为系统调用

3cdecd79f5d4de3b3769b8b57ff32eaf.png

3. I / O 模型

3.1 Blocking I/O Model

阻塞的I/O模型是最传统,最基本的模型,即当进程调用读取操作时,会一直阻塞到内核数据返回!

305053de020f505dab587ee7a6909f2f.png

dcb8660c9872ddf877fe58c83578b907.png

上图展示了当进程执行recvfrom函数时,通过系统调用,由用户态转入内核态,由于数据迟迟未到,所以内核一直会等待数据,直到数据准备好便将全部数据拷贝给用户进程!此情况用户进程是全程陷入阻塞状态

阻塞I/O——当你下楼拿快递,发现快递小哥没有来,ok没办法,我原地等,直到快递小哥来了,拿到了快递我再回宿舍!

3.2 Nonblocking I/O Model

非阻塞 I/O 即当用户进程调用读取操作时,如果内核数据准备好了则直接复制并返回;如果没有准备好,那就返回一个错误提示进程,并不断的去轮询是否准备好!

4db8c5b1bfa72c150cbc72819b871658.png

e35d97086b42ca98895cdf8f9ea6b83f.png

上图展示了当进程执行recvfrom函数时,通过系统调用,由用户态转入内核态,由于数据迟迟未到,所以内核不会等待数据,直接返回一个错误给用户进程!然后用户进程不断去轮询,检查数据是否准备好此情况用户进程不断去轮询内核数据是否准备好,浪费CPU时间片

非阻塞I/O-当你下楼拿快递,发现快递小哥没来,好吧我先回宿舍。刚回宿舍我心想:万一此时恰好来了呢?于是我又马上下楼去检查,重复这个过程直到快递小哥来!

3.3 I/O Multiplexing Model

dba326bf9d61381b4c8f1479a414b491.png

dba326bf9d61381b4c8f1479a414b491.png

dba326bf9d61381b4c8f1479a414b491.png

I/O 多路复用即通过执行 select 或者 poll 函数来对多个文件描述符进行监控,一旦内核发现某个数据准备好,便通知相对应的用户进程进行读取

9728ccc2c561d50148f7c3d5ba6682e2.png

上图展示了进程一直阻塞在对 select 或者 poll 函数的调用上,等待直到某个 socket 可读,此时进程便对数据进行读取。这种模型有个明显的缺点:需要两次系统调用。而且当一个连接来了,就必须遍历所有已经注册的文件描述符,来找到那个需要处理信息的文件描述符,如果已经注册了几万个文件描述符,那会因为遍历这些已经注册的文件描述符,导致cpu爆炸。但其优势在于可以对多个socket进行监控

I/O多路复用的优势并不是对于单个连接能处理的更快,而是在于可以在单个线程/进程中处理更多的连接。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

select,poll 和 epoll 比较

dba326bf9d61381b4c8f1479a414b491.png

dba326bf9d61381b4c8f1479a414b491.png

dba326bf9d61381b4c8f1479a414b491.png

1. 支持一个进程所能打开的最大连接数

select:单个进程所能打开的最大连接数有FD_SETSIZE宏定义,其大小是32个整数的大小(在32位的机器上,大小就是3232,同理64位机器上FD_SETSIZE为3264),当然我们可以对进行修改,然后重新编译内核,但是性能可能会受到影响,这需要进一步的测试。

poll:poll本质上和select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的。

epoll:虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右的连接,2G内存的机器可以打开20万左右的连接。

2. fd 剧增后带来的IO效率问题

select:因为每次调用时都会对连接进行线性遍历,所以随着FD的增加会造成遍历速度慢的“线性下降性能问题”。

poll:同上

epoll:因为epoll内核中实现是根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,所以在活跃socket较少的情况下,使用epoll没有前面两者的线性下降的性能问题,但是所有socket都很活跃的情况下,可能会有性能问题。

3. 消息传递方式

select:内核需要将消息传递到用户空间,都需要内核拷贝动作

poll:同上

epoll:epoll通过内核和用户空间共享一块内存来实现的。

I/O 多路复用——同样去拿快递,但是有中通,申通,韵达等多个快递都快来了,于是我一直等电话,当某个快递小哥给我打电话的时候我就去拿。

3.4 Signal-Driven I/O Model

信号驱动型I/O即进程在IO访问时,通过使用信号告诉内核,当socket上的数据准备好了的时候,通过信号

通知一声

4c2e0f5cd86753b352e5b8124416c0dd.png

上图展示了用户进程先通过sigaction系统调用,创建一个信号处理函数,立即返回。之后进程并不阻塞,而是转而执行其他事情。当内核准备好数据后,产生一个SIGIO信号(电平触发)并投递给信号处理函数。可以在此函数中调用recvfrom函数操作数据从内核空间复制到用户空间,这段过程进程阻塞。无论我们如何处理信号,这个模型的优点是在等待数据报到达时不会阻塞。主循环可以继续执行并等待信号处理程序通知数据已准备好处理或数据报已准备好读取。

信号驱动型I/O——同样去拿快递,而且有中通,申通,韵达等多个快递都快来了,我不等电话了(这个电话与上面电话不同,此处的电话需要专用的快递电话),我先收拾宿舍卫生,一旦电话响了即某个快递来了,那我就去拿!

3.5 Asynchronous I/O Model

异步 I/O 模型即在进程发起异步IO请求,立即返回。当内核完成IO时,内核给进程发一个信号。

292f305e90b90a0ca3c80f385534f622.png

上图展示了用户进程 会首先调用 aio_read函数执行系统调用,并向内核传递描述符、缓冲区指针、缓冲区大小(与read相同的三个参数)、文件偏移量(与lseek类似),以及如何在整个操作完成时通知我们。这个系统调用立即返回,我们的进程并没有阻塞而是继续执行其他事情,直到数据全部写入缓冲区!!!

异步 I/O ——同样拿快递,我太忙了,委托给我同学去拿,并把快递的单号,类型告诉他,然后我去吃饭或者干其他事

39be7aad23bcc71f3d985f810d7705aa.png ,当他拿到快递时通知我一下,舒服

综上,前四个I/O模型都是同步型 I/O,即都会在数据从内核写入到缓冲区这个阶段阻塞,即同步I/O操作会导致请求进程被阻塞,直到I/O操作完成。异步I / O操作不会引起请求进程被阻塞

de05f864d786866158e2561b9bf32c66.png

本作品采用《CC 协议》,转载必须注明作者和本文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值