🔥 博客主页: 我要成为C++领域大神
🎥 系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️ 感谢大家点赞👍收藏⭐评论✍️本博客致力于分享知识,欢迎大家共同学习和交流。

什么是进程
我们编写的程序是存储在电脑磁盘中的静态数据,是进程的静态表现,例如微信,包含程序文件、程序数据、程序配置。当我们执行可执行文件exe后(启动),会创建进程,装载到内存中去,CPU会执行程序中的指令,这个运行中的程序,就被称为「进程」(Process)。
进程属于系统中的逻辑单位,没有实体

进程与程序的区别
程序是进程的静态表现,进程是程序的动态表现,进程创建后占用系统资源,完成特定任务
进程的生存空间
操作系统会给每个进程分配内存空间,32位和64位分配的空间大小有所不同:
32位系统
- 最大地址空间:4GB(2^32 字节)
64位系统
- 最大地址空间:理论上是16EB(2^64 字节),但实际可用的地址空间取决于操作系统的实现。
- 实际分配:
- 目前的操作系统一般只使用其中的一部分。
- 用户空间:可以达到128TB到256TB。
- 内核空间:64TB到128TB不等。
具体分配
32位系统分配
- 用户空间:3GB
- 内核空间:1GB
内存布局细节
- 代码段:存放可执行代码。
- 数据段:存放已初始化的全局变量。
- BSS段:存放未初始化的全局变量。
- 堆区:用于动态内存分配。
- 栈区:存放函数调用栈,包括局部变量和函数调用信息。

PCB中包含了384项进程信息,其中pid是进程id,是操作系统唯一的进程身份标识。
虚拟内存
既然操作系统会为一个进程分配4G的内存空间,而我们平常用的PC大多为8G,16G,那样不是内存很快会满吗?
其实在操作系统中,即使一个进程被分配了4GB的地址空间,也不代表这4GB的地址空间全部都在物理内存中实际存在。虚拟内存是计算机系统的一种内存管理技术,允许操作系统使用硬盘的一部分来扩展物理内存(RAM),从而使得系统能够运行超过实际物理内存容量的应用程序。

内存资源有限且珍贵,允许多个进程使用,但是不允许共用(同时占用和访问)。
进程的用户空间是独占内存,此内存数据不允许多进程共享。
原因:
安全性
- 防止非法访问:如果多个进程随意共享内存,一个进程可能会无意或故意地修改另一个进程的数据,导致数据泄露或篡改。
- 防止代码注入攻击:攻击者可能利用内存共享来注入恶意代码,从而控制其他进程的执行流。
稳定性
- 防止崩溃传播:如果一个进程出现内存访问错误(如访问了无效地址),这个错误可能会影响共享内存中的数据,进而导致其他进程崩溃。
- 数据完整性:独立的内存空间确保每个进程的数据不会被其他进程干扰,从而保证数据的完整性。
进程内核空间内存允许多进程共享,因为内核空间开发者无权限访问。同时将所有进程的内核层都映射到这一块物理内存,方便PCB进程控制块记录物理内存。

内存的基本单位
页(Page)
- 页(Page):内存管理中的基本单位,通常为4KB或其他大小的内存块。操作系统将物理内存划分为若干个固定大小的页框(Page Frame),而将进程的虚拟内存划分为相同大小的页。通过页表(Page Table),操作系统可以将虚拟地址映射到物理地址。
为什么使用页?
- 虚拟内存管理:通过分页技术,操作系统可以实现虚拟内存,使得进程可以使用超过实际物理内存大小的地址空间。
- 内存保护和共享:页表可以提供进程间内存保护,防止进程访问不属于它们的内存。同时,通过映射相同的物理页到不同进程的虚拟地址空间,可以实现内存共享。
- 内存分配效率:以页为单位进行内存分配和回收,可以减少内存碎片,提高内存利用率。
内存分页机制
- 虚拟地址和物理地址:进程使用虚拟地址进行内存访问。虚拟地址通过页表转换为物理地址。
- 页表(Page Table):记录虚拟页与物理页的映射关系,每个进程都有自己的页表。
- 页框(Page Frame):物理内存被划分为多个页框,每个页框大小通常为4KB。
32位和64位系统中的页
- 32位系统:最多支持4GB的虚拟地址空间,通常采用三级页表(Page Directory、Page Table、Page)来进行地址转换。
- 64位系统:支持更大的虚拟地址空间,通常采用多级页表(如四级页表)来进行地址转换,具体取决于操作系统和硬件架构。
为什么32位操作系统中的进程空间是G为单位?
因为32位操作系统采用三级页表进行地址转换。
在32位操作系统中,使用三级间接寻页机制可以管理的最大虚拟地址空间取决于每级页表的大小和虚拟地址的总长度。
- 32位操作系统:意味着虚拟地址总共有32位。
- 页大小:通常为4KB,即2^12字节。
- 每级页表项的大小:通常为4字节(32位)。
分解虚拟地址
32位虚拟地址可以分解为:
- 页内偏移:12位(用于定位4KB页内的具体地址)
- 第三级页表索引:10位
- 第二级页表索引:10位
计算可管理的地址空间
每个页表项指向下一级页表或最终的物理页框。逐级进行计算:
1.第一级页表 (页目录):
- 大小:2^10 个表项。
- 每个表项:指向第二级页表的基地址。
2.第二级页表 :
- 每个第一级页表项指向一个第二级页表。
- 大小:2^10 个表项。
- 每个表项:指向第三级页表的基地址。
3.第三级页表:
- 每个第二级页表项指向一个第三级页表。
- 大小:2^10 个表项。
- 每个表项:指向一个物理页框。
4.物理页框
- 每个第三级页表项指向一个物理页。
- 大小:4KB(2^12字节)。
地址空间总计算
- 第一级页表可以管理的空间:2^10 * 2^12 = 2^22 字节。
- 第二级页表可以管理的空间:2^10 * 2^22 = 2^32 字节。
因此,使用三级间接寻页结构,32位虚拟地址空间可以管理的最大虚拟内存空间是:
232字节=4GB
在32位操作系统中,通过三级间接寻页机制可以管理最大4GB的虚拟地址空间。每个级别的页表逐步解析虚拟地址,最终映射到物理地址。这种机制不仅节省内存,还使得大地址空间的管理变得高效。
而64位系统采用四级间接寻页机制,因此能够管理符虚拟地址就更大,以T为单位
四种内存的基本权限
- 可读(Read):允许读取内存数据。
- 可写(Write):允许写入内存数据。
- 可执行(Execute):允许执行存储在内存中的指令代码。
- 无权限(No Access):禁止任何访问,包括读取、写入和执行。
用户空间对内存的权限
代码段(Code Segment):
- 权限:可读(Read)和可执行(Execute)。
- 作用:存放程序的可执行代码。通常禁止写入,以防止代码被恶意修改。
数据段(Data Segment):
- 权限:可读(Read)和可写(Write)。
- 作用:存放已初始化的全局变量和静态变量。
BSS段(BSS Segment)
- 权限:可读(Read)和可写(Write)。
- 作用:存放未初始化的全局变量和静态变量。
堆区(Heap):
- 权限:可读(Read)和可写(Write)。
- 作用:用于动态内存分配,通过
malloc等函数进行内存分配和释放。
栈区(Stack):
- 权限:可读(Read)和可写(Write)。
- 作用:存放函数的局部变量、函数参数和返回地址。
保存与恢复处理器现场
在计算机系统中,处理器现场(context)是指描述处理器当前状态的集合,包括寄存器的内容、程序计数器的值以及其他与处理器状态相关的信息。保存和恢复处理器现场通常涉及操作系统或者软件的管理,目的是在需要时能够暂时中断当前执行的程序,并在稍后恢复执行,而不丢失程序的状态。
由于CPU中的寄存器有限,当不同进程需要使用同一寄存器时,将触发保存处理器现场机制
如下图所示,当进程A和进程B同时执行一段代码进行变量a自增的操作,那么他们都需要用到eax寄存器,但是处理器寄存器数量有限,我们就需要将此刻进程A的处理器现场保存到内核栈中去,当进程A需要恢复现场时,再通过进程A的PCB中的内核栈指针,找到保存在内核栈中的现场恢复。所以我们可以说进程、线程就是寄存器和栈

保存处理器现场
保存处理器现场通常发生在以下几种情况下:
- 中断处理:当处理器接收到硬件中断或软件中断(例如系统调用)时,操作系统会保存当前进程的处理器现场,以便稍后能够恢复执行。
- 任务切换:在操作系统中,当一个进程或任务需要被暂停,而另一个进程或任务需要被调度执行时,操作系统会保存当前进程的处理器现场,并恢复下一个即将执行的进程的处理器现场。
- 系统调用:当用户程序通过系统调用请求操作系统提供服务时,操作系统可能会保存当前用户程序的处理器现场,以便在服务完成后能够恢复用户程序的执行。
恢复处理器现场
恢复处理器现场是指在保存处理器现场后,将保存的状态重新加载到处理器中,以便程序可以继续执行。恢复处理器现场的过程通常包括以下步骤:
- 恢复寄存器状态:将保存的寄存器内容恢复到处理器的寄存器中,这些寄存器包括通用寄存器(如AX、BX等)以及特定用途的寄存器(如程序计数器PC)。
- 更新程序计数器:特别是在中断处理或任务切换时,需要确保程序计数器指向正确的指令地址,以便程序可以从中断点或切换点继续执行。
- 恢复其他状态:根据需要,可能还需要恢复其他处理器状态,如标志寄存器的内容等。
分时复用原则结合保存恢复现场,是一个合格的多任务系统

被折叠的 条评论
为什么被折叠?



