是什么

进程页表是用于管理进程虚拟地址空间和物理内存之间映射关系的数据结构。它记录了进程中每个虚拟页对应的物理页的信息。

什么作用

进程使用进程页表的方式是通过虚拟地址访问内存。当进程访问一个虚拟地址时,操作系统会根据进程页表中的映射关系,将虚拟地址转换为物理地址,然后进行内存访问操作。

谁维护

内核。进程页表的创建、更新和销毁等操作都由内核负责。

什么结构

通常是一个多级页表,由多个页表项组成。每个页表项记录了虚拟页和物理页的映射关系,包括虚拟页号、物理页号、权限位等信息。多级页表的结构可以有效地管理大型的虚拟地址空间。

什么时间创建

进程页表在进程创建时被创建。当一个新的进程被创建时,操作系统会为该进程分配一个独立的虚拟地址空间,并为其创建一个新的页表。页表的创建过程包括分配页表所需的内存空间,并建立虚拟页和物理页的映射关系。

CPU切换进程时

操作系统会切换进程的页表。具体操作包括将新进程的页表加载到MMU(内存管理单元)中,以更新虚拟地址空间和物理内存的映射关系。这样,当新进程执行时,它的虚拟地址访问将会映射到正确的物理内存位置。

进程从用户态切换内核态时

会发生一次上下文切换;在这个过程中,进程的页表也会发生切换:当进程发起系统调用或触发异常时,CPU会自动切换到内核态,并将当前进程的页表切换为内核页表。内核页表是内核专用的页表,用于管理内核地址空间和物理内存之间的映射关系。

与内核页表的区别

进程页表和内核页表是两个独立的数据结构,用于管理不同的地址空间。进程页表用于管理进程的用户态地址空间,而内核页表用于管理内核的地址空间。进程页表和内核页表之间没有直接的映射关系,它们是独立的。

当进程从用户态进入到内核态时,内核页表会被加载到MMU中,以便进程可以访问内核地址空间中的代码和数据。当进程从内核态返回到用户态时,内核页表会被切换回进程页表,以恢复进程的用户态地址空间。

什么是缺页异常

指当进程访问一个尚未映射到物理内存的虚拟页时,操作系统会产生一个缺页异常。这种设计是为了实现虚拟内存的概念,即将进程的虚拟地址空间扩展到比物理内存更大的范围。当发生缺页异常时,操作系统会根据页表的映射关系,将相应的物理页加载到内存中,并更新页表的映射关系,以便进程继续访问该虚拟页。

附录

Linux系统文件页表目录和页表结构(图文详解)

参考:Linux系统文件页表目录和页表结构(图文详解)

linux查看某一进程详细信息

cat /proc/进程号/status

VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
VmStk(KB) 任务在用户态的栈的大小 (stack_vm)
VmExe(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE 该进程的所有页表的大小,单位:kb
Threads 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符

进程个各个数据段的虚拟地址是在什么时候确定的

在Linux中,进程的各个数据段的虚拟地址是在进程创建时确定的。具体来说,当进程被创建时,内核会为其分配一块虚拟地址空间,其中包括代码段、数据段、堆和栈等。这些虚拟地址是由内核根据进程的需求和系统的配置来确定的。

进程各个数据段的作用

进程的虚拟地址空间中,代码段用于存放可执行代码,数据段用于存放全局变量和静态变量,堆用于存放动态分配的内存,栈用于存放函数调用的局部变量和函数调用的上下文信息。

哪些数据段会一直驻留内存

在Linux中,代码段和数据段通常会一直驻留在内存中,因为它们是进程的静态数据。而堆和栈是动态分配的,它们的大小和位置会随着进程的运行而变化。当堆和栈的空间不足时,进程会触发内存分配和释放操作,这时才会将相应的内存页写入或从内存中释放。

swap的作用

当系统的物理内存不足时,操作系统会将一些不常用的内存页换出到swap分区中,以释放物理内存供其他进程使用。具体来说,当发生缺页中断时,如果内存中没有空闲的物理页,操作系统会选择一个不常用的内存页,将其写入swap分区,并更新进程页表中的映射关系。这样,物理内存就可以为新的内存页腾出空间。当进程再次访问被换出的内存页时,会触发缺页中断,操作系统会将其从swap分区中读入内存,并更新进程页表中的映射关系。

Linux中的进程页表的更多相关文章

  1. 1.1 Linux中的进程 --fork、孤儿进程、僵尸进程、文件共享分析

    操作系统经典的三态如下: 1.就绪态 2.等待(阻塞) 3.运行态 其转换状态如下图所示: 操作系统内核中会维护多个队列,将不同状态的进程加入到不同的队列中,其中撤销是进程运行结束后,由内核收回. 以 ...

  2. Linux中查看进程的多线程pstree, ps -L

    Linux中查看进程的多线程 在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的 ...

  3. 如何在 Linux 中查看进程占用的端口号【转】

    对于 Linux 系统管理员来说,清楚某个服务是否正确地绑定或监听某个端口,是至关重要的.如果你需要处理端口相关的问题,这篇文章可能会对你有用. 端口是 Linux 系统上特定进程之间逻辑连接的标识, ...

  4. [转帖]Linux教程(8)-Linux中的进程和日志㐇、

    Linux教程(8)-Linux中的进程和日志 2018-08-20 23:42:23 钱婷婷 阅读数 3554更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文为博主原 ...

  5. Linux中查看进程与日志

    转至:https://www.cnblogs.com/dengxiaoning/p/13336778.html Linux尽管使用频繁,仍然每次都还是需要到处去找相关的命令,如进程,日志之类的,既然这 ...

  6. Linux中查看进程占用内存的情况【转】

    转自:http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux/ Linux中查看某个进程占用内存的情况,执行如下命令即可,将 ...

  7. <实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向

    [root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...

  8. Linux中查看进程的多线程

    在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况: 在我的系统中,用qemu-syst ...

  9. Linux中查看进程及杀死进程命令

    Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx' 3405 ?        00 ...

  10. Linux 中查看进程及资源使用情况

    top 自带的 top 命令类似于平时我们使用的任务管理器,能够列出当前系统中的进程及资源的使用情况. $ man top top - display Linux tasks 使用起来很简单,不加任何 ...

随机推荐

  1. 【OpenAI】私有框架代码生成实践

    作者:京东零售 牛晓光 根据现有调研和实践,由OpenAI提供的ChatGPT/GPT-4模型和CodeX模型能够很好的理解和生成业界大多数编程语言的逻辑和代码,其中尤其擅长Python.JavaSc ...

  2. 2022-11-26:给定一个字符串s,只含有0~9这些字符 你可以使用来自s中的数字,目的是拼出一个最大的回文数 使用数字的个数,不能超过s里含有的个数 比如 : 39878,能拼出的最大回文数是

    2022-11-26:给定一个字符串s,只含有0~9这些字符 你可以使用来自s中的数字,目的是拼出一个最大的回文数 使用数字的个数,不能超过s里含有的个数 比如 : 39878,能拼出的最大回文数是 ...

  3. 2022-03-10:限制:0 <= start <= end,0 <= target <= 64。 [start,end]范围上的数字,有多少数字二进制中1的个数等于target。 真实面试题,被问

    2022-03-10:限制:0 <= start <= end,0 <= target <= 64. [start,end]范围上的数字,有多少数字二进制中1的个数等于targ ...

  4. 2021-09-01:三数之和。给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

    2021-09-01:三数之和.给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. ...

  5. vue全家桶进阶之路36:Vue3 全局路由useRouter和本地路由useRoute

    在 Vue.js 3.x 中,我们可以使用 useRouter 和 useRoute 来获取当前路由对象和当前路由信息. useRouter useRouter 可以用来获取当前路由对象.我们可以通过 ...

  6. 500行代码手写docker开篇-goland远程编译环境配置

    (1)500行代码手写docker开篇-goland远程编译环境配置 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现 ...

  7. c++函数参数和返回值

    c++函数参数和返回值 函数存储位置 函数参数入栈顺序 初始化列表 函数的返回值 用参数引用来返回 返回一个参数指针 返回一个对象 总结 函数的几种变体 inline 函数 函数对象 lambda 函 ...

  8. Linux 创建 Python 虚拟环境

    Linux 创建 Python 虚拟环境 0. 前言 网上教程太杂太乱,要么排版不好看,要么讲半天讲不到重点,故做此篇,精简干练. 1. 安装virtualenv 先用pip安装virtualenv第 ...

  9. 500行代码手写docker-实现硬件资源限制cgroups

    (5)500行代码手写docker-实现硬件资源限制cgroups 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一 ...

  10. Pycharm激活码,Pycharm稳定专属激活码(持续更新)

    分享一下 PyCharm 2023.1.2 最新激活注册码,破解教程如下,可免费永久激活,亲测有效,下面是详细文档哦~ 申明:本教程 PyCharm 激活码收集于网络,请勿商用,仅供个人学习使用,如有 ...