- 博客(40)
- 收藏
- 关注
原创 DB面试题
RocksDB 是一种可以存储任意二进制kv数据的嵌入式存储。RocksDB 按顺序组织所有数据,他们 的通用操作是 Get(key) , NewIterator() , Put(key, value) , Delete(Key) 以及SingleDelete(key)。LSM-TreeWAL Log(预写日志)写入操作首先记录到WAL(Write Ahead Log),保证数据不丢失。Memtable(内存表)
2025-06-20 22:26:26
442
原创 MySQL八股文
视图是一种虚拟表,一种逻辑上的表,不包含数据通过SQL来定义 create_view_name as <SQL>用来创建视图的表叫做基表,通过视图可以展现基表的部分或者全部内容可以用来描述基表的增删改查,通常只用于查询,增删有限制非空唯一索引,一个表只能有一个主键索引,primary key (index)索引列不能出现相同的值,可以有null值,unique(index)主键索引对应的索引是聚集索引,也称为聚簇索引非主键索引对应的索引是辅助索引,也称之为二级索引。
2025-06-19 20:13:10
1034
原创 面经的疑难杂症
虚拟地址是指在采用虚拟存储管理的操作系统中,进程访问内存时所使用的地址。每个进程都有独立的虚拟地址空间,虚拟地址通过操作系统和硬件(如MMU,内存管理单元)映射到实际的物理内存地址。这样可以实现内存保护、空间隔离和更高效的内存管理,同时也方便了进程的内存扩展和迁移。
2025-06-15 23:39:45
408
原创 操作系统八股文
调度对象线程和进程相对于操作系统而言都是任务(task_struct)。线程又称为共享用户虚拟地址空间的进程。包含多个线程的进程称之为线程组。只有一个线程的进程称为进程。没有用户虚拟地址空间的进程称之为内核线程。用于绝对由谁(哪个或者哪几个)获得处理器的执行权进程状态就绪 -->|进程调度| 运行运行 -->|时间片用完| 就绪运行 -->|io请求| 阻塞阻塞 -->|io就绪| 就绪调度时机主动调度(系统调用等待某个资源)。
2025-06-15 22:42:39
1651
原创 面经总结池
每个线程都会占用一定的内存(如栈空间),线程数过多会导致内存消耗大,业务可用内存变少,甚至引发OOM。动态扩容可以在高并发时适当增加线程数,但不会无限制扩展,避免因线程过多导致的频繁切换,保证系统整体性能。当有新任务提交到线程池时,如果发现当前所有线程都在忙,且任务队列长度超过一定阈值,线程池就会自动创建新的工作线程,直到达到设定的最大线程数。动态扩容的线程在空闲一段时间后(比如通过条件变量等待超时),如果没有新任务,就会自动退出,释放资源,避免线程长期空闲造成资源浪费。
2025-06-13 14:04:26
837
原创 面经总结协议类
Protobuf 支持强类型和向后兼容,字段有编号,易于演进;:对象转为二进制流(序列化),二进制流转为对象(反序列化),需要 .proto 文件生成的类。Protobuf 是二进制格式,体积更小,效率更高。:两者都支持多语言,但 Protobuf 需要生成代码,JSON 直接解析即可。:适合高性能、带宽敏感、数据量大、服务间通信(如微服务、RPC)等场景。:JSON 可直接阅读和编辑;:适合前后端交互、配置文件、调试和日志等对可读性有要求的场景。:对象转为字符串(序列化),字符串转为对象(反序列化)。
2025-06-13 13:11:49
921
原创 C/C++八股文
指针是一个变量,其值是另一个变量的地址。声明指针时用*符号。引用是一个别名,它是在已存在的变量上创建的。引用在声明的时候用&符号。
2025-06-10 21:21:49
1137
原创 fastdfs:海量小文件存储的秘密
单台 storage 理论上可达数千 QPS,高峰期可通过增加 storage 节点和分组扩展整体吞吐量。新文件上传到任意 storage 后,tracker 通知同组其他 storage 拉取同步。提供 fdfs_monitor 工具和 HTTP 监控接口,可查看 storage、tracker 状态和文件同步情况。宕机 storage 恢复后,会自动从同组其他 storage 拉取缺失文件进行同步,保证数据一致性。元数据与文件一起存储在 storage 节点,支持自定义键值对,上传时一同提交。
2025-06-08 14:44:52
686
原创 My图床项目
①根据poller通知的channel发生的具体事件,由channel负责调具体的回调操作//根据poller通知的channel发生的具体事件,由channel负责调用具体的回调操作处理挂起事件(EPOLLHUP)如果发生了挂起事件(如对端关闭连接),并且没有可读事件,则调用关闭回调。处理错误事件(EPOLLERR)如果发生了错误事件,则调用错误回调。处理读事件(EPOLLIN | EPOLLPRI)如果有可读事件(普通或优先级数据),则调用读回调,并传递接收时间。
2025-06-06 20:40:30
1346
原创 RocksDB
①MemTable 在内存中的一个可读可写表读取在查询 SST 文件前总是要查询 memtable,因为 memtable 里面的数据总是更新的。一旦一个 memtable 被写满,他会变成不可修改的,并被一 个新的 memtable 替换。一个后台线程会把这个 memtable 的内容落盘到一个 SST 文件,然后这 个 memtable 就可以被销毁了②Immutable MemTable 在内存中的一个只读表Immutable MemTable 也是存储在内存中的数据,不过是只读的内存数据;
2025-05-28 19:04:23
1065
原创 etcd:高可用,分布式的key-value存储系统
领导者选举(Leader Election)集群中的所有节点通过选举过程选出一个领导者,负责处理客户端请求以及日志复制工作;如果当前领导者发生故障,其余节点会重新选举出新的领导者。日志复制(Log Replication)领导者接收到客户端请求后,会将这条命令追加到自己的日志中,然后通过日志复制机制将该命令复制到所有追随者节点,确保所有节点都以相同的顺序应用这些命令,从而保持一致的状态机。安全性(Safety)为防止不同节点之间的日志产生分歧,Raft设计了一套严格的规则。
2025-05-27 21:56:56
1464
原创 浅入k8s
豆荚,K8S 调度、管理的最小单位,一个 Pod 可以包含一个或多个容器,每个 Pod 有自己的虚拟IP。当你应用访问数不断增加,机器逐渐增加到十几台、上百台、上千台时,每次加机器、软件更新、版本回滚,都会变得非常麻烦、痛不欲生,再也不能好好的摸鱼了,人生浪费在那些没技术含量的重复性工作上。Kubernetes 可以为你提供集中式的管理集群机器和应用,加机器、版本升级、版本回滚,那都是一个命令就搞定的事,不停机的灰度更新,确保高可用、高性能、高扩展。PI 服务器,公开了 Kubernetes API。
2025-05-25 18:55:32
267
原创 Docker:容器化技术
容器编排通俗来说一堆容器一起配合工作并且互不干扰build构建或重新构建服务的镜像config解析、解析并呈现规范格式的compose文件,即检查配置文件cp在服务容器和本地文件系统之间复制文件文件夹create为服务创建容器down停止并移除容器、网络events从容器接收实时事件exec在正在运行的容器中执行命令images列出创建的容器使用的镜像kill强制停止服务容器logs查看容器的输出ls列出正在运行的compose项目pause暂停服务port打印端口绑定的公共端口ps列出容器。
2025-05-24 23:30:28
2084
原创 workflow:高效的流式工作架构
负载均衡 类似于fd通过%4取模的方式负载均衡给四个网络线程 ,当条件满足的时候把任务抛出给工作线程处理。
2025-05-20 23:05:29
1939
原创 OpenResty 深度解析:构建高性能 Web 服务的终极方案
1.我们使用openresty的三板斧①背靠nginx,嵌入到各个阶段的lua函数②cosocket可同步非阻塞在多个阶段访问第三方库服务,在nginx上实现业务成为可能③ngx,shared.dict共享内存可在多个worker进程共享数据,数据实时生效Kong 是一款基于 NGINX 和 OpenResty 构建的开源 API 网关,支持 API 管理、流量控制、身份验证、监控等功能,可实现对 API 的全生命周期管理与流量治理。
2025-05-17 21:42:03
1366
原创 初探 Skynet:轻量级分布式游戏服务器框架实战
服务启动时执行的代码(如打印 "hello skynet")在 Actor 初始化阶段同步执行。当有新客户端连接时,Skynet 会将这个事件封装成消息发送给当前服务。c->lua每个协程一个栈 我们需要维护栈的空间 弹出不需要的栈空间。, 因此,只要你不是不断的把数据压栈, 通常你不用关心堆栈 大小。是服务的入口点,Skynet 会为这个服务创建一个独立的。创建虚拟机时,伴随创建了一个主协程,默认创建一个虚拟栈;我们通过一个网络消息的代码案例来看actor是怎么运行的。,每一个协程都有一个栈;
2025-05-14 16:21:11
1420
原创 关系型数据库MYSQL(续)
比如在有索引的用户表中,某条记录索引值为 5,临键锁会锁定小于等于 5 的范围,既保护该记录,也防止其他事务在其前面间隙插入数据,增强数据一致性和隔离性。:即写锁,一个记录被加 X 锁后,其他事务不能再对其加任何锁,加 X 锁事务可读写记录,保证写操作原子性,防止其他事务干扰。例如:一个表 的姓名是唯一键,如果一个事务对姓名进行修改,但是在事务 提交或事务回滚后,表中的姓名变得不唯一了,这样就破坏了。:也叫读锁,多个事务可同时对同一记录加 S 锁,用于并发读场景,加锁事务能读取记录。
2025-04-18 11:19:33
1059
原创 探索关系型数据库 MySQL
按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合;
2025-04-17 19:33:35
1536
原创 高性能内存kv数据库Redis(续)
系统调用创建一个子进程。从节点接收并执行主节点发送的写操作后,也会更新自己的偏移量。在网络出现问题后,replica 保存有同步位置(通过复制偏移量 ),当网络恢复时,可依据该位置继续从 master 拉取数据,实现断点续传式的数据同步。主节点将自身的所有数据发送给从节点,从节点接收并加载这些数据,以此来和主节点数据保持一致。Redis 集群中主节点宕机后,从节点经故障检测与选举成为新主节点,丢弃旧缓存、更新集群状态,通过持久化恢复及后续复制同步数据,保障数据一致性,也可手动触发从节点替换主节点。
2025-04-15 11:34:19
963
原创 高性能内存kv数据库Redis
事务:用户定义一系列数据库操作,这些操作视为一个完整的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。MULTI开启事务,事务执行过程中,单个命令是入队列操作,直到调用EXEC才会一起执行;乐观锁实现,所以失败需要重试,增加业务逻辑的复杂度;acid①原子性②一致性③隔离性④持久性不能有耗时的操作:cpu运算和阻塞的io对于redis而言会影响性能。
2025-04-14 23:40:22
2374
原创 如何深入理解protobuf
用于定义客户端和服务器之间交互的接口规范,独立于具体编程语言,清晰描述服务提供的方法、参数及返回值等,像 gRPC 使用的.proto 文件就是典型的 IDL 文件。
2025-04-11 20:24:55
1113
原创 内存泄露 手写内存泄露检测工具
①.内存泄露在面试和工作中常见,尤其是C和C++项目。②.内存泄露的核心原因是调用了malloc但没有调用free,导致堆内存无法被释放。③.内存泄露的判断方法和泄露位置的定位是解决内存泄露的关键。#define _GNU_SOURCE //这个b玩意要放所有头文件最上面#if 0if(flag){// 使用 snprintf 将文件路径格式化到 buff 中,//文件路径包括内存地址(p),并将该内存地址存储在“./mem/”目录下,以.p作为扩展名if(!fp){
2025-04-08 15:54:35
820
原创 死锁 手撕死锁检测工具
for(i;i<MAX;for(i;i<MAX;return -1;for(i;i<MAX;return -1;#if 1//有向图uint64 id;int num;return tex;int i = 0。
2025-04-08 15:23:48
1610
1
原创 线程池/内存池/mysql连接池
维持和管理固定数量线程的结构,用于解决资源频繁创建和销毁的问题。固定数量的线程、队列、任务状态管理。避免频繁创建和销毁线程,管理线程状态,提高系统资源利用率。内存池是在程序运行开始时,预先分配一块较大的内存空间作为 “池”,当程序需要申请内存时,直接从这个池中分配小块内存给用户,而不是每次都向操作系统申请;当用户释放内存时,也不是直接归还给操作系统,而是将其放回内存池,以便后续再次使用。①.介绍了课程内容和目标,重点讲解了池化技术的概念及其重要性。
2025-04-06 22:09:44
674
原创 定时器的实现方案:红黑树、最小堆与时间轮
①.定时器定义组织大量定时任务模块,项目底层基础模块。②.定时器应用解决延时处理任务问题,如客户端与服务端连接检测。包括keep alive和应用层发送心跳包,区别在于检测范围和网络通畅性。技能冷却和倒计时,需要高性能定时器。
2025-04-06 21:24:29
988
原创 分布式KV存储的实现
KV 存储的核心是将数据抽象为键值对(Key-Value Pair)。键作为唯一标识符,值则承载任意格式的数据。这种设计摒弃了传统关系型数据库的复杂表结构,将数据存储简化为 “键→值” 的映射,从而实现了 O (1) 级别的读写效率。(如 LevelDB):数据写入磁盘,利用 LSM-Tree 结构优化读写性能。(如 Redis):将数据常驻内存,通过异步持久化保证可靠性。:将数据分散到多个节点,避免单点瓶颈。:每个分片保留多个副本,确保高可用性。
2025-04-01 21:00:03
200
原创 io_uring:高性能异步 I/O
操作通常用于在服务器端接受客户端的连接请求,当有新的客户端连接时,该操作会返回一个新的套接字描述符,用于与客户端进行通信。实例,包含了提交队列(Submission Queue,SQ)和完成队列(Completion Queue,CQ)。库中的一个关键操作,用于批量从完成队列(Completion Queue, CQ)中获取已完成的 I/O 操作条目。队列的各种行为和特性,例如提交队列(SQ)和完成队列(CQ)的条目数量、标志位、线程相关参数等。
2025-03-28 19:11:53
983
原创 浅入高性能网络框架DPDK
是一个高性能数据包处理开发框架,专为网络设备、数据中心和云计算环境设计。它通过绕过内核协议栈、优化硬件访问和提供高效数据结构,实现了低延迟、高吞吐量的数据包处理能力。核心特性用户空间驱动直接在用户空间操作物理网卡(通过 UIO 或 VFIO 技术),避免内核上下文切换和数据拷贝开销。支持轮询模式驱动(PMD),减少中断处理延迟。零拷贝与内存优化使用大页内存(Huge Pages)减少内存分页开销。通过环形缓冲区(Ring Buffer)实现无锁队列,降低线程间同步成本。多线程并行处理。
2025-03-26 23:45:28
1820
原创 深入浅出网络协议栈TCP/UDP/KCP/QUIC
发送方在未收到接收方确认(ACK)的情况下,可连续发送的数据量上限,通常以 “窗口大小” 表示。例如,TCP 中的滑动窗口允许发送方在等待 ACK 时持续发送多个数据包。
2025-03-21 23:27:01
1479
原创 服务器百万并发(基于reactor模式)
准备四台虚拟机 一台服务器配置高一些 三台客户机配置均衡配置 最后就是宿主机的性能比拼了。当我们用服务端对接客户端的时候遇到的第一个问题就是打开的文件过多 导致程序挂掉。本地端口范围,1024 到 65535,客户端常用动态端口。TCP 内存分配,分别是低、高、最大值,控制内存使用。:开启后,记录来源错误的 IP 包,1 表示启用。已建立 TCP 连接的跟踪超时时间,1200 秒。TCP 写缓冲区大小,默认、最小、最大值。TCP 读缓冲区,类似写缓冲区的三个值。系统全局最大打开文件数,控制资源。
2025-03-20 23:07:28
322
原创 Reactor 模式
int fd;int rlen;int wlen;定义一个 conn_item结构体 该结构体包含的成员分别有int fd :对应的文件描述符char rbuffer :接收客户端发送的数据并保存char wbuffer:发送给客户端的数据并保存三个函数指针分别为指向 accept_cb的函数指针accept_callback指向recv_cb的函数指针recv_callback指向send的函数指针send_callback。
2025-03-18 23:58:10
1657
原创 Linux 系统编程:文件、进程与线程的底层原理与实战优化
信号的最明显的特点是一次注册 永久生效信号这章节对我们最重要的是signal函数 以及 mask屏蔽集合 和 pending未决集合 需要我们牢牢掌握个人认为线程相比于进程最大的区别就是多个线程访问相同的共享资源 因此我们在用线程对各种区域的数据进行访问的时候 我们都需要加上锁来避免数据的污染 从而取得正确的结果。
2025-03-10 22:18:38
1055
原创 基于多线程的简单 TCP 服务器实现
在网络编程中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在实际应用场景中,我们经常需要实现一个 TCP 服务器来处理多个客户端的连接请求。本文将详细介绍如何使用 C 语言编写一个简单的基于多线程的 TCP 服务器,该服务器可以接收客户端发送的数据,并将数据原样返回给客户端。函数创建一个 IPv4 的 TCP 套接字,返回一个文件描述符。9.4连接成功 并发送消息到服务器 服务器接收数据。9.3用TCP/UDP助手进行远程连接。9.2查看端口号信息。
2025-02-27 13:32:18
499
1
原创 深入探究多线程并发中的同步机制:以 C 语言为例
多线程并发锁通过限制同一时刻对共享资源的访问线程数量,避免数据竞争和竞态条件,保障数据一致性,实现线程同步,保护临界区,从而简化多线程编程的复杂性 。
2025-02-24 18:30:26
602
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人