Skip to content

Commit 78ad164

Browse files
committed
add os notes
1 parent 388bb17 commit 78ad164

File tree

4 files changed

+89
-11
lines changed

4 files changed

+89
-11
lines changed

OperatingSystem/1.操作系统简介.md

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
# 1.操作系统简介
44

5-
6-
75
操作系统(Operating System, 简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是一种由引导程序(bootloader)启动并管理计算机中所有程序生命周期的系统程序。任何其他软件都必须在操作系统的支持下才能运行,操作系统能有效组织和管理系统中的各种软、硬件资源,合理组织计算机系统的工作流程并控制程序的执行,为用户提供一个良好的操作环境。 目前比较为人所知的操作系统有Microsoft的Windows系统、Apple的Mac及以Linux为内核的各种Linux发行版(Centos/Ubuntu等)。 现代计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口及各种输入\输出设备构成。
86

97
作用: 它可以帮我们管理计算机的各种资源,协助我们完成各种复杂繁琐的任务。
@@ -95,7 +93,9 @@
9593

9694
### 计算机硬件
9795

98-
从概念上讲,计算机的结构非常简单:首先布置一根总线,然后将各种硬件设备挂在总线上。所有的这些设备都有一个控制设备,外部设备都由这些控制器与CPU通信。而所有设备之间的通信均需通过总线:
96+
计算机的硬件由大量的IC (Integrated Circuit,集成电路)组成。每块IC上都带有许多引脚。这些引脚有的用于输入,有的用于输出。
97+
98+
从概念上讲,计算机的结构非常简单:首先布置一根总线,然后将各种硬件设备挂在总线上。所有的这些设备都有一个控制设备,外部设备都由这些控制器与CPU通信。而所有设备之间的通信均需通过总线,如果对总线做一个简单的概括,可以认为总线就是数字信号的集合,而这些信号被提供给计算机上的每块电路板:
9999

100100
![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/computer_hardware.jpg?raw=true)
101101

@@ -236,6 +236,10 @@ CPU(中央处理器)是计算机的大脑,它主要和内存进行交互,从
236236

237237

238238

239+
为了驱动CPU运转,称为“时钟信号”的电信号必不可少。这种电信号就好像带有一个时钟,滴答滴答地每隔一定时间就变换一次电压的高低。输出时钟信号的元件叫作“时钟发生器”。时钟发生器中带有晶振,根据其自身的频率(振动的次数)产生时钟信号。时钟信号的频率可以衡量CPU的运转速度。这里使用的是2.5MHz(兆赫兹)的时钟发生器。最大时钟频率(maximum clock speed),也称主频,是影响处理器速度的决定性因素之一。时钟频率决定了执行一条指令所需要的时间,处理器的数据位宽也影响处理器的速度。
240+
241+
242+
239243
CPU 主要由两部分构成:`控制单元``算术逻辑单元(ALU)`
240244

241245
- 控制单元:从内存中提取指令并解码执行
@@ -256,18 +260,20 @@ CPU 的内部由**寄存器、控制器、运算器和时钟**四部分组成,
256260

257261
使用高级语言编写的程序会在编译后转化成机器语言,然后通过CPU内部的寄存器来处理。不同类型的CPU,其内部寄存器的数量,种类以及寄存器存储的数值范围都是不同的。根据功能的不同,我们可以将寄存器大致划分为八类:
258262

259-
- ***累加寄存器简称累加器(Accumulator, AC)***:是一个通用寄存器。存储临时的执行运算的数据和运算后的数据
260-
- ***标志寄存器***:存储运算处理后的CPU的状态。
263+
- ***累加寄存器简称累加器(Accumulator Register, AC)***:是一个通用寄存器。存储执行运算的数据和运算后的数据
264+
- ***标志寄存器(Flag Register)***:存储运算处理后的CPU的状态。
261265
- ***程序计数器(Program Counter, PC)***:记录将要取出的指令的地址。存储下一条指令所在内存的地址。
262-
- ***基址寄存器***:存储数据内存的起始地址。
263-
- ***变址寄存器***:存储基址寄存器的相对地址。
264-
- ***通用寄存器***:存储任意数据。
265-
- ***指令寄存器(Instruction Register, IR)***记录最近取出的指令。存储指令,CPU取到的指令存放在处理器的一个寄存器中,这个寄存器就是指令寄存器。CPU内部使用,程序员无法通过程序对该寄存器进行读写操作。
266-
- ***堆栈寄存器(stack pointer)***:目的是跟踪调用堆栈,存储栈区域的起始地址。指向内存中当前栈的顶端。堆栈指针会包含输入过程中的有关参数、局部变量以及没有保存在寄存器中的临时变量。
266+
- ***基址寄存器(Base Register)***:存储数据内存的起始地址。
267+
- ***变址寄存器(Index Register)***:存储基址寄存器的相对地址。
268+
- ***通用寄存器(General Purpose Register)***:存储任意数据。
269+
- ***指令寄存器(Instruction Register, IR)***:存储指令,CPU取到的指令存放在处理器的一个寄存器中,这个寄存器就是指令寄存器。CPU内部使用,程序员无法通过程序对该寄存器进行读写操作。
270+
- ***堆栈寄存器(Stack Register)***:目的是跟踪调用堆栈,存储栈区域的起始地址。指向内存中当前栈的顶端。堆栈指针会包含输入过程中的有关参数、局部变量以及没有保存在寄存器中的临时变量。
267271
- **程序状态字寄存器(PSW(Program Status Word))**:这个寄存器是由操作系统维护的8个字节(64位) long 类型的数据集合。它会跟踪当前系统的状态。除非发生系统结束,否则我们可以忽略 PSW 。用户程序通常可以读取整个PSW,但通常只能写入其某些字段。PSW 在系统调用和 I / O 中起着重要作用。
268272

269273
其中,程序计数器,累加寄存器,标志寄存器,指令寄存器和栈寄存器都只有一个,其他的寄存器一般有多个。
270274

275+
![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/cpu.jpg?raw=true)
276+
271277

272278

273279
### 计算机执行的原理是: 取指执行
@@ -497,7 +503,23 @@ CPU 的内部由**寄存器、控制器、运算器和时钟**四部分组成,
497503

498504
## 内存
499505

500-
内存就是一个字节数组。要读取(read)内存,必须制定一个地址(address),才能访问存储在那里的数据。要写入(write)或更新(update)内存,还必须制定要写入给定地址的数据。
506+
通常所说的内存指的是计算机的主存储器(mainmemory)简称主存。主存通过控制芯片等与CPU相连,主要负责存储指令和数据。主存由可读写的元素构成,每个字节(1字节=8位)都带有一个地址编号。CPU可以通过该地址读取主存中的指令和数据,当然也可以写入数据。
507+
508+
509+
510+
内存实际上是一种名为内存IC的电子元件。虽然内存IC包括DRAM、SRAM、ROM[插图]等多种形式,但从外部来看,其基本机制都是一样的。内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址(address),来进行数据的读写。
511+
512+
下内存IC(在这里假设它为RAM)的引脚配置示例。虽然这是一个虚拟的内存IC,但它的引脚和实际的内存IC是一样的。VCC和GND是电源,A0~A9是地址信号的引脚,D0~D7是数据信号的引脚,RD和WR是控制信号的引脚(读取或写入)。将电源连接到VCC和GND后,就可以给其他引脚传递比如0或者1这样的信号。大多数情况下,+ 5V的直流电压表示1,0V表示0。
513+
514+
![内存IC的引脚配置示例](https://raw.githubusercontent.com/CharonChui/Pictures/master/ram.jpg?raw=true)
515+
516+
那么,这个内存IC中能存储多少数据呢?数据信号引脚有D0~D7共八个,表示一次可以输入输出8位(=1字节)的数据。此外,地址信号引脚有A0~A9共十个,表示可以指定0000000000~1111111111共1024个地址。而地址用来表示数据的存储场所,因此我们可以得出这个内存IC中可以存储1024个1字节的数据。因为1024=1K[插图],所以该内存IC的容量就是1KB。
517+
518+
虽然内存的实体是内存IC,不过从程序员的角度来看,也可以把它假想成每层都存储着数据的楼房,并不需要过多地关注内存IC的电源和控制信号等。
519+
520+
![1KB内存的模型](https://raw.githubusercontent.com/CharonChui/Pictures/master/1kb_memory.jpg?raw=true)
521+
522+
501523

502524
内存包括主存(内存条,基于DRAM(动态RAM))与高速缓存(Cache,基于SRAM(静态RAM,静态RAM速度很快但是成本很高,所以用于在CPU内部充当缓冲))两部分。可能是由于Cache相较内存条容量很小,毕竟内存容量只计内存条大小,加上重要性也不及内存条,一般人或许不知道Cache,所以就忽略了高速缓存Cache,直接将主存--内存条等同了内存吧。计算器内存条采用的是DRAM(动态随机存储器),即计算机的主存。通常所说的内存容量即指内存条DRAM的大小。
503525

OperatingSystem/2.进程与线程.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
## 进程概念
2020

21+
程序是指令和数据的集合。
22+
2123
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
2224

2325
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是[操作系统](https://baike.baidu.com/item/操作系统/192)动态执行的[基本单元](https://baike.baidu.com/item/基本单元),在传统的[操作系统](https://baike.baidu.com/item/操作系统)中,进程既是基本的[分配单元](https://baike.baidu.com/item/分配单元),也是基本的执行单元。

OperatingSystem/6.文件管理.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,13 @@
3434
- 基本I/O管理程序(basic I/O supervisor);负责所有文件I/O的初始化和终止。在这一层,需要一定的控制结构来维护设备的输入/输出、调度和文件状态。基本I/O管理程序是操作系统的一部分。
3535
- 逻辑I/O(logical I/O)使用户和应用程序能够访问记录。因此基本文件系统处理的是数据块,而逻辑I/O模块处理的是文件记录。逻辑I/O提供一种通用的记录I/O的能。
3636

37+
### 文件
3738

39+
文件是将数据存储在磁盘等存储媒介中的一种形式。文件是字节数据的集合体。程序文件中存储数据的单位是字节。文件的大小之所以用××KB、××MB等来表示,就是因为文件是以字节(B=Byte)为单位来存储的。
40+
41+
文件就是字节数据的集合。用1字节(=8位)表示的字节数据有256种,用二进制数来表示的话,其范围就是00000000~11111111。如果文件中存储的数据是文字,那么该文件就是文本文件。如果是图形,那么该文件就是图像文件。在任何情况下,文件中的字节数据都是连续存储的。
42+
43+
![Image](https://raw.githubusercontent.com/CharonChui/Pictures/master/file_data.jpg?raw=true)
3844

3945
### 地址独立的实现机制:文件夹
4046

OperatingSystem/8.虚拟机.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,54 @@ DVM运行Java语言的应用和代码。标准的Java编译器将源代码(写
8181

8282
以上命令首先将jar包push到/data/app目录下,因为该目录一般用于存放应用程序,接着使用adb shell执行dalvikvm程序。dalvikvm的执行语法是: dalvikvm -cp 类路径 类名,从这里可以感觉到,dalvikvm的作用就像在pc上执行java程序一样。
8383

84+
## 程序是如何执行的
85+
86+
计算机只能运行本地代码。本地(native)这个术语有“母语的”意思。对CPU来说,母语就是机器语言,而转换成机器语言的程序就是本地代码。用任何编程语言编写的源代码,最后都要翻译成本地代码,否则CPU就不能理解。也就是说,即使是用不同编程语言编写的代码,转换成本地代码后,也都变成用同一种语言(机器语言)来表示了。
87+
88+
#### 编译:编译器负责转换源代码
89+
90+
能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器。将C语言编写的源代码转换成本地代码的编译器称为C编译器。
91+
92+
编译器首先读入代码的内容,然后再把源代码转换成本地代码。编译器中就好像有一个源代码同本地代码的对应表。但实际上,仅仅靠对应表是无法生成本地代码的。读入的源代码还要经过语法解析、句法解析、语义解析等,才能生成本地代码。
93+
94+
根据CPU类型的不同,本地代码的类型也不同。因而,编译器不仅和编程语言的种类有关,和CPU的类型也是相关的。例如,Pentium等x86系列CPU用的C编译器,同PowerPC这种CPU用的C编译器就不同。从另一个方面来看,这其实是非常方便的。因为这样一来,同样的源代码就可以翻译成适用于不同CPU的本地代码了。
95+
96+
但是仅靠编译是无法得到可执行文件的。
97+
98+
#### 链接
99+
100+
编译器转换源代码后,就会生成一个个的本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的EXE文件,编译之后还需要进行“链接”处理。
101+
102+
把多个目标文件结合,生成1EXE文件的处理就是链接,运行连接的程序就称为链接器(linkage editor或连结器)。
103+
104+
105+
106+
![Windows下的编译和链接机制](https://raw.githubusercontent.com/CharonChui/Pictures/master/windows_compile_link.jpg?raw=true)
107+
108+
109+
110+
在了解了通过程序的编译及链接来生成EXE文件的机制后,接下来看一下EXE文件的运行机制。EXE文件是作为单独的文件储存在硬盘中的。通过资源管理器找到并双击EXE文件,就会把EXE文件的内容加载到内存中运行。
111+
112+
请大家思考一下下面的问题。本地代码在对程序中记述的变量进行读写时,是参照数据存储的内存地址来运行命令的。在调用函数时,程序的处理流程就会跳转到存储着函数处理内容的内存地址上。EXE文件作为本地代码的程序,并没有指定变量及函数的实际内存地址。在类似于Windows操作系统这样的可以加载多个可执行程序的运行环境中,每次运行时,程序内的变量及函数被分配到的内存地址都是不同的。那么,在EXE文件中,变量和函数的内存地址的值,是如何来表示的呢?
113+
114+
下面就让我们来揭晓答案。那就是EXE文件中给变量及函数分配了虚拟的内存地址。在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。
115+
116+
117+
118+
EXE文件的再配置信息,就成为了变量和函数的相对地址。相对地址表示的是相对于基点地址的偏移量,也就是相对距离。实现相对地址,也是需要花费一番心思的。在源代码中,虽然变量及函数是在不同位置分散记述的,但在链接后的EXE文件中,变量及函数就会变成一个连续排列的组。这样一来,各变量的内存地址就可以用相对于变量组起始位置这一基点的偏移量来表示,同样,各函数的内存地址也可以用相对于函数组起始位置这一基点的偏移量来表示。而各组基点的内存地址则是在程序运行时被分配的。
119+
120+
121+
122+
EXE文件的内容分为再配置信息、变量组和函数组,这一点想必大家都清楚了吧。不过,当程序加载到内存后,除此之外还会额外生成两个组,那就是栈和堆。栈是用来存储函数内部临时使用的变量(局部变量),以及函数调用时所用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。
123+
124+
![加载到内存的程序由4部分构成](https://raw.githubusercontent.com/CharonChui/Pictures/master/progress_memory.jpg?raw=true)
125+
126+
EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE文件加载到内存后开始运行时得到分配的。因而,内存中的程序,就是由用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这4部分构成的。
127+
128+
129+
130+
131+
84132
---
85133

86134
- [上一篇:7.嵌入式系统](https://github.com/CharonChui/AndroidNote/blob/master/OperatingSystem/7.%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%B3%BB%E7%BB%9F.md)

0 commit comments

Comments
 (0)