Linux服务器多线程编程

Linux多线程服务器开发笔记

第三章-----多线程服务器适用场合与常用编程模型



前言

本文记录了我阅读《Linux多线程编程》的一些笔记


一、进程与线程

进程是操作系统里的一个非常重要的概念,它是CPU资源分配的基本单位。而线程则是在进程的基础之上衍生而来,它是CPU资源调度的的基本单位。属于同一个进程的多个线程通常可以共享地址空间,从而可以高效的共享数据。而多个进程只能共享代码段,但不能共享数据。

二、单线程常用编程模型

在单线程最常用的编程模式中,恐怕要属"non-blocking + IOmultiplexing"模型,即reactor模型。在这种模型中,程序的基本结构就是一个事件循环(event loop), 以事件驱动和事件回调的方式实现业务逻辑。
reactor的优点是实现简单,效率也不错,不仅可以用于读写socket的连接建立,也可以实现DNS的解析,这些都能够非阻塞实现。对IO密集型程序是一种非常不错的选择。
缺点是对于事件的回调函数必须是非阻塞的。

三、多线程服务器常用模型

1.one loop per thread

在这种模式下,每个IO线程都有一个event loop,即reactor,由于处理事件的读写和定时事件。
这种方式的优点是:
(1)线程数目基本固定,可以在程序启动的时候设置,不会频繁的创建与销毁。
(2)可以很方便的在线程之间调配负载。
(3)IO事件发生的线程是固定的,同一个TCP连接不必考虑事件并发。

2.线程池

使用BlockingQueue实现一个线程池

3.推荐模式

one loop per thread + thread pool
利用event loop 配合非阻塞IO和定时器。
thread pool用来计算,具体可以是任务队列或者生产者消费者队列。
注意:对于loop于thread的初始化数量可以根据阻抗匹配原则来决定。

4.进程间的通信只用TCP

进程间的通信方式有许多种,但是首选的就是tcp方式,其最大的好处在于:可以跨主机,具有伸缩性。1.由于pipe一般是半双工的,所以在使用的时候一般要打开两个文件描述符,不是很方便。
2.tcp port由一个进程独占,程序意外退出的时候,不会给系统留下垃圾,程序重启之后能后比较容易恢复,不需要重启主机。
3.TCP还能够跨语言,适用于不同语言实现的server/client之间的通信。
4.对于TCP这种字节流的传输方式,推荐使用goolge protocol buffers
5.在分布式系统中也推荐用tcp来做长连接通信
好处1:容易定位分布式系统中服务的依赖关系。netstat -tpna | grep:port
好处2:通过接收和发送队列的长度也比较容易定位网络或者程序的故障。

5.多线程服务器适用场景

主要讨论运行一个多线程的进程、运行多个单线程的进程(主进程+worker进程)这两种方式

5.1.必须使用单线程的场景

1.程序可能会fork、
通常在程序fork之后一般会执行两种行为:
①以及执行exec函数族,变为另一个程序。
②不运行exec,继续运行原有的程序,通过共享的文件描述符继续与父进程进行通信,协同完成工作。要么接受都进程传递过来的文件描述符,独自完成工作。
2.限制程序cpu的使用率
单线程的优缺点:
优点:简单
缺点:是非抢占的,容易出现优先级反转的问题。

5.2.适用于多线程的场景

提高响应速度,让IO和计算相互重叠,降低时延。
1.有多个cpu可用。
2.线程间有共享数据。
3.共享数据可以修改
4.提供非均质服务。处理事务有优先级之分,防止出现优先级反转。
5.利用异步操作。
6.能scale up。
7.具有可预测的性能。
8.能够有效的划分责任与功能,让每个线程逻辑比较简单。
线程的分类:
io线程:主循环是io multiplexing,阻塞的等待在select/poll/epoll_wait上。这类也处理定时事件。
计算线程:主要的循环是blocking queue,阻塞的等待条件变量上。一般位于thread pool。
第三方库所用的线程:比如logging线程。


总结

1.thread per connection 并不适用于高并发场景,其扩展性太差。
2.多线程不能提高计算密集型服务的吞吐量。可以降低首次响应时间。
3.把io操作通过blocking queue交到其它线程里面,实现IO和计算相互重叠。
4.阻抗匹配原则。 T = C/P
5.若工作集较大则用多线程,否则,使用单线程多进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值