# gopher **Repository Path**: wear-crown/gopher ## Basic Information - **Project Name**: gopher - **Description**: 总结go面试题 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2021-06-20 - **Last Updated**: 2022-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gopher ## 一、go相关 ### 1. golang的协程为什么比线程轻量 - 切换上 - 占用内存 - https://studygolang.com/articles/21716 ### 2. GPM模型 - 基础:http://www.crownblog.icu/post/GMP.html - 底层数据结构: https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-goroutine/#g ### 3. slice底层以及扩容机制 ### 4. 内存模型 ### 5. 内存分配 ### 6. GC ### 7. channel的底层原理 ### 8. map的底层数据结构 ### 9. 对已经关闭的channel进行读写会发生什么 ### 10. 什么是内存逃逸 - https://mp.weixin.qq.com/s/4YYR1eYFIFsNOaTxL4Q-eQ ### 11. sync.Mutex互斥锁的实现原理(正常模式、饥饿模式) - https://blog.csdn.net/yizhiniu_xuyw/article/details/113862446 ### 11. go中的切片扩容的策略(如何以及注意点) ### 12. new和make的区别 - https://www.cnblogs.com/mylly/p/11892887.html ### 13. panic和error - https://blog.csdn.net/baolingye/article/details/110879023 - https://tennysonsky.blog.csdn.net/article/details/78946265 ### 14. golang实现一个哈希表 - https://www.cnblogs.com/9527s/p/14222744.html ### 15. golang里面的读写锁实现与核心原理分析 - https://www.bilibili.com/read/cv7136700/ ### 16. go netpoll原生网络模型 - https://segmentfault.com/a/1190000038690758 ### 17. go runtime - https://zhuanlan.zhihu.com/p/95056679 ### 18 go实现一致性哈希 - https://www.cnblogs.com/moonyaoo/articles/13093321.html ### 19. 并发安全的map - https://blog.csdn.net/xiaohenghengmua/article/details/111693723 ## 二、计算机网络 ### 1. tcp、udp ### 2. 流量控制、拥塞控制 ### 3. http队头阻塞、多路复用 - http://www.crownblog.icu/post/http_edition.html ### 4. 网络的分层结构,各层的相关概念,相关的协议 ### 5. ARP协议以及作用 ### 6. TCP怎么保证可靠传输 ### 7. TCP四次挥手状态,最后close的时候,为什么会有2msl的等待时间 ### 8. 什么时候出现多次timewait状态?什么时候出现多次closewait状态? ### 9. http请求到服务端的过程 ### 10. 讲讲HTTP与HTTPS的区别;TLS是哪一层;HTTPS的连接流程是怎样;HTTPS的加密方式 ### 11. TCP连接全过程;三次握手过程;二次握手行不行;TCP四次挥手过程;TCP的重传 ### 12. 浏览器输入URL到渲染页面的全过程 ### 13. TCP拥塞控制方法;什么是TCP连接复用;TCP滑动窗口,发送窗口,接收窗口; ### 14. 如果让你来实现客户端和服务端文件发送和接收的进度条,你会怎么实现;如何判断已经发送的字节数的呢 - 通过已发送的字节数比上总字节数来实现进度条;通过tcp报文中的序号字段 ### 15. 半连接状态的协议 - TCP三次握手中,如果A向B发送连接, B正常响应,但是A不进行第三次的握手,这就是半连接 - 半连接攻击:会造成被分配的资源一直消耗着,知道资源耗尽 ### 16. Ping 命令的执行过程和应用协议 - https://www.cnblogs.com/jkzr/p/10729093.html ### 17. tcp粘包问题 - https://www.cnblogs.com/sui776265233/p/9289858.html ### 18. http2中多路复用的原理 - https://blog.csdn.net/weixin_33693070/article/details/88711831 ### 19. TCP协议中的数据包分片与重组功能 当TCP传输的数据包比较大时,在接收方会进行分片,在接收方进行数据包的重组。 - 发送方: 将数据包分为多个TCP头部+数据包的组合,TCP头部中存着不同的数据序号;之后将多个组合交由IP模块,统一添加IP头部和MAC头部,IP头部的ID号设为统一的。 - 接收方: IP模块具有分片重组的功能,如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包。 分片的包会在IP头部的标志字段中进行标记,当收到分片的包时,IP模块会将其暂时存在内部的内存空间中,然后等待IP头部中具有相同ID的包全部到达,因为同一个包的所有分片都具有相同的ID。此外,IP头部还有一个分片偏移量的字段,它表示当前分片在整个包中所处的位置。根据这些信息,在所有的分片全部收到之后,就可以将它们还原成原始的包。 > 解析:数据包的分片和重组里边还涉及到了MTU和MSS的概念,介绍如下: - MTU: Maxitum Transmission Unit 最大传输单元 - MSS: Maxitum Segment Size 最大分段大小,MSS就是TCP数据包每次能够传输的最大数据分段。 ### 20. http 响应码 301 和 302 - 301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。 - 302 Found 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。 - https://www.cnblogs.com/lanqiu5ge/p/9457074.html ### 21. TCP UDP进程端口占用情况 - netstat -p ### 22. 拥塞控制 - https://blog.csdn.net/qq_41431406/article/details/97926927 ### 23. Dos攻击、DDos攻击、DRDos攻击、SYN洪泛攻击 - https://www.cnblogs.com/mfrbuaa/p/5268542.html ## 三、操作系统 ### 1. 进程线程协程 - https://blog.csdn.net/daaikuaichuan/article/details/82951084 ### 2. 进程间通信 - 管道(Pipe)、命名管道(FIFO)、消息队列(Message Queue) 、信号量(Semaphore) 、共享内存(Shared Memory);套接字(Socket)。 - https://blog.csdn.net/zhaohong_bo/article/details/89552188 ### 3. 进程的状态,状态之间的转换 就绪状态--->运行状态:获得处理机资源(分派处理机的时间片) 运行状态--->就绪状态:1)处于运行状态的进程时间片用完 2)当有更高优先级的进程就绪时 运行状态--->阻塞状态:1)进程请求资源(外设)使用和分配 2)等待某一事件的发生(IO操作完成) 阻塞状态--->就绪状态:当进程等待事件到来(IO操作结束或者中断的结束) ### 4. cpu的上下文切换问题 - 进程上下文切换 - 线程上下文切换 - 中断上下文切换 - https://zhuanlan.zhihu.com/p/52845869 ### 5. IO模型 - 同步阻塞、同步非阻塞、多路复用、信号驱动、异步非阻塞 - https://www.cnblogs.com/jackion5/p/13544927.html ### 6. 进程地址空间有哪些划分 - 代码区、数据区、栈区、堆区 ### 7. 共享内存是怎么回事?映射到实际物理内存的虚拟地址在地址空间的哪一部分 - 内存映射区,堆和栈之间直接的那个位置(习惯上归类为堆区) ### 8. 物理内存和虚拟内存 - 物理内存:硬件实际的内存大小,比如常见的500G硬盘,32G的U盘等。500G、32G指的是物理内存 - 虚拟内存:是计算机系统中一种内存管理技术,因为计算机内存的造价比较高,一般常见内存8G,而计算机的应用软件都是在内存中运行,每个应用都会占一定的内存,这就导致一个问题,如果计算机同时运行很多软件,使计算机的内存空间很容易被占满,那么计算机就无法运行用户的下一个应用了,直到空出足够的内存。虚拟内存技术就是解决用户内存不足的问题,当执行程序占用了大部分内存,导致当前内存不足以支撑下一个应用时,系统便会”拿”出一部分物理内存来充当内存使用。具体操作流程是这样的,程勋运行的时候,可以先将一部分需要运行的程序装入内存,剩余部分暂且放在外存,当这部分运行结束需要运行下一部分时,将已运行的部分从内存转移到外存,同时将外存需要的那部分转移到内存,这样就可以避免因为内存不足引起的程序无法运行的问题。 ### 9. 死锁 - https://cyc2018.xyz/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%20-%20%E6%AD%BB%E9%94%81.html ### 10. 应用写日志到磁盘,从调用write到写入到磁盘上的过程中发生了什么 - https://blog.csdn.net/bandaoyu/article/details/102594469 ### 11. mmap - https://www.cnblogs.com/huxiao-tee/p/4660352.html ## 四、数据库 ### 1. 索引相关(数据结构、索引类型、索引优化) - 索引 https://blog.csdn.net/ibigboy/article/details/104571930?depth_1- ### 2. 事务以及隔离级别(ACID以及底层实现) - https://www.cnblogs.com/superming/p/13368771.html ### 3. mysql锁(表级锁、行级锁、页级锁) - https://www.cnblogs.com/luyucheng/p/6297752.html ### 4. undolog、redolog、binlog - https://zhuanlan.zhihu.com/p/346970015 ### 5. 主从复制、读写分离 ### 6. mysql的where和having的区别 - having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的 - https://blog.csdn.net/yexudengzhidao/article/details/54924471 ### 7. SQL查询语句是怎么查询的,即执行查询语句的过程 - https://www.cnblogs.com/wupeixuan/p/11626024.html ### 8. MySQL 普通索引和唯一索引的区别 - https://www.cnblogs.com/hhhhuanzi/p/12318504.html ### 9. sql的优化策略 - https://blog.csdn.net/weixin_44141495/article/details/109631915 - https://www.cnblogs.com/riverone/p/14840313.html ### 10. MVCC原理 - https://blog.csdn.net/weixin_35489311/article/details/112293729 - https://www.jianshu.com/p/8845ddca3b23 ### 11. 查询语句中select from where group by having order by的执行顺序 - from--where--group by--having--select--order by from:需要从哪个数据表检索数据 where:过滤表中数据的条件 group by:如何将上面过滤出的数据分组 having:对上面已经分组的数据进行过滤的条件 select:查看结果集中的哪个列,或列的计算结果 order by :按照什么样的顺序来查看返回的数据 ### 12. Mysql聚簇索引和非聚簇索引原理 - https://blog.csdn.net/lisuyibmd/article/details/53004848 ### 13. 分库分表 - https://blog.csdn.net/azhuyangjun/article/details/86976568 - https://zhuanlan.zhihu.com/p/348659067 ### 14. mysql索引下推 Extra的值为Using index condition 使用索引下推可以减少回表的次数 - https://www.jianshu.com/p/d0d3de6832b9 ### 15. bin log 和 redo log的写入顺序 - https://zhuanlan.zhihu.com/p/161901853 ### 16. mysql innodb 重做日志 写满了怎么办? - https://segmentfault.com/q/1010000000601079 ## 五、分布式 ### 1. rpc、grpc ### 2. etcd、底层实现原理 ### 3. rpc与http的区别(有了http,为什么还要使用rpc) rpc与http虽然都是请求-响应,但是本质上不是一样的,rpc包含了传输协议以及序列化协议,rpc更快,rpc可以基于tcp或者http - https://blog.csdn.net/weixin_34362790/article/details/86753817 - https://www.zhihu.com/question/41609070 ## 六、Linux ### 1. select、poll和epoll ### 2. linux怎么查看端口是否占用 - lsof -i:端口号 ### 3. Linux 如何查看某个进程占用内存情况 - https://blog.csdn.net/fengyuanye/article/details/102526513 ### 4. kill的原理以及kill的相关信号 ### 5. 孤儿进程与僵尸进程 ### 6. iostat和iotop - https://www.cnblogs.com/zjz20/p/13793536.html ### 7. 统计一个日志文件里面 请求出现 404 的 ip 要求去重 - cat web.log| grep -E ' 404 '|awk '{print $1}'|sort |uniq ### 8. linux查询一个日志文件中访问次数最多前10个IP - cat log.txt|awk -F" " '{print &1}' |sort|uniq -c|sort -nrt " "|awk -F" " 'print &2' |head -10 ## 七、redis ### 1. redis中的跳表 - http://www.crownblog.icu/post/redis-dataStructure.html ### 2. 分布式锁相关 ### 3. rehash ### 4. 持久化 ### 5. Redis的内存淘汰策略 - 从全局的键空间和设置了过期时间的键空间来谈 ### 6. redis的pipeline - https://blog.csdn.net/w1lgy/article/details/84455579 ### 7. redis的优缺点,哪些场景不适合使用 ### 8. redis的big key问题 - https://blog.csdn.net/huxianbo0807/article/details/102912172 ### 9. redis底层数据结构 - https://juejin.cn/post/6844904008591605767 ## 其他 ### 1. protobuf为什么那么快 - https://www.jianshu.com/p/72108f0aefca - https://blog.csdn.net/carson_ho/article/details/70568606 ### 2. redis和etcd的区别 - 从数据结构方面来讲 Redis支持多种数据类型(string,set,list,hash,zset) - 从读写性能上来讲,Redis读写性能优异,并且提供了RDB、AOF持久化,而etcd v3的底层采用boltdb做存储,value直接持久化 - 从使用场景上来看,etcd更适用于服务发现,配置管理,而Redis更适用于非强一致性的需求,比如说是队列,缓存,分布式Session - 两者都是KV存储,但是etcd通过Raft算法保证了各个节点间的数据和事务的一致性,更强调各个节点间的通信;Redis则时更像是内存式的缓存,因此来说读写能力很强。 - Redis是c开发的,etcd是go开发的,他是源于k8s的兴起作为一个服务发现。 - etcd v3只能通过gRPC访问,而redis可以通过http访问,因此etcd的客户端开发工作量高很多。 ### 3. 介绍etcd的raft算法 - http://www.crownblog.icu/post/raft.html ### 4. Oauth2详解 - https://www.jianshu.com/p/84a4b4a1e833 ### 5. SSO简单原理及实现 - https://www.cnblogs.com/zh94/p/8352943.html ### 6. Token - https://www.jianshu.com/p/24825a2683e6 ### 7. 十大排序算法 - https://leetcode-cn.com/problems/sort-an-array/solution/golang-by-xilepeng-2/ ### 8. 线上CPU爆高,如何定位问题 - top 命令查看当前系统负载信息 - top -H -p pid 查看指定进程中每个线程的资源占用情况 - jstack pid > ./dump.log 将指定进程中线程的堆栈信息输出到文件 ### 9. 怎么让注册中心实现即使在宕机期间也能正常服务 - 使用本地缓存或者缓存到文件 - https://my.oschina.net/u/4587289/blog/4521348 ### 10. 环形链表的快慢指针问题 - https://blog.csdn.net/chenlong_cxy/article/details/116593206 ### 11. 堆排序实现及时间复杂度分析 - https://www.cnblogs.com/nima/p/12724862.html