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

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

相关文章

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Linux进程终止的N种方式详解

《Linux进程终止的N种方式详解》进程终止是操作系统中,进程的一个重要阶段,他标志着进程生命周期的结束,下面小编为大家整理了一些常见的Linux进程终止方式,大家可以根据需求选择... 目录前言一、进程终止的概念二、进程终止的场景三、进程终止的实现3.1 程序退出码3.2 运行完毕结果正常3.3 运行完毕

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

linux本机进程间通信之UDS详解

《linux本机进程间通信之UDS详解》文章介绍了Unix域套接字(UDS)的使用方法,这是一种在同一台主机上不同进程间通信的方式,UDS支持三种套接字类型:SOCK_STREAM、SOCK_DGRA... 目录基础概念本机进程间通信socket实现AF_INET数据收发示意图AF_Unix数据收发流程图A

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程