Linux|进程地址空间

news2024/11/20 4:34:49

Linux|内存地址空间

  • 现象
  • 基本概念
  • 理解
    • 如何理解地址空间
      • 什么是划分区域?
      • 地址空间的理解
      • 为什么要有地址空间?
      • 如何进一步理解页表和写时拷贝
      • 如何理解虚拟地址
    • Linux真正的进程调度方案

现象

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include<sys/types.h>
int g_val = 100;


int main()
{
    printf("father is running, pid: %d, ppid: %d\n", getpid(), getppid());


    pid_t id = fork();
    if(id == 0)
    {
        //child
        int cnt = 0;
        while(1)
        {
            printf("I am child process, pid: %d, ppid: %d. g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
            sleep(1);
            cnt++;
            if(cnt == 5)
            {
                g_val = 300;
                printf("I am child process, change %d -> %d\n", 100, 300);
            }
        }
    }
    else
    {
        //father
        while(1)
        {
            printf("I am father process, pid: %d, ppid: %d. g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);
            sleep(1);
        }
    }
}

在这里插入图片描述
同一个地址但是值却不一样!这是为什么呢?我们可以得出一个最基本的结论:就是我们看到的地址不是真实的物理地址

基本概念

操作系统为我们划分了4G的虚拟进程地址空间(针对32位的机器)
在这里插入图片描述

  • 虚拟进程空间和真实的进程空间通过页表的映射联系起来
    在这里插入图片描述

  • 每一个进程都有自己的一份虚拟进程空间,子进程会基础父进程的内核数据结构
    在这里插入图片描述

  • 内存空间是用来描述代码和数据的,本质是操作内核中的一个数据结构

  • 因为操作系统设计进程的时候要保证独立性,子进程的数据是独立的,子进程修改val的值的时候会发生写时拷贝
    在这里插入图片描述
    这也解释了为什么我们看到的地址一样值却不一样,因为发生了写时拷贝,虽然虚拟地址是一样的但是物理地址则不一样。
    写实拷贝本质是一种按需申请,如果把父进程内存空间的数据全部拷贝一份,会浪费很多。比如命令行参数和环境变量几乎是不修改的。

理解

如何理解地址空间

什么是划分区域?

上小学的的时候,我们都会遇到这种情况,就是和同桌划分三八线,本来各占桌子的百分之五十,但是一天你突发奇想想要把区域划分大一点。这怎么用计算机描述呢?
在这里插入图片描述
我们可以定义一个区域的结构体来描述自己的区域大小。
另外一个结构体用来描述来个区域的信息。

struct area
{
	int start;
	int end;
}typedef area

struct desk
{
 	area left;
 	area right;
}typedef desk

desk.left.end += 20;
desk.right.start -= 20;

进程地址空间本质上也是一个结构体,很多属性表示end 和start的范围

地址空间的理解

操作系统给进程画的大饼
操作系统告诉每个进程你们可以使用整个的内存哦!

为什么要有地址空间?

  • 实际中的物理内存中,代码区,数据区,堆区,栈区,共享区,命令行参数,环境变量是杂乱存放的。页表和进程地址空间可以将无序变为有序。
  • 对进程管理模块和内存管理模块进行解耦。我们申请开辟空间只是在进程地址空间中调end的大小,当使用时才真正的在内存中分配。这样做能提高内存的利用率
  • 拦截非法请求当我们访问内存时,操作系统和硬件会在页表中寻找物理内存的位置,但是当我们越界访问时,就在页表中找不到对应的物理内存的位置,操作系统就把这次访问内存的请求拦截了下来,避免往内存中写入废旧的数据,从而影响其他内存。

如何进一步理解页表和写时拷贝

页表里面有很多标记位,比如能否读写的标记位,是否在物理内存中的标记位

  • 理解进程挂起,就是把进程是否在物理内存中置为false了
    在这里插入图片描述

  • 解释 char *str =“hello word”; *str =‘H’ 在字符常量区为什么不能被修改呢? 因为页表在映射时有权限管理

OS通过识别到错误(比如父子进程对全局变量的权限都是r和w 父进程一旦创建了子进程,对全局变量的权限都变为w 此时修改就会判断为错误)来引发写时拷贝:

  • 先判断数据是不是在物理内存中(看标记为是否ture)如果不在发生缺页中断,在内存中分配一个空间。这属于正常情况
  • 是不是需要写实拷贝,怎么判断是否需要写实拷贝呢?通过引用计数的方式
  • 如果都不是才进行异常处理,比如我们越界了,地址就不页表的虚拟地址中

如何理解虚拟地址

最开始的时候页表里的数据从那里来的?
我们知道程序里面本身就有地址
这个地址就是逻辑地址(虚拟地址)
当程序加载到物理内存的时候,就得到物理地址
根据这个虚拟到物理建立映射关系

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        // child
        while(1)
        {
            printf("I am child, %d, %p\n", id, &id);
            sleep(1);
        }
    }
    else if(id > 0)
    {
        while(1)
        {
            printf("I am father, %d, %p\n", id, &id);
            sleep(1);
        }
    }
    return 0;
}

解释这个id怎么能同时==0又!=0呢?return 的本质就是对ID进行写时拷贝

Linux真正的进程调度方案

在这里插入图片描述

  • runqueue里的queue虽然有140个空间 但是前100个空间不用。
    和我们nice -20到19 对应优先级 60~99
    在这里插入图片描述
  • queue里面的每一个元素又是一个队列,把task_struct 按优先级放入对应下标的队列中
  • 因为前面有很多空间没用,我们又使用了大小为5个长整型的位图 32位 32位的查找 使用的下标。
  • 实际当中有两个这样的结构 通过一个active指针和expired指针指向,active指向的队列 只出不进,expired指向的队列只进不出。
  • active指向的队列为空时交换两个指针。

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

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

相关文章

AcWing 4993 FEB

4993. FEB - AcWing题库 大佬亲笔 将原串分成三段&#xff1a; FFF|E.....B|FFF 先合并中间段&#xff0c;再合并两边的段 #include <iostream> #include <cstring> #include <algorithm> #include <string> #include <queue&g…

鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗

ninja | 忍者 ninja是一个叫 Evan Martin的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome的构建,Martin给它取名 ninja(忍者)的原因是因为它strikes quickly(快速出击).这是忍者的特点,可惜Martin不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin自…

Fastgpt知识库接入oneapi和自定义大模型

本期教程教大家训练自己的知识库回答chatgpt回答不了的问题 FastGPT 是一个知识库问答系统,可以通过调用大模型和知识库回答特定的问题 可以做成专属 AI 客服集成到现有的APP或者网站内当作智能客服支持网络爬虫学习互联网上的很多知识可以通过flow可视化进行工作流程编排 本期…

Ubuntu20.4中复现Graspness

Ubuntu20.4中复现Graspness 文章目录 Ubuntu20.4中复现Graspness1.安装cuda和cudnn2.安装pytorch3.安装MinkowskiEngine4.编译graspnetAPI5. RuntimeError: "floor" "_vml_cpu" not implemented for IntRefernece &#x1f680;非常重要的环境配置&#x1…

深入理解DNS、ICMP协议与NAT技术:网络世界的三大基石

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统❤ 前言 在网络世界中&#xff0c;数据的传输和交互离不开各种协议和技术的支持。其中&#xff0c;DNS&#xff08;域名系统&am…

1068 万绿丛中一点红

solution 找出满足①像素值唯一&②和相邻像素点色差大于tol 的像素点个数 若唯一&#xff0c;则输出该像素点列、行、像素值&#xff1b;若不唯一&#xff0c;则输出"Not Unique"若无&#xff0c;则输出"Not Exist" 题干和输出中&#xff0c;都是先列…

【ACM出版】第四届控制与智能机器人国际学术会议(ICCIR 2024)

第四届控制与智能机器人国际学术会议&#xff08;ICCIR 2024&#xff09; 2024 4th International Conference on Control and Intelligent Robotics 2024年6月21日-23日 | 中国-广州 官网&#xff1a;www.ic-cir.org EI、Scopus双检索 投稿免费参会、口头汇报及海报展示 四…

【MySQL数据库开发设计规范】之基础规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人笔名姑苏老陈&#xff0c;是一个JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关…

Python从0到POC编写--实用小脚本02

爆破脚本&#xff1a; 爆破脚本也是我们经常使用的东西 这里就简单讲讲后台爆破脚本的编写吧 在编写之前&#xff0c;我们先通过访问网站去看看情况 首先我们可以先登录看看 输入账号 admin &#xff0c;密码 12345 后 登录失败&#xff0c;提示 用户名或密码错误 在输入…

水质监测设备预警系统

随着工业化进程的加快和城市化水平的提高&#xff0c;水质安全问题愈发受到社会各界的广泛关注。为了确保水资源的清洁与安全&#xff0c;水质监测设备预警系统成为了不可或缺的利器。在这个背景下&#xff0c;HiWoo Cloud平台凭借其先进的技术和卓越的性能&#xff0c;为水质监…

Centos中将UTC的时区改为CTS时区

date命令可以看到现在的时间以及时区&#xff0c;可以看到现在是UTC时区 而想要更改时区那么就要了解tzselect命令 tzselect 是一个 Linux 命令行工具&#xff0c;用于交互式地帮助用户选择并设置系统的时区。这个程序会通过一系列的问题引导用户&#xff0c;从而确定用户所在的…

小程序如何注销

随着移动互联网的深入发展&#xff0c;管控也越来越严格。现在小程序都要求进行ICP备案&#xff0c;不管是新注册的还是以往注册的。很多商家的小程序本身处于无运营状态&#xff0c;现在要求备案&#xff0c;还不如直接注销。下面&#xff0c;将详细介绍小程序注销的步骤和注意…

WPF容器控件之WrapPanel、布局控件

WrapPanel: 换行panel 子元素进行换行&#xff0c;当子元素的宽度或者高度超出了父元素&#xff0c;才进行换行。高度超出父元素的高度 也会另起一列 属性 Orientation布局方式 实例 <WrapPanel Orientation"Horizontal"><Label>C# 是从 C/C 衍生出来的…

Proxmox VE 8 用SDN隔离用户网络

作者&#xff1a;田逸&#xff08;formyz&#xff09; 最新发布的Proxmox VE&#xff08;以下简称PVE&#xff09; 8在Web管理后台集成了易于操作的SDN&#xff08;软件定义网络&#xff09;功能插件&#xff0c;其实质是对不同的PVE用户指定不同的网络&#xff0c;进行逻辑隔离…

低组装直线导轨有哪些应用场景?

低组装直线导轨&#xff0c;是一种用于工业自动化设备中的导轨类型。所谓低组装导轨&#xff0c;是指该导轨的轨道平面高度相对于其他传统导轨较低&#xff0c;其特点是安装方便、维护简单&#xff0c;同时具有较高的稳定性和定位精度。接下来&#xff0c;我们一起来了解低组装…

如何优雅的实现接口限流?

首先限流&#xff0c;其实解决方案有很多&#xff0c;比如通过nginx配置&#xff0c;通过gateway网关进行限流&#xff0c;比如Spring Cloud GateWay整合熔断器实现限流 但是以上都是全局的&#xff0c;如何灵活的针对某些接口进行不同级别的限流呢&#xff1f; 方案一&#…

西汉两个韩信,结局怎么如此相似

西汉军事家、“汉初三杰”韩信是家喻户晓的人物&#xff0c;同时期还有一个韩信&#xff0c;也是战功赫赫&#xff0c;也被封王&#xff0c;史书为了区别&#xff0c;在后一个韩信名字之间加上一个“王”&#xff0c;称为韩王信。韩信是个光芒万丈的人物&#xff0c;韩王信也是…

游戏专用设备指纹方案解析

如同人类拥有独一无二的指纹&#xff0c;设备也有设备的指纹&#xff0c;我们可以把设备指纹理解为设备的唯一识别码。 构建设备指纹需要采集设备硬件信息、软件信息、环境信息、网络信息等维度信息&#xff0c;进行加密/压缩&#xff0c;再通过算法处理&#xff0c;赋予设备唯…

YOLOv9中模块总结补充|SPPELAN

专栏相关代码&#xff1a;目前售价售价69.9&#xff0c;改进点80 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. SPPELAN SPPELAN是YOLOv9作者在SPPF的基础上创新的模块&#xff08;增加了一次…

2024付费进群系统,源码及搭建变现视频课程(教程+源码)

前三节讲解搭建支付对接&#xff0c;后两节讲解一些引流变现的方法&#xff0c;还有一种变现就是帮人搭建这样的平台&#xff0c;因为全网都没有一套完整的视频教怎么搭建的&#xff0c;有也只是文字教程&#xff0c;一般新人根本看不懂&#xff0c;我视频实操演示&#xff0c;…