『 Linux 』重新理解挂起状态

文章目录

    • 🦄 前言
    • 新建状态 🐋
    • 挂起状态 🐋
    • 唤入唤出 🐋
    • 进程与操作系统间的联系 🐋


🦄 前言

请添加图片描述

『 Linux 』使用fork函数创建进程与进程状态的查看中提到了对挂起状态的一个理解;

挂起状态相比于其他状态来说,挂起状态与CPU并没有太直接的关系;在计算机的磁盘当中,存在着一个swap分区,这个分区就是为了当内存不足时使进程状态转化为挂起状态而准备的;

在队列当中的进程不仅仅是PCB结构体,由于各个进程要通过使用资源来操作自身的代码及数据可以得知一个进程中除了PCB结构体以外还包含着对应的代码以及数据;而挂起状态即为:

当内存严重吃紧时,操作系统会将这个进程所对应的代码及数据交换至磁盘中的swap分区从而到达减轻内存的负担,当这个进程对应的代码及数据被交换至swap分区时这个进程即为挂起状态;

在这里插入图片描述


新建状态 🐋

请添加图片描述

从『 Linux 』进程地址空间存在的意义 博客中可以知道,加载的本质就是创建进程,在一个进程的创建中,OS在初始化进程地址空间时往往采用延迟加载的策略使得能够更有价值的发挥内存的作用;

所以在一个进程创建之后,OS并不会立马为该进程分配对应的物理内存并在页表中建立映射关系;

当一个进程被创建时只初始化其对应的内核数据结构而并未申请对应物理内存(分配内存建立映射关系)时,这个状态即为新建状态;

在这里插入图片描述

这个状态下内核数据结构已经被初始化完毕;

当内存管理单元(MMU)对进程的页表的映射中未找到对应的映射关系,内存管理单元将会向OS反馈这个异常状态,这个异常状态就是 “缺页中断”;

OS获取到缺页中断的异常状态时将会去把磁盘中的代码和数据加载进内存当中;


挂起状态 🐋

请添加图片描述

在前言中提到对于挂起状态的概念性理解,而在实际上挂起状态不能完全理解为一个进程的当前状态,更能理解为一个进程中的部分代码和数据的状态;

举一个例子:

内存作为计算机中的断电易失存储介质其有着读写速度快的优点,其根据计算机的配置不同有着不同的大小(4GB,8GB…);

而某些游戏的大小少则几十GB,大则上百GB,所以将这个程序中的所有的代码和数据加载同时加载进内存当中是不可能的,所以计算机在处理这些大型程序时将以延迟加载的策略,但本质上进程内所对应的内核数据结构已经被创建;

内存管理单元(MMU)检查到页表中的虚拟地址不存在对应的映射关系将产生缺页中断的异常状态并通知OS分配内存加载数据,以这种延迟加载的策略使得内存能够更加高效的被利用;

但本质上为了内存的高效利用仅仅只是利用延迟加载方式以分批加载的策略并不能完美的使内存被高效利用;

当进程中部分的代码和数据被执行完毕后将持续保存在内存当中一段时间,这种策略叫做页面缓存(page caching);

在页面缓存中,OS会将最近使用过的页面 (包括代码和数据) 保留在内存当中一定时间,以便在将来可能需要再次访问这些内容时能够更快的获取,以提高进程整体的效率;

而当进程间的一些页面长时间未被进程访问使用,或者是在内存吃紧的情况下,OS将会把这些不常用的页面(包括代码和数据)移动至磁盘的swap分区当中以便释放内存使内存能够有效利用;

这种将页面移至磁盘swap分区的行为称为唤出;

而这些被存放进磁盘中swap分区数据的这种状态被称为挂起状态;

所以挂起状态不能完全称之为一个进程的状态,当进程仍在调度队列运行时,其某些页面可能已经进行了唤出并发生了页面置换,也就成为了概念中的挂起状态;

在这里插入图片描述

当进程中已经执行了代码和数据或者是并不常用的页面(包括数据和代码)被唤出至swap当中时,OS将会重新在页表中对这个唤出的页面进行重新建立新的映射关系,这个映射关系将从物理内存地址移至磁盘中的swap分区,这种行为被称作页面置换;

需要注意,在新建状态中,对于数据的"内存分配调度"取决于内存管理单元(MMU)对是否存在有效页表映射关系的检查所反馈的异常状态(缺页中断),并不会像此处一样建立对应的映射关系;

当然,当磁盘中的swap分区占满时,OS通常会选择释放swap分区中的部分数据,以腾出一定的空间来满足系统的内存需求,这个过程通常被称为"交换调度";

当系统中所有可用的存储空间(包括物理内存与swap分区)都已被占满时,OS才可能会因为内存不足而报错,导致系统无法正常运行;


唤入唤出 🐋

请添加图片描述

在这里应该进行区分一下,当内存管理单元(MMU)对页表的映射关系进行检查时若是未找到对应的映射关系时将会向OS发送异常状态(缺页中断),OS根据对应的异常状态对进程进行对应处理;

这里的概念是对于上文中提到新建状态以及对进程进行的延迟加载所对应的策略方法,这种方法被称为"内存分配"或是"内存分配调度";

本质上与唤入(page in) 唤出(page out) 并没有关系,唤入唤出指的是对于不常用的页面加载进磁盘中的swap分区与当这个数据重新要被使用时从swap分区再次加载进内存的概念;

二者不能相提并论;


进程与操作系统间的联系 🐋

请添加图片描述

从上文中可以总结出,实际上进程可以看作一个静态的容器;

它的作用本质上只是表示了一个程序在执行过程中的状态和资源集合(包括代码,数据,寄存器状态等);

本质上进程并不具备行为;

概念上理解的进程的行为本质上是由OS其他硬件来共同完成的;

OS负责管理进程的创建调度销毁,以及资源分配等;

硬件包括中央处理器(CPU),进程管理单元(MMU)其他设备等;

从上文可以得出结论,实际上操作系统与内存管理单元之间的关系是互相协作的;

操作系统负责管理系统资源,包括内存管理;一般用来分配内存,管理进程和线程的地址空间,或是调度内存中的页面;

而内存管理单元一般负责将页表中的虚拟地址转化为物理地址并在需要的时候执行内存访问权限的检查,同时检查页表中是否存在有效的映射关系 触发"页面中断" 使得操作系统能够以"延迟加载"的策略高效使用内存;

操作系统和内存管理单元的共同协作实现了对内存的有效管理和保护;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/254431.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫练习-获取imooc课程目录

代码: from bs4 import BeautifulSoup import requests headers{ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0, }id371 #课程id htmlrequests.get(https://coding.imooc.com/class/chapter/id.html#Anchor,head…

kubernetes 学习笔记

1. Kubernetes 介绍 1.1 应用部署方式的演变 在部署应用程序的方式上,主要经理了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上。虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚…

高可用接入层技术演化及集群概述

集群概述 集群的介绍及优势 集群:将多台服务器通过硬件或软件的方式组合起来,完成特定的任务,而这些服务器对外表现为一个整体。集群的优势 高可靠性:利用集群管理软件,当主服务器故障时,备份服务器能够自…

Cesium 加载 Geoserver WMS 图层以及条件查询和切换图层样式

Cesium 加载 Geoserver WMS 图层以及条件查询和切换图层样式 图层样式核心代码完整代码:在线示例 Cesium 加载 Geoserver WMS 图层,在实际项目中常常会遇到,需要对图层进行过滤,这里介绍一下过滤方法。 Cesium Geoserver 图层条件…

AirPodsPro3爆料汇总,2025年发布?

不止是iPhone,苹果的AirPods Pro系列耳机也是非常受用户青睐的一款产品,相信不少果粉都非常期待它的升级换代。 第一代AirPods Pro于2019年10月发布,第二代AirPods Pro于2022年9月发布,按照这个时间线来看的话,第三代A…

《Linux C编程实战》笔记:进程操作之创建进程

进程是一个动态的实体,是程序的一次执行过程。进程是操作系统资源分配的基本单位。 以下是一些概念,我就直接抄书了 进程是操作系统的知识,简单理解的话,你写的代码运行起来算一个进程? 创建进程 每个进程由进程ID号…

在vue项目中,数据已经在页面渲染,但在后续操作时获取不到数据

如下图 产生这个问题的原因 异步问题 如何解决 方法一:可以将其存放在一个setTimeout里面(利用一个极小的延迟来获取数据),如下图 效果 方法二:将操作放入axios里面,如下图

昂首资本发现原油价差这样用,难怪银行这么富

难怪银行这么富,原来是发现一个稳定产生利益的投资策略。虽然这个利润可能看起来比较少。但是昂首资本需要提醒各位投资者的是:首先,这个策略几乎没有风险。第二,这是一个可以复制的投资策略。 下面昂首资本就通过原油的价差进行实…

开发信怎么写回复率高?写外贸邮件的技巧?

如何打造高回复率的开发信?有效的开发信模板推荐? 如何写一封能够引起客户兴趣并提高回复率的开发信变得至关重要。开发信是建立联系、促进销售和扩大业务的关键工具之一。蜂邮EDM将探讨一些关键策略,帮助你提高开发信的回复率,确…

爬虫图片验证码处理

图片验证码处理 目前&#xff0c;很多网站为了防止爬虫爬取&#xff0c;登录时需要用户输入验证码。下面我们学习如何在爬虫程序中识别验证码。 其中包含验证码。 页面中的验证码图片对应一个<img>元素&#xff0c;即一张图片&#xff0c;浏览器加载完登录页面后&#…

Spring 6(二)【IOC原理】

前言 IOC 是Spring的两大核心概念之一&#xff0c;它是一种思想&#xff0c;需要极其熟练的掌握。 今日摘录&#xff1a; 低能无聊的人太多。说他们勤勉&#xff0c;不过是因困为不会合理分配时间&#xff1b;说他们积极&#xff0c;不过是逃避其他困难工作而已。即便说工作只…

DNN二分类模型

import os import datetime#打印时间 def printbar():nowtime datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)print("\n"""*8 "%s"%nowtime)#mac系统上pytorch和matplotlib在jupyter中同时跑需要更改环境变量 os.environ["KMP_DUP…

【网络安全】-Linux操作系统—操作系统发展历史与Linux

文章目录 操作系统发展历史初期的操作系统分时操作系统个人计算机操作系统 Linux的诞生UNIX与GNU项目Linux内核的创建 Linux的特点开放源代码多样性社区支持 Linux的应用服务器和超级计算机嵌入式系统桌面系统 总结 操作系统发展历史 操作系统&#xff08;Operating System&am…

详细教程 - 从零开发 Vue 鸿蒙harmonyOS应用 第五节 (基于uni-app封装鸿蒙接口请求库)

随着鸿蒙系统的兴起,越来越多的app会采用鸿蒙开发。而鸿蒙开发必不可少的就是调用各种接口服务。为了简化接口的调用流程,我们通常会做一层封装。今天就来讲解一下,如何用uni-app封装鸿蒙的接口请求库。 一、新建项目 首先我们要新建一个鸿蒙项目啦&#xff01;当然选择第一个…

neuq-acm预备队训练week 9 P1119 灾后重建

解题思路 本题可以用最短路算法——Floyd AC代码 #include<bits/stdc.h> #define inf 1e9 using namespace std; const int N 2e2 50; int n, m, q, now 0, a, b, c, t[N], G[N][N];int main() {scanf("%d%d", &n, &m);for(int i 0;i<n;i)sc…

044.Python异常处理_手动抛出异常自定义异常

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

ubuntu 磁盘挂载

1.前提 给自己的计算机加了一个新硬盘&#xff0c;怎么在ubuntu中使用呢 特别提示&#xff01;对磁盘操作存在一定丢失数据的风险&#xff0c;本篇是在一个新购买的硬盘上进行操作&#xff01;如果你使用的是一个带数据的硬盘&#xff0c;请勿参考本篇文章&#xff01; 2.找…

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imread’

解决&#xff1a;AttributeError: module ‘scipy.misc’ has no attribute ‘imread’ 文章目录 解决&#xff1a;AttributeError: module scipy.misc has no attribute imread背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退&#xff08;不推荐&#…

记录 | Visual Studio报错:const char*类型的值不能用于初始化char*类型

Visual Studio 报错&#xff1a; const char *”类型的值不能用于初始化“char *”类型的实体错误 解决办法&#xff1a; 1&#xff0c;强制类型转换&#xff0c;例如&#xff1a; char * Singer::pv[] {(char*)"other", (char*)"alto", (char*)"c…

会旋转的树,你见过吗?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…
最新文章