2.3 用golang写一个操作系统统 复睿:李四保 ⽤用Golang ⾃自我介绍 l 开发过银⾏行设备 l 同花顺移动证券 l 前后参与创⽴立过多家公司 l ⽤用Golang写了⼀一个云操作系统 电⼒力、⽯石化、银⾏行、证券、⼲⼴广电、电商 研发、产品、运营、公司运营 l 多种职业 l 喜欢各种宗教 l 喜欢在虚⽆无中创造⼀一个世界 l 多个⾏行业 ⾃自我介绍 说⼀一万句,不如做⼀一件事:⽤用Golang写⼀一个操作系统 来份硬菜:⽤用Golang写⼀一个操作系统 l 操作系统 相对完整的控制系统资源,有应⽤用体系 Unix,CP/M,dos、windows, l ⽣生态操作系统 在原有操作系统内核基础上,构建新的应⽤用体系及应⽤用⽣生态 ios、android l 云操作系统 chrome chrome os和阿⾥里云os。在上⼀一层操作系统基础之上和⾃自家的云系统进⾏行整合 l 去中⼼心化的云操作系统 Leither 架构基本和chrome os类似,只是将后端的云系统去中⼼心化,使之脱离巨头的控制 操作系统历史 l 互联⺴⽹网正在整合各个⾏行业,对各个传统⾏行业进⾏行重构 l 互联⺴⽹网的格局正在固化 ⾏行业巨头垄断互联⺴⽹网资源,全⾯面压制创新空间0 码力 | 33 页 | 1014.12 KB | 1 年前3
Go 入门指南(The way to Go)工程师:Robert Griesemer,参与开发 Java HotSpot 虚拟机;Rob Pike,Go 语言项目总负责人,贝 尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言;Ken Thompson,贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开 发了 UTF-8 字符集规范。自 年 1 月起,Ken Thompson 就开始研发一款以 C 语言为目标结果的编 译器来拓展 Go 语言的设计思想。 这是一个由计算机领域 “发明之父” 所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非 常深刻的见解 图 1.1 Go 语言设计者:Griesemer、Thompson 和 Pike Go入门指南 - 4 - 本文档使用 看云 构建 在 2008 年年中,Go 快速编译,高效开发 高效执行 并发支持,轻松驾驭 静态类型 标准类库,规范统一 易于部署 文档全面 免费开源 第2章:安装与运行环境 2.1 平台与架构 Go 语言开发团队开发了适用于以下操作系统的编译器: Linux FreeBSD Mac OS X(也称为 Darwin) 目前有2个版本的编译器:Go 原生编译器 gc 和非原生编译器 gccgo,这两款编译器都是在类 Unix0 码力 | 380 页 | 2.97 MB | 1 年前3
Go 入门指南(The way to Go)Robert Griesemer,参与开发 Java HotSpot 虚拟机;Rob Pike,Go 语言项目总负责人,贝尔实验室 Unix 团队成员,参与的项目包括 Plan 9,Inferno 操作系统和 Limbo 编程语言;Ken Thompson,贝尔实验室 Unix 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范。自 2008 年 1 月起,Ken Thompson 就开始研发一款以 C 语言为目标结果的编译器来拓展 Go 语言的设计思想。 这是一个由计算机领域 “发明之父” 所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非常深刻的见 解 图 1.1 Go 语言设计者:Griesemer、Thompson 和 Pike 在 2008 年年中,Go 语言的设计工作接近尾声,一些员工开始以全职工作状态投入到这个项目的编译器和运行实现 运行时(runtime) 2.8 Go 解释器 第2章:安装与运行环境 - 24 - 本文档使用 书栈(BookStack.CN) 构建 2.1 平台与架构 Go 语言开发团队开发了适用于以下操作系统的编译器: Linux FreeBSD Mac OS X(也称为 Darwin) 目前有2个版本的编译器:Go 原生编译器 gc 和非原生编译器 gccgo,这两款编译器都是在类 Unix0 码力 | 466 页 | 4.44 MB | 1 年前3
如何使用 docker 部署一个 beego 项目>容器提供了与虚拟机相似的资源分配和隔离优势。然而,相同之处仅此而已。
一个虚拟机需要它自己的客户操作系统而容器共享主机操作系统的内核。这意味着容器更加轻量 且需要更少的资源。从本质上讲,一个虚拟机是操作系统中的一个操作系统。而另一方面的容器则更 是操作系统中的其它应用程序。基本上,容器需要的资源(内存、磁盘空间等等)比虚拟机少很多, 且具有比虚拟机快很多的启动时间。
0 码力 | 5 页 | 269.19 KB | 1 年前3
Go Web编程下信息: export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin 如何判断自己的操作系统是32位还是64位? 如何判断自己的操作系统是32位还是64位? 我们接下来的Go安装需要判断操作系统的位数,所以这小节我们先确定自己的系统类型。 Windows系统用户请按Win+R运行cmd,输入systeminfo后回车,稍等片刻,会出现一些系统信息。在“系统类 件夹名不 同。默认生成的可执行文件名是文件夹名。) go build会忽略目录下以“_”或“.”开头的go文件。 如果你的源代码针对不同的操作系统需要不同的处理,那么你可以根据不同的操作系统后缀来命名文件。例 如有一个读取数组的程序,它对于不同的操作系统可能有如下几个源文件: arraylinux.go arraydarwin.go arraywindows.go arrayfreebsd LiteIDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),由visualfc编写。 18 图1.4 LiteIDE主界面 LiteIDE主要特点: LiteIDE主要特点: 支持主流操作系统 Windows Linux MacOS X Go编译环境管理和切换 管理和切换多个Go编译环境 支持Go语言交叉编译 与Go标准一致的项目管理方式 基于GOPATH的包浏览器0 码力 | 295 页 | 5.91 MB | 1 年前3
2.1.3 如何用Go模拟CPU所有发明都是有基础的 • 任何的方便都是有代价的:抽象层概念 • 抽象意味着更慢 • 为啥现在程序员好像更弱了? • 因为我们处在最好也是最坏的时代 • 抽象多且环环嵌套 • 硬件过于复杂 • 软件基于操作系统等复杂概念 • 真的快且便宜 Go模拟CPU • 如何用Go实现冯诺伊曼架构CPU? • 简单:一个循环+一个大数组 读取当前指令 执行指令 下一条指令 模拟目标 – MOS 6502 • • 早期电脑都是直接读写内存/硬件 • 操作系统仅仅是帮助处理IO • 进程?不存在的 • 用户?不存在的 • 虚拟内存?不存在的 • 都是用汇编编写程序 Go模拟Apple II • ZHUOS = Zhuo’s Hardly Usable Operating System for fun • 小结 • 早期电脑都是直接读写内存/硬件 • 操作系统仅仅是帮助处理IO • 进程?不存在的0 码力 | 42 页 | 7.10 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a// error: -1溢出uint 在上面的例子中,符号^为位反运算符,符号+为加法运算符,符号/为除法运算 符。 下面这个类型确定常量声明在64位的操作系统上是合法的,但在32位的操作系 统上是非法的。 因为一个uint值在32位操作系统上的尺寸是32位, (1 << 64) - 1将溢出uint。(这里,符号<<为左移位运算符。) const MaxUint uint = (1 << 64) 来替换上面这个。下面这个声明在64位和32位的操作系统上都是合法的。 const MaxUint = ^uint(0) 类似地,我们可以使用下面这个常量声明来声明一个具名常量来表示最大的int 值。(这里,符号>>为右移位运算符。) const MaxInt = int(^uint(0) >> 1) 使用类似的方法,我们可以声明一个常量来表示当前操作系统的位数,或者检 查当前操作系统是32位的还是64位的。 前程序可利用的逻辑CPU数目。 每个逻辑CPU在同一时刻只能最多执行一个协 程。Go运行时(runtime)必须让逻辑CPU频繁地在不同的处于运行状态的协程 之间切换,从而每个处于运行状态的协程都有机会得到执行。 这和操作系统执 行系统线程的原理是一样的。 下面这张图显示了一个协程的更详细的生命周期。在此图中,运行状态被细分 成了多个子状态。 一个处于排队子状态的协程等待着进入执行子状态。一个处 于执行子状态的协程在0 码力 | 608 页 | 1.08 MB | 1 年前3
Hello 算法 1.1.0 Go版,用于表示各种语言的字母、标点符号甚至表情符号等。 ‧ 布尔类型 bool ,用于表示“是”与“否”判断。 基本数据类型以二进制的形式存储在计算机中。一个二进制位即为 1 比特。在绝大多数现代操作系统中,1 字节(byte)由 8 比特(bit)组成。 基本数据类型的取值范围取决于其占用的空间大小。下面以 Java 为例。 ‧ 整数类型 byte 占用 1 字节 = 8 比特,可以表示 28 的字符串 str 。 ‧ C 和 C++ 未明确规定基本数据类型的大小,而因实现和平台各异。表 3‑1 遵循 LP64 数据模型,其用于 包括 Linux 和 macOS 在内的 Unix 64 位操作系统。 ‧ 字符 char 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字 符编码”章节。 ‧ 即使表示布尔量仅需 1 位(0 或 1),它在内存中通常也存储为 位的编码就足以表示所有的 Unicode 字符了。 ‧ C# 使用 UTF‑16 编码,主要是因为.NET 平台是由 Microsoft 设计的,而 Microsoft 的很多技术(包 括 Windows 操作系统)都广泛使用 UTF‑16 编码。 由于以上编程语言对字符数量的低估,它们不得不采取“代理对”的方式来表示超过 16 位长度的 Unicode 字符。这是一个不得已为之的无奈之举。一方面,包含代理对的字符串中,一个字符可能占用0 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0 Golang版,用于表示各种语言的字母、标点符号甚至表情符号等。 ‧ 布尔类型 bool ,用于表示“是”与“否”判断。 基本数据类型以二进制的形式存储在计算机中。一个二进制位即为 1 比特。在绝大多数现代操作系统中,1 字节(byte)由 8 比特(bit)组成。 基本数据类型的取值范围取决于其占用的空间大小。下面以 Java 为例。 ‧ 整数类型 byte 占用 1 字节 = 8 比特,可以表示 28 的字符串 str 。 ‧ C 和 C++ 未明确规定基本数据类型的大小,而因实现和平台各异。表 3‑1 遵循 LP64 数据模型,其用于 包括 Linux 和 macOS 在内的 Unix 64 位操作系统。 ‧ 字符 char 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字 符编码”章节。 ‧ 即使表示布尔量仅需 1 位(0 或 1),它在内存中通常也存储为 位的编码就足以表示所有的 Unicode 字符了。 ‧ C# 使用 UTF‑16 编码,主要是因为.NET 平台是由 Microsoft 设计的,而 Microsoft 的很多技术(包 括 Windows 操作系统)都广泛使用 UTF‑16 编码。 由于以上编程语言对字符数量的低估,它们不得不采取“代理对”的方式来表示超过 16 位长度的 Unicode 字符。这是一个不得已为之的无奈之举。一方面,包含代理对的字符串中,一个字符可能占用0 码力 | 382 页 | 17.60 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.aerror: -1溢出uint 在上面的例子中,符号^为位反运算符,符号+为加法运算符,符号/为除法运算 符。 下面这个类型确定常量声明在64位的操作系统上是合法的,但在32位的操作系统上 是非法的。 因为一个uint值在32位操作系统上的尺寸是32位, (1 << 64) - 1 将溢出uint。(这里,符号<<为左移位运算符。) 1| const MaxUint uint = (1 替换上面这个。下面这个声明在64位和32位的操作系统上都是合法的。 1| const MaxUint = ^uint(0) 类似地,我们可以使用下面这个常量声明来声明一个具名常量来表示最大的int 值。(这里,符号>>为右移位运算符。) 1| const MaxInt = int(^uint(0) >> 1) 使用类似的方法,我们可以声明一个常量来表示当前操作系统的位数,或者检查当 前操作系统是32位的还是64位的。 的逻辑CPU数目。 每个逻辑CPU在同一时刻只能最多执行一个协程。Go运行时 (runtime)必须让逻辑CPU频繁地在不同的处于运行状态的协程之间切换,从而每 个处于运行状态的协程都有机会得到执行。 这和操作系统执行系统线程的原理是一 样的。 下面这张图显示了一个协程的更详细的生命周期。在此图中,运行状态被细分成了 多个子状态。 一个处于排队子状态的协程等待着进入执行子状态。一个处于执行子 状态的0 码力 | 591 页 | 21.40 MB | 1 年前3
共 21 条
- 1
- 2
- 3













