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 使用起来很简单,不加任何 ...
随机推荐
- hasOwnProperty的作用、配合for in使用 、key in Object判读key
我们都知道,对象以 key|value的形式存在 它和数组一样可以遍历,对象可以通过for in 去遍历,拿到遍历对象的所有key 某些idea在使用for in 时,提示代码片段中就有出现以下这种情 ...
- 中国剩余定理(CRT)学习笔记
约定 \(A\perp B\) 表示 \(\gcd(A,B)=1\). \(A\mid B\) 表示 \(B\equiv 0\pmod{A}(A\neq0)\). 引入 考虑以下这道题: 有物不知其數 ...
- 突破tls/ja3新轮子
我之前的文章介绍了SSL指纹识别 https://mp.weixin.qq.com/s/BvotXrFXwYvGWpqHKoj3uQ 很多人来问我BYPass的方法 主流的BYPASS方法有两大类: ...
- 实例化对象 A a = new A();
"new" 在Java中代表实例化的意思, A a = new A()代表实例化了一个对象a, 这个对象a属于A类. 可以认为A是一个抽象概念, 对象a是一个实体(存储于内存), ...
- Prism Sample 10 10-CustomRegistrations
作用同上节,这里是用修改注册的方式自定义View和ViewModel的关联. protected override void ConfigureViewModelLocator() { base.Co ...
- 高精度------C++
高精度运算------C++ (加减乘除) 例:ZOJ2001 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1001 The ...
- golang版本sdl2显示窗体
golang版本sdl2显示窗体 go用syscall调用sdl2,在win10 x64上没问题,其他系统不敢保证. 见地址 package main import ( "fmt" ...
- Django4全栈进阶之路21 项目实战(在线报修):创建App应用和Model模型
创建应用App python manage.py startapp RepairApp 创建模型 在models.py文件中定义一个Repair模型来表示报修单,其中包含以下字段: repair_id ...
- c++函数参数和返回值
c++函数参数和返回值 函数存储位置 函数参数入栈顺序 初始化列表 函数的返回值 用参数引用来返回 返回一个参数指针 返回一个对象 总结 函数的几种变体 inline 函数 函数对象 lambda 函 ...
- jq如何将获取到的css属性值变为int类型
情况 小王:诶诶诶?我用js中css方法获取到的属性值怎么判断错误了呀?怎么办怎么办? Allen:害,小王,你是不是没有注意左右两边的类型,会不会是数据类型不一致导致的? 事故现场: if($(&q ...