分布式系统的进程组织
Posted 白水baishui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式系统的进程组织相关的知识,希望对你有一定的参考价值。
文章目录
1. 进程和线程
进程在分布式系统中形成一个构建块,由操作系统维护,对用户来说,它是不可见的(透明)。
一个进程中允许有多个控制线程:
进程上下文 | 线程上下文 |
---|---|
地址空间列表 | 优先级和执行状态 |
通信接口 | 处理器寄存器 |
信号量,以及其他同步对象 | 软件中断处理信息 |
线程标识符列表 | 执行环境标识符 |
进程的缺点:
- 在单线程进程中,每当阻塞I/O 系统调用被执行时,整个进程都会被阻塞;
- 创建进程和进程上下文切换的成本很高。
2. 非分布式系统中的线程
在非分布式系统(单机)中线程是如何作用的呢?我们举一个例子:若现在有一请求,需要处理2ms,需要IO 8ms,则每秒钟能处理请求数为:
- 单线程进程
1000 / ( 2 + 8 ) = 100 个 1000/(2+8)=100个 1000/(2+8)=100个 - 两线程进程
按流水线执行 ( 1000 − 2 ) / 8 = 125 个 (1000-2)/8=125个 (1000−2)/8=125个 - 命中cache的两线程进程
假设cache有75%的命中率,命中后IO时间减短为0.5ms ( 1000 − 2 ) / 8 ∗ 0.25 + ( 1000 ) / 2 ∗ 0.75 = 406 个 (1000-2)/8*0.25+(1000)/2*0.75=406个 (1000−2)/8∗0.25+(1000)/2∗0.75=406个 - 二核的命中cache的两线程进程
444 个 444个 444个
2.1. 最佳线程池大小
线程池技术相比于实时创建线程而言,它节省了线程创建的开销,但又带来了线程池的维护(并发控制、线程上下文切换)的开销。要发挥出线程池的最大作用,就要选取一个合适的线程池大小: 总 收 益 = 线 程 创 建 开 销 - 线 程 管 理 开 销 总收益 = 线程创建开销 - 线程管理开销 总收益=线程创建开销-线程管理开销当总收益达到最大值时的线程数为最佳线程数。
为了找出最佳线程池大小,我们首先目前如下概念:
- 线程的创建开销
创建一个线程的开销主要体现在内存分配的时间上,若一个线程的创建开销是 c 1 c_1 c1,那么创建 n n n 个线程的开销为 c 1 × n c_1\\times n c1×n; - 线程池维护开销
线程池中线程的维护开销主要体现在线程的上下文切换所需的时间上。若一次线程上下文切换开销为 x x x,那么 n n n 个线程的线程池切换开销就为 n × x n \\times x n×x;若维护1个线程的线程池开销为 c 2 c_2 c2,那么 n n n 个线程的线程池维护开销为 c 2 × n ≈ x × n c_2 \\times n \\approx x \\times n c2×n≈x×n; - 并发的请求数目
实际系统中,每一时刻并发的请求数目 r r r 是一个随机的值,设 f ( r ) f(r) f(r)为 r r r 的概率分布函数;
那么可以分析得到线程池的收益情况:
线程池的开销 | 无线程池时的开销 | 线程池的收益 | |
---|---|---|---|
0 ⩽ r ⩽ n 0\\leqslant r \\leqslant n 0⩽r⩽n | c 2 × n c_2\\times n c2×n | c 1 × n c_1\\times n c1×n | c 1 × r − c 2 × n c_1\\times r-c_2\\times n c1×r−c2×n |
n ⩽ r n \\leqslant r n⩽r | c 2 × n + c 1 × ( r − n ) c_2\\times n + c_1\\times (r-n) c2×n+c1×(r−n) | c 1 × n c_1\\times n c1×n | c 1 × n − c 2 × n c_1\\times n-c_2\\times n c1×n−c2×n |
那么线程池预期收益为: E ( n ) = ∑ r = 0 n ( c 1 ⋅ r − c 2 ⋅ n ) ⋅ f ( r ) − ∑ r = n + 1 ∞ ( c 1 ⋅ n − c 2 ⋅ n ) ⋅ f ( r ) E(n)=\\sum_r=0^n(c_1·r-c_2·n)·f(r)-\\sum_r=n+1^\\infty(c_1·n-c_2·n)·f(r) E(n)=r=0∑n(c1⋅r−c2⋅n)⋅f(r)−r=n+1∑∞(c1⋅n−c2⋅n)⋅f(r)将其连续化,得: E ( n ) = ∫ 0 n ( c 1 ⋅ r − c 2 ⋅ n ) ⋅ f ( r ) d r − ∫ n + 1 ∞ ( c 1 ⋅ n − c 2 ⋅ n ) ⋅ f ( r ) d r E(n)=\\int_0^n(c_1·r-c_2·n)·f(r)\\textdr-\\int_n+1^\\infty(c_1·n-c_2·n)·f(r)\\textdr E(n)=∫0n(c1⋅r−c2⋅n)⋅f(r)dr−∫n+1∞(c1⋅n−c2⋅n)⋅f(r)dr导数为零即为极值点,即: d E d n = − c 2 + c 1 ⋅ ∫ n ∞ p ( r ) d r = 0 \\frac\\textdE\\textdn=-c_2+c_1·\\int_n^\\inftyp(r)\\textdr=0 dndE=−c2+c1⋅∫n∞p(r)dr=0
令 ζ = c 2 / c 1 \\zeta=c_2/c_1 ζ=c2/c1,且 n ∗ n^* n∗ 为 E ( n ) E(n) E(n) 取得最大值时的 n n n 值,那么有: ∫ 0 ⌊ n ∗ ⌋ p ( r ) d r ⩽ 1 − ζ < ∫ 0 ⌊ n ∗ + 1 ⌋ p ( r ) d r \\int_0^\\lfloor n^* \\rfloorp(r)\\textdr \\leqslant 1-\\zeta <\\int_0^\\lfloor n^*+1 \\rfloor p(r)\\textdr ∫0以上是关于分布式系统的进程组织的主要内容,如果未能解决你的问题,请参考以下文章