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