万本电子书0元读

万本电子书0元读

顶部广告

深度探索Go语言——对象模型与runtime的原理、特性及应用电子书

本书系统论述Go语言特性,从语言实现的角度深度探索Go语言特性,包含大量的探索示例和源码分析,在学会应用的同时还能了解实现原理。阅读本书不需要精通汇编语言、操作系统,但是需要对程、线程这类基本概念有所了解。

售       价:¥

纸质售价:¥79.00购买纸书

71人正在读 | 0人评论 6.5

作       者:封幼林

出  版  社:清华大学出版社

出版时间:2022-08-01

字       数:20.6万

所属分类: 科技 > 计算机/网络 > 程序设计

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
本书主要讲解了Go语言一些关键特性的实现原理,Nicklaus Wirth大师曾经说过:算法 数据结构=程序,语言特性的实现也不外乎就是数据结构 代码逻辑。 全书共分为4个部分:部分是基础特性(第1章~第3章),第二部分是对象模型(第4章~第5章),第三部分是调度系统(第6章~第7章),第四部分是内存管理(第8章~第9章)。书中主要内容包括:指针、函数栈帧、调用约定、变量逃逸、Function Value、闭包、defer、panic、方法、Method Value、组合式继承、口、类型断言、反射、goroutine、抢占式调度、同步、堆和栈的管理,以及GC等。 书中包含大量的探索示例和源码分析,在学会应用的同时还能了解实现原理。书中绝大部分代码都是用Go语言实现,还有少部分使用汇编语言,都可以使用Go官方SDK直编译。探索过程循序渐条理清晰,用到的工具也都是SDK自带,方便读者亲自上手实践。 本书适合Go语言的初学者,在学习语言特性的同时了解其实现原理。更适合有一定的Go语言应用基础,想要深研究底层原理的技术人员。同样适合有一些其他编程语言基础,想要转学Go语言的发者。<br/>【推荐语】<br/>本书系统论述Go语言特性,从语言实现的角度深度探索Go语言特性,包含大量的探索示例和源码分析,在学会应用的同时还能了解实现原理。阅读本书不需要精通汇编语言、操作系统,但是需要对程、线程这类基本概念有所了解。<br/>【作者】<br/>封幼林,资深软件工程师,十多年IT从业经验,曾涉足Win32桌面程序发、Android移动端发,以及互联网服务器端发等多个领域。喜欢研究底层技术,用自己的方法探究背后的实现原理。热爱技术交流与分享,创建了微信公众号“幼麟实验室”,致力做一些形象、通透的计算机教程,让发者“知其然亦知其所以然”。<br/>
目录展开

内容简介

作者简介

序一 FOREWORD

序二 FOREWORD

序三 FOREWORD

序四 FOREWORD

前言 PREFACE

致谢

目 录

第1章 汇编基础

1.1 x86通用寄存器

1.1.1 32位架构

1.1.2 64位架构

1.2 常用汇编指令

1.2.1 整数加减指令

1.2.2 数据传输指令

1.2.3 入栈和出栈指令

1.2.4 分支跳转指令

1.2.5 过程调用指令

1.3 内存分页机制

1.3.1 线性地址

1.3.2 80386两级页表

1.3.3 PAE三级页表

1.3.4 x64四级页表

1.3.5 虚拟内存

1.4 汇编代码风格

1.操作数的宽度

2.操作数的顺序

3.地址的表示

4.立即数格式

1.5 本章小结

第2章 指针

2.1 指针构成

2.1.1 地址

2.1.2 元素类型

2.2 相关操作

2.2.1 取地址

2.2.2 解引用

1.空指针异常

2.野指针问题

3.悬挂指针问题

2.2.3 强制类型转换

2.2.4 指针运算

2.3 unsafe包

2.3.1 标准库与keyword

2.3.2 关于uintptr

2.3.3 内存对齐

2.4 本章小结

第3章 函数

3.1 栈帧

3.1.1 栈帧布局

3.1.2 寻址方式

3.1.3 又见内存对齐

3.1.4 调用约定

3.1.5 Go 1.17的变化

1.函数入参的传递方式

2.函数返回值的传递方式

3.2 逃逸分析

3.2.1 什么是逃逸分析

3.2.2 不逃逸分析

3.2.3 不逃逸判断

3.3 Function Value

3.3.1 函数指针

3.3.2 Function Value分析

3.3.3 闭包

1.闭包对象

2.看到闭包

3.调用闭包

4.闭包与变量逃逸

3.4 defer

3.4.1 最初的链表

1.deferproc

2.deferreturn

3.4.2 栈上分配

3.4.3 高效的open coded defer

3.5 panic

3.5.1 gopanic()函数

1.调用defer函数

2.释放_defer结构

3.检测recover

3.5.2 gorecover()函数

3.5.3 嵌套的panic

3.5.4 支持open coded defer

3.6 本章小结

第4章 方法

4.1 接收者类型

4.1.1 值类型

4.1.2 指针类型

4.1.3 包装方法

4.2 Method Value

4.2.1 基于类型

4.2.2 基于对象

4.3 组合式继承

4.3.1 嵌入值

4.3.2 嵌入指针

4.3.3 多重继承

4.4 本章小结

第5章 接口

5.1 空接口

5.1.1 一个更好的void∗

5.1.2 类型元数据

5.1.3 逃逸与装箱

5.2 非空接口

5.2.1 动态派发

1.方法地址静态绑定

2.动态查询类型元数据

3.C++虚函数机制

5.2.2 具体实现

1.接口类型元数据

2.如何获得itab

3.itab缓存

5.2.3 接收者类型

5.2.4 组合式继承

5.3 类型断言

5.3.1 E To具体类型

5.3.2 E To I

5.3.3 I To具体类型

5.3.4 I To I

5.4 反射

5.4.1 类型系统

1.类型信息的萃取

2.类型系统的初始化

5.4.2 类型元数据详细讲解

5.4.3 对数据的操作

5.4.4 对链接器裁剪的影响

5.5 本章小结

第6章 goroutine

6.1 进程、线程与协程

6.1.1 进程

6.1.2 线程

6.1.3 协程

6.2 IO多路复用

6.2.1 3种网络IO模型

6.2.2 示例对比

1.阻塞式IO下的GET请求

2.应用epoll的GET请求

6.3 巧妙结合

6.4 GMP模型

6.4.1 基本概念

6.4.2 从GM到GMP

1.本地runq和全局runq

2.M的自旋

6.5 GMP主要数据结构

6.5.1 runtime.g

6.5.2 runtime.m

6.5.3 runtime.p

6.5.4 schedt

6.6 调度器初始化

6.6.1 调度器初始化过程

6.6.2 runtime.schedinit()函数

6.7 G的创建与退出

6.7.1 相关汇编函数

1.runtime.systemstack()函数

2.runtime.mcall()函数

3.runtime.gogo()函数

4.runtime.gosave()函数

6.7.2 runtime.newproc()函数

6.8 调度循环

6.8.1 runtime.schedule()函数

6.8.2 runtime.findrunnable()函数

6.9 抢占式调度

6.9.1 Go 1.13的抢占式调度

6.9.2 Go 1.14的抢占式调度

6.10 timer

6.10.1 一个示例

6.10.2 数据结构

6.10.3 操作函数

1.添加

2.删除

3.修改

4.运行

6.1 1 netpoller

6.11.1 跨平台的netpoller

1.netpollinit()函数

2.netpollIsPollDescriptor()函数

3.netpollopen()函数

4.netpollclose()函数

5.netpollarm()函数

6.netpollBreak()函数

7.netpoll()函数

6.11.2 TCP连接的Read()方法

6.12 监控线程

6.12.1 按需执行timer和netpoll

6.12.2 抢占G和P

6.12.3 强制执行GC

6.13 本章小结

第7章 同步

7.1 Happens Before

7.1.1 并发

7.1.2 并行

7.2 内存乱序

7.2.1 编译期乱序

7.2.2 执行期乱序

7.2.3 内存排序指令

7.3 常见的锁

7.3.1 原子指令

7.3.2 自旋锁

7.3.3 调度器对象

7.3.4 优化的锁

7.4 Go语言的同步

7.4.1 runtime.mutex

7.4.2 semaphore

7.4.3 sync.Mutex

1.Mutex工作模式

2.Mutex的状态

3.Lock()和Unlock()方法

7.4.4 channel

1.channel内存布局

2.channel的send操作

3.send操作的源码分析

4.channel的recv操作

5.recv操作的源码分析

6.channel之多路select

7.5 本章小结

第8章 堆

8.1 内存分配

8.1.1 sizeclasses

8.1.2 heapArena

1.arenaHint

2.arenaIdx

3.spanOf

8.1.3 mspan

1.nextFreeIndex()方法

2.setSpans

8.1.4 mcentral

8.1.5 mcache

8.1.6 mallocgc

1.辅助GC

2.空间分配

3.位图标记

4.收尾工作

8.2 垃圾回收

8.2.1 GC root

1.全局数据区

2.栈

3.Finalizer

8.2.2 三色抽象

8.2.3 写屏障

8.2.4 触发方式

1.gcTriggerHeap

2.gcTriggerTime

3.gcTriggerCycle

8.2.5 GC Worker

1.GC Worker的工作模式

2.辅助GC

8.2.6 gctrace

8.3 本章小结

第9章 栈

9.1 栈分配

9.1.1 栈分配初始化

9.1.2 栈分配逻辑

1.小于32KB的栈分配

2.大于或等于32KB的栈分配

3.栈分配逻辑总结

9.2 栈增长

9.2.1 栈增长检测代码

1.第一种形式的栈增长检测

2.第二种形式的检测代码

3.第三种形式的检测代码

9.2.2 栈增长函数

9.3 栈收缩

9.4 栈释放

9.4.1 小于或等于16KB的栈空间

9.4.2 大于或等于32KB的栈空间

9.4.3 栈释放时机

9.5 本章小结

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部