第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 多线程服务器的常用编程模型

  1. 每个请求创建一个线程,使用阻塞式IO
  2. 使用线程池,同样使用阻塞式IO
  3. non-blocking IO + IO multiplexing
  4. 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章 多线程服务器的适合场合与常用编程模型相关推荐

  1. muduo学习笔记 - 第五章 高效的多线程日志

    第五章 高效的多线程日志 日志有两种意思: 诊断日志 交易日志 本章讲的是前一种日志,文本的供人阅读的日志,通常用于故障诊断和追踪,也可用于性能分析. 日志通常要记录: 收到的每条消息的id(关键字段 ...

  2. muduo学习笔记 - 第4章 C++多线程系统编程精要

    第4章 C++多线程系统编程精要 Pthreads只保证统一进程之内,同一时刻的各个线程的id不同,不能保证同一进程先后多个进程具有不同的id,更不要说一台机器上多个进程之间的id唯一性,pthrea ...

  3. muduo学习笔记 - 第1章 C++多线程系统编程

    第1章 C++多线程系统编程 1.1 智能指针 C++中动态内存管理是用new和delete完成. 动态内存管理经常出现两种问题: 忘记释放内存造成内存泄露 还有指针引用的内存的情况下释放内存,造成引 ...

  4. muduo学习笔记 - 第2章 线程同步精要

    第2章 线程同步精要 2.1 互斥器 (mutex) 互斥器保护了临界区,任何时刻最多只能有一个线程在mutex划出的临界区内活动 推荐使用原则: 用RAII手法封装mutex的创建.销毁.加锁.解锁 ...

  5. NLP学习笔记「第二章」2.2 N-gram Language Models(N元语言模型)

    Language Model words phrase sentence 2.2.1 Unigram Language Models 某个词出现的概率来估计一句话出现的概率 互不相干的独立同分布的词 ...

  6. Java 学习笔记:第一章 Java入门

    Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...

  7. 《Go语言圣经》学习笔记 第五章函数

    <Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...

  8. 计算机网络学习笔记:第二章

    文章目录 计算机网络学习笔记:第二章 前言 2.1.应用层协议原理 2.1.1 网络应用程序体系结构 2.1.2 进程通信 2.1.3 可供应用程序使用的运输服务 2.1.4 因特网提供的传输层服务 ...

  9. 2021-08-31《内网安全攻防》学习笔记,第二章-域内信息收集(转自PowerLiu)

    <内网安全攻防>学习笔记,第二章-域内信息收集 2020-07-212020-07-21 15:08:47阅读 1.1K0 2.1 内网信息搜集概述 当渗透测试人员进入内网后,面对的是一片 ...

最新文章

  1. Zookeeper的安装配置及基本开发
  2. 数据中心空调故障案例集
  3. P6329 【模板】点分树 | 震波
  4. libco协程库上下文切换原理详解
  5. zz在Ubuntu中通过源码安装编译安装软件(MySQL篇)
  6. 房屋户型图设计工具Room Arranger for Mac
  7. 顺序结构—— 华氏温度转摄氏温度
  8. Android报unable to instantiate application怎么解决
  9. 小白用Math对象随机生成一个名字
  10. 接口文档系统 - Yapi
  11. 字美杯装饮料茶点打印机
  12. Deep Crossing: Web-Scale Modeling without Manually Crafted Combinatorial Features(2016)
  13. DNS,FTP,HTTP,DHCP,TFTP,SMTP详解
  14. 量化交易之深入理解TB系统运行机制
  15. 记忆测试系统java代码_JAVA课程设计——记忆测试系统(附源程序).doc
  16. 读计算机成都哪所学校好,成都哪所计算机学校好
  17. 矩阵分解 (乘法篇)
  18. 多屏互动技术研究(三)之Airplay研究
  19. Fiddler怎么抓包?
  20. 信息部门人员角色划分及任职资格

热门文章

  1. 运营系统的前世今生(1)
  2. 年方二八,人生的路口之上
  3. 全球唯一标识GUID
  4. ASP.NET AJAX + JSON 实现对象调用
  5. 整理blog,回味过去的点滴
  6. [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类
  7. [论文阅读] (06) 万字详解什么是生成对抗网络GAN?经典论文及案例普及
  8. [python爬虫] 招聘信息定时系统 (二).调用pyinstaller包生成exe文件
  9. 【数据结构与算法】之柱状图中最大矩形的求解思路和算法示例
  10. 546. Remove Boxes 移除盒子