进程的那些事——了解进程(虚拟地址空间)

2024-09-05 16:04

本文主要是介绍进程的那些事——了解进程(虚拟地址空间),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

一、程序地址空间(虚拟地址空间)

二、虚拟地址寻找物理内存

1.页表

总结


前言

提示:这里可以添加本文要记录的大概内容:

程序和进程之间的区别:

        进程:对用户而言,进程是运行中的程序,但实际是进程是对程序动态运行的描述。当程序被加载到内存中并由操作系统执行就变成了进程。进程有独立的内存空间。它的生命周期到进程结束或操作系统终止。

        程序:是一系列静态的,有序执行的指令集合。用于指定计算机来完成特定的任务。通常储存在硬盘中。它的生命周期直到数据被删除或覆盖。

虚拟地址和物理地址的区别:

        虚拟地址:CPU在程序运行的时候生成的地址,是操作系统为进程提供的抽象层。每个进程都有自己独立的虚拟地址空间

        物理地址:内存模块的实际地址,硬件通过物理地址来之间访问内存数据。物理地址空间是全局的


提示:以下是本篇文章正文内容,下面案例可供参考

一、程序地址空间(虚拟地址空间)

1.程序本身不会有地址空间,程序在不在硬盘中运行,而是在内存中运行的,当程序被执行成为进程时占用地址空间。

2.进程中的变量地址都是虚拟地址。

3.系统为每个进程通过 mm-struct 结构体描述一个虚拟地址空间。

 为什么需要给进程提供一个虚拟地址空间,并让进程内部数据都使用虚拟地址?

        一个高级语言程序(指令)在链接生成可执行程序后,这个程序中的各个指令及数据在内存中的位置都已经被安排好了(这样安排对编译器比较友好,所以的数据都安排好之后,当编译器在运行程序的时候,只需要在指定位置拿数据,不用再找数据了),若运行进程时所需要的内存被占用,就会造成冲突。所以操作系统为了防止这种情况出现,不让进程之间访问物理内存,在程序运行的时候,给这个正在运行的程序虚拟出一个完整的,线性的虚拟地址空间,并且每个运行的程序都拥有自己独立的虚拟地址,即使两个相同的运行中的程序(进程)使用相同的虚拟地址也不会访问到同一个物理内存。这时这个进程就能随意的使用虚拟地址

        进程中有一个全局变量,g_val,这个变量指向虚拟地址空间,这个虚拟地址空间保存指向物理内存的地址,通过页表映射来找到物理内存中指定的位置,将全局变量的数据放到物理内存中。 

 

 

二、虚拟地址寻找物理内存

1.页表

        虚拟地址是通过页表来找到物理内存。

        页表:记录了每一个虚拟地址于物理地址之间的映射关系。

作用

        使用虚拟地址空间和页表之后,程序中的数据可以实现物理内存中离散式存储,在页表可以记录内存的访问权限。并且提高了内存访问、控制的安全性。提高了内存置换功能这样就算内存不够用依然能够进行大量的数据处理--将物理内存中暂时不用的数据放到磁盘中存储起来,腾出空间给新的进程使用。

        离散式存储,当一个16k的内存再中间占据了8k左右分别有4k的大小,如果是离散式存储,那么5k的内存就可以分开来存贮再左右两边,提高了内存利用率。 

 

页表关键元素
        1.虚拟地址与物理地址的映射关系
        2.访问权限
        3.缺页中断标志

如何通过虚拟地址找到物理地址

        分段式:将地址空间分为一个一个不同属性的段(对于编译器进程程序管理最友好);

        分页式:将地址空间分为大量的小的分页,提高内存的使用率。(默认小分页为4096);

        段页式:将地址空间进行分段,在每个段内使用分页式进程管理--上面二者的结合;

        

转换过程

        分段式

                分段式虚拟地址组成:段号+段内偏移

                    操作系统针对分段式内存管理构造了一个段表:段号,物理内存段的起始地址

      物理内存起始地址+偏移量=数据的存储空间=虚拟地址

        分页式

                分页式虚拟地址的组成:页号+页内偏移

        页号解析

            以32位操作系统为例:4G虚拟地址

                默认页面大小:4096-4k 4k = 4*1024

                页面个数:4*1024*1024*1024/4*1024 = 102*1024 = 2^20

                因此对页面进行编号:0~2^20-1

                因此再虚拟地址组成中,页号占了高20个bit位,低12bit位就是页内偏移

内存置换:

        当进程进行数据处理的时候,物理内存不够用,这时就会将物理内存中的某些数据拷贝到磁盘交换分区中存储起来,腾出内存给需要使用的数据 


总结

进程虚拟地址空间是什么:

        操作系统通过mm_struct给进程描述的虚拟地址空间

虚拟地址空间有什么用:

        实现数据再物理内存的离散式存储

        提高内存访问、控制的安全性

        通过内存置换再内存不够用的时候可以继续处理数据

如何通过虚拟地址找到物理地址:

        操作系统的三种内存管理方式:分段式、分页式、段页式。

物理地址、物理内存、物理地址空间:

        物理地址:二进制地址是计算机硬件内存中实际存在的地址,物理地址由内存管理单元或内存控制器转换为实际可访问的硬件地址。

        物理内存:通过物理内存条获得的内存空间。是计算机的主要存储区域。

        物理内存空间:是物理地址的集合,每个物理地址都对应内存中的一个存储单元。

        物理地址是物理内存中每个存储单元的标识,物理内存是存储这条存储单元的介质,物理地址空间是物理地址的集合,物理内存决定物理地址空间的大小。

 虚拟地址与虚拟地址空间的关系

        虚拟地址空间的包含虚拟地址的实际,在这个空间中进程通过虚拟地址来访问数据和指令。

这篇关于进程的那些事——了解进程(虚拟地址空间)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139422

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻