golang面试

答案会在后续更新

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语言系统层)

你可能感兴趣的:(golang面试)