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 ...
随机推荐
- 斐波那契数列Fibonacci问题—动态规划
斐波那契数列定义 Fibonacci array:1,1,2,3,5,8,13,21,34,... 在数学上,斐波那契数列是以递归的方法来定义: F(0) = 0 F(1) = 1 F(n) = F( ...
- [转帖]System Dynamic Management Views
System Dynamic Management Views https://docs.microsoft.com/en-us/sql/relational-databases/system-dyn ...
- [转帖]linux下CPU、内存、IO、网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具
linux下CPU.内存.IO.网络的压力测试,硬盘读写速度测试,Linux三个系统资源监控工具 https://blog.51cto.com/hao360/1587165 linux_python关 ...
- Vufuria入门 1 图片识别和选择
Vufutia中的图片识别功能,底层主要是识别特征点来实现的.特征点,即那些棱角分明的点.尖锐的而不是圆滑的.对比度大的而不是小的. *** 步骤: 进入vofuria官网,登录,点击develop. ...
- java都13了, 8的新特性你还没不会用吗
前言 java13都已经来了,很多同学还停留在使用java5的东西.如果在日常开发中没有使用上java8的一些新特性或者不会用.这篇文章对你可能有帮助. lambda表达式 介绍 lambda表达式是 ...
- Graphite简要教程
转载自DevOps实战:Graphite监控上手指南 英文原文Getting Started with Monitoring using Graphite 英文原文Google快照 作者 Frankl ...
- 使ffmpeg支持HDR10bit 环境为ubuntu16.04
1. 编译X265,生成静态库, 安装到默认目录 修改CMakeLists.txt 使 HIGH_BIT_DEPTH 设置为ON cmake -G "Unix Makefiles&qu ...
- CN丶Moti-个人博客
欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti
- 多线程之thread和runnable
Runnanle方式可以避免Thread由于单继承特性带来的缺陷. Runnable代码可以被多个线程(thread实例)共享,适用于多个线程处理同一资源的情况. 线程的生命周期:创建,就绪,阻塞,运 ...
- includes()函数的用法
在ES5,Array已经提供了indexOf用来查找某个元素的位置,如果不存在就返回-1,但是这个函数在判断数组是否包含某个元素时有两个小不足,第一个是它会返回-1和元素的位置来表示是否包含,在定位方 ...