nginx服务(一)_浅谈nginxIO模型

1、系统IO模式

2、磁盘IO模式

3、IO调度

4、MMAP机制

 

磁盘I/O: 磁盘每秒输入输出或读写次数量,是衡量磁盘性能的重要指标之一
网络I/O: 网络协议栈到用户空间进程的I/O


系统I/O类型

同步/非同步
关注点 是消息通知机制
同步(synchronous):等待对方反回消息,然后再进行后续的工作;(消息不会立即返回,一旦返回就是最终结果)
异步(asyncronous):被调用者通过状态、通知机制或者回调函数通知调用者被调用者的运行状态;(消息立即返回,但不是最终结果)
在这里插入图片描述
阻塞/非阻塞
关注点 是调用者在等待结果返回之前所处的状态
阻塞:blocking,调用结果 返回之前,调用者会被挂起,转为睡眠态(不可中断睡眠),闲等(只有得到结果才会继续);
非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起,而是一遍又一遍的去请求是否可以继续,忙等(即不会阻塞调用者);
在这里插入图片描述

总结
同步与异步是一组相对概念,针对的是自己等待还是别人通知 通知机制,即我什么时候通知调用者事情完成了
阻塞和非阻塞是一组相对概念,针对的是等待过程中,等待者的操作。等待机制,等待消息过程中,是一直等待还是可以去干其他的事情


系统IO模型组合
同步阻塞等同于阻塞IO
同步非阻塞等同于非阻塞IO 不再赘述
异步非阻塞等同于异步IO

异步阻塞
调用者向内核发送IO请求后,内核会立即通知IO结果,但是进程不能去响应其他事件需要等待调用完成才可以释放


网络I/O模型:

阻塞I/o: 调用者向内核发送IO请求后⼀直等待内核响应,如果内核处理请求的IO操作不能⽴即返回,则进程将⼀直等待
并不再接受新的请求,并由进程轮训查看IO是否完成,完成后进程将IO结果返回给Client,在IO没有返回期间进程不
能接受其他客⼾的请求,⽽且是有进程⾃⼰去查看IO是否完成,这种⽅式简单,但是⽐较慢,⽤的⽐较少。

非阻塞I/O: 调用者向内核发送请IO求后⼀直等待内核响应,如果内核处理请求的IO操作不能⽴即返回IO结果,进程将不再等待,⽽且继续处理其他请求,但是仍然需要进程隔⼀段时间就要查看内核IO是否完成。

I/O复用模型(select(),poll()功能类似,风格不同):当发起I/O调用时,就系统内部就会维护一个接口,用来记录多路I/O的状态,哪个好了就处理哪一个,默认单个调用者可注册多达1024个I/O请求(所以最大并发连接数不可大于1024,可以强制超过修改内核参数,但是性能反而可能会下降),和poll差不多,只是它没有数量限定,但是可承受的注册I/O和select都差不多。达到1024个也就够了(由BSD公司研发的和select差不多);第一次阻塞在内核代理select()上的,第二次仍然阻塞在内核空间到用户空间的路上,需要等待内核完成,期间进程不能处理其他事件

信号驱动I/O(epoll):调用者发起系统调用之后,留一个回调接口给被调用者,然后去处理新的请求,当内核这一阶段数据复制完成之后,叫醒调用者继续往下执行;
通知机制: 水平触发:多次通知; 边缘触发:只通知一次,之后不再通知,如果进程空闲下来还需要该资源,可使用回调函数,取回当初的数据

异步I/O(event):从调用开始,到复制数据到内核空间,到复制数据到进程空间都是由我们的被调用者完成,调用者只负责构建响应报文响应用户

在这里插入图片描述


I/O调用过程
I/O调用的主要目的就是把磁盘中的文件加载到进程的内存空间 因为进程是没有权限直接访问硬件的,所以就需要用到系统调用,调用者发起一个I/O调用请求之后,开始进入第一阶段(由用户空间的进程发起,内核空间中的系统调用来受接),内核接受到请求,从磁盘中将数据复制到内核空间(buff/cache),然 后开始第二阶段,这也是磁盘I/O的真正过程,内核通知进程过来取数据,然后进程过来复制数据到自己的内存空间,接而构建响应报文,响应用户请求; 如果有下一个用户请求的同一个页面资源,那么就可以直接从内核的空间中去取数据,给进程,继而响应,就节省了一步从磁盘中去复制数据到内核空间(buff)中去步骤了

在这里插入图片描述

总结
磁盘I/O是进程向内核发起系统调⽤,请求磁盘上的某个资源⽐如是⽂件或者是图⽚,然后内核通过相应的驱动程序将⽬标图⽚加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是⽐较⼤的数据也需要等待时间。
I/O阶段:第一阶段wait(等待数据准备完成,从磁盘到内核缓冲器),此步骤需要等待数据准备完成,时间较⻓
第二阶段copy数据过程(从内内核缓存区到用户空间的进程缓冲区的内存中),时间较短


继上面提到的IO调用我们可以知道,如果一个用户调用了一次磁盘中的文件如a.txt,下一个用户再次调用a.txt时,这个a.txt还在cache缓存中,所以不需要再次从磁盘上调动,只需要将cache缓冲区中的文件读取到物理内存中即可响应给进程;这里我们可以明确的感觉到,都是同一个文件的调用,虽然前一次没有被重复调用,但是后一次从cache到内存中依然是重复操作,如果能解决这一步的重复调用,那么服务器的性能就能进一步提升;基于此需要MMap(内存映射)就出现了

在这里插入图片描述

mmap内存映射

mmap(memory mapping)系统调⽤使得进程之间通过映射同⼀个普通⽂件实现共享内存,普通⽂件被映射到进程
地址空间后,进程可以像访问普通内存⼀样对⽂件进⾏访问。
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值