可用内存为什么可以超过实际内存

一、虚拟CPU和虚拟内存:

1、虚拟cpu:

利用进程机制,所有的现代操作系统都支持在同一时间来完成多个任务。尽管某个时刻,真实的CPU只能运行一个进程,但是从进程自己的角度来看,它会认为自己在独享CPU(即虚拟CPU),而从用户的角度来看多个进程在一段时间内是同时执行的,即并发执行。在实际的实现中,操作系统会使用调度器来分配CPU资源。调度器会根据策略和优先级来给各个进程一定的时间来占用CPU,进程占用CPU时间的基本单位称为时间片,当进程不应该使用CPU资源时,调度器会抢占CPU的控制权,然后快速地切换CPU的使用进程。这种切换在用户的视角中对程序执行毫无影响,可以认为是透明的。由于切换进程消耗的时间和每个进程实际执行的时间片是非常小的,以至于用户无法分辨,所以在用户看来,多个进程是在同时进行的。

1.1、调度器和优先级:

Linux内核存在一个专门用来调度进程的内核线程,称为调度器。调度器的基本工作是从一组处于可执行状态的进程中选择一个来执行,Linux提供了抢占式的多任务模式。调度器会决定某个进程在什么时候停止运行,并且可以让另一个线程进入执行,这个动作即所谓的抢占

传统的Linux操作系统采用的时间片轮转法。这种方法的大致流程是:调度器它把所有的可运行的非实时的进程组织在一起,这个数据结构被称为就绪队列。通常调度器取一个固定时间作为调度周期,当一个调度周期开始的时候,调度器回味就绪队列当中的每个进程分配时间片,每个进程能够获取的时间片长度和进程的优先级有关。正在执行的进程会在执行的过程中逐渐消耗它的时间片,当时间片耗尽时,如果该进程仍然处于运行状态,那么它就会被就绪队列中的下一个进程抢占。如果整个调度周期执行完成,调度器就会抢占该进程,并且根据优先级分配新的时间片。

在进程执行过程中,会出现等待IO操作的情况。此时,进程就会从就绪队列当中移除,并且将其放入等待队列,并且将自己的状态调整为等待状态。进程运行终止时,进程也会从就绪队列中移除。

当进程被创建或者被从等待状态唤醒时,调度器会根据优先级分配时间片,再将其插入到就绪队列当中。

二、虚拟内存

在进程本身的视角中,它除了会认为CPU是独占的以外,它还会以为自己是内存空间的独占者,这种从进程视角看到的内存空间被称为虚拟内存空间。当操作系统中有多个进程同时运行时,为了避免真实的物理内存访问在不同进程之间发生冲突,操作系统需要提供一种机制在虚拟内存和真实的物理内存之间建立映射

二、fork的写时复制:

当执行了fork了以后,父子进程地址空间的内容是完全一致,所以完全可以共享同一片物理内存,也就是父子进程的同一个虚拟地址会对应同一个物理内存字节。通常来说,内存的分配单位是页,我们可以为每一个内存页维持一个引用计数。代码段的部分因为只读,所以完全可以多个进程同时共享。而对于地址空间的其它部分,当进程对某个内存页进行写入操作的时候,我们再真正执行被修改的虚拟内存页分配物理内存并拷贝数据,这就是所谓的写时复制。在执行拷贝以后,同样的虚拟地址就无法对应同样的物理内存字节了。

再探写时复制:
当父进程使用fork创建了一个子进程以后,操作系统需要为子进程拷贝一份父进程的页表到内存当中(基本这是系统调用最令人烦恼的开销)。当子进程的某个可以写入的页被第一次写入的时候,内核会意识到对应的物理页是属于父进程的,此时会为子进程分配一个新的物理页,如果要分配的物理页不在主存储器中,此时会出发一个异常名为缺页异常,当异常处理完成以后,子进程会被分配一个新的物理页,并且物理页内容会是原来页的拷贝。这就是所谓的写时复制。

三、文件映射:

文件映射基本使用

使用mmap系统调用可以实现文件映射功能,也就是将一个磁盘文件直接映射到内存用户态地址空间的一片区域当中,这样的话,内存内容和磁盘文件内容一一对应,也不再使用read和write系统调用就可以进行IO操作,直接读写内存数据即可。

需要注意的是,mmap不能修改文件的大小,所以需要配合函数ftruncate来使用。

#include <sys/mman.h>
void *mmap(void *adr,size_t len,int prot,int flag,int fd,off_t off);
  • addr参数用于指定映射存储区的起始位置。这里设置为NULL,这样就由系统自动分配(一般是分配在堆空间里面);
  • fd参数是文件描述符,用来指示要建立映射的文件。
  • prot参数用来表示权限,其中PROT_READ|PROT_WRITE表示可读可写(open的flag应该填写O_RDWR);
  • flag参数在目前是采用MAP_SHARED。

下面是使用mmap的例子:

//假设文件本身的内容是hello#include <func.h>
int main(int argc, char *argv[])
{// ./mmap file1ARGS_CHECK(argc, 2);// 先open文件int fd = open(argv[1], O_RDWR);ERROR_CHECK(fd, -1, "open");// 建立内存和磁盘之间的映射char *p = (char *)mmap(NULL, 5, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);ERROR_CHECK(p, MAP_FAILED, "mmap"); // mmap失败返回不是NULLfor (int i = 0; i < 5; ++i){printf("%c", *(p + i));}printf("\n");*(p + 4) = '0';for (int i = 0; i < 10; ++i){printf("%c", *(p + i));}munmap(p, 5);close(fd);return 0;
}

 输出结果如下:

文件映射的底层原理: 

一个经常讨论的问题就是使用mmap和read/write的效率到底谁更高?这个问题的答案依赖问题发生所在的场景。从原理上来说,read/write是让数据在内核态的文件对象和用户态内存之间进行来回拷贝,文件对象会和一片由操作系统管理的内存区域(被称为页缓存)相关联,一般来说,操作系统会选择一个合适策略并使用专门的硬件(比如DMA设备)来同步磁盘和页缓存当中的内容,这样read/write操作最终就会影响到磁盘。而mmap的处理就更加简单粗暴,它直接把页缓存的一部分映射到用户态内存,这样在用户态当中的操作就直接对应页缓存的操作。

这样看上去的话,mmap的效率总是会比read/write更加高,因为它避免了一次数据在用户态和内核态之间的拷贝。但是考虑到read/write的特殊性质--它们总是顺序地而不是随机地访问磁盘文件的内容,所以操作系统可以根据这个特点进行优化,比如文件内容的预读等,最终经过测试--read/write在顺序读写的时候性能更好,而mmap在随机访问的时候性能更好。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安科瑞受邀参加2024年杭州建筑电气年会

24年7月4-5日&#xff0c;由杭州市土木建筑学会建筑电气专业委员会主办&#xff0c;中国联合工程有限公司&#xff0c;浙江省建设投资集团股份有限公司工程设计总院&#xff0c;大象建筑设计有限公司承办的2024年杭州建筑电气年会在杭州万华国际酒店隆重举办。杭州市各设计院所…

服务器数据恢复—RAID5阵列重建重建导致数据丢失的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器&#xff0c;有一组由5块硬盘组建的raid5磁盘阵列。 服务器在运行过程中一块有磁盘掉线&#xff0c;由于raid5阵列支持一块磁盘掉线的特性&#xff0c;服务器还在正常工作。不久之后服务器出现故障&#xff0c;管理员在不了…

【洁净室】压缩气体检测参考标准:悬浮粒子、微生物、水油检测

在洁净室&#xff0c;特别是达到ISO 5或更高级别的环境中&#xff0c;维护严格的污染控制是不可或缺的。其中&#xff0c;压缩气体的质量是一个至关重要的潜在污染源。为确保压缩气体不会引入损害洁净室完整性的微粒&#xff0c;适当的气体取样成为了一项核心任务。国际标准ISO…

C2W1.LAB.Vocabulary Creation+Candidates from String Edits

理论课&#xff1a;C2W1.Auto-correct 文章目录 Vocabulary CreationImports and DataPreprocessingCreate Vocabulary法1.集合法法2.词典加词频法Visualization Ungraded Exercise Candidates from String EditsImports and DataSplitsDelete Edit Ungraded Exercise 理论课&…

【中项第三版】系统集成项目管理工程师 | 第 5 章 软件工程① | 5.1 - 5.3

前言 第5章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术的内容&#xff0c;学习要以教材为准。 目录 5.1 软件工程定义 5.2 软件需求 5.2.1 需求的层次 5.2.2 质量功能部署 5.2.3 需求获取 5.2.4 需求分析 5.2.5 需求规格说明书 5.2.6 需求变…

C++写一个线程池

C写一个线程池 文章目录 C写一个线程池设计思路测试数据的实现任务类的实现线程池类的实现线程池构造函数线程池入口函数队列中取任务添加任务函数线程池终止函数 源码 之前用C语言写了一个线程池&#xff0c;详情请见&#xff1a; C语言写一个线程池 这次换成C了&#xff01;…

获取淘宝商品详情app原数据item_get_app响应参数解析(二):商品标题、销量、sku、价格、视频

API名&#xff1a;item_get_app 功能说明&#xff1a;通过传入商品id获取该商品的详情页原数据。因为是原数据&#xff0c;响应参数较多。 请求示例&#xff08;curl&#xff09;&#xff1a; -- 请求示例 url 默认请求参数已经URL编码处理 curl -i "https://api-服…

Java 在PDF中替换文字(详解)

目录 使用工具 Java在PDF中替换特定文字的所有实例 Java在PDF中替换特定文字的第一个实例 Java在PDF中使用正则表达式替换特定文字 其他替换条件设置 可能出现的问题及解决方案 PDF文档中的信息随时间的推移可能会发生变化&#xff0c;比如产品价格、联系方式等。为了确保…

2024可信数据库发展大会|存算分离架构驱动电信数据平台革新

7 月 16 日 - 17 日&#xff0c;由中国通信标准化协会和中国信息通信研究院主办&#xff0c;大数据技术标准推进委员会承办&#xff0c;InfoQ 联合主办的「2024 可信数据库发展大会」&#xff08;TDBC&#xff09;在北京召开。 酷克数据解决方案架构师吴昊受邀参与“电信行业数…

算法-计数质数

题目&#xff1a; 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 思路&#xff1a; 使用埃式筛法 当n大于等于2时&#xff0c;如果当前遍历的数 i 是质数&#xff0c;那么从 i*i 开始&#xff0c;直到 n 为止&#xff0c;把 i 的倍数都标记为合数 代码&a…

为什么提示词写作技能会让生成式AI工程师更上一层楼?

欢迎来到云闪世界。 “为什么我的经理对我的文章吹毛求疵&#xff1f;把措辞从 X 改为 Y 有什么区别&#xff1f;” 当你看到你的经理在你的文档中提出了无数建议时&#xff0c;你可能发现自己有这样的想法&#xff1b;我知道我有过。事实上&#xff0c;我曾经认为写作是数据科…

npm安装依赖包报错,npm ERR! code ENOTFOUND

一、报错现象&#xff1a; npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ETIMEDOUT: request to https://registry.npmjs.org/vue failed, reason: connect ETIMEDOUT 104.16.23.35:443 npm WARN registry Using stale data…

“点点通“餐饮点餐小程序-计算机毕业设计源码11264

"点点通"餐饮点餐小程序 XXX专业XX级XX班&#xff1a;XXX 指导教师&#xff1a;XXX 摘要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;微信的餐饮点餐小程序更…

《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》

这篇论文的标题《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》可以翻译为《探索对齐的互补图像对用于盲运动去模糊》。从标题可以推断,论文的焦点在于开发一种算法或技术,利用成对的图像来解决运动模糊问题,特别是在不知道模糊核(即造成模糊…

wifi preamble code, 前导码

WiFi packets 很神奇&#xff0c;自从802.11 协议诞生以来 就对信息传输 产生了无尽的影响&#xff0c; 闲来无事 看看wireless 空口包 发现 前导码 非常奇怪。 为什么前导码有两部分组成&#xff0c; 1. radiotap header 2. 802.11 radio information 并且 radiotap 是有在…

AIGC工具:IPAdapter和ControlNet 指导控制生成工具

ControlNet强调对生成过程的直接控制,如通过线条、边缘、形状等信息;而IPAdapter侧重于风格迁移和内容的间接引导。 IPAdapter 它专注于通过迁移图片风格来生成新的图像内容。IPAdapter的强项在于能够将一张图片的风格迁移到另一张图片上,实现风格融合,甚至可以进行多图风格…

CS110L(Rust)

1.Rust 语法总结 数值类型 有符号整数: i8, i16, i32, i64无符号整数: u8, u16, u32, u64 变量声明 声明变量: let i 0; // 类型推断let n: i32 1; // 显式类型声明 可变变量: let mut n 0; n n 1; 字符串 注意&#xff0c;let s: str "Hello world";…

React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

目录 1&#xff0c;介绍举例 2&#xff0c;原理和实现实现 3&#xff0c;注意点 1&#xff0c;介绍 一般情况下&#xff0c;action 是一个平面对象&#xff0c;并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…

WEB前端07-DOM对象

DOM模型 1.DOM概念 文档对象模型属于BOM的一 部分&#xff0c;用于对BOM中的核心对象document进行操作&#xff0c;它是一种与平台、语言无关的接口&#xff0c;允许程序和脚本动态地访问或更新HTML、XML文档的内容、结构和样式&#xff0c;且提供了一系列的函数和对象来实现…

工作边界感

工作边界 **明确工作边界****尊重他人的工作边界**&#xff1a;**建立有效的沟通机制**&#xff1a;**制定明确的规则和流程**&#xff1a;**保持开放和包容的心态**&#xff1a;**寻求专业支持**&#xff1a; 在程序员的日常工作中&#xff0c;会遇到很多边界问题。如果这些边…