Golang面试题详解(七):Slice底层、线程安全Map、锁与Map实现
Golang题库(七)Slice 与 Array, Append()Array数组(Array)是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因其长度的不可变动,数组在Go中很少直接使用。把一个大数组传递给函数会消耗很多内存。一般采用数组的切片 几种初始化方式 123arr1 := [3]int{1, 2, 3}arr2 := [...]int{1, 2, 3}arr3 := [3]int{0:3,1:4} SliceSlice是一种数据结构,描述与Slice变量本身分开存储的Array的连续部分。 Slice不是Array。Slice描述了Array的一部分。 slice底层是一个struct 123456// runtime/slice.gotype slice struct { array unsafe.Pointer// 指向数组的指针 len int cap ...
Golang面试题详解(六):GMP模型、GC、深浅拷贝及Channel应用
Golang题库(六)✨讲一讲 GMP 模型三个字母的含义 G(Goroutine):G 就是我们所说的 Go 语言中的协程 Goroutine 的缩写,相当于操作系统中的进程控制块。其中存着 goroutine 的运行时栈信息,CPU 的一些寄存器的值以及执行的函数指令等。 M(Machine):代表一个操作系统的主线程,对内核级线程的封装,数量对应真实的 CPU 数。一个 M 直接关联一个 os 内核线程,用于执行 G。M 会优先从关联的 P 的本地队列中直接获取待执行的 G。M 保存了 M 自身使用的栈信息、当前正在 M上执行的 G 信息、与之绑定的 P 信息。 P(Processor):Processor 代表了 M 所需的上下文环境,代表 M 运行 G 所需要的资源。是处理用户级代码逻辑的处理器,可以将其看作一个局部调度器使 go 代码在一个线程上跑。当 P 有任务时,就需要创建或者唤醒一个系统线程来执行它队列里的任务,所以 P 和 M 是相互绑定的。总的来说,P 可以根据实际情况开启协程去工作,它包含了运行 goroutine 的资源,如果线程想运行...
Golang面试题详解(五):热部署、读写锁、Goroutine与线程
Golang题库(五)go 实现不重启热部署根据SIGHUP 信号量根据系统的 SIGHUP 信号量,以此信号量触发进程重启,达到热更新的效果。 热部署我们需要考虑几个能力: 新进程启动成功,老进程不会有资源残留 新进程初始化的过程中,服务不会中断 新进程初始化失败,老进程仍然继续工作 同一时间,只能有一个更新动作执行 监听信号量的方法的环境是在 类 UNIX 系统中,在现在的 UNIX 内核中,允许多个进程同时监听一个端口。在收到 SIGHUP 信号量时,先 fork 出一个新的进程监听端口,同时等待旧进程处理完已经进来的连接,最后杀掉旧进程。 使用air包air包可以实现插件化热更新的方案,集成方便,非常适用于小型项目的开发。 ⭐saas灰度发布介绍灰度发布常见有三种模式金丝雀发布、滚动发布、蓝绿发布。灰度发布主要是更新服务中,通过服务的多节点、多切片进行无感知的服务更新迭代。阿里云、AWS等云平台都已支持灰度发布功能。 实现灰度发布主要是通过网关转发的均衡负载,确保服务更新过程中能够不停机、无感知、可回溯。常见的灰度发布实现方案有Nginx +Lua + Redis...
Golang面试题详解(四):Map、Channel、WaitGroup常见陷阱及Struct比较
Golang题库(四)map取一个key,然后修改这个值,原map数据的值会不会变化?map属于引用类型,所以取一个key,然后修改这个值,原map数据的值会发生变化 向为nil的channel发送数据会怎么样空通道即无缓冲通道。无缓冲通道上的发送操作将会阻塞,直到另一个goroutine在对应的通道上执行接收操作,这时值传送完成,两个goroutine都可以继续执行。相反,如果接收操作先执行,接收方gorountine将阻塞,直到另一个goroutine在同一个通道上发送一个值。 使用无缓冲通道进行的通信导致发送和接收goroutine同步化。因此,无缓冲通道也称为同步通道。当一个值在无缓冲通道上传递时,接收值后发送方goroutine才被再次唤醒。 WaitGroup的坑 Add一个负数如果计数器的值小于0会直接panic Add在Wait之后调用比如一些子协程开头调用Add结束调用Wait,这些...
Golang面试题详解(三):Channel与锁、应用场景及Slice与Array深度对比
Golang题库(三)同一个协程里面,对无缓冲channel同时发送和接收数据有什么问题 同一个协程里,不能对无缓冲channel同时发送和接收数据,如果这么做会直接报错死锁。 对于一个无缓冲的channel而言,只有不同的协程之间一方发送数据一方接受数据才不会阻塞。channel无缓冲时,发送阻塞直到数据被接收,接收阻塞直到读到数据。 channel和锁的对比作用区别 Channel是用于处理协程中的数据通信问题的,通过编程逻辑设计,可以实现锁的效果。 Mutex是用于控制原子性操作数据安全性,通过加锁和释放确保区间内数据只能有单一协程访问。数据一致性。 两者的用途不同 两者内存占用也不同 channel的应用场景channel用于协程之间数据通信,根据设计能够实现多种功能。 任务超时与取消通过在通道中传递信号,可以实现任务的超时和取消机制。例如,一个 goroutine 可以在执行耗时操作时启动一个定时器,如果操作在指定时间内未完成,可以通过通道发送取消信号给其他 goroutine,从而取消操作。 比如超时处理: 12select { case...
Golang面试题详解(二):GMP模型、Channel底层原理及Go与Java对比
Golang题库(二)数组怎么转集合?无法直接转换,需要通过遍历数组,构造一个map。例如: 12345678func main() { arr := [5]int{1, 2, 3, 4, 5} m := make(map[int]int, 5) for i, v := range arr { m[i] = v } fmt.Println(m)} ⭐Go的GMP模型?G是Goroutine的缩写,相当于操作系统的进程控制块(process control block)。它包含:函数执行的指令和参数,任务对象,线程上下文切换,字段保护,和字段的寄存器。 M是一个线程,每个M都有一个线程的栈。如果没有给线程的栈分配内存,操作系统会给线程的栈分配默认的内存。当线程的栈制定,M.stack->G.stack,...
Golang面试题详解(一):数组、切片、Channel与继承
Golang题库(一)golang里的数组和切片有了解过吗?值传递和引用传递在函数传参中,数组是值传递,切片则是引用传递。即函数内修改数组,外不变,而切片则相反。 逻辑运算数组能比较大小,切片则只能与nil比较。 容量和长度数组是连续地址的储存相同类型元素的序列,初始化容量之后,不可变。 切片是指向数组的拥有相同类型元素的可变长序列,可以扩容和传递,比数组更加灵活。 Go切片(slice)的实现可以在源码包src/runtime/slice.go中找到。在源码中,slice的数据结构定义如下。 12345type slice struct { array unsafe.Pointer //指向底层数组的指针 len int //切片长度 cap...
Linux面试题详解(三):性能、Shell、网络与安全
操作系统题库(三)16.如何选择 Linux 操作系统版本?作答 优先选择熟悉的操作系统,然后选择仍然在官方支持的版本。优先选择熟悉的系统可以更好更快的开发业务,选择官方支持的版本能够保持软件源的更新和及时同步安全补丁,同时有更好的社区支持。 按我来说就是CentOS 7。 答案 一般来讲,桌面用户首选 Ubuntu ;服务器首选 RHEL 或 CentOS ,两者中首选 CentOS 。 根据具体要求: 安全性要求较高,则选择 Debian 或者 FreeBSD 。 需要使用数据库高级服务和电子邮件网络应用的用户可以选择 SUSE 。 想要新技术新功能可以选择 Feddora ,Feddora 是 RHEL 和 CentOS 的一个测试版和预发布版本。 【重点】根据现有状况,绝大多数互联网公司选择 CentOS 。现在比较常用的是 7 系列,现在市场占有大概一半左右。另外的原因是 CentOS 更侧重服务器领域,并且无版权约束。 17. 如何规划一台 Linux 主机,步骤是怎样?作答 1、确定机器是做什么用的,比如是做 WEB...
Linux面试题(二):内核、启动、进程通信与文件系统
操作系统题库(二)4.什么是 Linux 内核?作答: Linux内核是操作系统最基础的程序。其中包括设备CPU、GPU、摄像头、USB等驱动,包括文件管理程序、进程调度程序等最基本的底层功能程序。并提供一系列的底层接口,供应用层开发程序,例如视频播放器、浏览器等。 参考答案: Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。 系统内存管理 应用程序管理 硬件设备管理 文件系统管理 5. Linux 开机启动过程?作答: Linux开机过程实际上是内核程序的启动,启动内存管理程序、进程调度程序。然后进度调度程序会去启动一些预设的自启的第三方应用,通常启动脚本配置在/etc/init.d目录下。 参考答案: 1、主机加电自检,加载 BIOS 硬件信息。 2、读取 MBR 的引导文件(GRUB、LILO)。 3、引导 Linux 内核。 4、运行第一个进程 init (进程号永远为 1 )。 5、进入相应的运行级别。 6、运行终端,输入用户名和密码。 6....
Linux面试题(一):常用命令、体系结构与内核空间
操作系统题库(一)1.Linux常用命令作答: 1cd ls top free df du awk sed vi zip/unzip tar gzip cp mv rm grep cat echo export ssh 这些都是我比较常用的命令。 参考答案: 常用命令 目录相关 find 命令 ls 命令 pwd 命令 cd 命令 mkdir 命令 df 命令 rm 命令 mv 命令 cp 命令 mount 命令 cat 命令 tail 命令 less 命令 通用命令 grep 命令 sed 命令 awk 命令 vim 命令 diff 命令 sort 命令 xargs 命令 压缩相关 tar 命令 gzip 命令 bzip2 命令 unzip 命令 系统命令 export 命令 kill 命令 passwd 命令 su 命令 yum 命令 rpm 命令 shutdown 命令 crontab 命令 service 命令 chmod 命令 chown 命令 uname 命令 whereis 命令 locate 命令 man 命令 网络相关 ifconfig...