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 ...
随机推荐
- CentOS 7系统KVM虚拟机安装过程详解
什么是 KVM ? KVM 在标准的 Linux 内核中增加了虚拟技术,从而我们可以通过优化的内核来使用虚拟技术.在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可以 ...
- QT 线程的使用(继承QThread)
对于多线程而言,要注意资源的同步和互斥问题,但对于单独的一个线程,则只需要对它的run方法进行重写. 下面实现了一个简单的线程 widget.h文件 #ifndef WIDGET_H #define ...
- git 使用中报错:LF will be replaced by CRLF in app.json
git config --global core.autocrlf false //禁用自动转换
- mysqldump原理及实战
使用mysqldump命令行工具创建逻辑备份: 注意mysqldump的版本和路径mysqldump命令创建的是逻辑备份,结果集有两种格式:一种是将数据转换成标准的SQL语句(一堆CREATE,DRO ...
- S02_CH08_ ZYNQ 定时器中断实验
S02_CH08_ ZYNQ 定时器中断实验 上一章实现了PS接受来自PL的中断,本章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 8.1中断原 ...
- maven中添加memcached.jar配置方法
一.java memcached client的jar包下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads 二.cd jav ...
- Linux Centos7 离线安装docker 【官网翻译和注释】
Centos7的Docker安装 需要一个维护版本的centos7,所以6不行. 卸载旧版本 旧版本的docker被称为 docker or docker-engine 如果存在请删除它们. sudo ...
- linux 安装redis 完整步骤
最近在linux服务器上需要安装redis,来存放数据,增加用户访问数据的速度,由于是第一次安装,于是在百度上搜了一篇文章,按照这篇博客,顺利安装好了,因此将博主的文章拷过来记录一下,方便以后使用,也 ...
- jquery.serializejson.min.js的妙用
关于这个jquery.serializejson.min.js插件来看,他是转json的一个非常简单好用的插件. 前端在处理含有大量数据提交的表单时,除了使用Form直接提交刷新页面之外,经常碰到的需 ...
- TypeScript入门二:基本数据类型
浅析基本数据类型 TypeScript类型解析 一.浅析基本数据类型 首先有一个问题TypeScript是一门编译型语言?还是解释性语言?显然已经不能被这两个分类来区分,TypeScript的并不是为 ...