![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试题
文章平均质量分 81
爱编程的小猴
从事互联网行业开发与教学10余年,有丰富的开发教学经验。对技术原理研究透彻,熟练C++语言、Golang语言、Windows、Linux操作系统内核编程、网络编程、数据库编程等。有较强的架构能力,参与研发项目有IM即时通讯、分布式云盘存储、短视频直播等。主导研发研发《C++面试专题课》、《服务器高级架构师课》、《Go入门到实战》等多门课程。
展开
-
【面试题】Golang 锁的相关问题(第七篇)
Go语言的Mutex主要有锁定状态、未锁定状态、唤醒状态(在内部实现中可能用于通信)、饥饿状态以及等待者计数等几种状态。这些状态共同协作,确保了Mutex能够高效地控制对共享资源的访问,同时避免了死锁和条件竞争等并发问题。需要注意的是,上述状态是基于Go语言sync包中Mutex的通用实现和描述,不同版本的Go语言或不同的锁实现可能会有所差异。因此,在具体使用时,建议参考Go语言的官方文档或源代码以获取最准确的信息。正常模式和饥饿模式是Mutex在Go语言中提供的两种不同的工作模式,它们各有优缺点。原创 2024-07-16 10:31:00 · 1023 阅读 · 0 评论 -
【面试题】Golang之互斥锁与读写锁(第七篇)
在Go语言(Golang)中,锁是用来实现并发控制的一种机制,它可以帮助多个goroutine安全地访问共享资源,防止数据竞争和条件竞争的发生。Go标准库提供了多种锁的实现,其中最常见和最基本的包括互斥锁(Mutex)和读写锁(RWMutex)。原创 2024-07-16 10:04:44 · 363 阅读 · 0 评论 -
【面试题】Golang 自动垃圾回收机制细节(第六篇)
如果三色标记法不被STW保护 条件1:一个白色对象被黑色对象引用 (白色被挂在黑色下),条件2:灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)Go V1.5三色标记法,对空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通。Go V1.8三色标记法,混合写屏障机制,栈空间不启动,堆空间启动,整体过程几乎不需要STW,效率极高。3.遍历灰色集合,将灰色的对象引用的对象从白色集合放入灰色集合中,之后将此灰色对象放入黑色集合。4.停止暂停,让程序继续跑。原创 2024-07-15 13:43:23 · 496 阅读 · 0 评论 -
【面试题】Golang垃圾回收机制(第五篇)
Golang(也称为Go语言)的垃圾回收机制是一种自动化的内存管理技术,它能够在程序运行时自动回收不再使用的内存,从而避免内存泄漏和资源浪费。原创 2024-07-15 11:22:27 · 470 阅读 · 0 评论 -
【面试题】Golang(第四篇)
slice底层结构并没有使用加锁等方式,不支持并发读写,所以并不是线程安全的,使用多个 goroutine 对类型为 slice 的变量进行操作,每次输出的值大概率都不会一样,与预期值不一致;slice在并发执行中不会报错,但是数据会丢失如果想实现slice线程安全,有两种方式:方式一:通过加锁实现slice线程安全,适合对性能要求不高的场景。var lock sync.Mutex //互斥锁for i := 0;i < 10000;原创 2024-07-12 09:57:26 · 1141 阅读 · 1 评论 -
【面试题】Golang 之Channel底层原理 (第三篇)
在使用 channel 进行 goroutine 之间的通信时,有时候场面会变得十分复杂,以至于写出难以觉察、难以定位的偶现 bug,而且上线的时候往往跑得好好的,直到某一天深夜收到服务挂了、OOM 了之类的告警…… 来梳理一下使用 channel 中常见的三大坑:panic、死锁、内存泄漏,做到防患于未然。原创 2024-07-12 09:51:52 · 1187 阅读 · 1 评论 -
【面试题】Golang 之 Channel(第二篇)
通道是Go中自带的、唯一一个可以满足并发安全性的类型。通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。原创 2024-07-11 14:01:10 · 814 阅读 · 0 评论 -
【面试题】Golang (第一篇)
协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。线程:一个线程上可以跑多个协程,协程是轻量级的线程。context是一个接口,它具备手动、定时、超时发出取消信号、传值等功能,主要用于控制多个goroutine之间的协作,尤其是取消操作。一旦取消指令下达,那么被context跟踪的这些goroutine都会收到取消信号,就可以清理和退出操作。原创 2024-07-11 13:58:35 · 1770 阅读 · 1 评论 -
【面试题】MySQL(第四篇)
MySQL的流程涉及连接与认证、查询处理、数据存储与检索以及事务处理等多个环节。通过优化这些环节中的各个步骤,可以显著提高MySQL数据库的性能和可靠性。同时,了解MySQL的执行流程也有助于更好地理解其内部工作机制,从而更好地进行数据库设计和优化。原创 2024-07-10 09:35:24 · 901 阅读 · 0 评论 -
【面试题】MySQL(第三篇)
存储过程是一组为了完成特定功能的SQL语句集,它存储在数据库中,一次编译后永久有效。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程可以提高数据库操作的效率和安全性,同时减少网络通信量。存储过程是数据库系统中一个非常重要的功能,它能够提高数据库操作的效率和安全性,减少网络通信量,并且能够封装复杂的数据处理逻辑。通过合理使用存储过程,可以优化数据库的性能,提升应用程序的响应速度。定义:触发器是一种特殊类型的程序或事件,当特定的条件满足时,会自动触发执行的操作。原创 2024-07-10 09:34:02 · 722 阅读 · 0 评论 -
【面试题】MySQL 索引(第二篇)
基本定义:索引是一个排序的列表,其中存储着索引的值和包含这些值的数据所在行的物理地址(或逻辑指针)。这类似于书籍的目录,通过目录可以快速定位到书中的具体内容。物理结构:索引是一个单独的、物理的数据库结构,它是表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。在数据库索引的底层数据结构中,B+树因其良好的性能和广泛的应用场景而被广泛采用。它能够有效地减少磁盘I/O操作次数,提高查询效率,并支持等值查询和范围查询等多种查询方式。原创 2024-07-08 10:01:35 · 1024 阅读 · 0 评论 -
【面试题】MySQL(第一篇)
MySQL常见的面试题原创 2024-07-08 09:43:42 · 870 阅读 · 0 评论 -
【面试题】Reactor模型
Reactor模型是一种高效、可扩展的并发编程模型,特别适用于处理大量并发连接和I/O操作。通过合理地选择和使用不同类型的Reactor模型,可以满足不同业务需求下的性能要求。原创 2024-07-05 16:33:55 · 426 阅读 · 0 评论 -
【面试题】IO多路复用模型之poll\epoll
epoll模型通过高效的数据结构和API函数,为Linux系统下的网络编程提供了强大的支持。它不仅能够处理大量的并发连接,还能通过事件驱动的方式提高程序的响应速度和性能。因此,在需要处理大量并发连接的场景中,epoll模型是一个非常好的选择。原创 2024-07-05 16:32:50 · 878 阅读 · 0 评论 -
【面试题】网络IO多路复用模型之IOCP
IOCP是Input/Output Completion Ports的简称,中文翻译为“输入输出完成端口”。它是一个支持多个同时发生的异步I/O操作的应用程序编程接口(API)。IOCP是一种高效的异步I/O模型,它通过事件驱动的方式和完成队列来处理I/O请求,从而避免了阻塞式I/O带来的性能问题。在需要高性能、高并发、低延迟的应用场景下,IOCP具有很大的优势。原创 2024-07-03 13:16:16 · 442 阅读 · 0 评论 -
【面试题】网络IO多路复用模型之异步事件
WSAEventSelect模型是WindowsSockets提供的另外一个有用的异步I/O模型。该模型允许一个或多个套接字上接收以事件为基础的网络事件通知。Windows Sockets应用程序在创建套接字后,调用WSAEventSlect()函数,将一个事件对象与网络事件集合关联在一起。当网络事件发生时,应用程序以事件的形式接收网络事件通知。因此,该模型增加了开发的难度,增加了开发人员的编码量。优势:可以在一个非窗口的Windows Sockets程序中,实现多个套接字的管理。原创 2024-07-03 13:10:24 · 218 阅读 · 0 评论 -
【面试题】网络 IO多路复用模型 select
为什么要引入select模型呢 同步阻塞问题我们可以利用多线程 或者把socket改成非阻塞 当我们要接受数据的时候我们要来回查看接受缓冲区有没有数据这样我们就要来回切换用户和内核浪费时间降低效率 所以我们让一个把所有的socket的有无数据都看了呢。原创 2024-07-02 14:57:04 · 360 阅读 · 0 评论 -
【面试题】网络IO模型
同步阻塞IO:简单易懂,但不适用于高并发场景。同步非阻塞IO:通过不断轮询检查IO状态,提高CPU利用率,但可能导致CPU使用率过高。IO多路复用:通过select、poll、epoll等机制实现单个进程同时处理多个IO操作,适用于高并发场景。异步IO:用户进程不需要等待IO操作完成,可以显著提高程序性能和资源利用率。在选择IO模型时,需要根据实际应用场景的需求和系统的性能要求来综合考虑。原创 2024-07-02 14:48:17 · 542 阅读 · 0 评论 -
【面试题】网络IP协议(第六篇)
路由器转发数据包的过程是一个基于路由表的决策过程。通过接收数据包、查找最佳路径、计算转发路径(如果需要)、转发数据包以及可能的路由表更新等步骤,路由器能够准确地将数据包转发到目标网络或目标主机,实现网络通信的功能。原创 2024-07-01 15:41:40 · 1034 阅读 · 0 评论 -
【面试题】网络UDP协议(第五篇)
UDP协议是面向无连接的、不可靠的传输层协议,可以通过在应用层添加一些机制来实现UDP的可靠传输。序列号和确认应答机制:为每个发送的数据包分配一个唯一的序列号,并且要求接收方发送确认应答来确认已经收到数据包。重传机制:在数据发出后,如果超过某个时间没有收到确认回复,则认为数据包丢失,重新发送数据。数据校验:可以采用哈希算法对发送和接收到的数据进行哈希值校验,比较二者是否一致,如果不一致则数据错误,触发重传。原创 2024-07-01 15:35:00 · 515 阅读 · 0 评论 -
【面试题】网络TCP之拥塞窗口(第四篇)
拥塞窗口是TCP在发送端维护的一个可滑动窗口,用于限制可能在端对端间传输的未确认分组总数量。它的大小取决于网络的拥塞程度,并且动态地在变化。原创 2024-06-28 10:58:46 · 979 阅读 · 0 评论 -
【面试题】网络TCP(第三篇)
TCP采用三次握手而不是两次握手,主要是为了确保连接的可靠性和有效性,防止失效的连接请求导致资源浪费,并确保双向通信的可靠性。通过三次握手,客户端和服务器能够确认彼此的状态和序列号,为后续的数据传输打下坚实的基础。原创 2024-06-28 10:47:54 · 878 阅读 · 0 评论 -
【面试题】网络 DNS协议(第二篇)
DNS是一种将域名转换为IP地址的协议。它的作用是通过将域名解析为相应的IP地址,使得用户可以更方便地访问互联网上的资源,而无需直接记住大量的IP地址。递归查询:客户端向本地域名服务器发送解析请求后,本地域名服务器会向其他域名服务器发起查询请求,并将最终的解析结果返回给客户端。迭代查询:本地域名服务器向其他域名服务器发送解析请求后,其他域名服务器只能给出自己所知道的解析结果,如果不知道,会返回一个指向下一个需要查询的域名服务器的地址。原创 2024-06-27 14:28:42 · 361 阅读 · 0 评论 -
【面试题】网络 http、https协议(第一篇)
当需要从服务器检索信息时,使用 GET 请求。当需要向服务器提交数据或执行其他非幂等操作时,使用 POST 请求。在传输敏感数据时,务必使用 HTTPS 协议来加密数据。根据需要传输的数据量选择适当的请求方法。如果数据量较大,则使用 POST 请求;如果数据量较小且主要是检索信息,则使用 GET 请求。原创 2024-06-27 14:21:58 · 1122 阅读 · 0 评论 -
【面试题】Linux下的GDB(第二篇)
当程序崩溃时,操作系统可能会生成一个coredump文件(核心转储文件),该文件包含了程序崩溃时的内存映像和寄存器状态等信息。:在调试多线程程序时,需要特别注意线程间的同步和通信机制,以及避免竞态条件等问题。(当单步调试某一个线程时,保证在调试过程中当前线程不会发生改变,其他线程也会随着被调试线程的单步执行而单步执行)。GDB会自动加载可执行文件和coredump文件,并停留在程序崩溃时的位置。命令监视变量的值,当变量值发生变化时,GDB会自动停止程序。当程序被停住时,可以检查或者说监视此时程序中的数值。原创 2024-06-25 15:09:02 · 655 阅读 · 0 评论 -
【面试题】Linux 下 MakeFile(第一篇)
Makefile中有一些特殊宏定义,如$@(表示规则中的目标文件集)、$<(表示依赖关系中的第一个文件)等。这些宏定义在规则中非常有用,可以简化Makefile的编写。可以在Makefile中直接定义变量,如VAR=value。在Makefile中引用变量时,使用$(VAR)的格式。此外,还可以在命令行中通过的方式传递变量值给Makefile。原创 2024-06-25 15:04:51 · 527 阅读 · 0 评论 -
【面试题】操作系统之银行家算法(第七篇)
银行家算法是荷兰学者Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁。核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。原创 2024-06-22 14:42:06 · 745 阅读 · 0 评论 -
【面试题】操作系统之死锁(第五篇)
多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。原创 2024-06-22 14:29:04 · 996 阅读 · 0 评论 -
【面试题】操作系统面试题(第六篇)
这种算法也叫做电梯算法,比如电梯保持按一个方向移动,直到在那个方向上没有请求为止,然后改变方向。但是存在这样的问题,中间部分的磁道会比较占便宜,中间部分相比其他部分响应的频率会比较多,也就是说每个磁道的响应频率存在差异。原创 2024-06-20 09:55:41 · 1232 阅读 · 0 评论 -
【面试题】操作系统面试题(第四篇)
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。原创 2024-06-20 09:47:33 · 514 阅读 · 0 评论 -
【面试题】操作系统面试题(第三篇)
用户态和内核态是操作系统的两种运行状态。内核态:处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。用户态:处于用户态的 CPU 只能受限的访问内存,并且不允许访问外围设备,用户态下的 CPU 不允许独占,也就是说 CPU 能够被其他程序获取。原创 2024-06-19 11:10:58 · 636 阅读 · 0 评论 -
【面试题】操作系统面试题(第二篇)
中断处理程序可以在启动时预先分配一定数量的内存,并在需要时使用这些静态分配的内存。这种方式适用于已知内存需求的情况,但不适用于变动或不确定的需求。操作系统内核通常会维护一个内存池,其中包含了一些预分配的内存块。中断处理程序可以通过内核提供的API请求内存块,然后在使用完毕后释放它们。这种方式可以有效地管理内存,但需要确保内核内存池足够大以满足中断处理程序的需求。伙伴系统是一种内存管理算法,通常用于内核中。原创 2024-06-19 10:59:01 · 849 阅读 · 0 评论 -
【面试题】 操作系统面试题 (第一篇)
操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件,它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层,使应用软件和硬件进行分离,让我们无需关注硬件的实现,把关注点更多放在软件应用上。通常情况下,计算机上会运行着许多应用程序,它们都需要对内存和 CPU 进行交互,操作系统的目的就是为了保证这些访问和交互能够准确无误的进行。原创 2024-06-18 10:51:42 · 603 阅读 · 0 评论 -
【面试题】 Redis (下篇)
处理Redis中的大key问题需要根据具体的应用场景和需求来选择合适的策略。通过识别大key、了解其影响、并采取相应的处理策略,可以有效地提高Redis的性能和稳定性。选择合适的fsync策略需要权衡Redis的性能和数据的持久化需求。如果你对数据的持久性有很高的要求,并且可以接受一定的性能损失,那么可以选择always策略。如果你更关注Redis的性能,并且可以接受在系统崩溃时可能丢失一部分数据的风险,那么可以选择no或everysec策略。在大多数情况下,everysec。原创 2024-06-17 11:20:05 · 373 阅读 · 0 评论 -
【面试题】Redis (上篇)
Redis(Remote Dictionary Server)是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis 支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)与位图(bitmaps)等类型的数据。Redis 还提供了多种操作这些数据结构的功能,如排序、事务等。高性能:Redis 所有的数据都存储在内存中,读写速度非常快,其性能远超数据库。支持多种数据结构:Redis 支持丰富的数原创 2024-06-17 11:18:37 · 838 阅读 · 0 评论 -
【面试题】Qt 常见的面试题
激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。因此,多个槽函数的执行顺序与排队连接方式一样,先连接的槽函数会先被执行,后连接的槽函数会后被执行。当一个对象的父对象被设置为另一个对象时,它会从原来的对象树中移除,并成为新的对象树的一部分。先连接的槽函数会先被执行,后连接的槽函数会后被执行。1.直接连接方式:触发信号的线程会直接调用与该信号连接的槽函数,并且所有的槽函数都会在同一个线程中被执行。原创 2024-06-13 10:08:20 · 654 阅读 · 0 评论 -
【面试题】C++新特性(第六篇)
这些类和原语为C++提供了强大的多线程和同步支持。用于创建和管理线程,和用于在不同线程之间传递数据和异常,和std::mutex用于同步线程的执行和保护共享数据。在编写多线程程序时,正确地使用这些工具可以确保程序的正确性和性能。原创 2024-06-06 10:32:49 · 571 阅读 · 0 评论 -
【最全】C++面试题 STL (第五篇)
STL(Standard Template Library,标准模板库)是C++的一个重要组成部分,它包含了一系列容器、迭代器、算法和函数对象,用于简化常见的编程任务。函数对象(也称为仿函数或函子)在C++中是一种特殊的对象,它们具有类似函数的行为,即可以被调用。函数对象实际上是具有operator()重载的类对象,这使得它们能够像普通函数那样被调用。函数对象的主要优点之一是它们可以携带状态。与普通的函数指针或函数相比,函数对象可以包含自己的数据成员,并在其operator()的调用中使用这些数据。原创 2024-06-05 13:27:00 · 828 阅读 · 0 评论 -
【最全】C++面试题 (第四篇)
volatilemutable和explicit在各自的编程语言中扮演着不同的角色。volatile用于确保并发编程中数据的一致性。mutable用于在C++中突破const的限制,允许在const上下文中修改成员变量。explicit(虽然不是关键字)在编程中强调需要明确指出的操作或声明,提高代码的可读性和明确性。4.)示例1. volatile (在C++中)#include // 也可以使用 std::atomic 来代替 volatile。原创 2024-06-05 09:33:25 · 730 阅读 · 0 评论 -
【最全】C++面试题 (第三篇)
秋招在即,帮助大家整理C++面试题,高效复习原创 2024-06-04 15:12:12 · 515 阅读 · 0 评论