Linux|进程地址空间

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){//childint 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{//fatherwhile(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 areastruct desk
{area left;area right;
}typedef deskdesk.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){// childwhile(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.mzph.cn/news/834770.shtml

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

相关文章

Java 区块链应用 | 割韭菜之假如K线涨跌可随意变动修改的实现

大家好&#xff0c;我是程序员大猩猩。 我一直在想&#xff0c;币圈这个行情时涨时跌&#xff0c;不断的割韭菜&#xff0c;不是由市场决定的&#xff01;而是由交易所直接输入一个数值后点击确定按钮而变化的&#xff0c;那么是不是很恐怖的行为。 为了验证这么一个想法&…

Java实现Excel导入和校验

文章目录 效果实现1,添加依赖2,实体类Member.javaMemberVO.java3,校验、监听器ValidationTool.javaExcelReadListener.java4,请求接口参考博文效果 输入:导入测试.xlsx postman调用实例: postman输出结果: 日志输出: 实现 1,添加依赖 easyexcel要去掉poi-ooxm…

Leetcode—295. 数据流的中位数【困难】

2024每日刷题&#xff08;132&#xff09; Leetcode—295. 数据流的中位数 实现代码 class MedianFinder { public:MedianFinder() {}void addNum(int num) {if(maxHeap.empty() || num < maxHeap.top()) {maxHeap.push(num);} else {minHeap.push(num);}if(maxHeap.size(…

未授权访问:Jenkins未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、利用未授权访问写入webshell 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好…

基于JSP动漫论坛的设计与实现(二)

目录 3. 系统开发环境及技术介绍 3.1 开发环境 3.2 开发工具 3.2.1 MyEclipse8.5 3.2.2 MySql 3.3 相关技术介绍 3.3.1 JSP技术简介 3.3.2 JDBC技术技术简介 3.3.3 MVC模式与Struts框架技术 4. 总体设计 4.1 系统模块总体设计 4.1.1 普通用户模块设计 4…

element ui的无法关掉的提示弹框

使用element的$alert组件的属性把X去掉和确定按钮和取消按钮去掉&#xff1b; import { MessageBox } from element-ui; MessageBox.alert(AI功能已到期或暂未开启, 友情提示, {showClose: false,showCancelButton: false,showConfirmButton: false }); 如果在router的路由守…

git 常用命令 git怎么撤销命令 持续更新中!!!!

基本流程 # 拉取仓库 git clone 仓库地址 # 拉取最新版本 git pull # 本地提交 git add . git commit -m "本次提交信息&#xff01;" # 推送上云 git push分支 # 创建分支 git checkout -b cart # 删除本机的分支 git branch -d cart # 切换分支 本地切换到主分支…

引入RabbitMQ

前置条件 docker 安装 mq docker run \-e RABBITMQ_DEFAULT_USERdudu \-e RABBITMQ_DEFAULT_PASS123456 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network hmall \-d \rabbitmq:3.8-management可能会出现&#xff1a;docker: Er…

2024HW Linux应急响应基础学习

首先展示关于Linux的关键目录&#xff0c;这是应急响应查看的关键&#xff1a; 常用命令 top //查看进程资源的占用情况 ps -aux //查看进程 直接写ps aux也可以 netstat -antpl //查看网络连接 ls -alh /proc/pid //查看某个pid对应的可执行程序 pid记得修改 lsof /…

基于Springboot+Vue+Java的校园资料分享平台

&#x1f49e; 文末获取源码联系 &#x1f649; &#x1f447;&#x1f3fb; 精选专栏推荐收藏订阅 &#x1f447;&#x1f3fb; &#x1f380;《Java 精选实战项目-计算机毕业设计题目推荐-期末大作业》&#x1f618; 更多实战项目~ https://www.yuque.com/liuyixin-rotwn/ei3…

word图片水印

一、word中旧水印如何删除 打开word模板&#xff0c;想要删除旧水印&#xff0c;如下图所示操作&#xff0c;但是旧水印删除不掉。 以为上传新水印图片会替换掉旧水印&#xff0c;结果显示了2个水印&#xff0c;要怎么删除呢&#xff1f; 如下截图所示&#xff0c;双击打开页…

SpringCloud:认识微服务

程序员老茶 &#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; P   S : 点赞是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#…

「短链接教程」如何使用自己的域名生成短链接

在当今数字化时代&#xff0c;短链接的应用越来越广泛。它们不仅能让链接更简洁美观&#xff0c;还便于分享和传播。 但很多时候想用自己的域名生成短链接&#xff1f;搭建短链接平台又比较麻烦&#xff0c;所以&#xff0c;这里以C1N短网址(c1n.cn)为例&#xff0c;介绍下如何…

【EI会议|投稿优惠】2024年电力电网与电子通讯国际会议(ICPGEC 2024)

2024 International Conference on Power Grid and Electronic Communication 一、大会信息 会议名称&#xff1a;2024年电力电网与电子通讯国际会议会议简称&#xff1a;ICPGEC 2024收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等会议官网&#xff1a;htt…

【训练与预测】02 - 完整的模型验证套路

02 - 完整的模型验证套路 模型图 验证一个模型就是指使用已经训练好的模型&#xff0c;然后给它提供输入。 test.py import torch import torchvision from PIL import Imagedevice torch.device("cuda" if torch.cuda.is_available() else "cpu") ima…

【数据结构】栈(Stack)和队列(Queue)

文章目录 栈一、栈的概念及结构二、栈的特点三、栈的实现1.初始化栈2.判断栈空3.入栈4.出栈5.取栈顶元素6.栈的元素个数7.销毁 队列一、队列的概念及结构二、队列的特点三、队列的实现1.初始化2.入队3.出队4.判断队空5.取队头元素6.取队尾元素 总结 栈 一、栈的概念及结构 栈…

HR招聘面试测评,如何判断候选人的创新能力?

创新能力代表着一个人的未来发展潜力&#xff0c;创新能力突出的人&#xff0c;未来的上限就可能更高。而对于一个公司而言&#xff0c;一个具有创新能力的员工&#xff0c;会给公司带来新方案&#xff0c;新思路&#xff0c;对公司的长远发展拥有着十分积极的作用。 而在挑选…

Spark云计算平台Databricks使用,SQL

创建workspace&#xff1a;Spark云计算平台Databricks使用&#xff0c;创建workspace和Compute计算集群&#xff08;Spark集群&#xff09;-CSDN博客 1 创建schema 选择Calalog&#xff0c;点击Create schema 输入名字&#xff0c;Storage location选择workspace&#xff0c;数…

2024年小沙弥小视频,轻松吸引中老年观众,上手简单,轻松月入了万

利用人工智能工具制作小沙弥主题的抖音内容&#xff0c;已成为网络赚钱的新途径。这个项目主要吸引中老年人群体&#xff0c;尤其是对智慧和人生哲理感兴趣的观众。小沙弥以其温馨且启发性的内容&#xff0c;引起中老年用户的共鸣&#xff0c;为他们提供心灵慰藉。 项 目 地 …

AI工具摸索-关于写作(1)

虽然人工智能工具非常多,但是如果想要成为生产力,能达标的工具仍然非常少,除了最常用的chatgpt,其他的工具真的能达标吗,这篇文章主要就是对比市面上的一些工具&#xff0c; 但我这个人非常执拗,我认为作为生产力工具的功能必然是可以真正帮助我们的,而不是说作为一个写作工具结…