《 九 阴 真 经 卷 七 》后端心法

《 九 阴 真 经 卷 七 》后端心法

一、 进程

1. 进程、线程和协程的区别

  • 进程(Process):
    • 进程是操作系统进行资源分配和调度的基本单位,每个进程都有自己独立的内存空间, 包括代码段、数据段、堆栈等
    • 进程之间相互独立,一个进程崩溃通常不会影响其他进程
    • 进程间通信比较复杂,通常需要借助操作系统提供的机制,如管道、消息队列、共享内存等
    • 创建和销毁进程的开销比较大
  • 线程(Thread):
    • 线程是进程中的实体,一个进程可以包含多个线程,它们共享进程的资源,如内存空间、文件描述符等
    • 线程之间可以方便地共享数据,通信比较简单,但需要注意线程同步和互斥
    • 线程的创建和销毁比进程要快,因为线程共享进程的资源
  • 协程(Coroutine):
    • 协程是一种用户态的轻量级线程,由程序员控制调度,可以在特定的时机暂停和恢复执行
    • 协程可以在同一个线程内实现并发,避免了线程切换的开销,提高了程序的运行效率
    • 协程通常用于处理大量I/O密集型任务,如网络编程、异步编程等
  • 总的来说,进程是资源分配的基本单位,线程是CPU调度的基本单位,而协程是程序设计的一种方式,用于提高程序的并发性能和简化编程模型

2. 进程之间如何通信

  • 管道(Pipe):
    匿名管道是一种半双工通信方式,适用于具有亲缘关系的进程间通信。一个进程写入管道,另一个进程从中读取数据。
  • 命名管道(Named Pipe):
    也称为FIFO(First In, First Out),允许无亲缘关系的进程间进行通信。与匿名管道不同,它们以文件形式存在于文件系统中
  • 信号(Signal):
    进程可以向另一个进程发送信号,用于通知某些事件的发生。例如,进程终止信号(SIGTERM)可以请求进程终止
  • 消息队列(Message Queues):
    进程可以通过消息队列发送和接收消息。这些消息遵循特定的格式,允许进程之间交换数据
  • 共享内存(Shared Memory):
    多个进程可以访问同一块内存区域,这样它们可以直接交换数据,而无需进行数据复制
  • 信号量(Semaphores):
    用于进程间同步的计数器。进程可以增加或减少信号量的值,以实现对共享资源的访问控制
  • 套接字(Sockets):
    套接字允许不同计算机上的进程进行通信。这种方法通常用于网络编程,但也可以在同一台计算机上进行进程间通信。
  • 文件(File):
    进程可以通过读写共享文件来进行通信。一个进程写入文件,另一个进程读取文件中的数据

3. 何时会触发进程的上下文切换

  • 时间片用完:
    在操作系统中,每个进程被分配一个时间片(时间量),当时间片用完时,操作系统会将 CPU 控制权从当前运行的进程切换到另一个进程,这就是因时间片用完而引起的进程上下文切换
  • 进程等待:
    当一个进程需要等待某些事件发生(如 I/O 操作完成、信号的到来等),操作系统会将该进程挂起,并切换到另一个就绪的进程执行,这也会导致进程的上下文切换
  • 多任务调度:
    操作系统的多任务调度机制会导致进程之间的切换,以便让多个进程共享 CPU 时间,实现多任务并发执行
  • 中断处理:
    当硬件中断发生时(如定时器中断、I/O 完成中断等),当前运行的进程会被中断处理程序所取代,这也会引起进程的上下文切换
  • 进程间通信:
    在进行进程间通信时,比如管道、消息队列、共享内存等方式,会涉及不同进程之间的切换,从而引发进程的上下文切换
  • 进程的上下文切换是一种开销较大的操作,因为涉及到保存当前进程的状态(如寄存器值、程序计数器等)并加载下一个进程的状态。因此,减少不必要的进程上下文切换对系统性能是有益的

二、IO

1. 阻塞与非阻塞、同步和异步

  • 阻塞与非阻塞:
    • 阻塞:
      当一个任务在执行过程中需要等待某个操作完成后才能继续执行时,该任务会被称为阻塞的。在阻塞状态下,任务会一直等待,直到所需的操作完成
    • 非阻塞:
      相对于阻塞,非阻塞是指一个任务在等待某个操作完成时,不会阻塞自己的执行,而是会继续执行其他操作。任务会通过轮询或回调等方式来检查所需操作是否完成
  • 同步和异步:
    • 同步:
      同步是指一个任务发出一个操作请求后,需要等待这个操作完成后才能继续执行后续的操作。在同步操作中,任务会一直等待操作完成,然后才能继续执行
    • 异步:
      异步是指一个任务发出一个操作请求后,不需要等待这个操作完成,而是可以继续执行后续的操作。在异步操作中,任务会继续执行,而不必等待操作完成,通常通过回调、事件通知等方式来处理操作完成后的结果
  • 阻塞与非阻塞描述了任务等待操作完成时的行为方式,阻塞会一直等待操作完成,而非阻塞会继续执行其他操作。同步和异步描述了任务发出操作请求后的执行模式,同步需要等待操作完成后才能继续执行,而异步可以继续执行后续操作而不必等待
  • 参考:
    • https://blog.csdn.net/wangpaiblog/article/details/117236684
    • https://www.cnblogs.com/linkenpark/p/12376343.html

阻塞:

当一个进程被阻塞时,通常是因为它在等待某些事件发生或某些条件满足。进程可能会被阻塞在以下情况下等待:

  1. I/O操作:进程执行了一个需要等待I/O完成的操作,比如从磁盘读取数据、从网络接收数据等。在这种情况下,进程会被阻塞,直到I/O操作完成。

  2. 资源不可用:进程需要访问一些资源,但资源当前不可用,比如需要获取一个锁,但锁被其他进程持有。进程会被阻塞,直到资源可用。

  3. 进程间通信:进程在等待其他进程发送消息或信号,或者在等待其他进程响应其消息。

  4. 信号:进程可能被挂起等待接收信号,比如中断信号或其他进程发送的信号。

  5. 条件变量:在多线程编程中,一个线程可能会等待另一个线程改变某个条件变量的状态,从而决定是否继续执行。

  6. 定时器:进程可能会被阻塞等待某个定时器事件发生,比如等待一个定时器超时。

总的来说,进程阻塞时是在等待某些事件的发生或某些条件的满足,一旦这些事件或条件满足,进程就可以继续执行。在操作系统中,进程的阻塞和唤醒是由调度器和内核来管理和控制的

2. IO模型

  • 阻塞IO模型:
    在阻塞IO模型中,当应用程序发起IO操作时,程序会被阻塞直到IO操作完成。这意味着应用程序在等待IO操作完成期间无法执行其他任务
  • 非阻塞IO模型:
    在非阻塞IO模型中,应用程序发起IO操作后,会立即返回并继续执行后续任务,而不会被阻塞。应用程序需要通过轮询或其他方式来检查IO操作是否完成
  • IO多路复用模型:
    IO多路复用模型通过select、poll、epoll等机制,允许应用程序同时监视多个IO操作,当其中任何一个IO操作就绪时,应用程序可以进行处理。这种模型可以避免阻塞,提高IO效率
  • 信号驱动IO模型:
    信号驱动IO模型使用信号来通知应用程序IO操作的完成。应用程序发起IO操作后,可以继续执行其他任务,当IO操作完成时,操作系统会向应用程序发送信号来通知
  • 异步IO模型:
    在异步IO模型中,应用程序发起IO操作后,可以继续执行其他任务而无需等待IO操作完成。当IO操作完成时,操作系统会通知应用程序。异步IO模型需要操作系统或框架的支持

3. IO多路复用

  • IO多路复用是一种IO模型,通过这种模型,应用程序可以同时监视多个IO操作,当其中任何一个IO操作就绪时,应用程序可以进行处理,而不需要阻塞等待。这种模型可以提高IO效率,减少资源的浪费。在Unix/Linux系统中,常见的IO多路复用机制有select、poll和epoll
  • select:
    select是最古老的IO多路复用机制之一。应用程序可以通过select监视多个文件描述符(sockets、文件等),当其中任何一个文件描述符准备好进行IO操作时,select函数就会返回,应用程序可以进行相应的IO操作
  • poll:
    poll与select类似,也可以用于监视多个文件描述符。相较于select,poll没有文件描述符数量的限制,但在处理大量文件描述符时效率可能较低
  • epoll:
    epoll是Linux特有的高性能IO多路复用机制。epoll使用事件通知的方式来进行IO操作,应用程序通过epoll_ctl注册文件描述符和事件,当文件描述符准备好时,操作系统会通知应用程序。epoll支持水平触发和边缘触发两种模式,边缘触发模式只在状态变化时通知应用程序
  • IO多路复用适用于需要同时监视多个IO操作的场景,如服务器程序中需要处理多个客户端连接。通过IO多路复用,可以避免创建大量线程或进程来处理IO操作,提高系统的性能和效率

4. Epoll

epoll 是 Linux 下高效的 I/O 多路复用机制,用于处理大量文件描述符的 I/O 事件。它可以显著提高服务器程序的性能,特别是在需要处理大量并发连接的情况下。epoll 基于事件通知机制,通过内核与用户空间共享一个事件表,提供了三个系统调用:epoll_create、epoll_ctl 和 epoll_wait。
下面是 epoll 的主要实现原理和特点:

  • 事件驱动:epoll 是事件驱动的,当一个文件描述符上有事件发生时,内核会通知应用程序,应用程序可以对这些事件进行处理。这种机制避免了应用程序不断地轮询文件描述符状态,提高了效率
  • 高效的事件注册和删除:epoll 通过 epoll_ctl 系统调用来注册和删除事件,可以动态地增加或删除关注的文件描述符,而不需要重新建立事件集合
  • 内核与用户空间共享事件表:epoll 将事件表放在内核空间,应用程序通过 epoll_create 创建一个 epoll 实例,然后通过文件描述符来操作这个 epoll 实例。这样可以避免了不必要的内存拷贝,提高了效率
  • 水平触发和边缘触发模式:epoll 支持两种工作模式,分别是水平触发(Level-Triggered)和边缘触发(Edge-Triggered)。在水平触发模式下,只要文件描述符上有事件发生,epoll_wait 就会返回;而在边缘触发模式下,只有当文件描述符上的事件状态发生变化时才会返回
  • 适用于大规模并发连接:epoll 适用于需要处理大量并发连接的场景,比如 Web 服务器、聊天服务器等。它可以高效地管理大量的文件描述符,避免了传统的轮询方式带来的性能问题
  • 总的来说,epoll 是一种高效的 I/O 多路复用机制,通过事件驱动的方式实现了高性能的事件处理,适用于需要处理大量并发连接的场景

epoll使用的数据结构
在Linux内核中,epoll 使用了以下几种主要的数据结构来实现其功能:

  • epoll数据结构:struct epoll_event 是 epoll 中的关键数据结构,用于描述事件的属性。它包含了事件的类型(读、写、错误等)、关联的文件描述符等信息
  • 红黑树(Red-Black Tree):epoll 使用红黑树来存储关注的文件描述符。在内核中,每个 epoll 实例都有一个红黑树,用于快速查找和管理需要监控的文件描述符
  • 双向链表(Doubly Linked List):epoll 还使用双向链表来存储就绪的事件,即那些已经发生了 I/O 事件的文件描述符。这个链表用于保存就绪事件的信息,以便应用程序在调用 epoll_wait 时能够获取到这些事件
  • 事件表:epoll 事件表是一个数组,用于存储发生的事件。当调用 epoll_wait 时,内核会将就绪的事件填充到这个数组中,应用程序再通过遍历这个数组来处理就绪事件

这些数据结构的结合使得 epoll 能够高效地管理大量的文件描述符和事件,实现高性能的 I/O 多路复用机制。通过红黑树和双向链表的组合,epoll 能够快速地查找和管理文件描述符,并且在事件就绪时能够高效地通知应用程序

三、并发

1. 反应堆

反应堆模型(Reactor pattern)是一种用于处理并发I/O事件驱动应用程序的设计模式。在高性能的网络编程中,这种模式特别有用,因为它可以处理大量并发连接,同时保持较低的资源消耗。
反应堆模型基于事件驱动,主要思想是将事件的监听和事件的处理分离开来。应用程序会创建一个或多个事件处理器(Event Handlers),它们定义了如何处理特定事件。事件分发器(Event Demultiplexer)负责等待和通知事件的发生

反应堆模式的主要组件包括:

  1. 事件源(EventSources): 产生事件的组件,如网络套接字、文件描述符等
  2. 事件处理器(Event Handlers): 定义了事件发生时应该执行的操作,比如读取数据、写入数据、关闭连接等
  3. 事件分离器(Event Demultiplexer): 等待事件发生的组件,并将这些事件分派给相应的处理器。在UNIX系统中,这个组件通常使用selectpollepoll等系统调用实现
  4. Reactor: 管理事件循环,分发事件给事件处理器

反应堆的工作流程大致如下:

  1. 应用程序初始化一个或者多个事件处理器。
  2. 应用程序将事件处理器注册到反应堆。
  3. 反应堆启动事件循环,等待事件的发生。
  4. 当事件发生时,事件分离器通知反应堆。
  5. 反应堆根据事件类型,将事件分派给相应的处理器。
  6. 事件处理器处理事件,执行相关逻辑。
  7. 事件处理器处理完毕后,通常会再次返回到事件分离器,等待下一个事件。

反应堆模式的一个典型实现是Java的NIO(New I/O)库,它提供了Selector类作为事件分离器,以及ServerSocketChannelSocketChannel作为事件源。
反应堆模型可以有效地处理大量并发连接,因为它不需要为每个连接分配一个线程,而是使用单线程或者少量线程来管理所有连接的事件。这大大减少了线程创建和上下文切换的开销,非常适合于需要处理高并发请求的应用场景

2. 同步互斥

实现同步互斥是并发编程中非常重要的概念,用于确保多个线程或进程之间的访问顺序和数据一致性。以下是几种常见的实现同步互斥的方法:

  • 互斥锁(Mutex):
    互斥锁是最常见的同步机制之一。线程在访问共享资源之前会尝试获取互斥锁,如果资源已被其他线程占用,则当前线程会被阻塞,直到其他线程释放锁。一旦线程完成对资源的访问,它会释放锁,允许其他线程访问资源
  • 信号量(Semaphore):
    信号量是一种更通用的同步机制,它可以控制对多个资源的访问。信号量可以是计数器,用于表示可用资源的数量。线程在访问资源之前会尝试获取信号量,如果信号量为正数,则线程可以继续执行;如果为零,则线程会被阻塞。使用信号量可以实现更复杂的同步机制
  • 条件变量(Condition Variable):
    条件变量用于线程间的通信和同步。线程可以在条件变量上等待某个条件的发生,当条件满足时,线程被唤醒并可以继续执行。条件变量通常与互斥锁一起使用,以确保线程在等待条件时不会发生竞争条件
  • 读写锁(Read-Write Lock):
    读写锁允许多个线程同时读取共享资源,但只允许一个线程写入资源。这种机制适用于读操作远远超过写操作的场景,可以提高并发性能
  • 原子操作(Atomic Operations):
    原子操作是一种不可分割的操作,可以确保对共享变量的读写操作是原子的。原子操作通常通过硬件支持,可以用来实现简单的同步机制,如自旋锁等

3. 线程安全

多线程环境中,代码可以被多个线程安全地调用而不会引发任何竞态条件、数据不一致或者其他并发问题。

线程安全的代码可以保证在多线程环境下,不论多少线程同时执行这段代码,或者线程以何种顺序执行,程序都能正确运行,不会导致数据损坏或逻辑错误。

线程安全问题主要来源于多个线程并发访问共享资源。如果没有适当的同步机制,一个线程可能会覆盖另一个线程的操作,导致数据不一致。例如,如果两个线程同时修改一个共享变量,一个线程可能会覆盖另一个线程对该变量的修改,从而导致数据损坏

四、内存

1. 虚拟地址空间

虚拟地址空间是每个运行在操作系统中的进程所拥有的抽象地址空间,它为每个进程提供了一个独立的、连续的地址空间,使得每个进程都认为自己在独占一整块连续的内存空间,而不需要关心物理内存的具体情况。

以下是虚拟地址空间的一些关键特点和组成部分:

  1. 地址空间范围:虚拟地址空间的大小取决于操作系统的位数和具体实现,通常在32位系统中为4GB,而在64位系统中可以是几乘几EB(Exabytes)
  2. 地址空间划分:虚拟地址空间通常被划分为多个部分,包括代码段(text segment)、数据段(data segment)、堆(heap)、栈(stack)等,每个部分用于存储不同类型的数据
  3. 内存保护:虚拟地址空间可以通过内存保护机制来保护不同部分的内存区域,防止进程越界访问或者访问未分配的内存区域,从而提高系统的稳定性和安全性
  4. 地址映射:虚拟地址空间中的每个虚拟地址可以通过地址映射机制映射到物理内存中的某个地址,这样可以实现虚拟地址到物理地址的转换,进而访问实际的内存数据
  5. 共享内存:虚拟地址空间中的一部分内存可以被多个进程共享,这样可以实现进程间的数据共享,提高系统的效率和灵活性
  6. 虚拟内存管理:操作系统负责管理虚拟地址空间和物理内存之间的映射关系,包括页面置换、页面分配、内存保护等功能,以保证系统的正常运行

总的来说,虚拟地址空间为每个进程提供了一个独立的、连续的地址空间,使得每个进程可以独立地运行并访问内存,同时通过地址映射和内存保护等机制,保证了系统的稳定性、安全性和高效性

2. 虚拟内存

虚拟内存是计算机操作系统中一种重要的内存管理技术,它通过将磁盘空间作为辅助存储器来扩展计算机的主存储器。虚拟内存使得程序能够比实际物理内存更大,同时提供了一种抽象的内存模型,使得每个程序都认为自己拥有连续的、私有的内存空间。

以下是虚拟内存的一些关键概念和作用:

  1. 地址空间分割:虚拟内存将每个进程的地址空间分割成多个页面(Page),这些页面可以被映射到物理内存或者磁盘上的交换空间。

  2. 页面替换:当物理内存不足时,操作系统会将一部分不常用的页面置换到磁盘上,以释放物理内存供其他页面使用。这个过程称为页面替换(Page Replacement)。

  3. 内存保护:虚拟内存可以提供内存保护功能,防止程序越界访问内存或者访问未分配的内存区域,从而增强系统的稳定性和安全性。

  4. 共享内存:虚拟内存可以实现共享内存的概念,多个进程可以映射同一个页面,从而实现进程间的数据共享。

  5. 内存映射:虚拟内存可以将文件映射到内存中,使得文件读写操作变得更加高效,同时也方便了进程间通信。

  6. 提高性能:虚拟内存通过页面置换和页面预取等技术,可以提高系统的性能,减少磁盘访问次数,加速程序的执行速度。

总的来说,虚拟内存是一种重要的内存管理技术,它使得操作系统能够更高效地管理内存资源,提供更大的地址空间给每个进程,并提供了一些额外的功能,如内存保护、共享内存等,从而提高了系统的稳定性、安全性和性能

3. 缺页中断

缺页中断(Page Fault)是操作系统中的一种重要机制,用于处理虚拟内存中发生的页面访问异常。当程序试图访问虚拟内存中的一个页面,而该页面当前不在物理内存中时,就会触发缺页中断。这时操作系统需要将缺失的页面从磁盘加载到内存中,以满足程序的访问需求。
缺页中断的处理流程通常如下:

  1. 当程序访问一个虚拟地址时,硬件会检查该地址对应的页面是否在物理内存中。
  2. 如果页面在物理内存中,则直接访问;如果页面不在物理内存中,则触发缺页中断。
  3. 操作系统内核接收到缺页中断后,会根据缺失页面的信息,决定如何处理:
    • 如果缺失的页面已经在磁盘上,操作系统会将其加载到内存中,并更新页表,然后重新执行导致缺页中断的指令。
    • 如果缺失的页面不在磁盘上,操作系统可能会触发页面置换算法,将某个页面换出到磁盘,腾出空间来加载缺失的页面。
  4. 当缺失的页面成功加载到内存后,操作系统会更新页表,允许程序继续访问该页面。
  5. 通过缺页中断机制,操作系统可以实现虚拟内存管理,将物理内存和磁盘空间结合起来,提供更大的虚拟地址空间给程序使用,同时保证了内存的有效利用和程序的正常运行

五、OS

1. OS内核

操作系统内核空间是指操作系统内核运行和存储其数据和代码的内存区域。操作系统内核是计算机系统中负责管理硬件资源和提供程序运行环境的软件部分。内核空间是操作系统的核心,它包含执行内核代码和管理硬件的指令和数据。

特点:

  • 受保护:内核空间是受保护的,只有操作系统内核及其授权的进程才能访问。用户空间的应用程序不能直接访问内核空间。
  • 权限级别:在x86架构中,内核空间通常位于更高的权限级别(如Ring 0),而用户空间程序运行在较低的权限级别(如Ring 3)。这确保了操作系统的稳定性和安全性。
  • 直接硬件访问:内核空间允许操作系统直接与硬件通信,执行低级硬件操作,如读写寄存器、管理内存分配、调度进程等。
  • 全局资源视图:内核空间拥有对整个系统资源的全局视图,包括CPU、内存、存储设备、网络接口等。
  • 稳定性要求:由于内核空间中的错误可能导致整个系统崩溃,因此内核代码需要非常稳定,并且经过严格测试。

用途:

  • 系统服务:内核空间包含执行系统服务的代码,如进程调度、内存管理、文件系统管理等。
  • 硬件抽象:内核空间提供硬件抽象层,隐藏了不同硬件之间的差异,使得应用程序可以跨平台运行。
  • 中断处理:内核空间中的代码负责处理来自硬件设备的中断请求,确保系统响应外部事件。
  • 系统调用:应用程序通过系统调用请求操作系统提供的服务,这些系统调用通常由内核空间中的代码处理。
  • 安全控制:内核空间还负责实施安全控制,如权限检查、访问控制列表等,以防止未授权的访问。
  • 资源管理:内核空间管理着系统资源,如CPU时间片、内存分配、磁盘I/O等,确保资源的高效分配和使用。
  • 缓存和缓冲:为了提高性能,内核空间维护了各种缓存和缓冲,如页面缓存、缓冲区缓存等。

内核空间和用户空间的关系:
内核空间和用户空间是操作系统内存管理的关键概念。用户空间是分配给普通应用程序的内存区域,而内核空间则是分配给操作系统内核的内存区域。用户空间的应用程序不能直接访问内核空间,它们必须通过操作系统提供的系统调用接口来访问。操作系统内核则负责管理硬件资源,并通过这些系统调用接口向用户空间提供服务。

用户进程何时会陷入内核:

一个用户进程可能会在多种情况下陷入内核,即从用户空间切换到内核空间。当进程需要进行某些需要更高权限的操作时,例如访问硬件、执行特权指令或请求操作系统服务,它必须通过操作系统提供的系统调用接口进入内核空间。以下是一些常见的导致用户进程陷入内核的情况:

系统调用:当用户进程需要执行像文件操作(如读写文件)、进程通信(如管道、信号)、网络通信(如发送数据包)等服务时,它会通过系统调用进入内核空间。

中断和异常处理:当硬件设备(如磁盘、网络适配器)完成操作或发生错误时,会向CPU发送中断信号。操作系统内核会响应这些中断,执行相应的中断服务程序来处理事件。

上下文切换:当操作系统决定从一个进程切换到另一个进程执行时,会发生上下文切换。这个过程中,当前进程的上下文(如寄存器状态)将被保存,新进程的上下文将被加载,这个过程通常涉及内核空间。

异常:当CPU在执行指令时遇到错误或非法操作(如除以零、访问非法内存地址),会引发异常,这时操作系统内核需要介入来处理这些异常情况。

设备驱动操作:用户进程可能请求设备驱动程序执行某些操作,如访问特定的硬件设备。由于驱动程序需要直接与硬件交互,这些请求通常会触发进入内核空间的操作。

定时器和休眠:当进程等待一个特定条件满足时,可能会使用定时器和休眠机制。操作系统内核会管理这些等待状态,并在条件满足时唤醒进程。

内存管理:当进程请求分配或释放内存、映射文件或执行内存映射I/O等操作时,这些请求会涉及到内核空间的内存管理模块。

同步原语:当用户进程使用锁、信号量等同步原语来协调对共享资源的访问时,这些操作通常需要内核的支持。

以上情况中,系统调用是最常见的导致用户进程陷入内核的方式。每当用户进程需要操作系统提供的服务时,它都必须通过系统调用来请求这些服务,而这个过程通常涉及从用户空间到内核空间的切换。

六、分布式

1. CAP原理

  • 在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三个基本需求之间存在互斥关系,也就是说,一个分布式系统最多只能同时满足其中的两个

2. 分区一致性算法

  • 两阶段提交(2PC): 两阶段提交是一种保证分布式事务原子性的协议,通过两个阶段来协调参与事务的多个节点。
    • 准备阶段(Prepare Phase):协调者向所有参与者发送准备命令,询问它们是否可以提交事务。如果参与者可以提交,它锁定资源并持久化日志。
    • 提交阶段(Commit Phase):协调者根据参与者的准备情况决定是提交还是回滚事务。如果所有参与者都准备好了,协调者会发出commit命令;如果有任何参与者未能准备,协调者会发出rollback命令。
  • 三阶段提交(3PC): 三阶段提交是2PC的改进版本,通过增加一个预提交阶段来处理网络分区的情况。
    • 预备阶段(CanCommit):与2PC类似,协调者询问参与者是否可以提交事务。
    • 预提交阶段(PreCommit):如果所有参与者都可以提交,协调者会发出预提交命令,参与者执行事务但不提交。
    • 提交阶段(DoCommit):协调者根据参与者的响应决定是提交还是回滚。
  • raft算法

3.

七、常见常规题

1. 海量数据取最大的TopK

  • 在内存中维护一个堆,不断读取磁盘中的文件,利用堆动态维护TopK

2. 海量数据取出现频率最高的TopK

  • 先分为n个子块,维护一个哈希表,记录每个子块内的出现频率,然后维护一个堆,利用堆找哈希表的TopK

3. 一台服务器有哪些资源

一台服务器通常具有多种可供分配的资源,这些资源可以根据服务器的配置和用途有所不同。以下是一台服务器可能具有的一些常见资源:

  1. CPU(中央处理器):用于执行计算任务的核心部件。

  2. 内存:用于临时存储数据和程序的内存空间。

  3. 存储空间:硬盘或固态驱动器,用于长期存储数据。

  4. 网络带宽:用于网络通信的数据传输速率。

  5. GPU(图形处理器):用于加速图形处理和计算密集型任务。

  6. 网络接口:用于连接服务器到网络的接口,可以是以太网、无线网络等。

  7. 操作系统:服务器上安装的操作系统,如Linux、Windows Server等。

  8. 软件服务:可能安装有各种服务软件,如Web服务器(如Apache、Nginx)、数据库服务器(如MySQL、PostgreSQL)、应用服务器等。

  9. 虚拟化技术:如虚拟机或容器技术,用于实现资源隔离和利用率提升。
    10.文件描述符: 文件描述符是操作系统用于跟踪打开文件的整数。每个打开的文件都有一个文件描述符。

  10. 进程ID(PID): 每个运行的进程都有一个唯一的PID。

  11. 用户ID(UID)和组ID(GID): 每个用户账户和组

  12. 文件描述符

这些资源可以根据实际需求进行配置和分配,以满足服务器运行不同应用程序或服务的要求。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值