LInux(三)程序地址空间、内存管理

news2024/11/18 11:44:57

目录

 一、程序地址空间

 二、内存管理方式

1、分段式内存管理

 2、分页式内存管理

3、段页式内存管理

 三、关于内存管理内容补充(分页式)

1、页表简单呈现

2、访问权限位

3、缺页中断

4.内存置换算法


一、程序地址空间

  创建父子进程同时访问同一变量,在子进程中对全局变量g_val进行修改

  1 #include<stdio.h>                                                                          
  2 #include<unistd.h>
  3 
  4 int g_val = 10;
  5 int main()
  6 {
  7     int ret = fork();
  8     if(ret<0){
  9       printf("error fork\n");
 10     }else if(ret==0){
 11       g_val = 300;
 12       printf("i am child, my g_val = %d,my &g_val = %p\n",g_val,&g_val);
 13     }else{
 14       printf("i am parent, my g_val = %d,my &g_val = %p\n",g_val, &g_val);
 15     }
 16     return 0;
 17 }

现象: 输出结果俩者不相同,但俩变量的地址相同。

 

程序地址空间:进程的虚拟地址空间

        系统为每一个程序运行通过mm_struct结构体(LInux下)所描述的一个虚拟的,连续的,完整的地址空间

        我们进程中访问内存时候看到的地址其实都是虚拟地址,经过页表映射之后得到物理地址进行进而访问物理内存

 进程并不直接访问物理地址,而是通过访问虚拟地址,进行映射访问物理地址的方式进行:

好处:

1、每个进程都有一个完整独立的虚拟地址空间,则地址可以随便使用,不同担心冲突

2、经过页表映射可以将数据存储在物理内存的任意位置,实现数据的离散式存储,提高内存利用率

3、在进行页表映射之后可以进行访问权限的控制

 二、内存管理方式

1、分段式内存管理

将一个整体的地址空间划分为多个段(代码段、数据段、堆区、栈……)

作用: 更加利于编译器对于地址的管理

俩个要素:段表,地址组成

        虚拟地址组成:段号,段内偏移量

        段表:一种数据结构,其中描述的信息,段号,物理内存的一个起始地址

通过段号找到段表项,得到一块物理内存的起始地址

屋里内存起始地址+偏移量就是实际数据存储位置

 2、分页式内存管理

将一个整体的地址空间划分为大量的小的分页page(当前一般默认都是4096字节为一页)

作用: 实现数据的离散存储,提高内存利用率

俩个关键要素:页表+虚拟地址组成

        页表:页号、物理内存块起始地址、缺页中断位、访问权限位……

        虚拟地址组成:页号+页内偏移

通过虚拟地址中的页号,在页表中找到对应的页表项,得到一个物理内存块的起始地址,加上页内偏移量就是实际的访问位置

二者不同的区别在于应用方向不同,分段式利于地址管理,分页式更加倾向于碎片化管理,提高内存利用率以及内存访问控制

3、段页式内存管理

先将地址空间进行分段,然后在每个分段内使用分页进行管理(集合了分段式与分页式的优势)

 三、关于内存管理内容补充(分页式)

1、页表简单呈现

 2、访问权限位

标记当前的地址能够进行什么操作

简单举例:

0号地址,也就是NULL,这个地址既不可读也不可写,因此一旦解引用或者修改则会内存访问错误

const修饰的常变量,具有常性,其实就是访问权限上只读

代码段的所有地址,都是只读的

3、缺页中断

当进程要访问一块内存时,经过页表映射的时候发现缺页中断位被置位(这个地址原先的数据现在不在内存中),则触发缺页中断

内存交换:

一个程序运行就要占据大量内存,但是物理内存是有限的,意味着内容总有耗尽时候

大佬们就有想法:按照某种规则将内存中的某些数据从内存中移出去,放到硬盘中存起来(放入swap分区)交换分区一般32G以内都是内存的俩倍

当我们访问数据的时候,刚好就是被移出去的数据时,就会触发缺页中断

触发缺页中断后,就需要重新进行内存置换,将数据从交换分区置换到内存中进行访问

4.内存置换算法

内存不够的时候,把哪些数据移出去放到交换分区上存储

        LRU--最久未使用                 LFU--最少未使用

操作系统中可以使用LRU(least recently used)内存淘汰旧数据的策略,如果内存需要加载新数据但空间又不足,则会按照最近访问时间进行排序,并将最老的数据淘汰,假设现在内存空间大小为6,原本内存中没有数据,对内存中数据的访问顺序如下: 1,2,5,3,4,6,1,4,3,6,7,8,3,9 则缺页次数为()

 

LRU栈:当前引用不在栈中,且栈未满,放到栈顶;栈满,删除栈底,放到栈顶。当前引用在栈中,删除栈中原先位置,放到栈顶。

    缺页:当前引用不在页的某个帧中,即缺页。而LRU只是确定被置换的那个引用,即LRU栈底引用。

     前6次均缺页,因为每次的引用都不在已有的页中,缺页次数6,当前LRU栈:6->4->3->5->2->1

     第7次为1,在页中,不缺页,当前LRU栈:1->6->4->3->5->2

     第8次为4,在页中,不缺页,当前LRU栈:4->1->6->3->5->2

     第9次为3,在页中,不缺页,当前LRU栈:3->4->1->6->5->2

     第10次为6,在页中,不缺页,当前LRU栈:6->3->4->1->5->2

     第11次为7,不在页中,缺页。删除栈底2,将7放到栈顶。当前LRU栈:7->6->3->4->1->5

     第12次为8,不在页中,缺页。删除栈底5,将8放到栈顶。当前LRU栈:8->7->6->3->4->1

     第13次为3,在页中,不缺页。当前LRU栈:3->8->7->6->4->1

     第14次为9,不在页中,缺页。删除栈底1,将9放到栈顶。当前LRU栈:9->3->8->7->6->4

     综上,缺页9次。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正式发布丨Azure OpenAI Service

Azure OpenAI 服务现已在微软全球 Azure 平台正式发布&#xff0c;这是微软人工智能大众化以及与 OpenAI 持续合作的又一里程碑。 大型语言模型正迅速成为用户无限创新、应用 AI 解决重要问题的平台。随着 Azure OpenAI 服务的正式发布&#xff0c;更多企业用户可以访问世界先…

在线支付系列【5】支付安全之数字证书

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录公钥信任问题数字证书颁发流程使用流程SSL数字证书HTTPSSSL/TLS 证书如何申请SSL 证书使用keytool 生成ssl证书通信过程公钥信任问题 之前我们使用对称、非对称加密、信息摘要、数字签名&#…

DPDK系列之一基础环境搭建

一、DPDK是什么 DPDK,Data Plane Development Kit&#xff0c;数据平面开发套装&#xff0c;它还有一个兄弟SPDK&#xff0c;专门用来做存储优化的。它主要运行于Linux&#xff0c;是由Intel几家公司共同开发&#xff0c;用于快速处理数据的一个网络开发工具套装。更详细的说明…

python数据清洗1

数据获取——》数据清洗——》数据转换——》数据分析 通过设置步长&#xff0c;有间隔的取元素通过设置步长为-1&#xff0c;将元素颠倒 数据清洗工具 目前在Python中, numpy和pandas是最主流的工具。 Numpy中的向量化运算使得数据处理变得高效&#xff1b;Pandas提供了大量…

【Java入门】Java数据类型

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java入门 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一…

(十四)线程池

线程池线程池是一组线程的集合。线程池维护一个队列&#xff0c;调用者向这个队列中添加任务&#xff0c;而线程池中的线程则不停地从队列中取出任务执行。线程池的继承关系如下图&#xff0c;其中ThreadPoolExecutor和ScheduledThreadPoolExecutor是具体的实现。ThreadPoolExe…

LeetCode刷题模版:141 - 150

目录 简介141. 环形链表142. 环形链表 II143. 重排链表144. 二叉树的前序遍历145. 二叉树的后序遍历146. LRU 缓存【未实现】147. 对链表进行插入排序148. 排序链表149. 直线上最多的点数150. 逆波兰表达式求值结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方…

多轮对话(三):Spoken Language Understanding 进展和前沿

本篇博客基于哈工大发表在IJCAI上的论文&#xff1a;A Survey on Spoken Language Understanding - Recent Advances and New Frontiers。 论文链接 github链接 口语理解&#xff08;SLU&#xff09;旨在提取用户查询的语义框架&#xff0c;是面向任务的对话系统的核心组件。本…

excel函数技巧:两个查询函数的用法比较 上篇

EXCEL函数江湖烽烟再起&#xff0c;函数大擂台迎来两位重量级选手。守擂者是号称全民偶像、人见人爱车见车载的巨星级函数VLOOKUP&#xff0c;挑战者则是名气不大实力强劲高手的LOOKUP函数&#xff01;这对与生俱来的对手&#xff0c;究竟会在函数擂台上擦出怎样的火花&#xf…

Nginx原理

一、master和worker二、worker当客户端发送请求&#xff0c;先到达master,master通知所有的worker,然后所有的worker开始竞争任务。三、一个master和多个worker有什么好处&#xff08;1&#xff09;可以使用nginx -s reload热部署&#xff0c;利用nginx进行热部署&#xff08;2…

8、MariaDB11数据库安装初始化密码Navicat连接

MariaDB11安装 安装前准备 下载安装包 点我去MariaDB官网下载安装包 查看相关文档 Mariadb Server官方文档 使用zip安装 解压缩zip 将下载到的zip解压缩到想安装的位置。 生成data目录 打开cmd并进入到刚才解压后的bin目录&#xff0c; 执行mysql_install_db.exe程序生…

Python异步编程Future对象详解

今天继续给大家介绍Python相关知识&#xff0c;本文主要内容是Python异步编程Future对象详解。 一、Python Future对象简介 在上文Python Task对象详解中&#xff0c;我们介绍到了Task对象&#xff0c;而Future对象是Task对象的基类&#xff0c;比Task更加底层。一个Future是…

英方软件在科创板上市:总市值89亿元,胡军擎、江俊夫妇为实控人

1月19日&#xff0c;上海英方软件股份有限公司&#xff08;下称“英方软件”&#xff0c;SH:688435&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;英方软件的发行价为38.66元/股&#xff0c;发行2094.6737万股&#xff0c;募资总额约为8.10亿元&#xff0c;募资…

linux的工具(yum,vim)

前言 linux工具的意义Linux已经成为工作、娱乐和个人生活等多个领域的支柱&#xff0c;人们已经越来越离不开它。在 Linux 的帮助下&#xff0c;技术的变革速度超出了人们的想象&#xff0c;Linux 开发的速度也以指数规模增长。因此&#xff0c;越来越多的开发者也不断地加入开…

pycharm远程链接服务器配置

拿到gpu的节点以后开始下面的配置 1. 下载专业版pycharm&#xff0c;一定是专业版&#xff0c;community版本没有远程连接ssh的功能。 2. python编译器->添加ssh编译器->新创建服务器配置 3. 输入host名&#xff0c;用户名。 host名字如&#xff1a;vpcc-gpu032&#xf…

【自学Docker】Docker wait命令

Docker wait命令 大纲 docker wait教程 docker wait 命令可以用于阻塞一个或多个 Docker容器 直到容器停止&#xff0c;然后打印退出代码。 docker wait命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker wait语法 haicoder(www.haicoder.net)# docker…

基于蒙特卡洛随机潮流研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

代码审计-8 ThinkPHP框架代码审计 2

文章目录熟悉网站结构确定网站的路由1.通过分析url直接得出路由2.查看app/route.php了解参数过滤情况SQL注入举例任意文件下载与删除任意文件下载代码分析任意文件删除代码分析熟悉网站结构 首先对系统的功能点进行大致的了解&#xff0c;对系统的目录情况进行大致了解&#x…

9. 列表list类型详解

python3 list类型的使用 1. 基本知识 List&#xff08;列表&#xff09; 是 Python 中使用最频繁的数据类型。 列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0c;它支持数字&#xff0c;字符串甚至可以包含列表&#xff08;所谓嵌套&#xff…

全球化商家平台技术探索与演进

作者&#xff1a;马金金 阿里全球化业务平台团队 全球化业务高速发展给平台技术带来了极大的挑战。如何差异化支撑全局业务的高效迭代&#xff1f;如何轻量化支撑创新业务的快速建站&#xff1f;本文将聚焦全球化商家平台技术架构演进&#xff0c;为大家分享背后的技术思考。 一…