goroutine 相关知识4

  • 程序内存布局

程序内存布局

os 中的每进程运行在属于它自己的内存沙盘中 (虚拟地址空间(virtual address space))

虚拟地址通过页表(page table)映射到物理内存,页表由 os 维护并被 cpu 引用

每个进程有一套属于它自己的页表,但一部分虚拟地址必须保留给内核使用

不意味着内核使用了那么多的物理内存,仅表示它可支配这么大地址空间,根据内核需要,映射到物理内存

  • 内核空间常驻物理内存,并在所有进程中都映射到同样的物理内存
  • 用户模式地址空间的映射随进程切换而不断变化


最顶部

  • 大多数编程语言用于存储 局部变量和函数参数
  • 函数调用会将一个新的栈桢(stack frame)压入栈中
  • 栈桢在函数返回时被清理
  • 数据遵从 LIFO 顺序

简单设计意味着不必使用复杂的数据结构来追踪栈的内容,只要一个简单的指针指向栈的顶端即可;压栈(pushing)和出栈(popping)过程非常迅速、准确

持续的重用栈空间有助于使活跃的栈内存保持在 CPU 缓存中,从而加速访问。进程中的每一个线程都有属于自己的栈

页故障(page fault)

不断向栈中压入的数据,超出栈所对应内存区域将触发page fault,被 Linux 的 expand_stack() 处理,调用 acct_stack_growth() 检查是否还有合适的地方用于栈的增长

如果栈的大小低于 RLIMIT_STACK(通常是 8MB),一般情况下栈会被加长,程序继续愉快的运行,感觉不到发生了什么事情

如果达到了最大的栈空间大小,就会栈溢出(stack sverflow

内存映射段

栈的下方

内核可将文件内容直接映射到内存

系统调用请求这种映射

  • Linux 的 mmap()
  • Windows 的 CreateFileMapping() / MapViewOfFile()

内存映射是一种方便高效的文件 I/O 方式,被用于加载动态库

创建不对应于任何文件的匿名内存映射用于存放程序的数据

Linux 通过 malloc() 请求一大块内存,C 运行库将会创建这样一个匿名映射而不是使用堆内存

大块意味着比 MMAP_THRESHOLD 还大,缺省是 128KB,可以通过 mallopt() 调整

与栈一样,用于 运行时内存分配

但堆用于存储生存期与函数调用无关的数据

  • C 是 malloc() 系列函数
  • 有 gc 的语言(如 java)中,是 new 关键字

堆中有足够空间满足内存请求,就可被语言运行时库处理而不需要内核参与

否则,堆会被扩大,通过 brk() 系统调用来分配请求所需的内存块

BSS / 数据段

不映射到任何文件

static int cntActiveUsers 在 BSS

static int cntWorkerBees = 10 在数据段

转载于:https://my.oschina.net/zhangthe9/blog/3021390

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为Go语言初学者,以下是一些重要的知识点和建议,可以帮助你开始学习和使用Go语言: 1. 安装和设置Go环境:首先,确保在计算机上安装了Go语言的最新版本,并设置好相关的环境变量。可以从官方网站(https://golang.org)下载安装程序并按照说明进行安装。 2. 了解基本语法和数据类型:学习Go语言的基本语法,包括变量声明、函数定义、条件语句、循环语句等。掌握Go语言的基本数据类型,如整型、浮点型、字符串、布尔型等。 3. 学习函数和包:函数是Go语言的基本构建块之一。了解如何定义和调用函数,并理解函数的参数和返回值。此外,了解如何使用包(package)来组织和重用代码。 4. 并发编程:Go语言内置了强大的并发编程支持。学习使用goroutine和channel进行并发编程,以实现高效的并发处理和协作。 5. 错误处理:Go语言鼓励使用显式的错误处理机制。学习使用错误类型和错误处理函数来处理可能发生的错误,并避免潜在的错误。 6. 标准库和第三方库:探索Go语言的标准库,了解如何使用其中的功能和工具。此外,也要了解常用的第三方库,它们提供了许多有用的功能和工具,可以加快开发速度。 7. 学习常用的工具和技术:Go语言有许多强大的工具和技术可用于开发。学习使用Go工具链(如go build、go run、go test等),以及版本管理工具(如git)和构建工具(如Makefile)等。 8. 实践和项目:通过实践和参与项目,将所学的知识应用到实际中。可以尝试解决一些小型的编程问题,或者参与开源项目,以提高自己的编程能力和经验。 9. 阅读文档和教程:Go语言有丰富的文档和教程资源可供学习。阅读官方文档、博客文章、书籍和在线教程,可以帮助你更深入地理解和掌握Go语言的知识和技巧。 10. 加入社区和交流:加入Go语言的社区,与其他开发者交流和分享经验。参加本地的Go语言用户组、在线论坛或社交媒体群组,可以获取更多资源、解答问题,并与其他Go开发者建立联系。 记住,持续学习和实践是掌握任何编程语言的关键。通过不断地编写代码、阅读文档和参与项目,你将逐渐掌握和提高Go语言的技能。祝你在学习Go语言的过程中取得成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值