花钱买不到系列—linux虚拟地址空间

news2024/9/22 23:17:30

        不知道大家有没有听说过一个东西,叫C/C++地址空间。

        给大家画一个图这个图,作为C/C++程序员应该比较熟悉,有人一个会有人把这个图叫做C/C++地址空间,我觉得大家应该比较陌生,我也是刚刚学完,大家如果感兴趣的,可以看看,看看我有没有什么地方说错没。

        我当时在学语言的时候,只知道记住它, 就意识到我自己在C里面,定义局部变量,定义static变量,定义全局变量。那么malloc那么大概每一个对应的变量大概在什么位置,给我们去开辟空间呢?在当时学的时候,是我们有了一个这个图之后呢,那么对于C/C++语言当中的变量或者对象,它的内存分布情况,我们脑海里就有了一个基座。

        上面这个图,请问你认为这个地质空间它是什么呢?是内存吗?答案不是内存。

        让大家看看一个现象。这是这个创建子进程的代码。

        但我知道。在系统当中,只要是一个进程,它就要被操作系统管理,只要被操作系统管理,那么你就必须得怎么办呢啊?你就必须得进行我们对应的创建,指定层时要拷贝附近层的内核数据结构。比如说你指定层得有个PCB吧,对不对?没有PCB的话,你你拿什么来做进程管理呢?所以有俩进程,父子进程。说白了创建一个子进程不就系统里多了个进程吗?系统里多了个进程,我们操作系统要管理,它要管理怎么管理,先描述再组织,所以我们的子进程也一定有自己的PCB结构。

        如果我们fork之后啊,父子进程呢,那么它们两个谁先运行呢?答案是不确定它们两个进是谁先运行,不确定。具体谁先跑的时候完完全全是由我们的调度器决定的。运行看看,所以运行系统决定的。

         现在做一小实验。在代码最前面加了一个全局变量,父子进程都来打印这个变量和变量的地址号值,运行一定时间,用子进程修改g_value的值

         代码如下。运行起来看看效果。


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int g_value = 100;

int main()
{
    pid_t pid;
    pid = fork();
    if (pid < 0)
    {
        return -1;
    }
    else if (pid == 0)
    {
        int cnt = 0;

        // 子进程
        while (1)
        {
            printf("我是子进程 pid: %d, ppid = %d | g_value = %d g_vlue地址 =%p \n", getpid(), getppid(), g_value, &g_value);
            sleep(1);

            cnt++;
            if (cnt == 5)
            {
                g_value = 500;
                printf("子进程改了 g_value的值改变了");
            }
        }
    }
    else
    {
        // 父
        while (1)
        {
            printf("我是父进程 pid: %d, ppid = %d | g_value = %d g_vlue地址 =%p \n", getpid(), getppid(), g_value, &g_value);
            sleep(1);
        }
    }

    return 0;
}

         看结果,我们曾经讲过父子进程必须保证父。父子进程的独立性啊,因为子进程改,因为独立性,所以不能改变父的值,这个我能明白,但是有一一点不理解的就是,g_value是一个全局变量,为什么,子进程改了,他们两的地址还是相同的?

         可是让我们感觉到最震惊的其实不是它的值。而是最让我们感觉到震惊的是,这个地址大家竟然是一样的同学们啊,那么这个地址竟然是一样的。怎么可能啊,多进程在读取同一个叫做地址的时候。怎么可能出现不同的结果?

        那么所以呢啊,实践是检验真知的唯一标准,出现了一个和我们之前认知不一样的结果,首先肯定不是操作系统错了,一定是我们有哪些知识,我们理解错了。或者哪些知识我们理解的并不全面。

        它们两个的值肯定是一样的,但结果却不一样。那么,所以因为地址没变,所以我们首先可以推导出来的第一个结论就叫做肯定不是物理地址,如果是物理地址读出来的值一定是一样的。在学习的语言级别的地址,包括我们叫做我们所谓的指针。这样的概念,它最终对应的不是物理地址。

        所以先把概念抛出啦,而叫做虚拟地址,或者我们叫线性地址,在linux上,也有一种叫法叫做逻辑地址啊。

        在C语言上面打印出来的指针地址,全都是虚拟地址,也称为虚拟地址空间,所以根本不是内存,还在软件上面,不是在硬件地址。

        下面就开始来研究。先建立共识

        那么进程呢?认为自己是啊,独占系统资源的,事实上,它并不是啊,但是进程那么认为自己想用内存,它就想用。想用CPU,那么进程上下文切换的时候把一个进程投入休眠了,这个进程也不知道自己休眠了。虽然我们那么在上帝视角一个进程,在一个时间段内不断在并发来回切换。但你如果是这个进程,你都休眠了,那你就相当于你眼睛闭上了。你像比如说你晚上睡觉啊,晚上睡觉的时候呢,别人把你就是或者是把你挪到其他位置,把你从你宿舍挪出去,然后人家只要你睁开眼之前,人家把你挪回宿舍,那么此时在你看来,你就认为你自己永远都在宿舍。所以对我们来讲你会认为自己独占性的资源。

        在举一个例子,美国一个大富翁,有三个私生儿子

        这个在美国的这个富翁呢?他非常有钱啊,比如说十亿美金啊。但是富翁呢?他没有结婚。啊,那么他总是认为总有刁民想害朕啊 。

        每一个人都有他自己的工作啊,比如说这个那么大儿子啊,一个工厂的老板啊。好,假设这个工厂呢,管了一个工厂。我儿子二,做CEO啊,三儿子念书。

        竟然是私生子,3个儿子,那么肯定不知道对方的存在。大富翁想管理好这三个儿子,为了让他们未来在做自己的事情的时候,那么更游刃有余。

        所以呢,大富翁呢,就给儿子说什么呢?说儿子。你好好把这个工厂经营好。那么未来等我嗯。驾鹤西去了。我有十个亿,这十个亿就交给你去继承了。大儿子一听,非常高兴,就相当于有日没夜的,就天天在工厂里面。做着各种事情。

        然后呢?又找到二儿子啊?给二儿子说。说儿子啊啊,你好好的帮我把那么我们的家族的这个金融的那么投资类的事情,你给我做好。将来等我驾鹤西去的时候,这十个亿啊,我们整个的家族产业就交给你了啊。所以二儿子也很高兴啊,

        然后呢?那么又跑过去找三儿子,他给三儿子说。儿子啊,我就你一个儿子啊,你好好念书啊,等你把书念出来了,那老爹给你把工作什么安排好?然后等老爹就是驾鹤西去了,那么我们家族这十个亿的那么呃现金啊,包括我们的产业都交给你了。所以那么三儿子也很高兴啊

        大富翁就给每一个儿子都画了一个大饼,因为三个儿子都不在互相存在,所以认为自己独占10亿。但是他们不可能会一次就要10亿,想什么呢,大富翁都还在,比如说大儿子要建工厂,问老爸那50w美金或者发不出工资了,又问几十万美金,到了二子,问大富翁拿几千美金买一个手表,撑门面,或者几十万美金,买台车。三儿子老爸,开学了,要几千美金交学费或者生活费,这三个儿子要的,老爹都会给,那么其中在这样的工作方式之下呢?那么其中。这三个儿子和这个老爹相处的非常非常好。

        

        其中这里的大富翁,它对应的就是我们的操作系统啊。它要划分的十亿美金相当于内存啊,然后呢,这三个儿子你看这德行,你看这三个儿子一伸手要。你自己平时写代码时,你自己调malloc,你自己定义各种变量,你有各种对象。你不就是在做那个儿子的工作吗?你在向系统要资源呐,所以我们都是儿子对吧?我们对应的三个儿子就是我们所谓的进程,那么这一批东西我们相当于我们进程。我们进程所对应给我分配的内存,或者在于语言上,我们叫做对象空间啊,你以前申请内存,你会不会直接说啊?我内存16个g会不会?你基本上不会啊,一次申请一性能要16个g,而是那么慢慢要啊。

        那么其中我们站在进程角度呢?他认为自己独占资源啊,但是那么操作系统早就料定了你这每一个儿子,你不可能怎么要你要了,我可以拒绝你啊,我不给你,有一天,那个大儿子跑去找他老爹说,我跟你要了这么多次钱啊,累计已经要了好几百万了。你这样吧,你到时候把你那十个亿一块给我吧啊,反正我也花也是花,来回要也麻烦啊,那么怎么办呢?这大富翁立马就可以把这儿子揍一顿。立马拒绝他啊,你赶紧回去吧啊,想都别想啊。

        那么其中给每个儿子画的这一个大饼,我们将其称之为地址空间啊。严格意义上来讲的,叫做进程地址空间。

        下一篇聊,操作系统如何给进程画的饼,

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

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

相关文章

计算机毕业设计 毕业季旅游一站式定制服务平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

圈子论坛小程序搭建教程,系统快速部署上线指南,支持文章、源码、链接等上传

圈子论坛小程序是一种基于移动端的社交平台&#xff0c;旨在为用户提供交流分享、互动沟通的空间。以下是关于圈子论坛小程序的详细解析&#xff1a; 一、圈子论坛小程序的定义与功能 定义&#xff1a;圈子论坛小程序是一个集社交、分享、交流于一体的移动应用&#xff0c;用户…

Unity视频流监控接入,点击播放只播放一帧画面

Universal Media Player 检查监控平台编码/解码配置&#xff08;H265/H264&#xff09;

安卓sdk manager下载安装

安卓sdk下载安装 android SDK manager下载 环境变量配置 ANDROID_HOME&#xff1a;D:\Android %ANDROID_HOME%\tools %ANDROID_HOME%\platform-tools %ANDROID_HOME%\build-tools\29.0.3Android SDK Platform-tools公用开发工具包&#xff0c;需要下载 Android SDK Tools基础…

llvm windows编译成功

一、所需工具 Visual Studio 推荐版本&#xff1a;Visual Studio 2022。其他版本亦可支持。 CMake 下载地址 Ninja 下载地址 LLVM 版本参考&#xff1a;llvm-project-llvmorg-18.1.8下载地址 二、配置与编译步骤 以管理员身份打开命令行终端&#xff0c;输入以下命令来设置…

Linux多进程

进程的概述 进程是计算机科学中的一个基本概念&#xff0c;它指的是在操作系统中正在执行的程序的实例 在Linux操作系统中&#xff0c;进程是程序执行的实体&#xff0c;是资源分配的基本单位 在在Ubuntu中&#xff0c;通过使用ps命令可以查看当前的进程列表 ps aux 进程与…

WSL2安装与使用

使用WSL2的前提条件&#xff1a; 1.开启CPU的虚拟化 打开任务管理器 ->性能->查看CPU虚拟化 2.开启Windows功能 任务栏输入“功能”&#xff0c;勾选下面选项&#xff0c;然后按照提示重新启动电脑。 3.搜索栏输入cmd&#xff0c;右键以管理员身份运行&#xff0c;输入…

对商品评论进行文本分析(NLP)的实战项目

文本分析技术是指使用计算机程序或算法处理、分析和理解文本数据的一系列方法。这种技术在自然语言处理&#xff08;NLP&#xff09;领域中非常重要&#xff0c;它可以应用于多种场景&#xff0c;包括但不限于情感分析、主题识别、信息提取、文本分类等。以下是一些常见的文本分…

SpringBoot+Vue3整合minio,实现分布式文件存储

文章目录 几种常用的文件存储安装和使用minioSpringBoot整合minio 基本所有的软件项目都会需要文件存储功能&#xff0c;图片、视频存储。 几种常用的文件存储 经常用的几种方案&#xff0c;直接存在本地文件夹&#xff0c;开发一个简单的系统当然没有问题。随机系统所需的资源…

90.WEB渗透测试-信息收集-Google语法(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;89.WEB渗透测试-信息收集-Google语法&#xff08;3&#xff09; • inurl • 搜索特殊 UR…

Leetcode JAVA刷刷站(55)跳跃游戏

一、题目概述 二、思路方向 在Java中&#xff0c;为了解决这个问题&#xff0c;你可以采用贪心算法的思想。贪心算法在这里的应用主要体现在&#xff0c;每一步都尽可能跳得远&#xff0c;以此来判断是否能够到达数组的最后一个下标。 算法的思路是&#xff0c;遍历数组nums&am…

ICWS 2024 _ 基于生成长度预测的大语言模型推理请求调度

随着技术的快速迭代&#xff0c;大语言模型&#xff08;Larage Langugage Model, LLM &#xff09;在各种场景下都展示出强大的文本处理能力&#xff0c;越来越多的业务期待通过接入大模型服务&#xff0c;提升业务效果。区别于传统RPC请求服务时间相近&#xff0c;大模型请求服…

《计算机操作系统》(第4版)第2章 进程的描述与控制 复习笔记

第2章 进程的描述与控制 一、前趋图和程序执行 1. 前趋图 (1)定义 前趋图是指一个有向无循环图&#xff0c;可记为DAG, 它用于描述进程之间执行的先后顺序。 (2)图形表示 前趋图如图2-1所示。 图2-1 前趋图 2. 程序的执行 (1)程序顺序执行时的特征 ①顺序性。 ②封闭性。 ③ 可…

Robot Operating System——创建可执行文件项目的步骤

大纲 初始化环境创建Package代码添加依赖&#xff08;package.xml&#xff09;修改编译描述find_package寻找依赖库指定代码路径和编译类型&#xff08;可执行文件/动态库&#xff09;链接依赖的库完整文件 编译测试总结参考资料 之前我们看到ROS2中&#xff0c;有的Node的实现…

案例 | 生产制造中的直线度测量

关键词&#xff1a;直线度测量仪,直线度 生产中不仅需要评价产品的外观尺寸&#xff0c;还需要对直线度&#xff08;弯曲度&#xff09;等尺寸加以测量。作为一种评价产品直度的重要指标——直线度&#xff0c;能够对其进行检测是非常重要的。 关于直线度&#xff0c;对于一些弯…

初学者使用WordPress可能会遇到的问题以及如何解决

WordPress 作为一个普及度相当广的内容管理系统 (CMS)&#xff0c;对于刚刚开始建立自己第一个网站的初学者来说是非常合适的选择。它不需要你懂编写代码&#xff0c;且对 SEO 友好&#xff0c;管理起来也很方便。然而&#xff0c;许多初学者在使用 WordPress 时会犯一些错误&a…

各厂家BI对比

帆软BI、奥威BI、永洪BI、思迈特BI、亿信华辰BI是国内知名的BI产品&#xff0c;不少企业在选型BI软件时都需要对这些BI软件进行了解&#xff0c;从中选择适合自己的一款。经过过年的发展&#xff0c;这些BI&#xff08;商业智能&#xff09;软件各自在多个行业中都有广泛的应用…

Anti-Bandit Neural Architecture Search for Model Defense

模型防御的Anti-Bandit网络架构搜索 论文链接&#xff1a;https://arxiv.org/abs/2008.00698(ECCV2020) 项目链接&#xff1a;https://github.com/bczhangbczhang/ABanditNAS 模型防御的Anti-Bandit网络架构搜索Abstract1 Introduction2 Related Work3 Anti-Bandit网络架构搜…

前端项目重新打包部署后如何通知用户更新

前端项目重新打包部署后如何通知用户更新 前端项目重新打包部署后如何通知用户更新常用的webSocket解决方案纯前端方案路由拦截多线程main.ts中 创建多线程多线程逻辑处理 前端项目重新打包部署后如何通知用户更新 前端项目重新打包部署后&#xff0c;由于用户没及时更新页面&…

Vue 自定义文字提示框

目录 前言代码演示相关代码文字提示框组件定义组件调用前言 今天开发遇上了一个新的问题,要求写一个带着滑动动画的文字提示框。但是我经常使用的Element-UI组件库只有淡入淡出效果,并且想要修改样式只能全局修改,非常不利于后期的开发。因此,我最终选择直接自定义一个符合…