Linux中的进程页表
是什么
进程页表是用于管理进程虚拟地址空间和物理内存之间映射关系的数据结构。它记录了进程中每个虚拟页对应的物理页的信息。
什么作用
进程使用进程页表的方式是通过虚拟地址访问内存。当进程访问一个虚拟地址时,操作系统会根据进程页表中的映射关系,将虚拟地址转换为物理地址,然后进行内存访问操作。
谁维护
内核。进程页表的创建、更新和销毁等操作都由内核负责。
什么结构
通常是一个多级页表,由多个页表项组成。每个页表项记录了虚拟页和物理页的映射关系,包括虚拟页号、物理页号、权限位等信息。多级页表的结构可以有效地管理大型的虚拟地址空间。
什么时间创建
进程页表在进程创建时被创建。当一个新的进程被创建时,操作系统会为该进程分配一个独立的虚拟地址空间,并为其创建一个新的页表。页表的创建过程包括分配页表所需的内存空间,并建立虚拟页和物理页的映射关系。
CPU切换进程时
操作系统会切换进程的页表。具体操作包括将新进程的页表加载到MMU(内存管理单元)中,以更新虚拟地址空间和物理内存的映射关系。这样,当新进程执行时,它的虚拟地址访问将会映射到正确的物理内存位置。
进程从用户态切换内核态时
会发生一次上下文切换;在这个过程中,进程的页表也会发生切换:当进程发起系统调用或触发异常时,CPU会自动切换到内核态,并将当前进程的页表切换为内核页表。内核页表是内核专用的页表,用于管理内核地址空间和物理内存之间的映射关系。
与内核页表的区别
进程页表和内核页表是两个独立的数据结构,用于管理不同的地址空间。进程页表用于管理进程的用户态地址空间,而内核页表用于管理内核的地址空间。进程页表和内核页表之间没有直接的映射关系,它们是独立的。
当进程从用户态进入到内核态时,内核页表会被加载到MMU中,以便进程可以访问内核地址空间中的代码和数据。当进程从内核态返回到用户态时,内核页表会被切换回进程页表,以恢复进程的用户态地址空间。
什么是缺页异常
指当进程访问一个尚未映射到物理内存的虚拟页时,操作系统会产生一个缺页异常。这种设计是为了实现虚拟内存的概念,即将进程的虚拟地址空间扩展到比物理内存更大的范围。当发生缺页异常时,操作系统会根据页表的映射关系,将相应的物理页加载到内存中,并更新页表的映射关系,以便进程继续访问该虚拟页。
附录
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 Linux中的进程 --fork、孤儿进程、僵尸进程、文件共享分析
操作系统经典的三态如下: 1.就绪态 2.等待(阻塞) 3.运行态 其转换状态如下图所示: 操作系统内核中会维护多个队列,将不同状态的进程加入到不同的队列中,其中撤销是进程运行结束后,由内核收回. 以 ...
- Linux中查看进程的多线程pstree, ps -L
Linux中查看进程的多线程 在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的 ...
- 如何在 Linux 中查看进程占用的端口号【转】
对于 Linux 系统管理员来说,清楚某个服务是否正确地绑定或监听某个端口,是至关重要的.如果你需要处理端口相关的问题,这篇文章可能会对你有用. 端口是 Linux 系统上特定进程之间逻辑连接的标识, ...
- [转帖]Linux教程(8)-Linux中的进程和日志㐇、
Linux教程(8)-Linux中的进程和日志 2018-08-20 23:42:23 钱婷婷 阅读数 3554更多 分类专栏: Linux教程与操作 Linux教程与使用 版权声明:本文为博主原 ...
- Linux中查看进程与日志
转至:https://www.cnblogs.com/dengxiaoning/p/13336778.html Linux尽管使用频繁,仍然每次都还是需要到处去找相关的命令,如进程,日志之类的,既然这 ...
- Linux中查看进程占用内存的情况【转】
转自:http://hutaow.com/blog/2014/08/28/display-process-memory-in-linux/ Linux中查看某个进程占用内存的情况,执行如下命令即可,将 ...
- <实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向
[root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...
- Linux中查看进程的多线程
在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况: 在我的系统中,用qemu-syst ...
- Linux中查看进程及杀死进程命令
Linux中想杀死fcitx进程,然后再重启它. root@www.linuxidc.com:/home/zhangbin# ps -e | grep 'fcitx' 3405 ? 00 ...
- Linux 中查看进程及资源使用情况
top 自带的 top 命令类似于平时我们使用的任务管理器,能够列出当前系统中的进程及资源的使用情况. $ man top top - display Linux tasks 使用起来很简单,不加任何 ...
随机推荐
- InnoSetup打包 添加.NET环境安装
这是封装出来的针对.NET环境安装的精简流程 根据流程新建一个配置文件 教程都是很简单的,可以参考<InnoSetup 客户端程序打包教程> 添加.NET安装基本的函数及辅助方法 在[Se ...
- python 高级函数补充
补充几个高级函数 zip 把两个可迭代内容生成一个可迭代的tuple元素类型组成的内容 # zip 案例 l1 = [ 1,2,3,4,5] l2 = [11,22,33,44,55] z = zip ...
- [OpenCV-Python] 15 图像阈值
文章目录 OpenCV-Python:IV OpenCV中的图像处理 15 图像阈值 15.1 简单阈值 15.2 自适应阈值 15.3 Otsu' 's 二值化 15.4 Otsu' 's 二值化是 ...
- 【问题解决】RabbitMQ启动出现epmd error for host xx.xx: nxdomain (non-existing domain)
问题描述 [k8s]或[普通容器]或[Linux]部署的RabbitMQ启动时出现了 epmd error for host xx.xx: nxdomain (non-existing domain) ...
- 音视频八股文(6)-- ffmpeg大体介绍和内存模型
播放器框架 常用音视频术语 • 容器/文件(Conainer/File):即特定格式的多媒体文件, 比如mp4.flv.mkv等. • 媒体流(Stream):表示时间轴上的一段连续数据,如一 段声音 ...
- 2021-12-21:任务调度器。 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间
2021-12-21:任务调度器. 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表.其中每个字母表示一种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间 ...
- python 之路,Django rest framework 初探
摘自 金角大王 https://www.cnblogs.com/alex3714/articles/7131523.html Django rest framework介绍 Django REST ...
- pycharm eslint 关闭
pycharm 关闭eslint 文件->设置->语言和框架->JavaScript->代码质量工具->ESLint
- OpenAI 官宣首个 ChatGPT iOS 应用
最近,OpenAI 宣布推出官方 iOS 应用,允许用户随时随地访问其高人气 AI 聊天机器人,此举也打破了近几个月内苹果 App Store 上充斥似是而非的山寨服务的窘境. 该应用程序是 Chat ...
- Python基础 - 算数运算符
算数运算符 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被 ...