鹅毛羽翼丰满,能薅快薅,薅大厂的高工资呀。
昨天,腾讯2025校园招聘正式启动,不仅招聘规模相较前两年有较大增长,面向人群的毕业时间范围也进一步扩大,毕业时间为2024年1月至2025年12月的同学均可应聘。
虽然官方招聘上说是有实习生到了腾讯之后就去了巴黎看奥运和采访去了,
但是去了腾讯后到巴黎看奥运的事,应该不是我们技术人的岗位去的,而是腾讯体育那些新媒体工作者们。
关于今天的2025校招的启动,我们注意到与往年不一样的地方,包括:
1、部分岗位不再安排统一笔试:腾讯2025年校园招聘开放技术、产品、市场、设计、职能5个大类70余种岗位。
腾讯招聘对校招岗位JD(职位描述)进行全面刷新,并针对部分岗位上架了视频JD,帮助毕业生快速找到适合的岗位。
在招聘安排上,腾讯2025校园招聘不再安排统一笔试,但部分岗位保留个性化笔试流程。
2、校招面向的更广:其中最引人注意的是校招面向人群的毕业时间范围从一年拓宽至两年。
毕业时间为2024年1月至2025年12月的同学(中国大陆/内地以毕业证为准,中国港澳台及海外地区以学位证为准)均可通过腾讯招聘官网及“腾讯招聘”公众号投递简历,覆盖人群更广。
这也意味着,除了2025年应届毕业生外,2024届毕业生和部分2026届准毕业生也有望参与到此次招聘中。
3、技术岗薪资依然不错:腾讯去年校招薪资我去看了下,技术岗(含前端、后端、算法等)薪资依然不错,技术岗offer月薪一般分为三档。,我给大家整理一下,需要注意的是:这是去年的网上数据,而且今年7月10日腾讯发布全员邮件,称将调整内部薪酬福利政策(我的读者提醒的是:每个月能提前收到更多的钱,不过也多交些税),所以仅供参考!
既然腾讯校招正式启动了,,那么给大家分享腾讯的 Golang后端面经的几道二面题型,给准备参加秋招的同学做一个参考。
可以说问得很细,但是这位同学已经通过了,并且已完成HR面,等着排序中,
更多的技术知识可以访问皇子哥的网站:https://itgogogo.cn 免费阅读。
进程同步与进程通信很容易混淆,它们的区别在于:
IPC(Inter-Process Communication,进程间通信)是指在操作系统中,不同进程之间进行数据交换和通信的机制。下面是几种常见的实现进程间通信的方式:
管道 管道是通过调用 pipe 函数创建的,fd[0] 用于读,fd[1] 用于写。它具有以下限制:
只支持半双工通信(单向交替传输); 只能在父子进程或者兄弟进程中使用。适用于父子进程之间的通信,例如一个进程创建子进程并与其进行通信。
FIFO 也称为命名管道,去除了管道只能在父子进程中使用的限制。FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。 消息队列 相比于 FIFO,消息队列具有以下优点:
消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难; 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法; 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。适用于需要异步通信的场景,例如一个进程将消息发送到队列中,其他进程可以在需要时从队列中接收消息。
信号量 它是一个计数器,用于为多个进程提供对共享数据对象的访问。适用于进程间的同步和互斥操作,例如多个进程需要对共享资源进行访问控制。 共享存储 允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。需要使用信号量用来同步对共享存储的访问。多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外 XSI 共享内存不是使用文件,而是使用内存的匿名段。 套接字 与其它通信机制不同的是,它可用于不同机器间的进程通信。适用于网络通信和跨主机通信的场景,例如不同主机上的进程需要进行数据交换和通信。
同一台机器上的简单通信:
管道:适用于父子进程间的数据传输,方向性,一般用于简单的命令行工具或脚本。 命名管道:适用于没有亲缘关系的进程,提供半双工通信。 大量数据传输:共享内存),适用于需要大量数据快速交换的场景,需要结合信号量或互斥锁来保证数据一致性。
消息传递和异步通信:消息队列,适用于需要异步处理和消息持久化的场景,可以处理大量的消息并且保证顺序。
跨机器通信:套接字,适用于网络通信,可以在不同主机上的进程之间进行通信。
并发控制和资源访问:信号量,用于控制多个进程对共享资源的访问,防止资源竞争。
复杂对象或远程过程调用:远程过程调用(RPC),适用于复杂的对象序列化和远程调用场景,如分布式系统中服务之间的调用。
select, poll, 和 epoll 都是Unix/Linux系统中用于实现I/O多路复用的技术,它们允许一个单一的进程同时监听多个文件描述符(例如网络套接字)的I/O事件。
下面分别解释这三者的区别,以及为什么在许多情况下会选择 epoll。
| select | poll | epoll | |
|---|---|---|---|
| 底层 | 数组 | 链表 | 红黑树和双链表 |
| fd获取方式 | 遍历 | 遍历 | 事件回调 |
| 复杂度 | O(N) | O(N) | O(1) |
| 最大监听数 | 1024 | 无限 | 无限 |
| fd数据拷贝 | 每次调用select,需要将的数据从用户空间拷贝到内核空间 | 每次调用poll,需要将fd数据从用户空间拷贝到内核空间 | 使用内存映射mmap,不需要将fd数据从用户空间拷贝到内核空间 |
select select是最早的I/O多路复用函数之一,它接受一组文件描述符集合,并等待其中一个或多个文件描述符变为可读、可写或有异常状态。select的最大限制是每个集合最多只能包含1024个文件描述符,这在高并发的服务器应用中可能是一个瓶颈。poll poll函数改进了select的一些限制,主要是在于它没有文件描述符数量的上限(受限于系统资源)。poll使用一个pollfd结构体数组来代替select的位掩码,这样就可以动态地添加和删除文件描述符。但是,poll仍然需要在每次调用时遍历整个pollfd数组,这在文件描述符非常多的情况下会导致性能下降。epoll epoll是为了解决select和poll的不足而设计的。epoll提供了一个更为高效的方式来处理大量文件描述符的I/O事件。epoll的工作原理基于事件驱动模型,它维护一个内核事件表,当一个事件发生时,epoll只需要检查该事件是否在用户的事件列表中即可,而不是像poll那样需要遍历整个列表。
epoll?
epoll的关键特性包括:
效率: epoll在事件处理上更有效率,因为它只需要关心那些真正有事件发生的文件描述符。无文件描述符限制: epoll没有文件描述符的数量限制,取决于系统资源。边缘触发和水平触发模式: epoll支持两种事件触发模式,可以根据需求选择更合适的方式。
在高并发场景下,epoll 的优势尤为明显。由于其基于事件的机制,它可以更有效地管理大量连接,减少不必要的系统调用,提高整体性能。此外,epoll 的事件通知机制使得它能够更好地适应现代硬件和网络环境,从而成为构建高性能服务器和网络应用的首选I/O多路复用技术。
在Golang中,标准库的
net包内部使用了这些I/O多路复用技术,其中epoll在Linux系统上作为首选,因为其提供了更好的性能和可扩展性。
epoll是 Linux 内核提供的 I/O 多路复用机制,用于高效地管理大量文件描述符的 I/O 操作。epoll的核心思想是通过事件驱动的方式,将用户空间的事件请求与内核空间的事件通知进行解耦,从而实现高效的事件处理。下面是
epoll的基本机制和实现步骤:
创建 epoll实例首先,应用程序调用
epoll_create()或epoll_create1()函数创建一个epoll文件描述符。这个文件描述符是后续所有epoll操作的基础,相当于epoll的句柄。
注册文件描述符 接着,应用程序通过调用
epoll_ctl()函数,向epoll实例注册需要监控的文件描述符及其感兴趣的事件类型(如读、写等)。epoll_ctl()接受三个参数:epoll句柄、操作类型(如添加、修改、删除)、以及包含要监控的文件描述符和事件类型的结构体。
内核事件收集 一旦文件描述符被注册,Linux 内核就会开始监控这些文件描述符上的事件。内核维护一个事件表,当某个文件描述符上的事件发生时,内核会在事件表中记录这一事件。
事件通知 应用程序调用
epoll_wait()或epoll_pwait()函数来等待并获取已发生的事件。这两个函数会阻塞直到至少有一个事件发生或超时到达。当事件发生时,epoll_wait()返回就绪的事件数量,并填充由用户提供的事件数组,每个事件包含触发事件的文件描述符和事件类型。
事件处理 应用程序从
epoll_wait()获得的事件数组中读取并处理就绪事件。对于每一个就绪的文件描述符,应用程序可以进行相应的读写操作或其他处理。
重复或结束 如果应用程序希望继续监听事件,可以重复步骤 4 和 5;如果不再需要监听某些文件描述符,可以通过
epoll_ctl()函数删除对应的注册信息。
多线程网络I/O体现了并发处理和资源优化的思想,它允许网络应用程序同时处理多个客户端的请求,从而提高了系统的响应能力和吞吐量。
并发处理:多线程网络I/O使应用程序能够同时执行多个任务,每个线程可以独立地处理一个客户端的请求。这意味着当一个线程正在等待某个I/O操作完成时,其他线程可以继续处理其他请求,而不是让整个程序停滞。 资源优化:通过合理分配线程和CPU资源,多线程网络I/O可以最大化利用系统资源。每个线程都负责一部分计算或I/O任务,从而避免了单一线程在等待I/O操作时浪费CPU时间。 响应性和吞吐量:在多线程网络I/O模型中,即使在处理复杂或耗时的请求时,服务器也能迅速响应新进来的请求。这提高了服务器的响应性和吞吐量,因为更多的请求可以在单位时间内得到处理。 负载均衡:多线程网络I/O可以实现负载均衡,即多个线程可以并行处理请求,从而减轻单个线程的负担。这有助于保持服务器性能稳定,即使在高负载下也能提供一致的服务质量。
Go的垃圾回收机制综合运用了多种先进的算法和技术,以提供高效、低延迟的内存管理。它的设计目标是在保证程序性能的同时,尽可能简化开发者在内存管理方面的负担。
通过并发、增量和三色标记优化的标记算法,以及逃逸分析、写屏障策略,Go能够在大多数情况下实现平滑的内存管理,减少GC引起的暂停。
Go垃圾回收的基本原理:
标记-清除(Mark-Sweep):Go使用标记-清除算法来识别不再使用的内存区域。在标记阶段,垃圾回收器遍历所有可达的对象,将它们标记为“活动”。未被标记的对象被视为垃圾,可以被回收。在清除阶段,垃圾回收器释放未标记的内存,使其可供重新分配。 并发标记:为了减少GC暂停时间,Go的垃圾回收器采用并发标记策略,即标记过程可以在应用程序运行时进行,与应用程序的其他部分并行执行。这降低了GC的总体暂停时间,提高了应用的响应性。 增量标记:增量标记策略意味着标记过程可以分段进行,而不是一次性完成。这样可以进一步减少GC暂停时间,因为每次只处理一小部分未标记的内存。 三色标记:三色标记是一种优化的标记算法,用于减少标记过程中的暂停时间。在三色标记中,对象被分为白色(未标记)、黑色(已标记)和灰色(待处理)三种颜色。这种算法允许标记过程更高效地进行,减少全局暂停时间。 逃逸分析:逃逸分析是Go编译器的一个特性,它分析变量的作用域和生命周期,判断变量是否逃逸出当前函数作用域。如果一个变量没有逃逸,它就可以被分配在栈上,而不是堆上,从而避免了额外的垃圾回收开销。 写屏障:主要解决三色标记法存在并发性问题。
进程 (Process)
进程是计算机程序的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程都有独立的地址空间、数据段、堆栈和资源。进程之间相互隔离,通信需要通过进程间通信(IPC)机制,如管道、消息队列、信号量等。
线程 (Thread)
线程是进程内的一个执行单元,是比进程更小的调度和执行单位。同一进程内的线程共享进程的地址空间、文件描述符和其他资源,使得线程间的通信比进程间通信更高效。线程有自己的栈和寄存器集,但线程的创建和切换仍有一定的开销。
Golang 协程 (Goroutine)
Goroutine 是 Go 语言中一种轻量级的线程,由 Go 运行时调度。Goroutine 的开销远小于标准的 OS 线程,可以轻松创建数万个 Goroutine 同时运行。Goroutine 之间的切换由 Go 运行时管理,无需依赖操作系统的线程调度,这使得 Goroutine 成为并发编程中处理大量 I/O 绑定任务的理想选择。Goroutine 具有自动的调度和上下文切换,使得并发编程更加简单和高效。
索引的主要目的是加速数据检索速度,但是创建和维护索引也会占用额外的磁盘空间,并且在插入、更新或删除数据时会增加操作的时间复杂度。
考虑到低基数字段的索引效率和维护成本,通常不建议为性别字段创建索引。
数据不一致(不考虑事务隔离级别的情况下):
脏读:一个事务读取了另一个未提交事务修改的数据。如果第二个事务最终回滚,第一个事务读取的数据就是无效的,这会导致数据不一致。 不可重复读:在一个事务中,两次读取同一数据返回不同的结果,这是因为另一个事务在此期间修改并提交了数据。 幻读:在一个事务中,两次执行相同的查询,第二次查询返回了第一次查询时不存在的新行,这是因为另一个事务在此期间插入了新数据。 死锁:当两个或更多事务互相等待对方释放锁时,会发生死锁。例如,事务A持有表X的锁并等待表Y的锁,而事务B持有表Y的锁并等待表X的锁,这时两个事务都将无限期等待,除非系统检测到死锁并采取行动(如回滚其中一个事务)。
资源争用:当多个事务试图同时访问相同资源时,数据库必须实施某种形式的锁定机制来防止冲突。这可能导致性能瓶颈,尤其是在热点数据上,多个事务可能长时间等待锁的释放。
性能退化:并发操作会增加数据库的负载,包括CPU、内存和I/O资源。如果并发过高,可能会导致响应时间变长,甚至系统崩溃。
在InnoDB存储引擎里,利用辅助索引查询,先通过辅助索引找到主键索引的键值,再通过主键值查出主键索引里面没有符合要求的数据,它比基于主键索引的查询多扫描了一棵索引树,这个过程就叫回表。
例如:select * from user where name = ‘张三’;
以上,点亮【赞与在看】让我们心中充满力量、披荆斩棘、不惧未来!
推荐阅读
关于作者:一位热爱技术,并在职场与自媒体间探索的实践者,希望通过分享个人经验和见解,帮助更多人实现自我成长和价值。如果您对我的公众号内容感兴趣,欢迎关注。
也可以在下方添加我微信和一支烟花AI社区技术群,一起交流技术、职场心得。

原文作者:皇子谈技术;如有侵权,请联系管理员删除。