Linux-地址空间

news2024/12/23 14:14:44

文章目录

  • 问题引入
  • 操作系统宏观认识
  • 操作系统与进程
  • 程序地址空间
  • 进程地址空间
  • 问题解释

问题引入

在Linux操作系统中、vim编译器下,出现了变量同地址但不同值的现象。
下面以解释该现象产生的原因为主线,在过程中学习Linux操作系统的知识。

运行代码展示:
在这里插入图片描述
运行结果展示:
在这里插入图片描述

操作系统宏观认识

操作系统是什么?
操作系统是一个专注于“管理“功能的软件。
管理的对象是什么?
资源。
在这里插入图片描述

操作系统与进程

什么是进程?
课本概念:程序的一个执行实例,正在执行的程序等。
内核观点:担当分配系统资源(CPU时间,内存)的实体。
详细介绍

操作系统是如何管理进程的?
先描述再组织。
描述:用名为PCB(process control block)的struck结构体记录进程的基本信息,在Linux中描述进程的结构体叫做task_struct。
组织:用如链表的的数据结构组织起来。

操作系统创建系统的过程

  1. 分配进程控制块(PCB):操作系统为新进程分配一个独立的PCB,用于存储进程的相关信息。
  2. 分配地址空间:操作系统为新进程分配一段内存空间,用于存储进程的代码、数据和堆栈等信息。
  3. 加载程序:操作系统将进程的可执行文件从磁盘或其他存储设备中读入内存,并将其复制到进程的地址空间中。
  4. 初始化进程:操作系统为新进程初始化一些必要的数据结构和变量,如文件描述符表、信号处理表等。
  5. 设置进程优先级:操作系统为新进程设置一个优先级,用于决定进程在系统中的调度顺序。
  6. 将进程加入就绪队列:操作系统将新进程加入就绪队列,等待CPU分配资源并执行

程序地址空间

在这里插入图片描述
Linux验证地址空间分布图
在这里插入图片描述
在这里插入图片描述

进程地址空间

在这里插入图片描述

什么是虚拟内存?

虚拟内存是一种计算机内存管理技术,它允许操作系统将物理内存和磁盘空间组合使用,从而扩展可用内存的大小。虚拟地址空间通过页表映射到物理内存或者磁盘上。当进程需要访问某个页面时,操作系统会从磁盘读取到物理内存中,然后将该程序地址空间的虚拟地址映射到物理地址,使得进程可以访问该页面。当物理内存不足时,操作系统会将一些不常用的空间,从物理内存中换出到磁盘上,从而腾出空间给其他进程使用。虚拟内存技术可以提高系统的内存利用率,使得多个进程可以同时运行,而不会因为内存不足而导致系统崩溃。

虚拟内存存在的意义?

  1. 扩大可用内存空间:虚拟内存可以将磁盘空间作为扩展内存使用,从而扩大了可用内存空间。这样,即使物理内存不足,也可以运行更多的程序。(因为页表可以映射外存)
  2. 提高程序运行效率:虚拟内存可以将不常用的内存数据暂时存储到磁盘上,从而释放物理内存空间,让更常用的数据可以被加载到内存中,提高程序的运行效率。(由于页表的存在,在进程视角,内存中分配的空间是有序的)(有些分配了内存也不会立刻使用,虚拟内存的存在就提高了实际内存的使用效率)
  3. 保护系统稳定性:虚拟内存可以将程序的内存空间隔离开来,防止程序之间相互干扰,从而保护系统的稳定性。(物理内存是一个硬件,既可以读也可以写(虚拟内存只可以读),在物理内存的设计下,如果进程1中出现野指针那么有可能实际访问到其他进程的内容,如果其他进程中存有密码类的东西,那么这样就是不安全的,直接使用物理内存缺点很多,可以查查。)
  4. 实现内存共享:虚拟内存可以实现内存共享,多个进程可以共享同一块内存空间,从而减少内存的使用量,提高系统的效率。

什么是写时拷贝?
在这里插入图片描述

写时拷贝(Copy-on-write,简称COW)是一种内存管理技术,它允许多个进程共享同一块内存,但只有在进程试图修改该内存时才会进行实际的拷贝操作。这种技术可以减少内存的使用量,提高系统的性能。

在写时拷贝的实现中,当一个进程试图修改共享内存中的某个数据时,操作系统会先检查该内存块是否已经被其他进程共享。如果是,则操作系统会为该进程分配一块新的内存,将原始内存块中需要修改的数据拷贝到新的内存块中,然后让该进程修改新的内存块。其他进程仍然共享原始内存块,直到它们也试图修改该内存块中的数据。

在C语言中malloc的是什么地址?
虚拟地址,malloc的空间被写入时,才会在物理空间上有实际的空间。
相关知识:操作系统在第一次构建页表时,并不会为进程分配实际的物理内存,而是只是为进程分配了虚拟地址空间。当进程第一次访问某个虚拟地址时,操作系统才会为该虚拟地址分配实际的物理内存。

地址空间在编译中也生效,编译时地址空间是指程序在编译时所使用的虚拟地址空间。

问题解释

frok创建进程时,再父进程中返回所创建的子进程的值,在子进程中返回了0,也就是说此时发生了写时拷贝(在子进程中写入了 = 0 )发生了写时拷贝,物理内存会重新分配一块地方作为新的虚拟内存,也就是说,这里两个地址相同的变量,只是虚拟内存的地址相同,实际物理地址并不相同。

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

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

相关文章

chatgpt赋能python:Python分词处理

Python分词处理 随着网络技术的飞速发展,搜索引擎已成为人们了解信息的主要渠道之一,而搜索引擎的核心是关键词匹配,因此分词技术在搜索引擎优化(SEO)中起着至关重要的作用。Python作为一种强大的编程语言&#xff0c…

【学习日记2023.6.3】之 工作台显示和报表导出

文章目录 12. 工作台显示和报表导出12.1 工作台12.1.1 需求分析和设计12.1.2 代码开发Controller层Service层接口Service层实现类Mapper层 12.1.3 功能测试12.1.4 提交代码 12.2 Apache POI12.2.1 介绍12.2.2 入门案例12.2.2.1 将数据写入Excel文件12.2.2.2 读取Excel文件中的数…

Linux4.7Nginx优化与防盗链

文章目录 计算机系统5G云计算第六章 LINUX Nginx优化与防盗链一、Nginx服务优化和深入优化1.隐藏版本号2.修改用户与组3.缓存时间4.日志切割5.连接超时6.更改进程数7.配置网页压缩8.配置防盗链9.fpm参数优化 计算机系统 5G云计算 第六章 LINUX Nginx优化与防盗链 一、Nginx服…

操作系统复习4.1.0-文件管理结构

定义 一组有意义的信息的集合 属性 文件名、标识符、类型、位置、大小、创建时间、上次修改时间、文件所有者信息、保护信息 操作系统向上提供的功能 创建文件、删除文件、读文件、写文件、打开文件、关闭文件 这6个都是系统调用 创建文件 创建文件时调用Create系统调用…

django中使用celery

Celery介绍: 核心及优点:1.基于分布式系统架构(负载均衡避免单点故障,高可用) 2.实现了异步任务的调度(快速) 只需要通过配置文件的修改就可以实现架构的切换所以灵活 django-celery-beat 用…

Oracle中的循环

目录 一、简单循环 1.1LOOP 循环语法: 1.2LOOP 循环示例 二、for循环 2.1for循环语法: 2.2for循环示例 三、while循环 3.1while循环语法 3.2while循环示例 四、GOTO 循环 4.1GOTO 循环语法 4.2GOTO 循环示例 在 Oracle 数据库中,…

储能之动力电池与储能电池区别?

储能之动力电池与储能电池区别 1、概念1.1 动力电池1.2 储能电池 2、应用场景3、动力电池与储能电池的对比3.1 性能要求3.2 循环次数3.3 电池类型方面3.4 成本结构不同 1、概念 1.1 动力电池 动力电池即为工具提供动力来源的电源,多指为电动汽车、电动列车、电动自…

Oracle中ORA-12560:协议适配器错误

平时在长时间未登录Oracle数据库,再次登录时会出现如下错误: 当Oracle登录时出现12560协议适配器错误时,可以通过以下步骤尝试启动相应的服务: 第一步: 打开本地【服务】,点击最顶层的名称输入【O】&…

java-字符流和字节流(三)

java-字符流和字节流(三) 一、IO特殊操作流 1.1 标准流 1.1.1 标准输入流 System类中有两个静态的成员变量 public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out&am…

【StringBuilder类】添加和反转方法以及StringBuilder和String相互转换

StringBuilder类 如果对字符串进行拼接操作,每次拼接都会构建一个新的String对象,既耗时又浪费内存空间,而这种操作还不可避免。我们可以通过Java提供的StringBuilder类来解决这个问题。StringBuilder是一个可变的字符串类,我们可…

java-基础语法(一)

java-基础语法(一) 一、java变量 1.1、注释 单行注释 // // 这是单行注释文字多行注释 /* *//* 这是多行注释文字 这是多行注释文字 这是多行注释文字 */ 注意:多行注释不能嵌套使用。1.2 常量 常量:在程序运行过程中,其值不可以发生改变的…

Arthas-monitor/watch/trace 相关命令使用

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 开头: 本章所有的命令都非常重要,都是使用率相当高的。 文章目录 moni…

python---列表

列表 1. 列表的介绍1.1 访问列表元素1.2 索引从0而不是1开始1.3 使用列表中的各个值1.4 修改、添加和删除元素1.4.1 修改列表元素 1.5 在列表中添加元素1.5.1 在列表末尾添加元素1.5.2 在列表中插入元素 1.6 从列表中删除元素1.6.1 使用方法pop()删除元素1.6.2 弹出列表中任何位…

【TreeSet集合】自然排序Comparator的使用

自然排序Comparator的使用 存储学生对象并遍历,创建TreeSet集合使用无参构造方法 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序 创建学生类: package com.gather.set.treeset; public class Student…

【利用AI让知识体系化】前端开发学习了解业务架构

文章目录 I. 前端技术入门1.1 HTML/CSS/Javascript 简介1.2 前端框架 React/Vue/Angular 了解1.3 前端工具 Git/Webpack/npm/yarn 的使用1.4 前端调试和性能优化技巧 II. 开发综合应用2.1 工程化开发的全流程2.2 单页面应用 (SPA)2.3 数据交互和批量操作2.4 模块化和组件化开发…

压缩感知重构之匹配追踪算法

算法的重构是压缩感知中重要的一步,是压缩感知的关键之处。因为重构算法关系着信号能否精确重建,国内外的研究学者致力于压缩感知的信号重建,并且取得了很大的进展,提出了很多的重构算法,每种算法都各有自己的优缺点&a…

[golang 微服务] 4. gRPC介绍,Protobuf结合gRPC 创建微服务

一.gRPC框架的介绍 简介 gRPC是一个 高性能、 开源和 通用的 RPC 框架, 面向移动端和 HTTP/2 设计,目前提供 C、Java 和 Go语言版本,分别是:grpc, grpc-java, grpc-go,其中 C 版本支持 C, C, Node.js, Python, Ruby, Objective-C, PHP 和 C# …

Windows Pyqt5配置环境过程(pycharm Anaconda)

必要安装 Anaconda下载地址 Pycharm下载地址 这两个推荐2019年左右的版本就行了,安装的时候选择“add path” Anaconda换源 换源之后叉掉终端之后再创建环境 Anaconda常用命令 Anaconda换源应该是只对conda install 有用,pip还要换源 使用清华源进行…

java-集合

java-集合 一、集合体系结构 集合类的特点 ​ 提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 集合类的体系图 ​ 二、单列集合 2.1 Collection集合(接口) Collection集合概述 是单列集合的顶层接口,它表示一…

汇编栈寄存器SS与SP使用

入栈时,栈段地址与偏移地址计算 使用a命令输入下面汇编,然后使用u命令查看 写入汇编指令到内存 修改CS:IP指向当前代码段 使用t命令执行汇编指令,详细执行如下图标号 注意每行指令执行后寄存器变化. 取内存段单元数据 将内存段单元数据送入寄存器, 多次送入数据到同一寄存…