Linux之进程的虚拟地址空间,逻辑地址和物理地址,进程管理命令

 更新时间:2023年03月23日 10:48:56   作者:Dutkig  
这篇文章主要介绍了Linux之进程的虚拟地址空间,逻辑地址和物理地址,进程管理命令,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

进程的虚拟地址空间

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,虚拟地址空间的大小由计算机的硬件平台决定,比如32位的平台决定了虚拟地址空间为4G(因为32位系统上指针能够寻址的范围是232

这4G空间的分配如下:

  • 由上图可知,进程的虚拟内存被分为若干个“段”;
  • 每个段其实还被分成了若干个“块”,我们将这个“块”称为“页”;
  • 内存的映射(虚拟地址和物理地址之间的转换)也是以“页”为单位的;
  • 一般来说一页的大小4K;
  • 交换空间(内存‘【这里说的是物理内存】不够时使用,把当前不使用的数据或者临时数据放入到交换分区中),在防止数据块到交换分区时,也是以"页"为单位的,这个过程我们称为“换出”,再由交换分区调入内存,我们称为“换入”,整个过程即为“换页”

注意:虚拟地址一般由段号、页号、页中偏移量构成,从而最终计算出你的物理地址;

缺页:消除了进程全部载入内存中,按需调页(也就是换页);

以上就是Linux的段页式内存管理

1.内核空间(1G)

驻留在内存内,是操作系统的一部分,内核空间为内核保留,不允许应用程序读写该区域或调用内核代码。

2 栈(stack)

包括以下内容和用途:

  • 1 函数的返回值和参数。
  • 2 临时变量,包括非静态局部变量,以及编译器自动生成的临时变量。
  • 3 保存上下文:包括函数调用前后需保持不变的寄存器。

3 内存映射段(mmap)

该区域用于映射可执行文件用到的动态链接库。若可执行文件依赖共享库,则系统会为这些动态库在从0x40000000开始的地址分配相应空间,并在程序装载时将其载入到该空间。

在Linux 内核中,共享库的起始地址被往上移动至更靠近栈区的位置。

4 堆(heap)

堆用于存放进程运行时动态分配的内存段,可动态扩张或缩减。堆中内容是匿名的,不能按名字直接访问,只能通过指针间接访问。

当进程调用malloc©/new(C++)等函数分配内存时,新分配的内存动态添加到堆上(扩张);当调用free©/delete(C++)等函数释放内存时,被释放的内存从堆中剔除(缩减) 。

5 .BSS段

.BSS(Block Started by Symbol)段中通常存放程序中以下符号:

  • 1 未初始化的全局变量和静态局部变量
  • 2 初始值为0的全局变量和静态局部变量(依赖于编译器实现)
  • 3 未定义且初值不为0的符号(该初值即common block的大小)

6 数据段(.Data)

数据段通常用于存放程序中已初始化且初值不为0的全局变量和静态局部变量。

数据段属于静态内存分配(静态存储区),可读可写。

7 代码段(text)

代码段也称正文段或文本段,通常用于存放程序执行代码(即CPU执行的机器指令)。一般C语言执行语句都编译成机器代码保存在代码段。

通常代码段是可共享的,因此频繁执行的程序只需要在内存中拥有一份拷贝即可。

代码段通常属于只读,以防止其他程序意外地修改其指令(对该段的写操作将导致段错误)。

某些架构也允许代码段为可写,即允许修改程序。

8 保留区

位于虚拟地址空间的最低部分,未赋予物理地址。

任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。

一个页面的大小为4K(212),

——因此进程可以使用220个页面

注:绝大多数处理器上的内存页的默认大小都是 4KB,虽然部分处理器会使用 8KB、16KB 或者 64KB 作为默认的页面大小,但是 4KB 的页面仍然是操作系统默认内存页配置的主流

逻辑地址

在某一段程序中,我们输出的变量内存地址,其实是逻辑地址,也就是进程的地址空间。

虚拟地址向物理地址的转换依靠的是内存管理单元(MMU)

有些时候,父子进程的某个变量的输出地址可能相同,只可能是其逻辑地址相同,要想知道它们在内存中的物理地址,就必须根据逻辑地址判断页表号,再根据各自的页表进行映射,找到其在内存中的具体位置,,不同进程的逻辑地址没有可比性,但是如果在同一个进程中,若地址相同,那就证明其在同一段物理内存中。

如图,在上述图片中,假设父子进程的两个变量的逻辑地址均为4097,那么其就应该在页表号为1的页面上且偏移量为2(0-4095)的位置,在根据页表号映射出其在物理内存中的真实地址。

为什么我们在程序中不使用物理地址?

因为在运行程序的目标主机上,我们不知道当前哪些物理页面是空闲的,如果我们程序写的都是物理页面,比如说,第一个进程说它要用0,1,2,3号页面,假设其子进程也要用0,1,2,3号页面,就冲突了,然后其他页面是空闲的。我们在编程途中不知道其他程序会用哪些物理页面,我们无法预知将要运行的主机上哪些物理页面是空闲,而且物理页面的空闲页面是变化的,每次开机,空闲的页面是不一样的,我们无法确定,所以我们只能看逻辑地址,就像跳舞一样,每个人有相对其他人的位置,跳舞的队列是不变的,但是有可能在操场跳舞,或者在广场跳舞。我们只能记录相对位置,然后通过页表映射,页表的更新,确定哪个物理页面是空闲的。

进程管理命令

pstree:树状结构显示进程

ps:报告程序状况

这一命令用来显示某一时间点的进程信息,这些信息是静态的,

若想查看当前系统运行的动态程序信息 可以使用top命令。

top:

下面列举一些常用的选项:

ps -ef:显示所有程序,并以ASCII字符显示树状结构,表达程序间的相互关系

  • -e和-A的意思是一样的,即显示有关其他用户进程的信息,包括那些没有控制终端的进程。
  • -f显示用户id,进程id,父进程id,最近CPU使用情况,进程开始时间等等

ps -l:长格式输出

ps -aux:显示当前终端所有进程(a)

注意与ps aux区分:列出正在运行的所有进程

用户名 进程ID %CPU %内存 虚拟内存 固定内存 终端 状态 起始时间 CPU时间 程序指令

ps -x:当前用户在所有终端下的进程

ps -u:以用户格式输出

ps -elf:显示系统内的所有进程

列名解释:

如何杀死一个进程

  • kill  pid:结束pid进程
  • pkill:结束进程族
  • kill -9 pid:强制结束一个进程该,命令行可以使用`-9`参数来强制杀死进程

pkill sleep:可以结束后台挂起的所用名叫sleep的进程

挂起是一种省电模式,系统将机器的硬盘,显示器等外部设备停止工作,而CPU,内存仍然在工作中,等待用户随时唤醒。

  • kill -stop pid:挂起一个进程
  •  jobs:查看被挂起的程序工作号
  • command &:直接在后台运行程序

用grep命令和kil命令结合杀死一个目标进程

如何在后台运行一个进程 

命令+&

eg:

  • sleep 300&
  • sleep 300 &

进程恢复

  • fg 工作号:将挂起的作业放回到前台执行
  • bg 工作号:将挂起的作业放到后台执行

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Linux CentOS 定时运行脚本配置的方法

    Linux CentOS 定时运行脚本配置的方法

    今天小编就为大家分享一篇Linux CentOS 定时运行脚本配置的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • linux下查看已经安装的jdk 并卸载jdk的方法(推荐)

    linux下查看已经安装的jdk 并卸载jdk的方法(推荐)

    下面小编就为大家带来一篇linux下查看已经安装的jdk 并卸载jdk的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • LNMP系列教程之 SSL安装WordPress博客(程序下载与安装)

    LNMP系列教程之 SSL安装WordPress博客(程序下载与安装)

    在之前的文章中,老左已经在VPS中添加了站点,然后我们就需要传程序建站。我们可以利用WinSCP工具直接向我们的对应的站点目录中传程序,然后添加数据库安装网站
    2012-09-09
  • 在 Ubuntu 16.04 为 Nginx 服务器安装 LEMP 环境(MariaDB,PHP 7 并支持 HTTP 2.0)

    在 Ubuntu 16.04 为 Nginx 服务器安装 LEMP 环境(MariaDB,PHP 7 并支持 HTTP

    LEMP 是个缩写,代表一组软件包(L:Linux OS,E:Nginx 网络服务器,M:MySQL/MariaDB 数据库和 P:PHP 服务端动态编程语言),它被用来搭建动态的网络应用和网页
    2016-09-09
  • 一文详解Linux三种网络设置方式

    一文详解Linux三种网络设置方式

    我们在使用虚拟机搭建linux系统后,常常需要设置系统网络连接,以方便系统进行上网或其他系统连接系统进行操作,在linux中网络连接分了三类:桥接模式,仅主机模式,NAT模式,本文我们将对这三种模式进行讲解,感兴趣的同学可以参考阅读
    2023-06-06
  • centos6.5中用yum方式安装php5.4与apache2.2的步骤

    centos6.5中用yum方式安装php5.4与apache2.2的步骤

    相信大家都知道lamp的安装配置,最麻烦的是apache和php,网上关于apache和php的安装配置有很多的相关文章,本文通过针对版本进行详细的介绍,文章主要介绍的是centos6.5中用yum方式安装php5.4与apache2.2的步骤,感兴趣的朋友们可以参考学习。
    2016-10-10
  • 详解在Linux下9个有用的touch命令示例

    详解在Linux下9个有用的touch命令示例

    本篇文章主要介绍了详解在Linux下9个有用的touch命令示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Linux编译优化必须掌握的几个姿势总结

    Linux编译优化必须掌握的几个姿势总结

    内核是操作系统的核心,也是操作系统最基本的部分。下面这篇文章主要给大家总结介绍了关于Linux编译优化必须掌握的几个姿势,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-09-09
  • Ubuntu 14.04下安装Eclipse的经验分享

    Ubuntu 14.04下安装Eclipse的经验分享

    在linux下配置开发环境有点麻烦,对于linux刚入门的菜鸟来说,命令使用不熟悉,环境也是朦朦胧胧,今天整理了一下ubnutu14.04下安装eclipse的步骤,希望对大家有用。废话不多说,进入主题
    2014-09-09
  • Linux 内存释放命令详解

    Linux 内存释放命令详解

    这篇文章主要介绍了Linux 内存释放命令的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05

最新评论