Go语言 GMP面试题(GMP调度示例)

2023-05-16

GMP面试题

  • 第一段
  • 第二段

第一段

package main
import "fmt"
import "runtime"
func main() {
	runtime.GOMAXPROCS(1)
	for i :=0; i<10; i++ {
		i := i
		go func() {
			fmt.Println("A:",i)
		}()
	}
	var ch = make(chan int)
	<- ch
}

输出结果
无论执行多少回,A: 9 一定是第一个输出的。后面就让我们来解释一下这是为什么吧。

A: 9
A: 0
A: 1
A: 2
A: 3
A: 4
A: 5
A: 6
A: 7
A: 8

解析
第一句代码: runtime.GOMAXPROCS(1) 设置全局只有一个P表示将goroutine的并行调整至1。同时在只有一个P的时候所有创建的
goroutine都要进入三个队列中(runnext,local,gobal)。

第二句代码: for 开启一个循环10次的代码。

第三句代码: i := i 这里是因为for循环的时候i是一个指针,如果循环内的代码使用for 语句的i,那么所有的goroutine拿到的I都将是9,即i最后一次循环的值。

第四句代码: go func(){} 开启一个goroutine

第五句代码: fmt.Println() goroutine的执行内容是打印A: i

第六句代码: var ch = make(chan int) 创建一个没有缓冲的chan

第七句代码: <- ch 读取一个没有缓冲,如果chan没有信息,则会阻塞,这里用途就是阻塞main()进程

程序执行过程

  • 先将P设置为1,在GMP调度模型中P只有一个的话,所有的goroutine都将进入队列(三个队列)。
  • golang 开一个goroutine的话,都会将goroutine放置在runnext队列,runnext有goroutine的话,会将已有的goroutine放置到local队列中,并将新的goroutine放置到runnext。 即循环开启10个goroutine的话最后一个将在runnext,将会优先执行。这里最后一个goroutine中的i是9,于是9就会最先打印出来
  • 执行完runnext会从local队列的头部开始执行goroutine

第二段

package main
import "time"
import "fmt"
import "runtime"
func main() {
	runtime.GOMAXPROCS(1)
	for i :=0; i<10; i++ {
		i := i
		go func() {
			fmt.Println("A:",i)
		}()
	}
	time.Sleep(time.Hour)
}

1.13 输出结果

A: 0
A: 1
A: 2
A: 3
A: 4
A: 5
A: 6
A: 7
A: 8
A: 9

1.14输出结果

A: 9
A: 0
A: 1
A: 2
A: 3
A: 4
A: 5
A: 6
A: 7
A: 8

解析
第一句代码: runtime.GOMAXPROCS(1) 设置全局只有一个P表示将goroutine的并行调整至1。同时在只有一个P的时候所有创建的
goroutine都要进入三个队列中(runnext,local,gobal)。

第二句代码: for 开启一个循环10次的代码。

第三句代码: i := i 这里是因为for循环的时候i是一个指针,如果循环内的代码使用for 语句的i,那么所有的goroutine拿到的I都将是9,即i最后一次循环的值。

第四句代码: go func(){} 开启一个goroutine

第五句代码: fmt.Println() goroutine的执行内容是打印A: i

第六句代码: time.Sleep(time.Hour) 将程序暂停1小时. 这里注意1.13和1.14的go版本中 time的实现有点不同。 1.13会创建一个goroutine,1.14则不会

程序执行过程

  • 先将P设置为1,在GMP调度模型中P只有一个的话,所有的goroutine都将进入队列(三个队列)。
  • golang 开一个goroutine的话,都会将goroutine放置在runnext队列,runnext有goroutine的话,会将已有的goroutine放置到local队列中,并将新的goroutine放置到runnext。 即循环开启10个goroutine的话最后一个将在runnext,将会优先执行。
  • 此时执行到time.Sleep(time.Hour),在1.13之前 time的实现会另外创建一个goroutine,于是这个goroutine会被最优先执行。之后再从local队列中从开头取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言 GMP面试题(GMP调度示例) 的相关文章

  • Windows 下PBC库的安装和配置

    背景 PBC库是一个基于双线性对的密码学库 这库在公钥密码学中使用非常广泛 这个库在Linux下的安装非常的简单 有些只会纸上谈兵的人需要在WIN下做 呵呵 但是没办法 需求到了 硬着头皮也要写完 对于一些只会谈兵的人 呵呵 现在主要介绍下
  • GMP pow 中的溢出处理

    我只是 GMP 库的间接用户 主要通过swi prolog and yap 但我对解决这个问题非常感兴趣 当使用大得离谱的值执行求幂时 主机系统或 GMP 不再能够适当地处理溢出 我已经与上述系统的开发人员交谈过 但他们没有看到解决此问题的
  • 使用 Xcode 在 MacOS X 上安装 GMP

    我正在尝试在我的 C 和 C 程序中使用 GMP 库 我使用 Xcode 编写代码 我按照说明在我的计算机上安装了 GMP 最终得到了一个文件夹 usr local gmp 5 0 5 其中包含 gmp h 文件 我怎样才能让我的程序看到这
  • gmpxx.h:没有这样的文件或目录

    我刚刚安装了一个全新的 mingw 32 位 下载它来自官方项目页面来自 Sourceforge 我安装了包中的所有内容 所有编译器等等 然后我从下载hereMinGW 的 gmp 我将 gmp 5 0 1 1 mingw32 src ta
  • 如何编写 bigint 库/libgmp 如何工作?

    我知道各种平台上有许多用于 C 的 BigInt 库以及如何使用它们 但我很好奇 它们是如何工作的 我将如何构建自己的库 我不会尝试 没有必要重新发明轮子 但我对它如何发生感兴趣 任何人都可以向我指出可以解释程序 基础知识的教程等吗 Tha
  • 使用 cygwin 在 Windows 上安装 GMP

    我是 C 新手 我必须处理大整数 所以我必须通过 Cygwin 安装 GMP 我能找到的有关安装此程序的任何文档都假设您知道自己在说什么 而我确实不知道 无论如何 我有权利 tar或者其他什么 正确提取它 现在我看到的任何网站都说要运行 c
  • 避免 libgmp 中的中止

    我有一些使用 libgmp 的代码 在某些时候 用户可能会请求一个非常大的数字的阶乘 不幸的是 这会导致 libgmp 发出中止信号 例如下面的代码 include
  • 使用 gmp mpf_class 进行近似

    我正在使用 Catch2 编写单元测试 我想检查两个向量是否相等 使用 gmplib 时它们看起来如下所示 std vector
  • 使用 Emscripten 编译 GMP/MPFR

    好吧 这已经让我发疯了 我已经尝试了至少一个月 但互联网上的任何地方都没有帮助 我按照以下步骤操作this https github com kripken gmp js 当我执行这些步骤时 甚至这个示例也不起作用 因为当我这样做时 我得到
  • 有没有办法将 gmpxx.h 与 c++98 一起使用?

    由于我的项目 我需要使用 c 98 和 gmpxx h 但即使对于一个简单的项目 它也不起作用 include
  • 具有 mpz/mpfr 值的 numpy 数组

    我想要一个带有 mpz mpfr 值的 numpy 数组 因为我的代码 import numpy as np import gmpy2 A np ones 5 5 print A gmpy2 mpfr 1 生成 RuntimeWarning
  • 为什么 Nettle 2.4 的 `configure` 找不到 GMP 5.0.2?

    我正在尝试建立GnuTLS http www gnu org software gnutls 在 Mac OS X 10 5 Leopard 服务器上 是的 我知道 它有点过时 但这就是该服务器目前正在运行的 并且遇到了构建问题Nettle
  • 如何使用 GMP 计算 2 ^ -18?

    令我尴尬的是 我刚刚发现 给负指数喂食mpz pow ui效果不太好 手册确实说 unsigned long 你知道 对于另一个mpz pow功能 手册使用了我不理解的概念 例如 base exp mod mod 在下面的 void mpz
  • 为 iOS 构建 GMP

    我需要使用GMP在我正在开发的 iPhone 程序中 但真的不知道从哪里开始 我知道我必须为设备构建一个版本 为模拟器构建一个版本 但这就是我所知道的 我尝试环顾四周 但没能找到太多东西 这里有人成功构建吗GMP for iphone愿意指
  • GMP mpz_array_init 是一个过时的函数 - 我们应该如何初始化 mpz 数组?

    只使用了GNU MP Bignum 库 https gmplib org index html dir有几次 我很感兴趣地发现我以前分配 启动数组的方式现在已经过时了 从整数特殊函数 https gmplib org manual Inte
  • 为arm64 iOS构建C库(GMP)

    我正在尝试为arm64 构建一个C 库 GMP 6 0 0 以在iOS 上使用 我正在使用下面的调用运行配置脚本 编译器是使用 xcrun find 找到的 configure CC Applications Xcode app Conte
  • OS X 10.10.2 与“__mpf_struct”相关的未定义符号错误

    我正在尝试编译一个程序 https github com davidsd sdpb https github com davidsd sdpb 在 OS X 10 10 2 上使用 gcc 4 9 boost 1 57 0 gmp 6 0
  • 在 Linux 上静态链接 libgmp 时出错

    GMP 文档表示静态链接可能会带来较小的性能改进 我在让它在我的 Linux 系统上静态链接 libgmp 时遇到问题 我已将问题范围缩小到一个小测试用例 gmptest c include
  • Gmp PHP 扩展 - MAMP PRO

    我查看了其他几个问题 例如this one https stackoverflow com questions 50435455 how to install gmp extension for php 7 2 using mamp on
  • 如何将 GMP C 参数约定转换为更自然的东西?

    例如 我想做这样的事情 include

随机推荐

  • freertos- 任务调度器-vTaskStartScheduler()解析(笔记)

    1 全局状态量 系统时钟节拍计数器tick static volatile TickType t xTickCount 61 TickType t 0U 全局下一任务调度需要的阻塞时间 xff0c 用于及其唤醒任务static volati
  • freertos- 重要管理数据结构-列表List及其操作API (笔记)

    1 xff0c 源码中的位置 list h xff0c list c 2 xff0c 列表和列表项结构 列表项分为2种 xff1a struct xLIST ITEM listFIRST LIST ITEM INTEGRITY CHECK
  • 技术分享 | Javaer 如何做单元测试?

    前言 xff1a 本文适用于 javaer xff0c 其他开发者或许可以借鉴 写本文的主旨有两个 xff0c 一是简单的给大家介绍下单元测试 xff0c 二是通过一个简单的示例来介绍一些单元测试的技巧 xff0c 希望以此来降低大家写单元
  • 扩展卡尔曼滤波【转】

    1 重点看 SLAM中的EKF xff0c UKF xff0c PF原理简介 半闲居士 博客园 2 机器人重点看 定位 xff08 一 xff09 xff1a 扩展卡尔曼滤波 windSeS的博客 3 重点实例 扩展卡尔曼滤波 xff08
  • AGV - Background(1)- Company

    Company 米克力美 DZ 80无轨导航AGV小车采用windows10智能交互系统 xff0c xff08 米克力美工业AGV小车机器人采用安卓交互系统 xff09 可自动编程和程序化 xff0c 实现自主学习 使用人员无需培训即可轻
  • 无线路由器CPU浅析 MT7621A、 BCM47189 到底谁强?

    转自 xff1a http bbs 360 cn thread 14459037 1 1 html 在第一讲中 xff0c 已经粗略介绍过了目前路由芯片的四大厂 xff1a Broadcom xff08 博通 xff09 Qualcomm
  • STM32F4_串口通信详解

    目录 1 串口相关介绍及使用 1 1 串口设置的一般步骤 xff1a 1 1 1 串口时钟和GPIO时钟使能 1 1 2 设置引脚复用器映射 1 1 3 GPIO端口模式设置 1 1 4 串口参数初始化 1 1 5 开启中断并且初始化NVI
  • 嵌入式Linux设备驱动开发笔记(二)

    一 内核的时间 xff08 1 xff09 Tick xff08 滴答 xff09 内核采用了一个新的时间单位来进行计时 该时间单位称为tick 滴答 xff0c 一个tick对应硬件定时器两次中断之间的时间间隔 当前内核每秒钟硬件定时器会
  • Docker实现原理/容器原理(LXC,Cgroups,Docker)

    Docker实现原理 容器原理 Docker实现原理 容器原理什么是容器 Container 容器传统架构问题容器是什么容器如何实现 CgroupsCgroups是什么Cgroups解决什么问题Cgroups如何工作Cgroups层级结构
  • ros 编译 Python 文件

    参考自 xff1a http wiki ros org rospy tutorials Tutorials Makefile 系统 xff1a Ubuntu14 04 ros indigo py并不是可编译的脚本文件 xff0c 但是为了适
  • [Emuelec]在gamelist.xml中,为中文游戏名生成拼音字母

    1 通过python脚本将汉字拼音首字母查询出来 usr bin python3 coding UTF 8 filename transPinying py 功能 xff1a 获取传入中文的每个汉字的拼音首字母 pydic 61 34 吖a
  • 51单片机-宏晶STC程序调试、烧录、硬仿真

    内容包括STC单片机内部硬件介绍 xff08 寄存器 xff09 与程序的调试 硬仿真 xff0c STC15F硬仿真及其错误处理 xff0c MCS 51仿真介绍 xff0c 全自动下载介绍等 紫色文字是超链接 xff0c 点击自动跳转至
  • STM32单片机-汇编指令2

    目录 xff1a 11 STMFD和LDMFD指令 1 xff09 STMFD SP R0 R7 xff0c LR 2 xff09 LDMFD SP R0 R7 xff0c LR 99 伪指令 1 xff09 PROC伪指令 2 xff09
  • 多个switch case如何优化

    这段时间一直在整改代码圈复杂度 xff0c 我们的要求是每个函数方法圈复杂度不得大于5 xff0c 以下是整改的部分截图 希望对整改代码的你有所提示或帮助 xff0c 如果有更好的整改方法 xff0c 还望您不吝赐教哦 xff01
  • OPENCV检测矩形并计算其中心

    include 34 cv h 34 include 34 highgui h 34 include lt stdio h gt include lt math h gt include lt string h gt pragma comm
  • Jetson Xavier NX/AGX快速安装Intel Realsense SDK并使用D455

    Jetson Xavier NX AGX快速安装Intel Realsense SDK并使用D455 环境搭建及测试 1 安装脚本下载 xff1a github链接 xff1a https github com jetsonhacks in
  • AirSim无人机键盘控制

    AirSim仿真中实现多键盘按键控制 前言本文实现效果一 环境依赖二 多按键检测1 Pygame中的常用的键盘鼠标事件2 利用Pygame实现的多按键检测 AirSim中键盘控制实现下期预告 前言 有时候为了方便在AirSim调试无人机 x
  • 使用多电脑进行AirSim联合仿真

    文章目录 前言一 什么时候适合用两台电脑进行仿真 xff1f 二 怎么使用多电脑联合仿真 局域网内 1 获取UE4渲染端的IP地址2 修改程序接口 前言 随着仿真无人机数量的增加 xff0c 单台电脑越来越难以做到实时渲染 xff0c 这时
  • H.265编码原理入门

    视频编码的目的是为了压缩原始视频 xff0c 压缩的主要思路是从空间 时间 编码 视觉等几个主要角度去除冗余信息 由于 H 264 出色的数据压缩比率和视频质量 xff0c 成为当前市场上最为流行的编解码标准 而 H 265 是在 H 26
  • Go语言 GMP面试题(GMP调度示例)

    GMP面试题 第一段第二段 第一段 span class token keyword package span main span class token keyword import span span class token strin