golanggolang面试

golang面试

2020-08-26  本文已影响0人  无拘无束的猪

答案会在后续更新

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

上一篇 下一篇

猜你喜欢

热点阅读