GO 面试题进阶篇【面试官这样问】

GO系列

1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
6、GO学习之 通道(Channel)
7、GO学习之 多线程(goroutine)
8、GO学习之 函数(Function)
9、GO学习之 接口(Interface)
10、GO学习之 网络通信(Net/Http)
11、GO学习之 微框架(Gin)
12、GO学习之 数据库(mysql)
13、GO学习之 数据库(Redis)
14、GO学习之 搜索引擎(ElasticSearch)
15、GO学习之 消息队列(Kafka)
16、GO学习之 远程过程调用(RPC)
17、GO学习之 goroutine的调度原理
18、GO学习之 通道(nil Channel妙用)
19、GO学习之 同步操作sync包
20、GO学习之 互斥锁、读写锁该如何取舍
21、GO学习之 条件变量 sync.Cond
22、GO学习之 单例模式 sync.Once
23、GO 面试题基础篇【面试官这样问】
24、GO 面试题进阶篇【面试官这样问】

前言

有了之前的 GO 面试题基础篇 呢,在学习过之后大概也就能应付一下一面了。那一般面试流程中至少也有一个二面吧,一面面基础,二面面广度和深度,也就是现在的企业都喜欢要 T 型人才,什么是 T 型人才呢?就是横向要广【了解的技术多】,竖向要深【熟悉的技术深刻,知道其原理】。
此篇进阶篇,咱就来学习一下 GO 语言比较有点难度的面试题。

一、GMP 的原理?

GO 面试题基础篇 的 3.4 面试题是 GMP 的比较简单的回答方法,按照 3.4 的回答,面试官就会觉得你是对 GMP 有所了解的,不过如果阁下想加分,那就需要更深入的、进一步的从 调度器来历、调度模型 等方面具体说说了,下面看怎么详细回答面试官这个问题。

1.1 什么是 GMP 呢?

答:

  • G: 就是 go 中的协程,也就是 goroutine;
  • P: 就是逻辑处理器,启动时创建,P 有自己的本地队列,也有个全局队列,存放着等待执行的 G,最多有 GOMAXPROCS(可配置) 个;
  • M: M代表着真正的执行计算资源,也就是操作系统线程;

1.2 M 是如何执行 P 的 ?

答:

  • 线程想运行任务就需要从 P 的本地队列中获取 G 执行,如果本地队列为空 时,就要从 全局队列中获取 G
  • M 也会从全局队列中那一批 G 放入本地队列中进行执行;
  • 如果全局队列中也没有可执行的 G 时,M 就会从其他队列中 G 放到自己队列并执行;

1.3 为什么需要 GMP 调度器?

答:

  • 从一开始的单进程操作系统时期,每次只能执行一个进程,进程阻塞是会浪费 CPU 资源;
  • 后来操作系统支持多进程,如果某一个进展阻塞是就会切换到其他等待执行的进程执行,这样就可以尽量利用 CPU 资源,但是进程切换也会有成本;
  • 多进程多线程提高了并发能力,不过每个任务执行都创建一个线程其实也是消耗大量内存(线程做大 4M 内存),而线程切换(用户态、内核态互相切换)也会消耗性能
  • 利用协程来提高 CPU 资源的利用率,协程是 goroutine,由线程来绑定执行的,并且是 M:N (就是多个线程和多个协程绑定执行),所以需要 GMP 调度器 来管理 goroutine

1.4 GMP 中 M 和 P 的关系?

答:

  • 在 GO 中,M 就是内核态线程,而 P 就是处理器,用来协调 goroutine 执行;
  • 一个 用户态线程 必须要绑定一个 内核态线程,但是 CPU 并不知道有 用户态线程 的存在,它只知道它运行的是一个 内核态线程(Linux 的 PCB 进程控制块),那用户态线程就是 goroutine
  • 当一个 内核态线程 绑定 一个 用户态线程 时,就是 1 :1 的关系;
  • 当一个 内核态线程 绑定 多个 用户态线程 时,就是 1 :N 的关系;
  • 当多个 内核态线程 绑定 多个 用户态线程 时,就是 M :N 的关系;

二、什么是 context 上下文?有哪些使用场景?

答:

  • Context 是 go 提供的控制并发包,提供了在 goroutine 之间传递请求作用域的方式;
  • 可以用来控制 goroutine 的生命周期取消操作传递请求相关的元数据以及处理请求超时等场景;
  • Context 通常用于在 goroutine 之间传递请求的元数据和控制信号,例如:超时、取消等;
  • 创建一个新的 Context 需要基于父 Context,新的 Context 也可以作为其他 Context 的父 Context,形成一个 Context 树
  • 可以通过 WithCancelWithDeadlineWithTimeoutWithValue 等函数创建一个带有上下文的新对象,用于设置不同的上下文属性。

三、通道(Channel)的核心原理是什么?

答:

  • 通道的核心原理是基于通信顺序进程(CSP)模型
  • CSP 模型是由计算机科学家 Tony Hoare 在 1978 年提出的一种并发编程模型,它将并发系统中的各个组件抽象为独立的通信进程,并通过通道进行通信和同步。
  • 通道是一种线程安全的、带有类型的消息队列。它提供了一种在 Goroutine 之间进行通信同步的机制,使得并发编程变得更加简单和安全。
  • 数据结构:通道内部数据结构通常是 队列(Queue)或者 循环链表(Circular Linked List)来存储待发送的和接受的数据,以保证了数据先入先出(FIFO)的顺序;
  • 同步原语 :通道的实现涉及到了同步原语,如互斥锁(Mutex)、条件变量(Condition Variable)、信号量(Semaphore)等。这些同步原语用于确保通道的并发安全性 ;

四、GO 语言中的垃圾回收机制?

4.1 简述垃圾回收机制?

答:

  • 垃圾回收机制(简称:GC)机制是自动管理内存的过程,它负责检查不再使用的内存对象并且销毁,是否内存,以避免内存泄漏和资源浪费。
  • Go 语言的垃圾回收器采用了分代垃圾回收算法,并且具有并发标记-清除(Concurrent Mark and Sweep)的特性,以提高垃圾回收的效率和性能。

4.1 什么是三色标记?

答:

  • 三色标记是 GO 中垃圾回收的··核心算法之一··,用于标记内存中的活动对象和垃圾对象,分为白灰黑三个颜色:
  • 白色:表示对象尚未被访问,也就是垃圾回收器尚未扫描过的对象,所有对象默认都是白色的;
  • 灰色:表示对象已被访问,但是引用尚未被访问,也就是该对象的引用链中有尚未被访问的对象;灰色对象是垃圾回收器需要继续扫描的对象。
  • 黑色:表示对象已经被访问,并且其引用的所有对象都已经被访问;黑色对象是活动对象,不会被垃圾回收器释放。
  • 三色标记算法通过不断地迭代扫描对象,并将灰色对象标记为黑色对象,直到所有可达的对象都被标记为黑色为止。
  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaScript面试题的进阶可以包括以下几个方面: 1. 作用域和变量提升:在JavaScript中,函数作用域和块级作用域的概念是很重要的。了解变量提升和作用域链的工作原理对于理解JavaScript的作用域规则至关重要。在题目中给出的代码中,变量name由于使用了var关键字声明,会被提升到函数作用域的顶部,但是在打印输出时还未被赋值,所以会输出undefined。而变量age使用let关键字声明,不会被提升,所以在console.log(age)时会报错。因此,上述代码的输出是undefined和ReferenceError。 2. 数据类型和类型转换:JavaScript有多种基本数据类型,包括数字、字符串、布尔值等。了解不同数据类型的特点以及类型转换的规则对于正确处理数据至关重要。在JavaScript中,使用双等号(==)进行比较时会发生隐式类型转换,这可能导致一些令人惊讶的结果。因此,在进行类型转换时需要格外小心。 3. 闭包和作用域:闭包是指函数能够访并操作其定义时所在的词法环境中的变量。了解闭包的概念以及如何正确使用闭包可以帮助开发人员编写更高效和安全的代码。 4. 面向对象编程:JavaScript是一种面向对象的语言,它支持封装、继承和多态等面向对象的特性。了解如何使用构造函数、原型链和对象创建模式等概念可以帮助开发人员设计和组织复杂的代码结构。 5. 异步编程:JavaScript是一种单线程的语言,但是通过使用回调函数、Promise和async/await等机制,可以实现非阻塞的异步编程。理解JavaScript中的事件循环和异步编程模型对于编写高效的异步代码至关重要。 总结:JavaScript面试题的进阶包括作用域和变量提升、数据类型和类型转换、闭包和作用域、面向对象编程以及异步编程等方面的知识。熟练掌握这些概念和技术,可以帮助您在JavaScript编码面试中取得优异的表现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值