进程切换:
1.
并行:多个进程在多个CPU上跑,是同时运行
并发:多个进程在一个CPU上跑,是交替运行
2.
程序return的值,作为一个临时变量,为什么可以传给程序之外?
答:因为return的值传给一个寄存器eax
3.
系统如何知道我的进程运行到哪行代码了?
答:程序计数器,eip寄存器:纪录当前进程正在执行的指令的下一行指令的地址
- 为什么需要寄存器呢?
答:提高效率,将进程的高频数据保存在寄存器中,方便CPU进行高速读取
5.
进程上下文---------CPU上寄存器保存的进程相关数据
进程从CPU上离开时,要把自己的上下文数据保存好(保存在PCB中),以便之后再回到CPU中,CPU能够读取已运行的数据,直接从上次运行的结尾开始,而不用重新开始(保存上下文,恢复上下文)
环境变量:
- 环境变量:是操作系统中用于存储有关运行环境信息的变量。这些信息可以被操作系统本身或运行在上面的应用程序使用,以适应或控制不同的环境设置。
env命令查看环境变量
环境变量可以被子进程继承(具有全局属性)
- 环境变量PATH:
查看环境变成:echo $PATH
就是一个指令的搜索路径,将一个指令加入环境变量,就可以让系统自己在已经保存的路径中自己找到命令,而不需要类似于./这样在前面加上指令的位置
3.常规命令与内建命令
内建命令(内部命令)
内建命令是shell程序的一部分。这意味着它们是由shell自身处理和执行的,不需要调用外部程序文件。因为这些命令是内建在shell中的,所以它们的执行速度通常比调用外部程序快。
优点:
- 执行速度快,因为没有程序加载的开销。
- 可以直接访问和修改shell的内部状态。
示例:
- 在Bash中,像 cd(更改目录)、echo(输出文本)、history(显示命令历史)等命令都是内建命令。
- 在Windows命令提示符中,如 dir 和 cls 也是内建命令。
常规命令(外部命令)
常规命令或外部命令是独立的程序文件,存储在系统的文件系统中。当你执行一个常规命令时,shell会在 PATH 环境变量定义的目录中查找该命令的可执行文件,然后启动一个新的进程来运行它。
优点:
- 功能更为强大和复杂,因为它们可以是任何独立的应用程序。
- 可以是由第三方开发的,不依赖于特定的shell实现。
示例:
- 在Unix/Linux系统中,如 grep、awk、sed 等工具。
- 在Windows系统中,如 notepad、ipconfig 等。
进程地址空间:
上面是虚拟地址,对于每一个进程都有一个对应相同大小的虚拟地址
· 代码区(Text Segment):
这部分包含程序的可执行代码,通常是只读的,以防止程序在运行时被意外或恶意修改。比如:函数与字符串常量
· 数据区(Data Segment):
包括初始化的全局变量和静态变量。这部分内存在程序开始执行时已经被分配,并且在程序运行期间保持固定大小。
· BSS段(Block Started by Symbol):
用于存储未初始化的全局变量和静态变量。在程序开始运行前,这部分内存通常被操作系统初始化为零。
· 堆区(Heap):
堆是用于动态内存分配的区域,程序在运行时可以通过诸如malloc、new等函数从堆上分配内存。堆的大小不是固定的,可以在运行时根据需要扩展或收缩。
· 栈区(Stack):
栈用于存储局部变量、函数参数以及程序的调用栈(函数调用和返回地址)。栈有很高的访问速度,通常较小,由操作系统自动管理。每次函数调用时,相关的数据会被推入栈中,函数返回时数据被弹出
实验:
VS编译结果:
地址逐渐向上增长,但堆区地址比栈区高
Linux下g++编译结果
可以看见堆区比栈区低了
结论:应该是VS编译器做了什么优化,让栈区地址与堆区进行了一些改变