并发编程模型——多线程、IO复用与Redis
多线程缺点
- 每个线程与主程序共用地址空间,受限于2GB地址空间;
- 线程之间的同步和加锁控制比较麻烦;
- 一个线程的崩溃可能影响到整个程序的稳定性;
- 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数; 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU
多线程如何确定线程数量
辩证关系: 多线程的目的和优势在于提高CPU利用率,但是线程间的切换存在开销。
引自参考文献2:
- 对于任务耗时短的情况,要求线程尽量少,如果线程太多,有可能出现线程切换和管理的时间,大于任务执行的时间,那效率就低了;
- 对于耗时长的任务,要分是cpu任务,还是io等类型的任务。如果是cpu类型的任务,线程数不宜太多;但是如果是io类型的任务,线程多一些更好,可以更充分利用cpu。
所以高并发,低耗时的情况:建议少线程,只要满足并发即可。例如并发100,线程池可能设置为10就可以。低并发,高耗时的情况:建议多线程,保证有空闲线程,接受新的任务。例如并发10,线程 池可能就要设置为20。高并发高耗时:1要分析任务类型,2增加排队,3、加大线程数。
IO复用缺点
单线程模型不能有阻塞,一旦发生任何阻塞(包括计算机计算延迟)都会使得这个模型不如多线程。另外,单线程模型不能很好的利用多核cpu。
Redis单线程的思考
Redis是数据库操作,所以属于高并发高IO耗时的任务类型。由于其设计在内存中,数据读写很快,于是退化成高并发低耗时,结合上述对多线程的分析,线程不宜过多。
参考资料