C10K问题和多进程模型
收录编辑来自马哥教育相关课程
- 内核空间的相关程序在调度用户空间里的进程的时候,也占用了cpu资源......
nginx可以作为两种类型的反向代理 http 和smtp(mail)
C10K问题,
当一个主机的连接数过多的时候,单独一片网卡,响应在一个套接字上的请求,如何通过一个进程,或一组线程对请求提供服务? 显然,阻塞模式就太糟糕了
- 多进程模型
以apache为例, 监听在80套接字上的http进程,接收用户请求,通过生成子进程响应客户请求,销毁用户空闲子进程(做到了专客户专进程的效果)
内核要调度进程,cpu要分配给时间片(但cpu的资源必定有限),
为了让访问者感受不到阻塞,内核调度程序对进程要进行切换 分配给进程2的时间片一旦完成,就把进程2转入睡眠(阻塞)状态,
再执行进程n.....如此往复执行 但某一时刻真正执行的只有一个进程,通过切换,客户感受不到等待,切换的工作由内核负责。
然而内核空间的相关程序完成这种用户空间的进程调度,也是需要占用cpu资源的,但实际问题并未得到解决(进程如果过多,那么消耗在切换的时间和cpu资源就会激增,但对解决实际问题无用)
例如,请求一个网页
实际上就是用户请求访问服务器硬盘上的一个网页(html php......皆有可能),然而用户空间的进程并不能直接访问,需要通过内核空间的调度程序去完成,在内核相关程序完成网页的读取和返回这段状态,
用户空间的进程处于睡眠状态(wait)其实就是阻塞,如果内核未完成读取网页并返回结果,那么即使唤醒这一请求,也无助于解决什么问题,因而这一状态也称之为 不可中断睡眠
物理内存,分为两部分,内核空间(buffer,cache) 进程空间(内有多个进程运行)(数据读取完毕,暂时放进内核空间,接下来复制到进程空间,供进程访问)
数据从硬盘加载到内存的过程,内存一般是要分页的,如果不分页那可能是堆,数据从磁盘加载到内存的页上面,每次I/O加载一个页面的数据,磁盘一般是分块的,每块1k,2k,4k不等,假设要读取的数据内存大小为4K,
那么根据页的大小,一次I/O读几个块,完成从硬盘数据到内存的加载(每块为2k,一次I/O读取两个块
每块为1K,一次I/O读取4个块......)
- DMA(direct memory access)
还以文件加载为例,如果文件大小需要占据10个内存页,磁盘上每个块大小2k,根据上面的论述,一次I/O要填充一个内存页,那么可以得出,有20k大小的文件数据需要加载,读取哪些磁盘块,加载到哪个内存地址,
都需要CPU参与决策!加载到内存页仅仅是处于缓冲的需要,最终是要映射/复制到进程可以访问的内存空间中去,接下来,如何选择空闲的内存空间,从内存的哪一部分开始分配,也都需要CPU参与决策,另外,从磁盘
哪一部分加载数据,需要驱动程序参与,而驱动程序也需要cpu资源得以运行,这些行为都发生在内核空间,因而我们说加载一个文件到内存,内核运作十分繁忙,那么降低内核对CPU的占用,尽可能让cpu处理其他程序
(进程),DMA机制应孕而生
- DMA工作过程
DMA是一个主板上的芯片,DMA机制下,文件加载过程是,内核找到一片连续的缓存空间,把起始地址给DMA,该芯片是一个控制芯片,具有CPU的部分功能:访问内存,复制数据,有传输数据----占据系统总线的能力,
有控制系统总线,数据总线,控制总线的能力;cpu分配完连续缓存的起始地址,并钦定完读取哪些磁盘块之后,就把总线控制权让渡给DMA芯片,DMA读取磁盘数据加载到内存,这一过程占据数据总线,
DMA发送指令读取第几个磁盘块,这一过程占用控制总线,读到哪个内存地址,也涉及占用数据总线
这样一来,cpu有更多的精力处理请求进程,而把加载数据的功能让渡给DMA履行,请求到数据的进程直接通过网卡和用户进行交互,而无需占用PCI总线
- DMA加载数据后
DMA完成加载数据后,产生中断,通知CPU(插入信号),DMA进入睡眠状态,由内核把加载完成的数据复制给请求进程,
这就是操作系统难以研发的原因-----涉及了复杂的仲裁机制
综上所述,内核空间根据用户空间的请求读取相应数据后,会先放到内存的内核空间,再复制到内存的进程空间以供请求进程访问,那么在多个请求请求同一个页面的业务场景下,虽然可以通过缓存,加速对
其他请求的访问速度,但是进程空间中会有多份相同的数据......这就是多进程模型不足的地方,冗余数据!
- 总结---多进程模型
线程切换过多,占用cpu资源
各进程地址空间独立,很多重复数据,内存利用效率低
C10K问题和多进程模型的更多相关文章
- 简化的nginx多进程模型demo
//version 1:以下代码仅演示nginx多进程模型[test@vm c]$ cat mynginx.c#include <stdio.h> #include <string. ...
- Chromium与CEF的多进程模型及相关參数
CEF基于Chromium,也是多进程模型.关于进程模型.參考这里:https://www.chromium.org/developers/design-documents/process-model ...
- 系列3|走进Node.js之多进程模型
文:正龙(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 之前的文章"走进Node.js之HTTP实现分析"中,大家已经了解 Node.js 是如何处理 HTTP 请求 ...
- PHP 技能精进之 PHP-FPM 多进程模型
PHP-FPM 提供了更好的 PHP 进程管理方式,可以有效控制内存和进程.可以平滑重载PHP配置.那么当我们谈论 PHP-FPM 多进程模型的时候,作为 PHPer 的你了解多少呢? 首先,让我们一 ...
- Node.js - 阿里Egg的多进程模型和进程间通讯
前言 最近用Egg作为底层框架开发项目,好奇其多进程模型的管理实现,于是学习了解了一些东西,顺便记录下来.文章如有错误, 请轻喷 为什么需要多进程 伴随科技的发展, 现在的服务器基本上都是多核cpu的 ...
- nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
nginx和apache的一些优缺点比较,摘自网络,加自己的一些整理. nginx相对于apache的优点: 1.轻量级,同样是web 服务,比apache 占用更少的内存及资源 2.抗并发,ngin ...
- 第13章 TCP编程(3)_基于自定义协议的多进程模型
5. 自定义协议编程 (1)自定义协议:MSG //自定义的协议(TLV:Type length Value) typedef struct{ //协议头部 ];//TLV中的T unsigned i ...
- nginx与apache 对比 apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
nginx与apache详细性能对比 http://m.blog.csdn.net/lengzijian/article/details/7699444 http://www.cnblogs.com/ ...
- [源码解析] 并行分布式任务队列 Celery 之 多进程模型
[源码解析] 并行分布式任务队列 Celery 之 多进程模型 目录 [源码解析] 并行分布式任务队列 Celery 之 多进程模型 0x00 摘要 0x01 Consumer 组件 Pool boo ...
随机推荐
- The timeout period elapsed prior to completion of the operation or the server is not responding.
问题:更新数据的状态值时,部分报出如下异常: 即时有成功更新,时有报错问题出现. 在LOG中发现成功更新的数据,存在更新时间过长问题,将近30秒(EF默认的CommandTimeout为30秒): 代 ...
- C#中异步编程异常的处理方式
异步编程异常处理 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try-catch来捕捉异常,未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.但是对于异步编程来说,异常处理一直 ...
- WDS无人参与批量部署Ser 2008
WDS无人参与批量部署Ser 2008 对于其它windows镜像采用此方法也是可以实现的: 1. 准备工作: 虚拟机server2012一个: 地址192.168.1.1/24 Server2008 ...
- k8s-PV和PVC使用
上节课我们学习了 PV 的使用,但是在我们真正使用的时候是使用的 PVC,就类似于我们的服务是通过 Pod 来运行的,而不是 Node,只是 Pod 跑在 Node 上而已,所以这节课我们就来给大家讲 ...
- visual studio 用 vs code 的 hot key
记得 2 年多前开始用 vs code, 一开始非常不适应它的 hot key 一心想把 vs code 的 hot key 全改成 visual studio 的,但一直没有找到比较方便的办法 (总 ...
- dl in image process
deep learning目前为止无论在分类还是检测上,都是整体的处理,而不会出现像sift这样的局部特征,这个问题或许如果能克服掉,能让检测效果更进一大步.
- WindowsAPI使用详解——GetVersion|GetVersionEx 获取操作系统版本和名称
Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx. GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返 ...
- 【CNN】 吴恩达课程中几种网络的比较
LeNet5 AlexNet VGG16 ResNet : 残差网络 Inception Net : 特点,可以通过1*1*192 的卷积核来缩减参数个数,压缩维度,约缩减10倍, 例如 :用1 ...
- Linux I2C核心、总线和设备驱动
目录 更新记录 一.Linux I2C 体系结构 1.1 Linux I2C 体系结构的组成部分 1.2 内核源码文件 1.3 重要的数据结构 二.Linux I2C 核心 2.1 流程 2.2 主要 ...
- JavaScript获取数组索引
JavaScript获取数组索引: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...