muduo学习笔记 - 第3章 多线程服务器的适合场合与常用编程模型
第3章 多线程服务器的适合场合与常用编程模型
3.1 基本概念
同步和异步
针对程序和内核的交互
同步:用户进程触发IO操作,等待或轮询的查看IO是否就绪
异步:用户进程触发IO操作,继续做自己的事情,当IO操作完成通知进程
阻塞和非阻塞
针对进程在访问数据,更具IO的状态采取不同的方式
- 阻塞:数据的读写会一直等待
- 非阻塞:数据的读写会立即返回状态值
IO模型
- 同步阻塞IO:用户进程发起IO操作,阻塞等待IO的完成,之后继续运行剩下的程序,浪费CPU资源
- 同步非阻塞IO:用户进程发起IO操作,可以返回做其他的事情,需要用户进程不断询问IO操作是否就绪,浪费比必要的CPU资源
- 异步阻塞IO:用户进程发起IO操作,不等待,当内核完成通知用户进程,但通过select函数判断文件描述符的状态是阻塞的
- 异步非阻塞IO:用户进程发起IO操作,不等待,当内核完成通知用户进程,对数据进行处理
3.2 单线程服务器的常用编程模型
non-blocking IO + IO multiplexing: 事件循环(event loop),事件驱动(event-driven)和事件回调的方式实现
Reactor模型
- 优点:编程容易,效率高
- 缺点:基于事件驱动的模型要求事件回调函数必须是非阻塞的,涉及到网络IO请求响应式协议,容易割裂业务逻辑,使其分布在多个回调函数中,不容易理解和维护
3.3 多线程服务器的常用编程模型
- 每个请求创建一个线程,使用阻塞式IO
- 使用线程池,同样使用阻塞式IO
- non-blocking IO + IO multiplexing
- Leader/Follower
3.4 进程间通信只用TCP
进程间通信(IPC):
匿名管道(pipe)
具名管道(FIFO)
POSIX消息队列
共享内存
信号
Socket
同步原语:
互斥锁(mutex)
条件变量(condition variable)
对写锁(reader-writer lock)
文件锁(record locking)
信号量(semaphore)
TCPport有进程独占,操作系统会自动回收, listening port和已建立连接的TCPsocket都是文件描述符,当进程结束会关闭所有的文件描述符。程序意外退出不会留下垃圾,程序重启后比较容易恢复,不需要重启系统。port的独占可以防止程序重复运行
TCP长连接的好处:
- 容易定位分布式系统中的服务之间的依赖关系
- 通过接受和发送队列的长度比较容易定位网络或程序故障,正常情况netstat打印的Recv-Q和Send-Q都应该接近0,或在0附近摆动。Recv-Q保持不变或持续增加,通常意味着服务进程的处理速度变慢,可能发生阻塞或死锁。如果Send-Q保持不变或持续增长,有可能对方服务器太忙、来不及处理,也有可能网络中某个路由器或交换机故障造成丢包,甚至对方掉线
muduo学习笔记 - 第3章 多线程服务器的适合场合与常用编程模型相关推荐
- muduo学习笔记 - 第五章 高效的多线程日志
第五章 高效的多线程日志 日志有两种意思: 诊断日志 交易日志 本章讲的是前一种日志,文本的供人阅读的日志,通常用于故障诊断和追踪,也可用于性能分析. 日志通常要记录: 收到的每条消息的id(关键字段 ...
- muduo学习笔记 - 第4章 C++多线程系统编程精要
第4章 C++多线程系统编程精要 Pthreads只保证统一进程之内,同一时刻的各个线程的id不同,不能保证同一进程先后多个进程具有不同的id,更不要说一台机器上多个进程之间的id唯一性,pthrea ...
- muduo学习笔记 - 第1章 C++多线程系统编程
第1章 C++多线程系统编程 1.1 智能指针 C++中动态内存管理是用new和delete完成. 动态内存管理经常出现两种问题: 忘记释放内存造成内存泄露 还有指针引用的内存的情况下释放内存,造成引 ...
- muduo学习笔记 - 第2章 线程同步精要
第2章 线程同步精要 2.1 互斥器 (mutex) 互斥器保护了临界区,任何时刻最多只能有一个线程在mutex划出的临界区内活动 推荐使用原则: 用RAII手法封装mutex的创建.销毁.加锁.解锁 ...
- NLP学习笔记「第二章」2.2 N-gram Language Models(N元语言模型)
Language Model words phrase sentence 2.2.1 Unigram Language Models 某个词出现的概率来估计一句话出现的概率 互不相干的独立同分布的词 ...
- Java 学习笔记:第一章 Java入门
Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
- 计算机网络学习笔记:第二章
文章目录 计算机网络学习笔记:第二章 前言 2.1.应用层协议原理 2.1.1 网络应用程序体系结构 2.1.2 进程通信 2.1.3 可供应用程序使用的运输服务 2.1.4 因特网提供的传输层服务 ...
- 2021-08-31《内网安全攻防》学习笔记,第二章-域内信息收集(转自PowerLiu)
<内网安全攻防>学习笔记,第二章-域内信息收集 2020-07-212020-07-21 15:08:47阅读 1.1K0 2.1 内网信息搜集概述 当渗透测试人员进入内网后,面对的是一片 ...
最新文章
- Zookeeper的安装配置及基本开发
- 数据中心空调故障案例集
- P6329 【模板】点分树 | 震波
- libco协程库上下文切换原理详解
- zz在Ubuntu中通过源码安装编译安装软件(MySQL篇)
- 房屋户型图设计工具Room Arranger for Mac
- 顺序结构—— 华氏温度转摄氏温度
- Android报unable to instantiate application怎么解决
- 小白用Math对象随机生成一个名字
- 接口文档系统 - Yapi
- 字美杯装饮料茶点打印机
- Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features(2016)
- DNS,FTP,HTTP,DHCP,TFTP,SMTP详解
- 量化交易之深入理解TB系统运行机制
- 记忆测试系统java代码_JAVA课程设计——记忆测试系统(附源程序).doc
- 读计算机成都哪所学校好,成都哪所计算机学校好
- 矩阵分解 (乘法篇)
- 多屏互动技术研究(三)之Airplay研究
- Fiddler怎么抓包?
- 信息部门人员角色划分及任职资格
热门文章
- 运营系统的前世今生(1)
- 年方二八,人生的路口之上
- 全球唯一标识GUID
- ASP.NET AJAX + JSON 实现对象调用
- 整理blog,回味过去的点滴
- [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类
- [论文阅读] (06) 万字详解什么是生成对抗网络GAN?经典论文及案例普及
- [python爬虫] 招聘信息定时系统 (二).调用pyinstaller包生成exe文件
- 【数据结构与算法】之柱状图中最大矩形的求解思路和算法示例
- 546. Remove Boxes 移除盒子