Golang运行与汇编

本文目录速览:

Golang的运行环境
内存
操作系统、CPU、内存互相配合
Go程序的调用规约
函数在栈上的分布
Go的调用实例
Go的汇编plan9
查看go应用代码对应的翻译函数
逃逸分析
传值还是传指针
总结
通过上一篇走进Golang之汇编原理,我们知道了目标代码的生成经历了那些过程。今天我们一起来学习一下生成的目标代码如何在计算机上执行。以及通过查阅 Golang 的 Plan9 汇编来了解Golang的一些内部秘密。

Golang的运行环境
当我们把编译后的Go代码运行起来,它会以进程的方式出现在系统中。然后开始处理请求、数据,我们会看到这个进程占用了内存消耗、cpu占比等等信息。本文就是要来解释在程序的运行过程中,内存、CPU、操作系统(当然还有其它的硬件,文中关系不大,就不说了)是如何进行配合,完成了我们代码所指定的事情。

内存
首先,我们先来说说内存。先来看一个我们运行的go进程。

代码如下:

package main

import (
“fmt”
“log”
“net/http”
)

func main() {
http.HandleFunc("/", sayHello)

err := http.ListenAndServe(":9999", nil)
if err != nil {
	log.Fatal("ListenAndServe: ", err)
}

}

func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Printf(“fibonacci: %d\n”, fibonacci(1000))

_, _ = fmt.Fprint(w, "Hello World!")

}

func fibonacci(num int) int {
if num < 2 {
return 1
}
return fibonacci(num-1) + fibonacci(num-2)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
来看一下执行情况

dayu.com >ps aux

USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
xxxxx 3584 99.2 0.1 4380456 4376 s003 R+ 8:33下午 0:05.81 ./myhttp
1
2
3
4
这里我们先来不关注其它指标,先来看 VSZ 与 RSS。

VSZ: 是指虚拟地址,他是程序实际操作的内存。包含了分配还没有使用的内存。
RSS: 是实际的物理内存,包含了栈内存与堆内存。
每一个进程都是运行在自己的内存沙盒里,程序被分配的地址都是 “虚拟内存”,物理内存对程序开发者来说实际是不可见的,而且虚拟地址比进程实际的物理地址要大的多。我们经常编程中取指针对应的地址实际就是虚拟地址。这里一定要注意区分虚拟内存与物理内存。来一张图感受一下。

这张图主要是为了说明两个问题:

程序使用的是虚拟内存,但是操作系统会把虚拟内存映射到物理内存;你会发现自己机器上所有进程的VSZ要大得多;
物理内存可以被多个进程共享,甚至一个进程内的不同地址可能映射的都是同一个物理内存地址。
上面搞明白了程序中的内存具体是指什么,接下来说明程序是如何使用内存的(虚拟内存),内存说白了就是比硬盘存取速度更快的一个硬件,为了方便内存的管理,操作系统把分配给进程的内存划分成了不同的功能块。像我们经常说的:代码区,静态数据区,堆区,栈区等。

这里借用一张网络上的图来看一下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ik8G2bb-1574824165169)(https://dayutalk.cn/img/go-hb-1.jpeg)]

这里就是我们程序(进程)在虚拟内存中的分布。

代码区:存放的就是我们编译后的机器码,一般来说这个区域只能是只读。

静态数据区:存放的是全局变量与常量。这些变量的地址编译的时候就确定了(这也是使用虚拟地址的好处,如果是物理地址,这些地址编译的时候是不可能确定的)。Data与BSS都属于这一部分。这部分只有程序中止(kill掉、crasg掉等)才会被销毁。

栈区:主要是 Golang 里边的函数、方法以及其本地变量存储的地方。这部分伴随函数、方法开始执行而分配,运行完后就被释放,特别注意这里的释放并不会清空内存。后面文章讲内存分配的时候再详细说;还有一个点需要记住栈一般是从高地址向低地址方向分配,换句话说:高地址属于栈低,低地址属于栈底,它分配方向与堆是相反的。

堆区:像 C/C++ 语言,堆完全是程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值