一些很常见的概念

活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

单点故障:在分布式集群环境中,如果只有一个master,当这个master宕机后,导致整个集群不能正常工作的情况。

像zoomkeeper这类通过协调,以及分布式锁解决了此类问题。(个人理解是因为有了leader选举,当某一个leader宕机后,会选举出重新的leader,所有不会出现单点故障)

同构系统:将存储节点分为若干组,每个组内的节点服务完全相同的数据,其中有一个节点为主节点,其他节点为备节点。由于同一个组内的节点服务相同的数据,这样的系统称为同构系统。

缺点:增加副本需要迁移的数据量太大,拷贝数据的过程中存储节点再次发生故障的概率很高,这样的架构很难做到自动化,不适用大规模分布式存储系统。

大规模分布式系统要求具有线性可扩展性,即随时加入或者删除一个或者多个存储节点,系统的处理能力与存储节点的个数成线性关系。

为了实现线性可扩展性,存储系统的存储节点之间是异构的。

异构系统:异构系统将数据划分为很多大小接近的分片,每个分片的多个副本可以分布到集群中的任何一个存储节点。如果某个节点发生故障,原有的服务将整个集群而不是某几个固定的存储节点来恢复。

写时复制(Copy-on-write):在写的同时复制,目的在于修改操作不影响读取,读取操作永远不会被阻塞。

惊群效应:多个进程或者线程在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒。 唤醒后通常只有一个进程获得了该事件并进行处理,其他进程发现获取事件失败后又继续进入了等待状态,在一定程度上降低了系统性能。

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。

无状态(stateless):是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立的,没有上下文关系。

这种服务最大的缺点是无法处理乱序和重复的IP数据报。比如发送端发送出的第N个IP数据报可能比第N+1个IP数据报后到达接收端,而同一个IP数据报也可能经过不同的路径多次到达接收端。在这两种情况下,接收端的IP模块无法检测到乱序和重复,因为这些IP数据报之间没有任何上下文关系。

接收端的IP模块只要收到了完整的IP数据报(如果是IP分片的话,IP模块将先执行重组),就将其数据部分(TCP报文段、UDP数据报或者ICMP报文)上交给上层协议。那么从上层协议来看,这些数据就可能是乱序的、重复的。

面向连接的协议,比如TCP协议,则能够自己处理乱序的、重复的报文段,它递交给上层协议的内容绝对是有序的,正确的。

虽然IP数据报头部提供了一个标识字段用以唯一标识一个IP数据报,但它是被用来处理IP分片和重组的,而不是用来指示接收顺序的。

无状态服务的优点:简单、高效。无须为了保持通信的状态而分配一些内核资源,也无须每次传输数据时都携带状态信息。常见的无状态协议有:UDP协议,HTTP协议,以HTTP协议为例,一个浏览器的连续两次网页请求之间没有任何关联,它们将被web服务器独立地处理。

无连接(connectionless):是指IP通信双方都不长久地维持对方的任何信息。这样,上层协议每次发送数据的时候,都必须明确指定对方的IP地址。

在UNIX/Linux中,正常情况下,子进程时通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。于是就产生了孤儿进程和僵尸进程。

孤儿进程:是指一个父进程退出后,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程:指一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称为僵尸进程。当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

CAP定理:一个分布式系统不可能同时满足一致性(C: Consistency) 、可用性(A:Availability)和分区容错性(P: Partition tolerance)这三个基本要求,最多只能同时满足其中两项。

BASE理论:是Basically Available(基本可用),Soft state(软状态)和 Eventually consistency(最终一致性)的简写。

I/O模型对比
I/O模型读写操作和阻塞阶段
阻塞I/O程序阻塞于读写函数
I/O复用

程序阻塞于I/O复用系统调用,但可同时监听多个I/O事件。对I/O本身的读写操作是非阻塞的

SIGIO信号信号触发读写就绪事件,用户程序执行读写操作。程序没有阻塞阶段
异步I/O内核执行读写操作并触发读写完成事件。程序没有阻塞阶段

同步/异步:在I/O模型 中,”同步“和”异步“区分的是内核向应用程序通知的是何种I/O事件(是就绪事件还是完成事件),以及该由谁来完成I/O读写(是应用程序还是内核)。

在并发模式中,”同步“指的是程序王权按照代码序列的顺序执行;”异步“指的是程序的执行需要由系统事件来驱动。

select、poll和epoll的区别
系统调用selectpollepoll
事件集合

用户通过3个参数分别传入感兴趣的可读、可写和异常等事件,内核通过对这些参数的在线修改来反馈其中的就绪事件。这使得用户每次调用select都要重置这三个参数

统一处理所有事件类型,因此只需一个事件集参数。用户通过pollfd.events传入感兴趣的事件,内核通过修改poll.revents反馈其中就绪的事件内核通过一个事件表直接管理用户感兴趣的所有事件。因此每次调用epoll_wait时,无须反复传入用户感兴趣的事件。epoll_wait系统调用的参数events仅用来反馈就绪的事件
应用程序索引就绪文件描述符的事件复杂度O(n)O(n)O(1)
最大支持文件描述符数一般有最大值限制6553565535
工作模式LTLT支持ET高效模式
内核实现和工作效率采用轮询方式来检测就绪事件,算法事件复杂度为O(n)采用轮询方式来检测就绪事件,算法事件复杂度为O(n)采用回调方式来检测就绪事件,算法事件复杂度为O(1)

可串行化和可线性化的区别

可串行化:可串行化是事务的隔离属性,其中每个事务可以读写多个对象(行、文档、记录等)。它用来确保事务执行的结果与串行执行(即每次执行一个事务)的结果完全相同,即使串行执行的顺序可能与事务实际执行顺序不同。

可线性化:可线性化是读写寄存器(单个对象)的最新值保证。它并不要求将操作组合到事务中,因此无法避免写倾斜等问题,除非采取其他额外错误。

弱一致性,强一致性,最终一致性的区别?

https://my.oschina.net/xianggao/blog/541003

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

数据库中的各种锁

独占锁:独占锁的锁粒度是行或者是多行。只允许锁定操作的程序使用,其他任何对它的操作均不被接收。当对象有其他锁的时候,无法对其加独占锁

共享锁:共享锁的锁粒度是行或者多行。当被锁定后其他程序可以读,但不能修改它

更新锁:更新锁是为了防止死锁的。当数据库要更新数据时,它对数据对象做更新锁锁定,这样数据不能被修改,但可以读取。等到确定是要更新数据时才会自动将更新锁换成独占锁。

从程序员的角度看锁有两类:

  • 乐观锁:程序员很高兴。程序代码不需要做任何事情,数据库自己加锁
  • 悲观锁:需要程序员自己手动加锁处理

CAS算法:compare and swap(比较和交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)

CAS算法涉及到三个操作数:

  • 需要读写的内存值V
  • 进行比较的值A
  • 拟写入的新值B

当且仅当V的值等于A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作),一般情况下是一个自旋操作,即不断地重试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值