操作系统--内存
简介
内存适用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理
进程运行的原理--指令
例如:x=x+1的代码运行时内存地址的逻辑
可见,写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址存/取数据,这个数据应该做什么样的处理。在这个例子中,指令中直接给出了变量x的实际存放地址(物理地址)。但实际在生成机器指令的时候并不知道该进程的数据会被放到什么位置。所以编译生成的指令中一般是使用逻辑地址(相对地址)
逻辑地址 与 物理地址
物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端
逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干
-
一个逻辑地址空间是指CPU产生的所有逻辑地址的集合
EG:编译时只需确定变量x存放的相对地址是100(也就是说相对于进程在内存中的起始地址而言的地址)。CPU想要找到x在内存中的实际存放位置,只需要用进程的起始地址+100即可
从写程序到程序运行
链接三种方式
静态链接
在程序运行之前先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块)之后不再拆开
装入时动态链接
将各目标模块装入内存时,边装入边链接的链接方式
运行时动态链接
在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享
装入模块到装入内存
绝对装入
静态重定位
动态重定位
特性:并且可将程序分配到不连续的存储区中:在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间
内存管理
存储保护
设置上下限寄存器
越界检查
地址转换
内存空间扩充
覆盖技术
例子如下B、C模块不是同时使用的
必须由程序员声明覆盖结构,操作系统完成自动覆盖
缺点:对用户不透明,増加了用户编程负担
覆盖技术只用于早期的操作系统中,现在已成为历史
交换技术
中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南