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

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

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

java 进程 返回值

实现 Callable 接口 与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。 public class MyCallable implements Callable<Integer> {public Integer call() {return 123;}} public static void main(String[] args

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

Weex入门教程之1,了解Weex

【资料合集】Weex Conf回顾集锦:讲义PDF+活动视频! PDF分享:链接:http://pan.baidu.com/s/1hr8RniG 密码:fa3j 官方教程:https://weex-project.io/cn/v-0.10/guide/index.html 用意 主要是介绍Weex,并未涉及开发方面,好让我们开始开发之前充分地了解Weex到底是个什么。 以下描述主要摘取于