1.分布式系统的意义
1.1 分布式系统产生的原因
- 升级单机处理能力的性价比越来越低
- 单机处理能力存在瓶颈
- 出于稳定性和可用性的考虑
2.分布式系统的基础知识
2.1 组成计算机的五要素
如图所示,分别是输入和输出设备,运算器,控制器和存储器。其中存储器又分成了内存和外存,在计算机断电时内存中存储的数据会丢失,但是外存可以保持存储的数据。
2.2 线程和进程
2.2.1 Amadal定律
这个公式告诉我们,程序中可并行代码的比例决定增加处理器(总核心数)所能带来的速度提升的上限。
公式中的P指的是程序中可以并行运行部分的程序在单核上执行时间的占比,N表示处理器的个数(总核心数)。S(N)是指程序在N个处理器(总核心数)相对在单个处理器(单核)中的速度提升比。
当P=0.5时,可以算出速度提升上限就是2.如果P=0.2,速度提升上限就是1.25
2.2.2 互不通信的多线程模式
首先看不进行交互的模式,在多线程程序中,多个线程在系统中会并发执行。如果线程之间不需要处理共享的数据,也不用进行动作协调就会非常简单,也就是多个独立的线程各自完成自己线程中的工作。
2.2.3 基于共享容器协同的多线程模式
在需要多个线程之间对共享数据进行处理的场景下,例如生产者和消费者的例子,有一个队列用于生产和消费,那么这个队列就是多个线程会共享的一个容器或者是数据对象,多个线程会并发的访问这个队列
在多线程环境下对临界数据的访问,需要保证数据的一致性。对于存储数据的容器或者对象,有线程安全和不安全两种。
对于线程不安全的,可以通过加锁或者Copy On Write的方式来控制并发控制。使用加锁的方式时,如果数据的读写比例很高,一般会使用读写锁来优化。
对于线程安全的容器或者对象,可以直接在多线程的环境下使用,有些支持并发的类的效率会比直接加互斥锁的实现更好,最典型的就是JUC包下的类。
2.2.3 基于事件协同的多线程模式
除了并发访问的控制,线程间会存在着协调的需求,比如A,B两个线程,B到等到某个状态或者事件发生后才能继续工作,而这个状态或者事件和A线程有关,此时就需要线程间的协调。
如下图所示,右边线程在某个步骤时一直阻塞直到事件通知到达后才继续自己的执行。
需要注意的是要调整对多个锁的获取顺序,避免死锁。