Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Linux】进程地址空间和进程调度队列

【Linux】进程地址空间和进程调度队列

作者头像
秦jh
发布于 2024-09-20 00:48:54
发布于 2024-09-20 00:48:54
1140
举报
文章被收录于专栏:c语言,c++c语言,c++

前言

💬 hello! 各位铁子们大家好哇。 今日更新了Linux进程空间地址和进程调度队列的内容 🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

问题现象

当g_val的值修改后,父子进程各自的g_val地址都是一样的,但是为什么值却不同呢? 由此我们可知,这个地址肯定不是物理地址,而是虚拟地址。

进程地址空间

地址空间的本质就是内核中的一个结构体对象。 每一个进程都有自己独立的地址空间,都有自己独立的页表。 页面里面存的是虚拟地址和对应的物理地址。

  • 上图中,左边是父进程,右边是子进程。
  • 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理
  • 页面一边存的是虚拟地址,另一边存的就是对应的物理地址。
  • 子进程会继承父进程的数据,所以最开始指向的虚拟、物理地址也跟父进程一样。
  • 由于g_val的值改了,由因为进程具有独立性,所以OS就会在物理空间重新开一个空间,拷贝旧的数据到该地址,再让子进程的g_val指向该物理地址,但是虚拟地址不变。因此就出现文章开头的情况。
  • 如果父子进程都不写,他们的变量默认是被父子共享的,代码是共享的,物理空间不会分离。 这种拷贝也叫写时拷贝,即按需申请,可有效节省空间。
  • OS必须负责将 虚拟地址 转化成 物理地址

进一步理解

地址空间

如上图源码。 地址空间的本质就是内核中的一个结构体对象。内部很多的属性都是表示start、end的范围。

cpu中有一个简单的工作单元叫MMU(内存管理单元),还有一些寄存器会将当前进程的页表的地址保存到cpu内。MMU会快速把指定的虚拟地址结合页表转换成物理地址。

Linux2.6内核进程调度队列

上图是Linux2.6内核中进程队列的数据结构

一个CPU拥有一个runqueue

如果有多个CPU就要考虑进程个数的负载均衡问题

优先级

  • 普通优先级:100~139(nice值的取值范围,可与之对应)
  • 实时优先级:0~99(不关心)

活动队列

  • 时间片还没有结束的所有进程都按照优先级放在该队列
  • nr_active: 总共有多少个运行状态的进程
  • queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!
  • bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个 比特位表示队列是否为空,这样,便可以大大提高查找效率!

过期队列

  • 过期队列和活动队列结构一模一样
  • 过期队列上放置的进程,都是时间片耗尽的进程
  • 当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算

active指针和expired指针

  • active指针永远指向活动队列
  • expired指针永远指向过期队列
  • 可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。
  • 在合适的时候,会交换active指针和expired指针的内容,就有了一批新的活动进程。

总结

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增 加,我们称之为进程调度O(1)算法!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Linux】进程>环境变量&&地址空间&&进程调度
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
用户10925563
2024/06/04
1020
【Linux】进程>环境变量&&地址空间&&进程调度
【linux】地址空间
我们发现,输出出来的变量值和地址是一模一样的,很好理解,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改
用户11029103
2024/10/18
4540
【linux】地址空间
【Linux】地址空间&&虚拟地址
这个地址绝对不是物理地址,理论上修改了数据为300之后不可能在输出有100,访问一个地址怎么可能又是100也是300。这个地址在系统层面上称之为虚拟地址。
zxctscl
2024/04/20
4590
【Linux】地址空间&&虚拟地址
【Linux】从零开始认识进程 — 终篇
经过前三篇的认识,现在应该已经大致认识到了进程到底是什么,也认识了进程的状态,进程的优先级,环境变量等知识。今天我们继续学习,来一起认识地址空间!!!
叫我龙翔
2024/03/28
1420
【Linux】从零开始认识进程 — 终篇
由浅入深的了解进程(6)---地址空间
其中当父子进程之间的g_val改变之后,为什么即使是不同的值了之后,两个进程中的g_val的地址还是一样的? 虽然不能够确认这是什么意思,但是这个绝对不是物理地址,如果是物理地址的话,一个地址修改过值了之后不可能还能表示另外一个值,所以这个应该是虚拟地址。
薛定谔方程难
2024/08/07
910
由浅入深的了解进程(6)---地址空间
【在Linux世界中追寻伟大的One Piece】Linux进程概念
我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
枫叶丹
2024/08/06
1180
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【Linux】进程地址空间
我记得在之前的博文中好像用编译器粗略定位过各个类型地址空间的位置,这里我们再验证一下它们的相对关系,这里是32位的机器,存储空间为2^32byte=4GB
s-little-monster
2025/02/11
2700
【Linux】进程地址空间
进程地址空间
大家在学习语言阶段应该都听到过内存的概念,那么大家脑子里的固态思维就有这样一张图:
ahao
2024/04/02
1150
进程地址空间
Linux系统 —— 进程系列 - 程序地址空间:虚拟地址空间
https://blog.csdn.net/hedhjd/article/details/144404639?spm=1001.2014.3001.5502
迷迭所归处
2024/12/24
3870
Linux系统 —— 进程系列 - 程序地址空间:虚拟地址空间
进程地址空间
绝活蛋炒饭
2024/12/16
1480
进程地址空间
Linux系统-进程地址空间
如果可以直接访问,那么看到的地址就是物理地址,对于野指针,越界访问等问题则不能进行很好的控制,不能保证程序的独立性;当通过物理地址暴露,恶意程序通过物理地址进行读取或者修改数据,无法保证信息和数据安全;控制以及管理了访问的权限,以常量区不能的常属性来说,当常量定义出来的时候不就是修改数据了么,但是再次修改时,通过页表访问时,页表发现是常量区数据则拒绝修改的访问,以此保护了数据的常属性
用户9645905
2022/11/30
4K0
Linux系统-进程地址空间
深入了解linux系统—— 进程地址空间
这里我们让父子进程同时执行,然后子进程每次执行x+=10;父子进程都输出x的值和x的地址。
星辰与你
2025/05/08
920
深入了解linux系统—— 进程地址空间
【Linux】翻山越岭——进程地址空间
有了这个基本框架,我们对于语言的学习更加易于理解,但是地址空间究竟是什么❓我们对其并不了解,是不是内存呢?对于是什么这个问题,我们需要通过一个例子来进行切入,见一见现象
平凡的人1
2022/11/21
7710
【Linux】翻山越岭——进程地址空间
Linux进程地址空间
Linux进程地址空间是学习Linux的过程中,我们遇见的第一个难点,也是重中之重的重点。虽然它很难,但是,等我们真正懂得了这样设计的原理,我们不禁会感叹:这真的是太妙了。接下来,就让我么开启这一段学习之旅吧!
破晓的历程
2024/06/24
2920
Linux进程地址空间
[操作系统] 深入进程地址空间
在C语言学习的时,对程序的函数、变量、代码等数据的存储有一个大致的轮廓。在语言层面上存储的地方叫做程序地址空间,不同类型的数据有着不同的存储地址。
DevKevin
2025/01/25
980
[操作系统] 深入进程地址空间
Linux进程——进程地址空间
前言:在讲完环境变量后,相信大家对Linux有更进一步的认识,而Linux进程概念到这也快接近尾声了,现在我们了解Linux进程中的地址空间!
Eternity._
2024/06/14
6380
Linux进程——进程地址空间
linux进程地址空间
CPU上面的资源不允许同时被访问,都是没一个进程独立被使用的,一个进程的运行是不可以影响其他的进程的;
阑梦清川
2025/02/24
2230
linux进程地址空间
linux-环境变量,进程地址空间
环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数
用户10923087
2024/08/04
1160
linux-环境变量,进程地址空间
进程地址空间
  有一些细微的差别,但是并不影响,按照正常人的逻辑思维方式低地址放在下面,高地址放在上面。那么图中这些区域真的就是这样排列的吗?我们来验证一下:
用户11029129
2024/06/04
1320
进程地址空间
Linux:进程地址空间、进程控制(一.进程创建、进程终止、进程等待)
上次介绍了环境变量:Linux:进程概念(四.main函数的参数、环境变量及其相关操作)
是Nero哦
2024/05/25
3260
Linux:进程地址空间、进程控制(一.进程创建、进程终止、进程等待)
相关推荐
【Linux】进程>环境变量&&地址空间&&进程调度
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档