进程切换,环境变量,地址空间

进程切换:

1.

并行:多个进程在多个CPU上跑,是同时运行

并发:多个进程在一个CPU上跑,是交替运行

2.

程序return的值,作为一个临时变量,为什么可以传给程序之外?

答:因为return的值传给一个寄存器eax

3.

系统如何知道我的进程运行到哪行代码了?

答:程序计数器,eip寄存器:纪录当前进程正在执行的指令的下一行指令的地址

  1. 为什么需要寄存器呢?

答:提高效率,将进程的高频数据保存在寄存器中,方便CPU进行高速读取

5.

进程上下文---------CPU上寄存器保存的进程相关数据

进程从CPU上离开时,要把自己的上下文数据保存好(保存在PCB中),以便之后再回到CPU中,CPU能够读取已运行的数据,直接从上次运行的结尾开始,而不用重新开始(保存上下文,恢复上下文)

环境变量:

  1. 环境变量:是操作系统中用于存储有关运行环境信息的变量。这些信息可以被操作系统本身或运行在上面的应用程序使用,以适应或控制不同的环境设置。
    env命令查看环境变量

环境变量可以被子进程继承(具有全局属性)

  1. 环境变量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编译器做了什么优化,让栈区地址与堆区进行了一些改变

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值