muduo读书笔记03
来源:互联网 发布:遗传算法tspmatlab程序 编辑:程序博客网 时间:2024/06/10 03:07
进程与线程
粗略的讲,一个进程是”内存中正在运行的程序”。每个进程都有自己独立的地址空间。
这里作者把进程比作人:
- 每个人都有自己的内存(memory)
- 人与人通过谈话来交流(消息传递)
- 谈话可以是面谈(同一个服务器),也可以在电话里谈(不同的服务器,有网络通信)
- 面谈和电话谈的区别是,面谈可以知道对方是否死了(crash,SIGCHLD),而电话谈只能通过周期性的心跳来判断对方是否还活着
有了这些比喻,分布式系统一些术语,可以这样解释:
- 容错: 万一有人死了
- 扩容:新人中途加进来
- 负载均衡:把甲的活儿挪给乙做
- 退休:甲要修复bug,先别派新任务,等他做完手上的事情就把他重启等等各种场景,十分便利
线程的特点是共享地址空间,从而可以高效的共享数据。进程不能共享数据(如果很多共享内存,等于把多进程程序当成多线程写)。多线程的价值是为了更好的发挥多核处理器的效能。
进程间通信只用TCP
Linux下进程通信方式有:匿名管道(pipe)、命名管道(FIFO)、消息队列、共享内存、信号,Socket。
TCP的好处在于:
- 可以跨主机,具有伸缩性
- TCP port由一个进程独占,且操作系统会自动回收(listening port和已建立连接的TCP socket都是文件描述符,在进程结束时,操作系统会关闭所有文件描述符)
- TCP还能跨语言,服务端和客户端不必使用同一种语言
- TCP连接是可再生的,连接的任何一方都可以退出再启动,重建连接之后就能继续工作,这对开发牢靠的分布式系统意义重大。
多线程适用场景
提高响应速度,让IO和”计算”相互重叠,降低延迟。
一个程序要做成多线程,大致要满足:
- 有多个CPU核可用
- 线程间有共享数据,即内存中的全局状态
- 共享的数据是可以修改的,而不是静态的常量表
- 提供非均质的服务(事件的响应应该有优先级)
- 延迟和吞吐量同样重要,不是逻辑简单的IO bound或CPU bound程序。换言之,程序需要有相当的计算量
- 利用异步操作
- 可扩展
- 具有可预测的性能。随着负载增加,性能缓慢下降,超过某个临界点之后会急速下降
- 多线程能有效地划分责任与功能,让每个线程的逻辑比较简单,任务单一,便于写代码。
线程的分类
- IO线程,这类线程的主循环是IO multiplexing,阻塞地等在select/poll/epoll_wait系统调用上。这类线程也处理定时时间。当然它的工程不止IO,有些简单计算也可以放入其中,比如消息的编码或解码
- 计算线程,这类线程的主循环是blocking queue,阻塞地等在condition variable上。这类线程一般位于thread pool中。这种线程通常不涉及IO,一般要避免任何阻塞操作。
- 第三方库所用的线程,比如logging,又比如database connection
- muduo读书笔记03
- muduo读书笔记01
- muduo读书笔记02
- C++中的内存错误(muduo读书笔记)
- Linux多线程服务器端编程:使用muduo C++网络库 读书笔记
- 浅析muduo库中的线程设施03
- muduo Accept
- muduo启程
- muduo总结
- muduo总结
- 学习 muduo。
- muduo:互斥量
- muduo : StringPiece
- muduo : Thread
- muduo : AtomicInteger
- muduo : MutexLock
- muduo : Condition
- muduo : ThreadPool
- AndroidStudio 2.3.3 百度云盘地址
- 树莓派ubuntu mate 修改屏幕解析度为800x480
- ubuntu 安装redis3.2 配置远程连接
- 我奋斗了18年才和你坐在一起喝咖啡
- 剑指offer——两个链表的第一个公共结点
- muduo读书笔记03
- 游戏编程入门(16):教游戏思考
- 解决docker中容器安装软件报E: Unable to locate package的错误
- HDU 1812 Count the Tetris (Polya计数,高精度)
- 你凭什么上北大
- day09 JavaScrip
- Python中控制语句
- Android 常用工作命令
- test