答案会在后续更新
cch关于知乎go面试题的部分答案:https://xargin.com/answers-for-some-interview-questions/
进程、线程、协程、goroutine区别,windows的协程和goroutine区别
go有用过什么框架或者包
go的调度、GMP什么运行
mysql相关的golang包
redis相关的包、redigo、goredis,redis的haspmap,zset原理
goroutine是连续栈,可以扩容,那么Linux线程分配的栈不能类似扩容机制吗
golang的包使用和原理分析,map,sync.map,container(list heap),net/http,io,bytes
data4000000000int,20核40线程256G内存,怎么快速求和?大文件排序,归并排序,小文件再排序。
linux内存分配图,主要是队和栈的位置定位故障
tcp握手和挥手的流程和状态图,以及time_wait什么原因造成,怎么定位解决
goroutine阻塞怎么诊断定位,一般什么原因造成
pprof,net/http/pprof,实时web查看相关信息,cpu、内存,goroutine信息,命令:top、list、traces、web
主要是channel leak或者其他原因,可以runtime打印goroutine信息,数量及内存
runtime三大核心组件
垃圾回收器
内存分配器
协程调度器(并发调度)
线程、协程池
ants
fasthttp使用协程池提升性能,就是使用sync.waitgroup,channel,atomic来控制go的数量
线程模型
主流线程模型主要分为三种,内核级线程、用户级线程、两级线程模型(混合型线程模型)
内核级线程:kse,由于io操作而阻塞,不会影响其他线程运行。java C++11的thread都是内核级线程的封装,1VS1绑定,内核操作创建销毁线程上下问调度资源性能影响较大。
用户级线程:不能很少利用多核cpu,linux的pthred就是,用户级线程VSKSE是(N:1),线程的创建销毁调度都是依靠库来实现,一个进程所有创建的线程都只和同一个KSE运行时动态绑定,内核的多有调度都是基于用户进程,如python的gevent库
两级线程模型:用户线程和KSE是N:M,一个进程可以和多个KSE关联,进程中的多个线程可以分别绑定一个KSE,但是不是KSE唯一绑定,可以多个用户线程映射到同一个KSE,自身调度和系统调度协同工作。
goroutine的生命周期
主动退出和被动退出
1.time.tick(1s)定时退出
2.context通知退出context.Done()
3.外部操作信号退出,signal.notify(ch,SIGINT,SIGTERM)
生命周期
https://xargin.com/state-of-goroutine/
runtime。go,定义了goroutine所有状态。
上图包含gc,去掉gc下图,去掉前缀runtime。
P的状态切换如下。
select有什么用
主要是对channel的IO监听,select「」优化成while
slice的扩容机制、slice结构和数组,map的扩容机制,map的有序读取(依靠key的有序再读取),slice和数组转换
实现消息队列,多生产者多消费者
slice+lock,channel+lock
数据库如何建索引
git merge rebase操作
lru实现
日志包glog.Errorf
golang实现服务器高性能 tcp aocket epool,转发。
mysql索引,优化。
redis的其他类型,zset原理等。
栈多大,系统等
空接口有什么用
字节对齐怎么实现(C语言系统层)
有疑问加站长微信联系(非本文作者)