高度模块化:DSO
MPM:多路处理模块
     prefork-->一个主进程+多个工作进程,每个工作进程处理多个请求
     worker-->一个主进程+多个工作进程,每个工作进程派生多个工作线程,每个线程处理一个请求
     event(2.4版本)-->一个主进程+多个工作进程,每个工作进程处理多个请求,不过是根据事件驱动模式来处理请求

系统调用分两个过程:数据从进程-->内核|数据从内核-->进程
只要有一个过程被阻塞,就是同步

异步IO主要应用于文件IO。在同步在编程里,一般是指只有在某个IO操作执行完后可以执行后面的操作。异步则是将某个操作给系统,主线程继续执行别的操作,而由内核完成操作后去负责通知主线程异步操作已经完成。


同步:指进程发出一个过程(功能、函数)调用后,在没有得到结果之前,该调用将不会返回。

异步:指进程发出一个过程(功能、函数)调用后,调用者不能立刻得到结果,但调用会返回。调用完成后,内核通过状态、通知和回调来通知调用者。

同步IO操作会导致请求进程阻塞,直到I/O操作完成;异步I/O操作不导致请求进程阻塞。--同步才有阻塞,异步没有阻塞

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入睡眠状态)。函数只有在得到结果之后才会返回。

非阻塞:指在不能立刻得到结果之前,被调用函数不会阻塞当前线程,而会立刻返回。


同步阻塞-->
进程接到用户请求,发起系统调用,提交给内核
内核接到调用后,并不会返回一个resv函数信号,且进程也会进入睡眠/挂起状态--阻塞
内核调用完毕后,告知进程,进程再次执行系统调用,将数据从内核空间复制到用户空间--阻塞
进程继续执行
同步非阻塞-->
进程接到用户请求,发起系统调用,提交给内核
内核接到调用,至处理完毕钱,进程会不断询问是否调用完毕,期间内核会返回一个错误信息,告知进程调用没有完成,这个过程叫做忙等待
(忙等待状态下,进程不会睡眠/挂起,但是也不会去接收请求)--非阻塞(忙等待)
内核调用完毕后,告知进程,进程再次执行系统调用,将数据从内核空间复制到用户空间--阻塞
进程继续执行
I/O复用-->apache的prefork模型基于select
进程接到用户请求,通过select/poll函数,代它发起系统调用
(select/poll函数的特点是可以同时发起多个系统调用,也就是说可以同时接收多个请求,如此以来,第一阶段的系统调用就不会被阻塞)--伪非阻塞(其实依然是阻塞,只不过阻塞到了select上,select会一次询问所有调用,而不是一个一个询问,因此这种瞬间一次遍历询问,性能并不一定会比同步非阻塞好)
(apache的prefork模型就是基于select函数实现,即一个工作进程通过select函数发起多个请求)
内核调用完毕后,会针对处理完毕调用,返回一个可读信号,由复用函数告知进程,从而使进程发起系统调用,将数据从内核空间复制到用户空间--阻塞
进程继续执行
事件驱动模型-->apache的event和nginx
进程接到用户请求,调用事件驱动回调函数sigaction,然后发起系统调用,提交给内核
内核接到调用后,会返回一个事件信号,告知进程可以先继续执行--非阻塞
当内核调用完毕后,会再返回一个事件信号,告知进程已经调用完毕,可以复制,此时,进程发起系统调用,复制数据到用户空间 -- 阻塞
(返回事件信号分两种:
第一种水平触发-->是不断返回直至进程过来复制
第二种边缘触发-->是通知一次,通知会一直处于提醒等待状态,但是有个超时时间
)
进程继续执行
异步非阻塞-->
进程接到用户请求,调用aio_read函数,提交系统调用的同时,告知内核进程缓冲区的位置/大小等
内核接到调用后,,返回一个信号,告知进程可以先继续执行--非阻塞
当内核调用完毕后,会根据缓冲区的位置和大小,主动将数据复制到缓冲区,同时告知进程,已经处理完毕,故进程不需要再次系统调用 -- 非阻塞
进程继续执行

这5种模型都会在系统调用的第二部分进行复制,那么内存映射mmap就不需要复制,性能更佳!
(内存映射(mmap):内核接到系统调用后,将其放到内核空间中A位置,并告知进程,进程将进程空间映射到内存空间的A位置,从而直接读取,免去了复制的问题,这样子,系统调用的第二部分也不存在阻塞了)

附件列表

HTTP之I/O模型图MPM详细解析的更多相关文章

  1. 如何将Sql server数据库中的模型图转化到Word中--并能够查看字段的属性信息

    1. 在Sql server数据库中创建数据库的模型图 -- Database Diagrams 2. 控制面板--管理工具--ODBC数据源链接--创建一个Sql server的数据源链接 3. 打 ...

  2. 【转】JDK5.0中JVM堆模型、GC垃圾收集详细解析

    基本概念 堆/Heap JVM管理的内存叫堆:在32Bit操作系统上有4G的限制,一般来说Windows下为2G,而Linux下为3G:64Bit的就没有这个限制.JVM初始分配的内存由-Xms指定, ...

  3. UML动态模型图简单介绍

    UML动态模型图描述了系统动态行为的各个方面,包括用例图.序列图.协作图.活动图和状态图.下面就每种图做一个简单介绍: 用例图 用例图描述系统外部的执行者与系统提供的用例之间的某种联系.所谓用例是指对 ...

  4. flex盒模型 详细解析

    flex盒模型 详细解析 移动端页面布局,采用盒模型布局,效果很好 /* ============================================================    ...

  5. 桥接模式_NAT模式_仅主机模式_模型图.ziw

      2017年1月12日, 星期四 桥接模式_NAT模式_仅主机模式_模型图   null

  6. 【转】Visio画用例模型图竟然没有include关系

    转自:http://blog.csdn.net/shuixin536/article/details/8289746 由于电脑上没有安装Rose,因此决定用visio来画UML中的用例模型图,在绘制的 ...

  7. UML的九种模型图

    本文转自UML 的九种模型图,仅供学习交流! 一.作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号的表示 ...

  8. 数据库设计规范、E-R图、模型图

    (1)数据库设计的优劣: 糟糕的数据库设计: ①数据冗余冗余.存储空间浪费. ②数据更新和插入异常. ③程序性能差. 良好的数据库设计 ①节省数据的存储空间. ②能够保证数据的完整新. ③方便进行数据 ...

  9. C++多态的实现及原理详细解析

    C++多态的实现及原理详细解析 作者: 字体:[增加 减小] 类型:转载   C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型 ...

随机推荐

  1. 一键分享到新浪微博、腾讯微博、搜狐微博、人人网、开心网、百度收藏等js代码大全

    下面给大家一些分享的js代码,只要把代码插入自己的网页中稍微修改一下图片路径就可以用了,好了,废话少说,上代码:  document.writeln("<b>喜欢本文,那就分享到 ...

  2. Java学习笔记--多线程

    rollenholt的博文:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html 弹球例子: 0. 创建Bounce框架 ...

  3. iOS 证书与签名 解惑详解

    iOS 证书与签名 解惑详解 分类: iPhone2012-06-06 19:57 9426人阅读 评论(1) 收藏 举报 iosxcodecryptographyappleiphone测试   目录 ...

  4. [TYVJ] P1023 奶牛的锻炼

    奶牛的锻炼 背景 Background USACO   描述 Description 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加 ...

  5. 163k地方门户网站系统自动审核信息脚本

    本代码实现对163k地方门户网站系统发布信息的自动审核,以及对内容中链接全过滤 软件安装 Python 安装 http://www.python.org/download/ pymssql安装 htt ...

  6. 《Programming WPF》翻译 第9章 3.自定义功能

    原文:<Programming WPF>翻译 第9章 3.自定义功能 一旦你挑选好一个基类,你将要为你的控件设计一个API.大部分WPF元素提供属性暴露了多数功能,事件,命令,因为他们从框 ...

  7. 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)

    原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...

  8. C#开发者准备的通用性代码审查清单

    这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...

  9. 关于Yeoman使用的总结

    Yeoman由三部分组成 Yo 用于项目构建. Grunt 用于项目管理,任务制定. Bower 用于项目依赖管理. 经过一段时间的使用,对这些东西有了一些个人总结: 总体上说这些内容学习曲线略高,不 ...

  10. HTML5学习笔记简明版 目录索引

    http://www.cnblogs.com/TomXu/archive/2011/12/06/2277499.html