腾讯面经,有点难度~

今天分享组织内的朋友在腾讯安全的实习面经。

内容涵盖了QPS测试方法、SQL聚合查询、Linux进程管理、Redis数据结构与持久化、NAT原理、Docker隔离机制、Go语言GMP调度模型、协程控制、系统调用流程、变量逃逸分析及map操作等等知识点。

下面是我整理的面经详解:

面经详解

一个表,里面有数据列,id, name, class,查学生最喜欢的前10个课程,sql语句实现

SELECT class, COUNT(*) AS popularity 
FROM your_table_name 
GROUP BY class 
ORDER BY popularity DESC 
LIMIT 10; 

解释:

  • SELECT class, COUNT(*) AS popularity:选择 class 列,并对每个 class 分组内的记录进行计数,将计数结果命名为 popularity
  • FROM your_table_name:指定要查询的表名。
  • GROUP BY class:按照 class 列进行分组,这样每个不同的 class 会形成一个组。
  • ORDER BY popularity DESC:按照 popularity 列进行降序排序,使得受欢迎程度高的课程排在前面。
  • LIMIT 10:只返回前10条记录,即最受欢迎的前10个课程。

怎么用linux命令查PID,ps grep, pgrep, top

  • ps + grep:
    • 示例:ps -ef | grep "program_name"ps -ef 会列出所有进程的详细信息,grep "program_name" 会在这些信息中过滤出包含 program_name 的行,其中就包含了进程的PID。例如,要查找 nginx 进程的PID,可以使用 ps -ef | grep "nginx"
  • pgrep:
    • 示例:pgrep "program_name"pgrep 命令会直接根据进程名查找并返回进程的PID。例如,pgrep "httpd" 会返回所有 httpd 进程的PID。
  • top:
    • 运行 top 命令会进入一个动态的进程监控界面,在这个界面中可以看到各个进程的信息,包括PID。可以使用 / 键输入进程名进行搜索,找到目标进程的PID。按 q 键可以退出 top 界面。

查当前有哪些进程, ps

  • ps -e:显示所有进程的信息,包括其他用户的进程。例如,ps -e 会列出系统中所有正在运行的进程。
  • ps -ef:显示更详细的进程信息,包括进程的完整命令行、父进程ID等。例如,ps -ef 可以清晰地看到每个进程的启动命令和父进程的关系。
  • ps aux:也是常用的查看所有进程信息的命令,a 表示显示所有用户的进程,u 表示以用户为中心显示详细信息,x 表示显示没有控制终端的进程。例如,ps aux 可以全面地查看系统中所有进程的详细状态。

Redis有哪些数据结构

  • String(字符串):是Redis最基本的数据结构,它可以存储字符串、整数或浮点数。可以进行设置值、获取值、递增、递减等操作,常用于缓存、计数器等场景。
  • Hash(哈希):是一个键值对的集合,适合存储对象。例如,可以将用户信息存储在一个哈希中,每个字段对应一个属性,如用户名、年龄等。
  • List(列表):是一个双向链表,支持在列表的两端进行插入和删除操作。可以用于实现消息队列、栈等数据结构。
  • Set(集合):是一个无序且唯一的数据集合,支持添加、删除、判断元素是否存在等操作。可以用于去重、交集、并集等操作,例如实现共同好友功能。
  • ZSet(有序集合):和集合类似,但每个元素都有一个分数,根据分数进行排序。常用于排行榜、热门列表等场景。

持久化RDB,AOF,save/applendly

  • RDB(Redis Database):
    • 原理:RDB是将Redis在某个时间点的数据快照保存到磁盘上。可以通过手动执行 SAVEBGSAVE 命令来触发持久化操作,也可以通过配置定期执行。
    • 优点:文件紧凑,适合用于备份和恢复大规模数据,恢复速度快。
    • 缺点:可能会丢失最后一次快照之后的数据,因为它是定期进行快照的。
  • AOF(Append Only File):
    • 原理:AOF是将Redis执行的所有写操作以日志的形式追加到文件末尾。当Redis重启时,会重新执行这些写操作来恢复数据。
    • 优点:数据安全性高,因为它记录了每一个写操作,最多只会丢失最后一次同步到磁盘的数据。
    • 缺点:文件体积较大,恢复速度相对较慢。
  • save/apply:
    • SAVE 命令会阻塞Redis服务器,直到RDB文件创建完成,期间服务器不能处理其他请求。
    • BGSAVE 命令会在后台异步创建RDB文件,不会阻塞服务器的正常运行。

Zset的底层原理。哈希和跳表

  • 哈希表:Zset使用哈希表来存储成员和分数的映射关系,这样可以在 O(1)O(1) 的时间复杂度内快速查找某个成员的分数。
  • 跳表:跳表是一种有序的数据结构,它通过在每个节点中维护多个指针,使得查找、插入和删除操作的平均时间复杂度为 O(logn)O(log**n) 。Zset使用跳表来实现按分数排序的功能,这样可以快速找到分数范围内的成员。当进行范围查询时,跳表可以高效地定位到起始位置,并按照顺序遍历成员。

nat是怎么实现的,如果内网有两个不同ip访问百度,百度返回消息,怎么知道要返回给哪个ip?

  • NAT(Network Address Translation)实现原理:
    • IP地址转换:NAT设备会将内网的私有IP地址转换为外网的公有IP地址。当内网主机发起对外网的请求时,NAT设备会将请求报文中的源IP地址替换为自己的公有IP地址。
    • 端口映射:除了IP地址转换,NAT设备还会进行端口映射。它会为每个内网主机的请求分配一个唯一的端口号,将这个端口号与内网主机的IP地址和端口号进行映射,并记录在映射表中。
    • 映射表:NAT设备维护一个映射表,记录了内网IP地址、端口号与外网IP地址、端口号的对应关系。当外网服务器返回响应时,NAT设备会根据响应报文中的目的IP地址和端口号,在映射表中查找对应的内网主机,并将响应转发给该主机。
  • 百度返回消息的处理:当内网有两个不同IP访问百度时,NAT设备会为这两个请求分配不同的端口号。百度返回的消息中包含目的IP地址(NAT设备的公有IP地址)和目的端口号,NAT设备根据目的端口号在映射表中查找对应的内网主机IP地址和端口号,然后将消息转发给相应的内网主机。

ping 操作,为什么用ping域名没通,ping ip通了,是因为什么

  • DNS解析问题:当使用 ping 域名时,系统需要先通过DNS服务器将域名解析为对应的IP地址。如果DNS服务器配置错误、DNS服务器故障或域名解析记录存在问题,就会导致域名无法解析为正确的IP地址,从而使得 ping 域名不通。而直接 ping IP地址则绕过了DNS解析过程,所以可以正常通信。
  • 防火墙问题:防火墙可能会限制对某些域名的访问,但不会限制对IP地址的访问。例如,防火墙可能配置了只允许访问特定IP地址的规则,而对域名的访问进行了阻止。在这种情况下,ping 域名会失败,而 ping IP地址可以正常进行。

docker 的隔离性内部是怎么实现的,命名空间,

Docker的隔离性主要通过Linux内核的命名空间(Namespaces)和控制组(cgroups)来实现,这里主要介绍命名空间:

  • PID命名空间:每个Docker容器都有自己独立的PID命名空间,这意味着容器内的进程有自己独立的进程ID,与宿主机和其他容器内的进程ID相互隔离。容器内的进程只能看到自己命名空间内的进程,无法直接访问宿主机或其他容器内的进程。
  • Network命名空间:每个容器都有自己独立的网络命名空间,拥有独立的网络栈,包括网络接口、IP地址、路由表等。容器可以有自己的IP地址和端口,与宿主机和其他容器的网络环境相互隔离。
  • Mount命名空间:容器有自己独立的挂载点,这意味着容器内的文件系统与宿主机和其他容器的文件系统相互隔离。容器可以有自己独立的根文件系统,并且可以在容器内进行挂载和卸载操作,而不会影响到宿主机和其他容器。
  • UTS命名空间:容器可以有自己独立的主机名和域名,与宿主机和其他容器的UTS(Unix Time - Sharing System)环境相互隔离。这样,容器内的进程可以认为自己运行在一个独立的主机上。
  • IPC命名空间:容器有自己独立的进程间通信(IPC)机制,如共享内存、消息队列等。容器内的进程只能与同一容器内的其他进程进行IPC通信,无法直接与宿主机或其他容器内的进程进行IPC通信。

GMP

  • 定义:GMP是Go语言的调度模型,包含三个核心组件:

    1. G(Goroutine):轻量级线程,由Go运行时管理。
    2. M(Machine):操作系统线程,实际执行Goroutine的实体。
    3. P(Processor):逻辑处理器,管理本地Goroutine队列和资源。
  • 调度机制:

    • P绑定到M后,从本地队列或全局队列获取G执行。
    • 当G遇到阻塞(如系统调用),M会释放P并进入阻塞状态,其他M可接管P继续执行其他G。
    • 通过工作窃取(Work Stealing)平衡各P的负载。
  • 优势:减少线程切换开销,实现高并发和高效资源利用。

defer与panic,10个协程用ctrl+c停止,会发生什么

  • defer与panic的执行顺序:
    1. 触发panic后,当前函数会停止执行,逐层执行defer
    2. defer中调用recover(),程序恢复执行;否则程序终止。
  • 10个协程被ctrl+c停止的影响:
    • ctrl+c发送SIGINT信号,默认终止整个进程。
    • 所有协程会立即停止,未执行的defer可能无法触发。
    • 资源泄漏风险:如未释放的文件句柄、数据库连接等。
    • 解决方案:监听信号量(如signal.Notify),在退出前执行清理逻辑。

一个协程在什么情况下可以直接停止,如何杀死它,抢占

  • 协程无法被直接杀死:

    • Go语言设计上不提供强制终止协程的API,需通过协作式退出(如context.Context传递取消信号)。
  • 抢占式调度条件:

    1. 协程执行时间超过10ms(Go 1.14+支持基于信号的抢占)。
    2. 协程进入函数调用或发生系统调用。
  • 实现优雅退出:

ctx, cancel := context.WithCancel(context.Background())go func() {for {select {case <-ctx.Done(): // 监听取消信号 return default:// 业务逻辑 }}}()cancel() // 触发协程退出 

系统调用的过程是怎样的

  • 简单流程:
    1. 用户程序通过库函数(如read())触发系统调用。
    2. CPU切换到内核态,执行内核中对应的系统调用处理函数。
    3. 内核完成操作后,返回结果到用户态,程序继续执行。
  • 详细步骤:
    1. 参数准备:用户程序将系统调用号和参数存入寄存器。
    2. 触发软中断:通过syscall指令或中断向量(如x86的int 0x80)进入内核。
    3. 内核路由:根据系统调用号查表跳转到对应处理函数(如sys_read)。
    4. 权限检查:验证用户空间内存地址合法性。
    5. 执行操作:内核完成文件读写、进程创建等操作。
    6. 返回结果:将返回值存入寄存器,切换回用户态。

逃逸场景

  • 变量逃逸到堆的常见场景:
    1. 返回局部变量地址:函数返回局部变量的指针,导致变量生命周期延长。
    2. 闭包引用:闭包引用外部变量,变量需在堆上分配。
    3. 动态类型:如interface{}类型变量可能触发逃逸。
    4. 大对象:超过栈空间限制的对象(默认栈大小1~2MB)。
    5. 发送指针到channel:接收方可能在其他协程访问变量。
  • 查看逃逸分析:通过go build -gcflags="-m"编译输出逃逸信息。

栈空间的最大分配量

  • 默认限制:Go 1.18+中,单个协程栈初始大小为2KB,动态扩容上限通常为1GB(受操作系统限制)。
  • 调整栈大小:可通过runtime/debug.SetMaxStack修改最大栈大小,但需谨慎避免内存浪费。

局部变量分配到栈还是堆

  • 分配规则:

    • 栈分配:变量生命周期仅限于函数内,且未发生逃逸。
    • 堆分配:变量被外部引用(逃逸),或大小超过栈容量。
  • 示例:

  func stackAlloc() int {x := 42 // 分配到栈 return x }func heapAlloc() *int {x := 42 // 逃逸到堆 return &x }

map判断数据是否存在及删除键

  • 判断存在性:
value, ok := myMap[key]
if ok {
// 存在 
}
  • 删除键:
delete(myMap, key)
  • 底层实现:

    • 哈希表结构:通过哈希函数计算桶位置,解决冲突采用链表或开放寻址。
    • 删除操作:标记对应键值对为删除状态,后续插入可复用空间。

欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。

没准能让你能刷到自己意向公司的最新面试题呢。

感兴趣的朋友们可以私信我,备注:面试群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39858.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 集合 List、Set、Map 区别与应用

一、核心特性对比 二、底层实现与典型差异 ‌List‌ ‌ArrayList‌&#xff1a;动态数组结构&#xff0c;随机访问快&#xff08;O(1)&#xff09;&#xff0c;中间插入/删除效率低&#xff08;O(n)&#xff09;‌‌LinkedList‌&#xff1a;双向链表结构&#xff0c;头尾操作…

基于 arco 的 React 和 Vue 设计系统

arco 是字节跳动出品的企业级设计系统&#xff0c;支持React 和 Vue。 安装模板工具 npm i -g arco-cli创建项目目录 cd someDir arco init hello-arco-pro? 请选择你希望使用的技术栈React❯ Vue? 请选择一个分类业务组件组件库Lerna Menorepo 项目❯ Arco Pro 项目看到以…

JVM-GC(G1)实践—GC异常定位、参数调整、GC更换

前言 如SpringBoot官方介绍所说的那样&#xff0c;从SpringBoot3.x开始支持的最低JDK版本为&#xff1a;JDK17&#xff08;官方推荐使用BellSoft Liberica JDK&#xff09;&#xff0c;其对应的GC为G1。 本文笔者从应用实践的角度出发&#xff0c;记录一些关于GC的一些实践总…

吾爱出品,文件分类助手,高效管理您的 PC 资源库

在日常使用电脑的过程中&#xff0c;文件杂乱无章常常让人感到困扰。无论是桌面堆积如山的快捷方式&#xff0c;还是硬盘中混乱的音频、视频、文档等资源&#xff0c;都急需一种高效的整理方法。文件分类助手应运而生&#xff0c;它是一款文件管理工具&#xff0c;能够快速、智…

修改Flutter工程中Android项目minSdkVersion配置

Flutter项目开发过程中&#xff0c;根据模板自动生成.android项目&#xff0c;其中app>build.gradle中minSdkVersion的值是19&#xff0c;但是依赖了一个三方库&#xff0c;它的Android sdk 最小版本只支持到21&#xff0c;运行报错如下&#xff1a; 我们可以手动修改.andro…

如何设计一个订单号生成服务?应该考虑那些问题?

如何设计一个订单号生成服务&#xff1f;应该考虑那些问题&#xff1f; description: 在高并发的电商系统中&#xff0c;生成全局唯一的订单编号是关键。本文探讨了几种常见的订单编号生成方法&#xff0c;包括UUID、数据库自增、雪花算法和基于Redis的分布式组件&#xff0c;并…

Java学习总结-Stream流

啥是Stream流&#xff1f; 用于操作集合或数组的数据。他就像把数据化为成一条河流&#xff0c;我们可以对这条流操作&#xff0c;例如过滤。 获取Stream流 Stream流的常用方法&#xff1a; Stream流的终结方法&#xff1a; 收集Stream流

《TypeScript 面试八股:高频考点与核心知识点详解》

“你好啊&#xff01;能把那天没唱的歌再唱给我听吗&#xff1f; ” 前言 因为主包还是主要学习js&#xff0c;ts浅浅的学习了一下&#xff0c;在简历中我也只会写了解&#xff0c;所以我写一些比较基础的八股&#xff0c;如果是想要更深入的八股的话还是建议找别人的。 Ts基…

热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二

找树左下角的值 本题递归偏难&#xff0c;反而迭代简单属于模板题&#xff0c; 两种方法掌握一下 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 我们来分析一下题目&#…

Qt窗口控件之浮动窗口QDockWidget

浮动窗口QDockWidget QDockWidget 用于表示 Qt 中的浮动窗口&#xff0c;浮动窗口与工具栏类似&#xff0c;可以停靠在主窗口的上下左右位置&#xff0c;也可以单独拖出来作浮动窗口。 1. QDockWidget方法 方法说明setWidget(QWiget*)用于使浮动窗口能够被添加控件。setAllo…

Web前端之JavaScript的DOM操作冷门API

MENU 前言1、Element.checkVisibility()2、TreeWalker3、Node.compareDocumentPosition()4、scrollIntoViewIfNeeded()5、insertAdjacentElement()6、Range.surroundContents()7、Node.isEqualNode()8、document.createExpression()小结 前言 作为前端开发者&#xff0c;我们每…

【Linux-驱动开发-系统调用流程】

Linux-驱动开发-系统调用流程 ■ Linux-系统调用流程■ Linux-file_operations 结构体 ■ Linux-系统调用流程 ■ Linux-file_operations 结构体 在 Linux 内核文件 include/linux/fs.h 中有个叫做 file_operations 的结构体&#xff0c;此结构体就是 Linux 内核驱动操作函数集…

ToolsSet之:ASCII字符表和国际标准代码表

ToolsSet是微软商店中的一款包含数十种实用工具数百种细分功能的工具集合应用&#xff0c;应用基本功能介绍可以查看以下文章&#xff1a; Windows应用ToolsSet介绍https://blog.csdn.net/BinField/article/details/145898264 ToolsSet中Other菜单下的ASCII Table是一个ASCII…

C语言判断闰年相关问题

一、简单闰年问题引入 写一个判断年份是否为闰年的程序? 运行结果: 二、闰年问题进阶 使用switch语句根据用户输入的年份和月份,判断该月份有多少天? 第一种写法(判断年份写在switch的case的里面): 运行结果: 第二种解法(先判断闰年): 运行结果: 三、补充 switch中的ca…

基于Java的班级事务管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展&#xff0c;推动了很多行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、畅通、高效的线上管理系统。当前的班级事务管理存在管理效率低下…

javaweb后端登录功能cookie session

登录功能 只需要这几个&#xff0c;用原来的返回太多用不上的信息&#xff0c;新写一个类只返回登录的结果 Ctrli 实现service的方法 和mapper相关的起名不用和业务一样 登录校验 登录校验思路 会话技术 cookie 创建cookie对象&#xff0c;响应给浏览器 服务端设置的…

《可爱风格 2048 游戏项目:HTML 实现全解析》

一、引言 在如今的数字化时代&#xff0c;小游戏以其简单易上手、趣味性强的特点深受大家喜爱。2048 游戏作为一款经典的数字合并游戏&#xff0c;拥有庞大的玩家群体。本文将详细介绍一个用单文件 HTML 实现的可爱风格 2048 游戏项目&#xff0c;它不仅具备传统 2048 游戏的基…

UART转APB模块ModelSim仿真

一、简介 之前介绍过一个UART转AHB模块&#xff0c;这个代码的框架有个好处&#xff0c;就是FPGA内总线接口比较容易修改成其他总线接口。下图是UART转AHB模块中子模块uart_ahb_mst的框图&#xff0c;主要有三个状态机&#xff1a; &#xff08;1&#xff09; UART_RX_FSM将接收…

ReAct: Synergizing Reasoning and Acting in Language Models

https://zhuanlan.zhihu.com/p/624003116https://zhuanlan.zhihu.com/p/624003116https://github.com/apssouza22/ai-agent-react-llm/tree/main

尝试在软考62天前开始成为软件设计师-信息系统安全

安全属性 保密性:最小授权原则(能干活的最小权限)、防暴露(隐藏)、信息加密、物理保密完整性(防篡改):安全协议、校验码、密码校验、数字签名、公证 可用性:综合保障( IP过滤、业务流控制、路由选择控制、审计跟踪)不可抵赖性:数字签名 对称加密 DES :替换移位 3重DESAESR…