死锁的四个必要条件
- 互斥条件:一个资源每次只能被一个进程使用。
- 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不可强行占有:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环
ZooKeeper的角色
它是一个分布式服务框架,用于维护配置信息,提供统一命名,分布式状态同步,集群管理等服务。
- 领导者leader:负责进行投票的发起和决议,更新系统状态
- 跟随者follower:接收客户端请求并向客户端返回结果,参与投票
- 观察者observer:接收客户端请求,将写请求转发给leader,不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度
- 客户端client:请求发起方
Zookeeper的工作原理 Paxos帕克索斯
-
为了保证事务的顺序一致性,zookeeper采用了**递增的事务id号(zxid)**来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。zxid是64位的数字,高32位标识leader关系是否改变,低32位递增计数。
-
当leader奔溃或者leader失去超过一半的follower,这时候会进入恢复模式,恢复模式需要重新选举一个 新的leader,让所有server都恢复到一个正确的状态。
-
[帕克索斯]是最重要的分布式一致性算法
-
tips:为了选举成功,要求zookeeper集群部署必须是奇数节点。
-
参与者
- proposer 提出提案,提案信息包括提案编号和提议的value
- acceptor 收到提案后可以接受(accept)提案;
- learner 只能"学习"被批准的提案;
-
prepare阶段:
-
当Proposer希望提出方案V1,首先发出prepare请求至大多数Acceptor。Prepare请求内容为序列号;
-
当Acceptor接收到prepare请求时,检查自身上次回复过的prepare请求
- 如果SN2>SN1,则忽略此请求,直接结束本次批准过程;
- 否则检查上次批准的accept请求(SNx,Vx),并且回复(SNx,Vx);如果之前没有进行过批准,则简单回复OK;
-
-
accept批准阶段
-
经过一段时间,收到一些Acceptor回复,回复可分为以下几种:
- 回复数量满足多数派,并且所有的回复都是,则Porposer发出accept请求,请求内容为议案(SN1,V1);
- 回复数量满足多数派,但有的回复为:(SN2,V2),(SN3,V3)……则Porposer找到所有回复中超过半数的那个,假设为(SNx,Vx),则发出accept请求,请求内容为议案(SNx,Vx);
- 回复数量不满足多数派,Proposer尝试增加序列号为SN1+,转perpare1继续执行;
-
经过一段时间,收到一些Acceptor回复,回复可分为以下几种:
-
回复数量满足多数派,则确认V1被接受;
-
回复数量不满足多数派,V1未被接受,Proposer增加序列号为SN1+,转1继续执行;
-
-
在不违背自己向其他proposer的承诺的前提下,acceptor收到accept 请求后即接受并回复这个请求。
-
-
与
Basic Paxos
选举的区别在于,通过选举产生一个leader (领导者),只有leader才能提交proposer
进程和线程的区别 和 使用场景
- 进程,并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
- 线程,进程的一个执行单元,是处理器调度和执行的基本单位,比进程更小的独立运行的基本单位。
- 协程,比线程更加轻量级的存在
- 根本区别:进程是操作系统资源分配的基本单位,线程是处理器任务调度和执行的基本单位
- **地址空间:**线程贡献本进程的地址空间,进程之间是相互独立的
- **资源:**线程共享进程的内存、IO资源,不利于资源管理和保护;进程之间资源独立
- 健壮: 多进程比多线程健壮,一个进程崩溃后,在保护模式下不会对其他造成影响,线程崩溃整个进程死掉
- 执行过程: 每个独立的进程有一个程序运行的入口、顺序执行序列,执行开销大;线程不能独立执行,依存在应用程序中,开销小。
- **可并发性:**都可并发执行
- 对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
- 要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。
进程间通信的方式有什么?线程间通信的方式有什么?
- 管道 半双工(数据只能在一个方向上流动) 只适用于父子进程或者兄弟进程 存在内存中 速度慢
- 有名管道FIFO 半双工,可以在无关的进程之间交换数据,存在文件系统中 速度慢
- 消息队列 具有特点格式和优先级 可以向消息队列加消息 或者读取 放在内核中
- 信号量 是一个计数器,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据
- 共享内存区:能够很容易控制容量,速度快,但要保持同步
- 线程之间可以通过 管道、信号量通信
缓存和LRU算法
-
缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取。由于缓存的数据比内存快的多,所以缓存的作用就是帮助硬件更快的运行。缓存往往使用的是RAM(断电既掉的非永久存储),所以在用完后还是会把文件送到硬盘等存储器中永久存储。电脑中最大缓存就是内存条,硬盘上也有16M或者32M的缓存。
-
LRU参考:设计LRU缓存结构