Linux 进程地址空间

文章目录

  • 进程地址空间
  • 进程地址空间结构
  • 页表
  • 虚拟内存
  • 写时拷贝

进程地址空间

进程地址空间难以定义,因为它更像是一个中间件。

程序从磁盘中加载到内存,程序的执行需要硬件资源,所以每个程序启动时会创建至少一条进程,进程作为组织资源的数据结构,记录了本进程各方面硬件资源的占用情况,其中就包括内存的占用情况。每个进程都有一个进程地址空间,进程地址空间不是实际的一个物理内存可以理解为进程地址空间里全是指针/地址,进程地址空间里的地址通过一个名为页表的结构与实际存储数据的物理内存建立映射关系。 至于为什么这样设计,以及上述中一些名词的解释在后文中均有提到 。
在这里插入图片描述

进程地址空间结构

在这里插入图片描述

  1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
  2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。
  3. 数据段/静态区 :存放全局变量静态数据。程序结束后由系统释放。
  4. 代码段:存放函数体、类成员函数和全局函数 的二进制代码 、 存放常量。

页表

  1. 页表的结构: 一个键值对形式的表,类似于一些数据库那样的KEY=VALUE结构的表,一遍记录进程地址空间的地址,另一边记录与该地址实际对应的物理内存空间。

  2. 在上述功能的基础上,页表还记录了每个进程地址的访问权限(这里的权限指读/写等权限),通过这些权限属性的记录,一方面实现了各种数据的属性,另一方保护了物理内存不被非法访问。

  3. 页表与进程地址空间都是每个进程独自有一份,进程被启动时,先创建PCB的实例task_struct, 再生成进程地址空间与页表 (进程地址空间是task_struct结构体的一个成员)

  4. 页表和虚拟地址空间都由OS(操作系统管理),所以虚拟地址访问的物理存储的数据是否超出权限由OS结合页表和进程地址空间来判断,所以平时写代码时的数组越界会报警,数组越界访问本质是一种访问物理内存权限越界的问题,会被OS拦截。

  5. 页表不只可以将进程地址空间中的地址与物理内存建立映射关系,还可以将进程地址空间与磁盘(外存)中的存储数据建立映射关系

  6. 页表和进程地址空间都是由OS创建、管理

虚拟内存

虚拟内存是一种计算机内存管理技术。以上进程地址空间通过页表与内存或外存建立映射关系的结构,是Linux虚拟内存的实现 。

虚拟内存技术的优点总结:

  1. 物理内存/磁盘外存是一个硬件,本身是不具有识别功能的。设想,如果没有虚拟内存技术,访问数组越界部分的数据数据就不会被拦截,那么如果发生错误或有人恶意攻击,整个主机上的所有程序或进程都可能被非法访问/修改。
  2. 从进程视角来看,它只能看到自己,或者说它认为自己占据所有的内存资源,所以它可以自由的动态开辟地址连续的空间(这里的地址连续只是在进程看来,实际物理空间不一定连续),再将开辟的空间映射到物理内存中。
  3. 支持了写时拷贝功能
  4. 扩大可用内存空间:虚拟内存可以将磁盘空间作为扩展内存使用,从而扩大了可用内存空间。这样,即使物理内存不足,也可以运行更多的程序。(因为页表可以映射外存)
  5. 提高程序运行效:虚拟内存可以将不常用的内存数据暂时存储到磁盘上,从而释放物理内存空间(这里说的磁盘就是C盘,所以C盘太满会卡,不过当今内存都很大,即使C盘满一点也不会有太大的影响),让更常用的数据可以被加载到内存中,提高程序的运行效率。(由于页表的存在,在进程视角,内存中分配的空间是有序的)(有些分配了内存也不会立刻使用,虚拟内存的存在就提高了实际内存的使用效率)

缺点:
物理结构上不是连续的,是随机的,所以CPU在内存中读取的时候,目标数据附近的数据不一定是下一个目标的数据,需要多次重新读取内存中的目标数据,操作损害高,会导致性能下降。

写时拷贝

在这里插入图片描述

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

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

一些碎碎念:

堆是堆,栈是栈,堆栈是堆。

程序奔溃就是进程退出,操作系统结束了进程。

本文以前写过,现在重写。

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

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

相关文章

销售人员如何拓展客户?

销售这个职业每年都会有很多新人来,也有很多老人转行。大多数人转行的原因无非就是找不到客户,没有完成业绩导致工资不理想,性格不合适无法开口交流不会社交等等。 既然有很多人因为找不到客户而放弃,那么对于一个销售来说&#…

k8s官方镜像代理加速

背景 大家可能在云原生领域需要部署周边的一些生态组件时,在国内遇到无法正常拉取镜像,显得就有点苦恼,不过没关系,常见的${{ registry_name }} 例如 “gcr.io”,“registry.k8s.io” Failed to pull image “registry…

[ffmpeg] aac 音频编码

aac 介绍 aac 简单说就是音频的一种压缩编码器,相同音质下压缩比 mp3好,目前比较常用。 aac 编码支持的格式 aac 支持的 sample_fmts: 8 aac 支持的 samplerates: 96000 88200 64000 48000 44100 32000 24000 22050 16000 12000 11025 8000 7350 通…

git push 报错 error: src refspec master does not match any 解决

git报错 ➜ *** git:(main) git push -u origin "master" error: src refspec master does not match any error: failed to push some refs to https://gitee.com/***/***.git最新版的仓库初始化后 git 主分支变成了 main 方法 1.把 git 默认分支名改回 master …

maven生命周期回顾

目录 文章目录 **目录**两种最常用打包方法:生命周期: 两种最常用打包方法: 1.先 clean,然后 package2.先 clean,然后install 生命周期: 根据maven生命周期,当你执行mvn install时&#xff0c…

Python函数

1.函数 1.1 函数概述 函数定义和优势 不同形状正方形打印 # 2个 for i in range(0, 2):for j in range(0, 2):print("*", end"")print() # 3个 for i in range(0, 3):for j in range(0, 3):print("*", end"")print() # 4个 for i …

Linux:dockerfile编写搭建nginx练习(8)

dockerfile是创建镜像的一种,通过已有镜像的基础上再在上面部署一些别的。 在这个基础镜像上搭建,我这个是一个空的centos镜像 我这里用http的yum仓库存放了nginx和rpm包 创建dockerfile vim Dockerfile写入#设置基础镜像 FROM centos#维护该镜像的用户…

redis------在java中操作redis

Redis(非关系型数据库)简介 redis下载 点击即可进入redis中文网进行下载 百度网盘windows版本 提取码 DMH6 redis主要特点 基于内存存储,读写性能高 适合存储热点数据(热点商品、资讯、新闻) 企业应用广泛 redis不同…

SQL Server 2016(创建数据库)

1、实验环境。 某公司有一台已经安装了SQL Server 2016的服务器,现在需要新建数据库。 2、需求描述。 创建一个名为"db_class"的数据库,数据文件和日志文件初始大小设置为10MB,启用自动增长,数据库文件存放路径为C:\db…

Gti GUI添加标签

通过Git Gui打开项目,通过菜单打开分支历史,我这里是名为"develop"的分支 选中需要打标签的commit,右键-Create tag即可 但貌似无法删除标签,只能通过git bash

linux NAT网卡配置static

由于是内网,资料无法拷贝,借助参考资料,整理发出。 镜像安装 基本操作。 查看VM配置 图1,有几个信息。一个是NAT借用了网卡里的VMnet8适配器。 子网IP是从192.168.142.0 子网掩码255.255.255.255,对应下面配置的N…

CoreDNS实战(五)-接入prometheus监控

1 背景 Prometheus插件作为coredns的Plugins,默认情况下是内置在coredns中,如果是自己编译安装的版本,需要注意在编译安装的时候的plugin.cfg文件中添加了prometheus:metrics,这样才能确保编译成功。 # 首先我们检查一下运行的版…

【从零认识ECS云服务器 | 快速上线个人网站】二、使用ECS云服务器

第二章 使用ECS 2.1 获取ECS 方式一:通过试用中心免费领取ECS实例 满足以下全部条件的阿里云用户,可免费试用云服务器ECS: 阿里云注册会员用户并完成阿里云企业认证或个人认证用户。申请用户是云服务器ECS产品的新用户,可以申…

【链表Linked List】力扣-2 两数相加

目录 题目描述 解题过程 题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 …

Vue学习计划-Vue2--Vue核心(二)Vue代理方式

Vue data中的两种方式 对象式 data:{}函数式 data(){return {} }示例&#xff1a; <body><div id"app">{{ name }} {{ age}} {{$options}}<input type"text" v-model"value"></div><script>let vm new Vue({el: …

[JavaScript前端开发及实例教程]计算器井字棋游戏的实现

计算器&#xff08;网页内实现效果&#xff09; HTML部分 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>My Calculator&l…

【头歌系统数据库实验】实验6 SQL的多表查询-2

目录 第1关&#xff1a;查询每个选手的信息及其提交的解答信息&#xff0c;没做题的选手不显示 第2关&#xff1a;查询做了1001题且耗时大于500&#xff08;time&#xff09;的选手信息 第3关&#xff1a;查询所有选手信息及其提交的解答信息&#xff0c;没做题的选手也要显…

css所有属性介绍

文章目录 1️⃣ CSS属性介绍1.1 CSS3 动画属性&#xff08;Animation&#xff09;1.2 CSS 背景属性&#xff08;Background&#xff09;1.3 CSS 边框属性&#xff08;Border 和 Outline&#xff09;1.4 Box 属性1.5 Color 属性1.6 Content for Paged Media 属性1.7 CSS 尺寸属性…

基于 Vue、Datav、Echart 框架的 “ 数据大屏项目 “,通过 Vue 组件实现数据动态刷新渲染,内部图表可实现自由替换

最近在研究大数据分析&#xff0c;基于 Vue、Datav、Echart 框架的 " 数据大屏项目 "&#xff0c;通过 Vue 组件实现数据动态刷新渲染&#xff0c;内部图表可实现自由替换。部分图表使用 DataV 自带组件&#xff0c;可进行更改&#xff0c;详情请点击下方 DataV 文档…

【全栈开发】使用NestJS、Angular和Prisma 打造全栈Typescript开发

在开发Angular应用程序时&#xff0c;我非常喜欢Typescript。使用NestJS&#xff0c;您可以以与Angular非常相似的方式编写后端。 我偶然发现了这个库&#xff0c;发现它非常有趣&#xff0c;所以我想设置一个简单的测试项目。一般来说&#xff0c;我主要使用SQL数据库&#x…