面经(快手_01)
面经C++ 基础 static 的作用是什么? 修饰局部变量: 只初始化一次局部变量,生命周期延长到整个程序运行期间,但作用域仍然只在当前函数内。 修饰全局变量/函数: 表示该符号只在当前源文件内可见,避免和其他文件同名冲突。 修饰类的成员变量: 表示这个成员变量属于整个类,而不是某个对象。所有对象共享同一份静态成员变量。 修饰类的成员函数: 表示这个函数属于类本身,调用时不依赖具体对象。 修饰类成员函数的作用是什么?什么情况下要用静态成员函数?举一个场景 作用: 静态成员函数属于类,而不属于某个对象,因此: 可以不创建对象直接调用; 不能访问非静态成员变量/非静态成员函数; 可以访问静态成员变量/静态成员函数; 使用时机: 当一个函数的逻辑不依赖某个具体对象的状态,但又希望它在 “类的命名空间” 下时,就适合定义成静态成员函数。 场景: 统计对象个数; const 静态成员函数内部能否修改类的非静态变量?为什么? C++ 里静态成员函数不能声明为 const 因为 const 成员函数本质上修饰的是隐藏参数...
csig_腾讯视频 (一面凉经)
面试问题 有没有实际上有用户使用这个 vpn,插件是不是只是把客户端上报的数据存储起来?是线上的业务嘛? 第一版,确实有用户在使用; 插件 不只是一个只做客户端上报存储的插件,而是一个和 客户端 进行通信的 服务端控制组件; 插件至少做了三类实质工作: 在 OpenVPN 的 TLS_VERIFY 阶段调用平台的 CertStatus 做证书状态校验; 拉取 UserAccessRules,再用 nftables 下发用户级访问控制; 通过 UserConnection 上报连接状态,并通过 PluginMsgPipe 接收动态规则更新; 拥有 流量解析 和 Kafka 投递能力,这已经不是单纯埋点了; grpc 同步和异步通信框架怎么去实现的?原来是什么样的?提升了什么性能? 同步 RPC 主要用在必须马上拿结果的链路上,这些请求如果不马上返回,后续流程就走不下去; 异步 RPC 主要用在不应该阻塞 OpenVPN 主线程的地方,比如 用户访问规则拉取 和 连接状态上报。 双向流主要用在 长生命周期 控制通道上; 托管节点和平台之间是...
靖安科技 (一面)
面试 用户鉴权 用的什么进行鉴权?鉴权方式是什么?证书鉴权的方式是什么? 两段式鉴权 业务登录鉴权:发生于 SDK 与 管理平台 之间 SDK 用 用户名/密码 + optional TOTP 调 SDKAuth,用于确认 “这个人是不是合法用户”。 SDK 登录成功后,平台会下发 ca/ cert /key/ server[],客户端再用这些材料去建立 OpenVPN 实例去建立连接。 VPN 接入鉴权:发生于 OpenVPN 插件与 管理平台 之间 到了服务端,插件在 TLS_VERIFY 阶段取客户端证书的 **序列号 SN 和 CN**,再调用同步 RPC 方法 CertStatus 查询这个证书当前是不是有效、属于哪个实体、对应哪个用户。 所以插件做的主鉴权不是用户名/密码,而是: mTLS 握手 远端证书状态校验。 证书里面的内容是什么?基于什么的呢? 这套系统底层是基于 X.509 证书 + PKI/CA 体系 的 OpenVPN 双向 TLS。 插件实际会读取证书里的 CN 和...
面经 csig_0318
面经 select/poll/epoll ,常见的有哪些输入事件? 针对 epoll,常见的有:读事件(EPOLLIN)、写事件(EPOLLPUT)、异常事件(EPOLLPRI) 环形缓冲区 解决了哪些问题? 环形缓冲区 通过 首尾相接 的方式,让读写指针循环移动,在 固定大小内存 里反复利用空间,这样可以减少数据搬移、减少频繁内存申请释放的开销。 编程常用的数据结构(数组 vector、链表 list、红黑树 map、哈希表 unordered_map) 链表环的检测方法?(快慢指针) 如何解决哈希冲突? 链地址法: 把哈希表的每个桶设计成一个链表,发生冲突时,就把元素挂到同一个桶后面。 开放定址法: 冲突后,不用链表,而是继续在表里找别的空位置存放。 线性探测: 冲突了就往后 一个一个 找; 二次探测: 冲突后按 平方步长 去找: rehash: 冲突太多,往往说明 表太小了。 这时通常会 申请更大的哈希表把原来的元素重新哈希后搬过去 常见排序算法?(快排、归并、堆排序) map...
面经 csig_0318
面经 多态在编程中起什么作用?(对同一个接口,进行不同的实现) 数据库 ACID 是什么?(原子性、一致性、隔离性、持久性) 数据库的隔离级别分别有哪些?分别会出现哪些问题?(读未提交、读提交、可重复读、串行化) TCP 和 UDP 的区别? TCP 是可靠的、面向连接的、基于字节流的传输层协议; UDP 是不可靠的、无连接的、基于报文的传输层协议; UDP 不可靠,为什么还要用? 正是因为 不可靠,所以带来了很多的优点:更快、更轻、更灵活; HTTPS 证书伪造的可能性?(HTTPS 证书理论上不是不能被伪造,但直接伪造一个被浏览器信任的证书非常难,因为需要受信任 CA 的签名) B树 和 B+树 的区别? B+ 树的非叶子节点不存放数据,只存放索引,支持在叶子节点层进行范围查询; 由于 B+ 树的非叶子节点只存放索引项,不存放数据,因此可以一个磁盘页可以存放更多的索引项,导致 B+ 树的高度不高,因此每次访问叶子节点的时候,需要对的磁盘 IO 更少; 服务器会不会存在 ping 得通,但是 tcp 无法连接得状况? ping 用的是...
面经 wxg_0312
面经 进程和线程的区别?(进程是资源分配的基本单位,线程是 CPU 调度的基本单位) 进程和线程的开销有没有差异?(进程切换时要切换更完整的上下文,线程切换通常更轻量) 协程了解过嘛?(协程是用户态线程,是程序员自己进行切换) 在应用程序中读文件涉及进程的切换嘛?(读文件一定会发生 用户态到内核态的切换;是否发生进程/线程切换,要看会不会 阻塞) 为什么要切换进程?(CPU 是并发处理操作系统的任务的,当前进程阻塞,就需要让出 CPU 去做其他事情) 为什么不在当前进程内直接读而是切换到其他进程?(为了提高 CPU 利用率) 什么 IO 会阻塞当前线程?(同步阻塞 IO) 访问磁盘的时是直接访问到硬件还是用过一些系统的转换?(DMA 请求过程) 虚拟内存的概念?(虚拟内存 就是操作系统给每个进程看到的一套 “虚拟的、连续的内存空间” ) 如果把换页交给应用进程可以嘛? 理论上应用进程可以参与内存管理策略,但不能把换页完全交给应用进程。 因为 换页 需要了解整个系统的内存使用情况,还涉及 页表修改、物理页分配 和 缺页异常处理,这些都属于 内核权限。 内存管理...
STL 常问问题
序列式容器1️⃣ C++ 容器有哪些? 序列式容器: vector、list 关联式容器: map、unoredred_map 2️⃣ vector 超出容量会怎样? vector 会先申请一块 1.5/2 倍 的当前内存大小的连续内存; 把原来元素 拷贝/移动 到新内存; 释放旧内存,再把新元素插进去 3️⃣ vector 扩容后会带来什么后果? 因为元素移动到了新内存,所以原来元素的地址可能全变了。 凡是指向原来 vector 内部元素的 迭代器、指针、引用失效 4️⃣ vector 如果申请新内存失败会怎样 可能抛出异常,一般是 std::bad_alloc 5️⃣ size() 和 capacity() 的区别? size(): 当前已经有多少个元素 capacity(): 当前底层内存最多还能容纳多少个元素而不触发扩容 6️⃣ resize() 和 reserve() 的区别? reserve(): 让 vector 的内存容量至少达到 n,避免后续频繁扩容。 n <= capacity():通常什么都不做; n >...
协程服务器常问问题
1️⃣ 面经一 (腾讯) 什么是协程(用户态线程,用户栈,用户态切换) 协程和线程相比有什么优势(轻量级、切换快、开销小,用户管理,配合非阻塞 IO 更好地实现异步并发) 更好地实现异步并发是怎么理解的(IO 操作时检测到需要等待缓冲时切换协程) 线程也可以在等待时切换,协程的优势是什么(用户自己操作) 轻量级怎么理解(线程的栈是 MB 级别的,协程的栈是 KB 级别的,线程在内核中切换,协程在用户态中切换) 怎么设置非阻塞(fctnl) 返回 EAGAIN 是什么意思(缓冲区没准备好) 互斥锁怎么实现的(访问锁时如果锁被占用就阻塞,加入阻塞队列,锁被释放时唤醒阻塞队列的中的线程进入就绪队列) http协议怎么解析的(引入了其他项目的解析器) http 是什么格式(消息行 消息头 消息体) N:M 的协程调度器是什么(N线程处理M协程) 如何调度(先来先服务,线程依次去协程队列取任务执行,如果没有任务就执行空闲协程,陷入 epoll_wait,有任务时再唤醒空闲线程去执行任务) 如果所有线程都不空闲,其他协程是不是就不调度了...
插件常问问题
1️⃣ 项目难点 流量线程 会根据 虚拟地址 高频查询客户端信息,但客户端断连时 pcc 会从 在线上下文 里移除。如果流量线程直接依赖 pccMap,就会面临 pcc 生命周期不稳定的问题。 所以我没有让 流量线程 直接访问 pcc,而是专门维护了一个 virtual_address_map,把流量线程需要的字段提前从 pcc 中抽出来,按 virtual_address -> Json 的形式保存。这样流量线程只读 轻量级映射,不依赖 pcc 本身,从而规避了断连场景下访问失效上下文的问题,同时也减少了重复组装 JSON 的开销。 2️⃣ 项目优化请求链路优化 根据场景不同,将 证书校验、用户规则下载、连接状态上报 进行拆分: 证书校验: 走 **同步 fast_fail**(服务器不可访问则立即返回),因为证书校验在主链路上,必须立即返回; 用户访问规则下载: 走 **异步 gRPC**,基于用户的 完成队列 (Completion Queue) 提前下载用户规则,同时避免阻塞 OpenVPN...
面经 csig_0309
面经 C++ 的智能指针你用过吗?(主要使用过 shared_ptr、weak_ptr、unique_ptr) C++ 里面总共有多少种智能指针?每一种的用法和应用场景是什么?(三种) unique_ptr: 定义:表示对所拥有的对象的独占权,一个对象只能被一个 unique_ptr 拥有 特点:只可以移动,不可以被复制,经常配合 std::move 来使用; shared_ptr: 定义:表示对所拥有的对象的共享权,一个对象可以被多个 shared_ptr 拥有; 特点:需要维持一个控制块,来进行引用计数; weak_ptr: 定义:不拥有对象,但是 weak_ptr 可以观察 shared_ptr 所拥有的对象; 特点:解决循环依赖问题;作为缓存对象; C++ 在 main 函数执行之前,还有哪些函数会先执行? main 之前通常会先执行运行时启动代码,然后完成 全局变量、静态变量的初始化。 如果这些对象是 类类型,就会 先调用它们的构造函数; 如果它们的初始化表达式里调用了普通函数,这些函数也会在 main 前执行。 程序真正的入口一般不是...
