nginx--I/O模型

一.nginx使用的I/O模型
阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O、异步I/O是nginx常用的五种I/O模型
区别:
前4中均为同步,后一种为异步
比较:
在这里插入图片描述
1.阻塞I/O模型
应用程序会调动一个IO函数,使应用程序阻塞,等待数据准备好,在进程等待数据处理的过程中,不会去处理其他请求,也没任何反应。直至数据准备好以后,将数据从内核拷贝到客户端,IO函数返回成功指示。
在这里插入图片描述
2.非阻塞I/O模型
反复进行调用IO函数,每次调用,每次都会返回内核,进程会一直反复询问数据是否准备好,在数据拷贝过程当中,进程也是阻塞型的。在等待数据处理过程中,进程不会去处理其他的请求
在这里插入图片描述
3.I/O复用型
select和epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听;将所有的对一个IO端口请求同一交给一个进程,代为和内核空间进行数据交换
IO复用模型的三种形式:select、poll、epoll
(1)select
所有的用户请求进程都需要通过调用select()函数和内核空间进行数据交换,可能同时存在多个进程在等待返回数据,当某一个进程请求的数据准备需要返回的时候,select()函数并不知道该数据属于哪一个进程,他会轮询所有已经调用自己的进程,寻找该数据属于的进程进行数据返回。单个进程所能打开的最大连接数有限制
(2)poll
进程处理方式与select一致,只是单个进程能打开的连接数没有限制;监听和返回的集合分离,不再是传入传出参数
(3)epoll
epoll支持水平触发和边缘触发,最大的特点在于边缘触发:只有数据从对端发送到接收缓冲区才触发,不管缓存区中是否还有数据。使用情形:当接收缓冲区数据很多时,但read要求只读一部分。只可以非阻塞。epoll形式会给每一个请求数据的进程一个独一无二的标示,当数据准备好的时候,其会根据表示将数据返回给正确的进程
最大的特点就是没有最大并发连接的限制
4.信号驱动I/O模型
当网络套接字可读,内核通过发送信号通知应用进程,进程开始读取数据。
进程在用户空间请求数据之后,进程并不阻塞来等待数据,可以去处理其他的事情,当请求的数据准备好的时候,内核直接通知进程前来读取数据
在这里插入图片描述
5.异步I/O模型
数据拷贝过程中不进行阻塞
用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可
在这里插入图片描述
二.关于同步与异步、阻塞与非阻塞区别
1.同步与异步
注重程序与内核的关系
(1)同步
就是程序向内核发送一个调用后,如果没有返回值,调用不会撤回,一旦调用返回,就得到的返回值结果。需要程序自己取读写数据
(2)异步
当一个异步调用发出之后,调用者并不会立即得到返回值,当数据准备好之后,被调用者根据状态、信号等通知调用者来处理这个调用。 不需要程序自己去读写数据,只需要发起通知,被调用者会自动将数据放在指定的位置
2.阻塞与非阻塞
注重进程或线程在等待数据的状态
(1)阻塞
在调用结果返回之前,进程或者线程会被挂起(进程被调用阻塞,cpu不会光顾这个进程),等待返回结果,等待过程中不可以做其他事情
(2)非阻塞
不能立即得到结果时候,进程和线程不会被挂起(还可以和cpu进行交流)不能立即得到结果时候,进程和线程不会被挂起(还可以和cpu进行交流)
3.举例
饭店吃饭
同步:点餐完成以后,一直在等待,做完以后去干其他事情
异步:点餐完成以后,可以去干其他事情,饭做好以后直接送到你跟前
阻塞:点餐完成以后,一致在等待,等待过程中不能干任何事情
非阻塞:点餐完成后,在等待过程中可以一直催促和老板进行交流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值