您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

坐井观天的:进程 | 虚拟内存 | 虚拟地址

时间:2022-10-08 14:30:39  来源:今日头条  作者:阿布编程

 进程、线程有什么区别?虚拟地址和物理地址有什么区别?让我们用一只青蛙的视角,来解读它们背后的秘密

进程、线程、虚拟地址、物理地址,这些名词既熟悉也陌生!似乎无论看多少资料,都很难准确地弄清楚它们之间的差异和存在的意义。今天我们用CPU的视角,再次会会这个老朋友,看看你是否有新的启发?

 

奇怪的内存

先写一个最简单的程序。这个程序只做两件事情:定义一个全局变量 a,并赋值为:1;然后打印出 a 的地址和数值

#include <stdio.h>
#include <unistd.h>


int a = 1;
int mAIn()
{
    printf("address: %p, value: %dn", &a, a);
    sleep(10000000);
}

将上面的代码,编辑成可执行程序:p1;接着,修改一下代码:给全局变量 a 赋值为:2,再次编译出可执行程序:p2。

好了,两个程序:p1,p2 都准备好了,让我们再以两个进程的形式,运行它们:左边的窗口进程,运行p1;右边的窗口进程,运行p2

 

发现问题了吗?无论是 p1 还是 p2,它们输出的 a 的地址都是一样的,但 a 的值却不一样!难道同一个内存地址里面,既能存放 1,也能存放 2?

当然不是,原来0x555555558010是虚拟地址,并不是真实的物理内存地址,进程p1的0x555555558010,跟进程p2的0x555555558010,没有任何关系!

虚拟地址,只在进程内,是有意义的;可以用来指示不同变量,所对应的不同内存地址;但一旦跳出单一进程,在进程之间比较虚拟地址,就没有任何意义了!

 

MMU

是什么软件,拥有如此的魔力?能让进程p1和进程p2的内存空间完全隔离?答案不是软件,而是硬件 — 现代CPU的协处理器:MMU

MMU的工作原理,未来我们还会详细阐述,这里只说结论:无论是进程p1,还是进程p2的,它们的变量 a 的地址都是虚拟地址,看上去是同一个地址,但实际上,已经被 MMU 映射到了不同的物理地址上去了。这就是“进程”最显著的特点:空间独立性。

 

举个例子,进程就像一只井底之蛙,它固执地认为:自己已经拥有整个天空;但它永远不知道:天空到底有多大。更不知道:周围还有很多跟它有一样想法的井底之蛙,而 MMU 就是束缚这些青蛙视野的井,每一口井,就是一个:进程空间。

 


 

进程 vs 线程

那看来全是 MMU 惹的祸,不要 MMU 行吗?当然可以,但一旦没有井的束缚,所有的青蛙,都跳到地面上,它们都可以看到一个完整的天空,所以,没有 MMU,进程也就不存在了,进程被降级成了:线程。

这样的例子很多,例如:在没有 MMU 的单片机。你就只会遇到线程或者叫:task,根本没有“进程”的概念。

在 MMU 出现之前,计算机的世界里面,只有“线程”,在 MMU 出现之后,“进程”才真正落地,因为没有 MMU,就没有办法实现:内存空间的隔离,也就根本无法实现“进程”要求的:空间独立性。

至于“进程”中的多“线程”就很容易理解了。就是:一堆青蛙,都放在一个井里。而且,它们都认为自己拥有整个天空。

 

因为,这些“线程”都处于同一个“进程”空间中,大家可以相互访问,完全没有任何限制。这使得用“线程”实现多任务编程,会非常便利。

 

但也因为这种对安全的忽视,一旦任何一个“线程”崩溃

 

所有的“线程”都不能幸免,大家一荣俱荣,一损俱损!

 

所以,网络服务器一般都会使用“多进程”,而很少使用“多线程”。这样即使某一个用户的服务进程崩溃了,其他“进程”还能继续正常工作。这样,就不会因为某个用户的访问失败,而导致其他用户也无法访问服务器。

 

好了,这可能就是你永远弄不清楚:“线程”和“进程”的原因,因为,这不仅仅是:一个软件问题,更是一个 MMU 的问题。以后你再跟人讨论“线程”、“进程”的时候,一定要先问一下:有 MMU 吗?

 

总结

  1. 进程就像一只井底之蛙,虽然看上去,它可以读/写整个64位(假设CPU是64位的)的虚拟内存空间:void write_memory()
    {char*p = 0;
    for(unsigned long offset = 0; offset<= 0xFFFFFFFFFFFFFFFF; offset++)
    {*(p + offset) = 0x55;
    }} 但天到底有多大,真实的物理内存空间到底有多少?除了操作系统和MMU,没有人能知道。
  2. 进程间的空间隔离,让进程之间的信息共享没有线程那么方便,但也大大提高了整个系统的安全性;再也不会因为某一个应用程序的崩溃,导致计算机重启。还记得红白机上的reset按键吗?

 

任何一个游戏程序的崩溃,都需要通过reset来重启/恢复系统。

3. 进程间的空间隔离,让恶意程序无法再扫描整其他程序的内存或整个物理内存,任何程序只能在自己的一亩三分地里面干活。通过游戏修改器,玩《仙剑奇侠传》的日子,不会再有了。

 

这样看来:生活在“井”里,也没有什么不好。

 

热点问题

Q1:谁在分配:虚拟地址?

A1:程序员在代码中编写的:任何变量、函数、数据结构,在编译过程中,都会被编译器安排了一个内存地址,这个地址就是虚拟地址。

 

Q2:虚拟内存的好处?

A2:好处是:编译器在生成可执行程序时,可以更加自由的分配:代码中变量的内存地址,不用关心它在实际运行环境中,应该是多少?也不用关心运行环境的内存是否够用。

相同的 exe文件,同时运行2次,也不用担心它们同名的变量或函数,会在内存中重叠在一起。因为它们都用的是虚拟地址,无论外表多么相似,都可能被分配在不同的“物理地址”上。

此外,当程序所需的内存大于计算机的实际内存时,虚拟内存机制可以用硬盘来给内存“扩容”。

 

Q3:我电脑的内存有8GB,那跑在该电脑上的程序,其虚拟地址空间,也只能有8GB吗?

A3:虚拟地址的空间大小,取决于CPU的位数,32位CPU对应的虚拟地址空间为:0~0xFFFFFFFF(4GB),64位CPU对应的虚拟地址空间为:0~0xFFFFFFFFFFFFFFFF(16384PB),它们跟真实的物理内存大小,没有关系。

 

Q4:为什么我执行实例代码的时候,输出的 a 的内存地址总是在变化?

A4:新版本的linux对虚拟内存进行了保护,作了随机化处理,为了达到文章所述的效果,需要取消这种随机化处理。请在运行程序之前,在命令行中输入如下命令:

echo 0 > /proc/sys/kernel/randomize_va_space


Tags:虚拟内存   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
电脑虚拟内存怎么设置?1分钟快速增加内存!
“我电脑里的内存好像不太够用,因此,我想在电脑里增加一些虚拟内存。不知道我应该怎么操作呢?有什么比较简单的此操作方法吗?” 虚拟内存是计算机系统内存管理的一种技术,它为程...【详细内容】
2024-02-06  Search: 虚拟内存  点击:(62)  评论:(0)  加入收藏
虚拟内存对于游戏性能的影响及优化方法
虚拟内存作为计算机系统中的一个重要组成部分,对于游戏性能的影响也不可忽视。本文将介绍虚拟内存对于游戏性能的影响,并提供一些优化方法,以帮助玩家提升游戏的流畅度和体验。...【详细内容】
2023-11-02  Search: 虚拟内存  点击:(262)  评论:(0)  加入收藏
windows11系统电脑的虚拟内存设置方法
电脑如果同时打开多个应用程序或者是在看电影游戏过程中常发现有时卡的很,电脑卡顿的问题千千万万,有一条就是虚拟内存似乎不够或不合理。内存占用率太高只有设置虚拟内存才可...【详细内容】
2023-07-09  Search: 虚拟内存  点击:(131)  评论:(0)  加入收藏
虚拟内存 & I/O & 零拷贝
作者:mosun,腾讯 PCG 后台开发工程师一、虚拟内存 1.1 虚拟内存引入我们知道计算机由 CPU、存储器、输入/输出设备三大核心部分组成,如下:CPU 运行速度很快,在完全理想的状态下,存...【详细内容】
2022-10-13  Search: 虚拟内存  点击:(306)  评论:(0)  加入收藏
坐井观天的:进程 | 虚拟内存 | 虚拟地址
“ 进程、线程有什么区别?虚拟地址和物理地址有什么区别?让我们用一只青蛙的视角,来解读它们背后的秘密”进程、线程、虚拟地址、物理地址,这些名词既熟悉也陌生!似乎无论看多少...【详细内容】
2022-10-08  Search: 虚拟内存  点击:(238)  评论:(0)  加入收藏
彻底搞懂虚拟内存,虚拟地址,虚拟地址空间
程序经过编译后,变成了可执行的文件,可执行文件主要包括代码和数据两部分,代码是只读的,数据则是可读可写的。可执行文件由操作系统加载到内存中,交由CPU去执行,现在问题来了,CPU怎...【详细内容】
2021-04-25  Search: 虚拟内存  点击:(523)  评论:(0)  加入收藏
Linux内核虚拟内存管理之匿名映射缺页异常分析
前面讲到过写时复制缺页异常(COW),一般用于父子进程之间共享页,而我们会常见一种缺页异常是匿名映射缺页异常,今天我们就来讨论下这种缺页异常,让大家彻底理解它。注:本文使用linux-5.0内核源代码。文章分为以下几节内容:...【详细内容】
2020-09-10  Search: 虚拟内存  点击:(285)  评论:(0)  加入收藏
虚拟内存 和 page fault 的解释
Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样进程就可以很方便地访问内存,更确切地说是访问虚拟内存。1、什么是虚拟内存假设某个进...【详细内容】
2020-08-17  Search: 虚拟内存  点击:(766)  评论:(0)  加入收藏
聊聊虚拟内存
大家好,我是良许。熟悉计算机的小伙伴都知道,我们常说的主机三大件分别是主板,CPU,内存,可见内存在计算机主机中的角色也非同一般,喜欢 DIY 主机的小伙伴对这三大件的了解更是精益...【详细内容】
2020-08-11  Search: 虚拟内存  点击:(299)  评论:(0)  加入收藏
虚拟内存技术的前世今生
在20世纪60年代及70年代早期,计算机内存十分昂贵,而随着计算机的发展,计算机应用程序越来越大,系统内存无法满足应用程序的需求,虚拟内存技术应运而生,它可使内存耗量大的软件运行...【详细内容】
2020-03-17  Search: 虚拟内存  点击:(718)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
站内最新
站内热门
站内头条