线程池和进程池

1、线程池

https://www.zhihu.com/question/27908489/answer/355105668 demo见:D:\Github\Storage\c++\standard_library\thread\thread_pool.c

1-1、介绍

第一个问题是创建线程所需的时间多少,以及线程在完成工作之后会被丢弃的事实。第二个问题更为麻烦,如果允许所有并发请求都通过新线程来处理,那么我们没有限制系统内的并发执行线程的数量。无限制的线程可能耗尽系统资源,如 CPU 时间和内存。解决这个问题的一种方法是使用线程池。

线程池的主要思想是:在进程开始时创建一定数量的线程,并加到池中以等待工作。当服务器收到请求时,它会唤醒池内的一个线程(如果有可用线程),并将需要服务的请求传递给它。一旦线程完成了服务,它会返回到池中再等待工作。如果池内没有可用线程,那么服务器会等待,直到有空线程为止。

线程池具有以下优点: 用现有线程服务请求比等待创建一个线程更快。 线程池限制了任何时候可用线程的数量。这对那些不能支持大量并发线程的系统非常重要。 将要执行任务从创建任务的机制中分离出来,允许我们采用不同策略运行任务。例如,任务可以被安排在某一个时间延迟后执行,或定期执行。

池内线程的数量可以通过一些因素来加以估算,如系统 CPU 的数量、物理内存的大小和并发客户请求数量的期望值等。更为高级的线程池架构可以根据使用模式动态调整池内线程数量。这类架构在系统负荷低时,提供了较小的池,从而减低内存消耗(如 Apple的大中央调度)。

1-2、分类

各种各样的线程池,包括最简单固定线程数的、运行时动态调整线程数的、有存活时间的、有任务队列长度限制的、底层用纤程的、支持多个线程池合并以复用资源的、脱离管程完全从底层实现的(仅以 POSIX 中 Futex 作为同步原语)、支持定时任务的、支持批量提交的、支持 Future 的等等。

2、进程池

https://zhuanlan.zhihu.com/p/397590343

3、新词汇:纤程和协程的区别

https://www.zhihu.com/question/23955356 ()[https://img-blog.csdnimg.cn/20200725105231269.png] coroutine通常是说, 啊, 我正在等待一些事, 线程(调度者)啊你叫其他人先做吧. coroutine是排队做任务, 一张办公桌只给一个人用, 谁脑袋卡住了没事干就自觉把桌子上的东西打包走, 以后回来的话, 就跑去队列后面继续排fiber则是, 我暂时没事干, 你(另外一个fiber)先做. fiber是主动决策哪个是接棒的fiber, 让另外一个fiber继续执行任务.

纤程包含独立的目态栈,寄存器状态的控制信息·目态控制的纤程转接要求较高的编程经验·由于纤程属于目态对象,一个纤程被封锁意味着所在线程被封锁·应用程序可以通过ConvertThreadToFiber将线程转换为纤程·与线程对比,纤程具有切换速度快的特点·

进程:是操作系统资源分配的基本单位,比如内存、打开文件、网络IO,分配了独立的内存空间 线程:是操作系统资源调度的基本单位,cpu分配的基本单位 纤程:是用户态的线程,是线程中的线程,切换和调度不需要经过OS(操作系统)。;轻量级的线程 - 线程

4、目态与管态

大多数计算机系统将CPU执行状态分为目态与管态。CPU的状态属于程序状态字PSW的一位。CPU交替执行操作系统程序和用户程序。 管态又叫特权态,系统态或核心态。CPU在管态下可以执行指令系统的全集。通常,操作系统在管态下运行。 目态又叫常态或用户态。机器处于目态时,程序只能执行非特权指令。用户程序只能在目态下运行,如果用户程序在目态下执行特权指令,硬件将发生中断,由操作系统获得控制,特权指令执行被禁止,这样可以防止用户程序有意或无意的破坏系统。 从目态转换为管态的唯一途径是中断。 从管态到目态可以通过修改程序状态字来实现,这将伴随这由操作系统程序到用户程序的转换。

5、管程

https://www.zhihu.com/question/30641734

打一个相对形象的比喻:人们到一家叫做计算机的银行取钱,这个银行里面就一个空窗口。最早之前,每个人需要从这个窗口爬进去取钱。这里,银行里面每一个需要取钱的人看作进程,而银行里面的钱可以看做计算机的共享资源,一般是硬件设备或一群共享变量。每个人都向窗口拥挤,场面混乱不堪。后面计算机银行不断改进,发明了一种叫ATM的机器(管程),ATM(管程)封装了钱和对外开放了一些存取钱的操作。这样一来,ATM(管程)在计算机银行的钱和客户之间担任了中介服务的角色。在一个相对封闭的屋子里面,一次只能服务一个人(让进程互斥使用)。ATM屋子里面有人的时候,其他需要依次排队使用。一个人(进程)在ATM使用的时间太长也不行,所以需要一个条件变量(condition)来约束他。条件变量可以让一个线程等待时让另一线程进入管程,这样可以有效防止死锁。

6、

对于“线程池”这类“并发组件”而言,如果我们的目标是“尽善尽美”的话,C++ 的实现难度无疑更大;为了更好的性能,我们也有可能针对不同的平台选择不同的原语。但如果不需要追求这种“理论上的最优”,用 C++ 写一个高性能线程池也并没有大家想象中的那么复杂;只要你可以熟练使用管程(即 std::mutex 和 std::condition_variable)就足够了。

results matching ""

    No results matching ""