论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
DevOps与敏捷开发
›
【Linux】历程地址空间
【Linux】历程地址空间
愛在花開的季節
金牌会员
|
2024-6-29 10:32:02
|
来自手机
|
显示全部楼层
|
阅读模式
楼主
主题
790
|
帖子
790
|
积分
2370
个人主页:东洛的克莱斯韦克-CSDN博客
祝福语:愿你拥抱自由的风
目录
地址总线
语言层面的内存
系统层面的内存
历程概述
历程地址空间优点
地址总线
地址总线的宽度一样平常是32或64。每一根总线均可体现出有电或无电(弱电),带电的总线被计算机解释为1,不带电的总线被计算机解释为0。
32根总线有
种0,1组合。每一种组合可以在内存中申请1比特空间,一共可以申请4294967296比特的空间,也就是4个G。这是一个程序能申请的最大空间。
种0,1组适用十进制理解就是从0增长到了4294967296。换句话说,站在cpu的视角,cpu看到的内存空间是线性(连续)的。
那么现在可以抛出一个概念,所谓的历程地址空间就是这一段线性空间。
语言层面的内存
【C++】C++的内存管理-CSDN博客
如果一个程序要访问内存,此时这个程序一定在cpu上运行的。用语言管理的内存就是上文所说的历程地址空间
把历程地址空间分别成栈 堆 数据段 代码段 内存映射段,在历程地址空间分布如下图
把相同属性的空间放在同一块地区,差别的地区之间限定好起始位置和边界是为了高效的维护好这一段线性空间。
系统层面的内存
历程地址空间实际上是虚拟的空间。也就是说程序管理的内存是虚拟内存。
物理内存的地址是绝对的,每一个存储单元都有一个自己的编号。系统管理的是虚拟内存和物理内存。
在历程地址空间中开好的内存通过页表映射到物理空间上——在物理空间上开辟巨细相同的空间存储数据。(本篇是为了讲历程地址空间,会弱化页表的概念)
历程概述
上文为了讲清历程地址空间是什么而弱化了历程的概念,现在参加历程的概念深入理解一下历程地址空间。
历程与程序:
把保存语言逻辑的文本文件编译成二进制文件便是可实行程序。cpu只能读取内存的数据,可实行程序要实行必须先加载到内存。
Linux操作系统会为该可实行程序创建一个平pcb——历程控制块。linux内核是用C语言写的,pcb实际上是一个结构体(
task_struct
)。可实行程序的属性放到该结构体中维护起来。
如下是
task_struct
保存可实行程序属性的分类
标示符
: 描述本历程的唯一标示符,用来区别其他历程。
状态
: 任务状态,退出代码,退出信号等。
优先级
: 相对于其他历程的优先级。
程序计数器
: 程序中即将被实行的下一条指令的地址。
内存指针
: 包罗程序代码和历程相干数据的指针,还有和其他历程共享的内存块的指针
上下文数据
: 历程实行时处理器的寄存器中的数据 [ 休学例子,要加图 CPU ,寄存器 ] 。 I/O 状态信息 : 包罗显示的 I/O 请求 , 分配给历程的 I / O 装备和被历程使用的文件列表。
记账信息
: 可能包罗处理器时间总和,使用的时钟数总和,时间限定,记账号等。 其他信息 通过
task_struct
可以控制一个可实行程序什么时候被cpu调理,调理的时间是多少,什么时候阻塞,什么时候被回收等等。 管理好一个可实行程序还要管理好其对应的内存。上文已经提到,可实行程序的内存就是历程地址空间。 linux内核会再创建一个结构体(
mm_struct
)来描述历程地址空间的属性,只要管理好这个结构体,便可以管理好程序所对应的内存。 综上,
历程 =
task_struct 加
mm_struct 加 可实行程序
历程地址空间优点
历程为什么不能直接访问物理内存呢?小编总结历程地址空间的三个优点
权限
【linux】root大王如何制约平凡用户——权限管理-CSDN博客
物理内存只是一个硬件,一个硬件是没有权限的概念的。在页表中参加只读,可写等权限字段,那么这块物理内存便有了权限的概念
操作系统可以在历程地址空间拦截历程对物理内存的非法操作。
如越界访问,读写权限不匹配等,物理内存中存的不止一个历程的数据,如果一个历程可以任意对物理内存举行非法操作,其他历程很容易就瓦解掉。
操作系统可以杀历程,如果一个历程对内存有非法操作,这么历程一样平常会被系统杀掉。
如下示例,str指向的内容是不能被修改的,如果修改该历程会挂掉
#include<stdio.h>
int main()
{
char* str = "abc";
*str = 'H';
return 0;
}
复制代码
统一
差别历程之间的数据在物理内存上可能是乱序的,但每个历程所管理的内存都是线性的,有规律的。
即使每个历程要做的任务差别,好比qq要发送消息,游戏软件要向屏幕输出对局信息等,但历程地址空间为操作系统提供了统一描述历程内存属性的模板,方便维护历程内存属性进而高效的管理历程。
计算机内存的巨细一样平常在2G到16G不等,而历程的数目一样平常在十几个到几十个不等,操作系统可能会给每个历程都分配4G(32位)的空间吗?不可能,物理内存是很告急的资源,可以理解为历程地址空间是操作系统给历程画的一张大饼。
在内存资源很告急的时候,操作系统为一个历程创建了
task_struct
,也创建了
mm_struct
,甚至在历程地址空间中为该历程开辟了几个G的空间,但此时大部分的代码和数据可能还在磁盘上,只在内存中加载了一部分的代码和数据。
为什么呢?因为操作系统不会做任何浪费时间和空间的事情。几个G的数据都加载到内存,但大部分数据可能并没有运算需求,也就没必要加载到物理内存。
上述行为被称作惰性加载。
实在惰性加载并不反直觉,举一个生活中的例子帮助各人理解。一个大型游戏软件都是几十个G,为什么能在4G的游戏本上流通的跑呢,此时你的游戏本上可能还开着微信,音乐等,缘故原由就是操作系统操作系统会接纳惰性加载的方式控制物理内存。
解耦
操作系统有四大模块,历程管理,内存管理,文件管理,驱动管理。
这里提的解耦是让历程管理和内存管理的关联性低落。
有了历程地址空间后,一个历程出题目了不会影响内存管理,进而不会影响其他历程运行。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
愛在花開的季節
金牌会员
这个人很懒什么都没写!
楼主热帖
流批一体开源项目ChunJun技术公开课— ...
Redis 原理 - Hash
HA启动Advanced SSH & Web Terminal 提 ...
SpringBoot
一次服务器被入侵的处理过程分享 ...
dotnet C# 使用 Vortice 支持 Direct2D ...
Redis持久化
Flink 作业提交流程
keepalived安装配置
【网络进阶】网络问题排查实例集锦(实 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表