首页 > 系统相关 >内存是如何工作的

内存是如何工作的

时间:2024-01-31 22:32:53浏览次数:19  
标签:操作系统 程序员 申请 内存空间 如何 内存 工作 CLR

一、什么是内存

从外观上辨识,它就是内存条;从硬件上讲,它叫RAM,翻译过来叫随机存储器。英文全称:Random Access Memory。它也叫主存,是与CPU直接交换数据的内部存储器。其特点是读写速度快,不是一般的快,是我们想像不到的快。

我们可以把内存想像成小时候写作文的本子,只不过,内存的每一行数据都有一个唯一的地址。所以从软件上讲,内存被操作系统管理,根据地址进行寻址和读写数据。对于程序而言,内存是一个逻辑上连续的空间,装载着运行时的程序和数据。为什么说是逻辑上呢,因为有的电脑从物理上看,它可能有两根或以上的内存条,它们都插在主板上,由操作系统将所有的内存条的地址统计进行“登记”,所以,很可能某个程序的一部分存在第一根内存条上,另一部分存在第二根内存条上。但是我们是感知不到的。

内存一般按照字节来编址,从 0 开始,也就是说,地址 0 代表第一个字节,地址 1 代表第二个字节,4GB 的内存,有 2*10^32 个字节,最大的地址就是 2*10^32 - 1,用十六进制表示就是 0xFFFFFFFF,这也是为什么 32 位的操作系统,最大支持 4GB 物理内存的原因,而64位操作系统理论上的寻址空间为2的64次方bit,转化单位为2147483648GB,这只是理论值,目前64位windows系统最大只支持128G。

我们可以把内存看成是一家酒店,地址号代表了房间号,每个房间只能住一个人(一个字节),因为内存被设计成单间。如果要住两个人,那只能开两间房。操作系统是酒店的前台小姐姐,负责房间管理工作。她会知道酒店哪些房间已订或空闲,但是她也是酒店的一员,所以,她也要占用房间,至于占用多少房间,取绝于前台小姐姐这个部门的人数。比如早期的WinXp系统就比较小,启动后所占内存500M-1G,到了如今的WIN11系统,原本16G的内存只剩下80%可用,起码要占用2G的内存空间。行政机构真是越来越臃肿!

内存是如何工作的_数据

程序员的本质工作是什么?

找到前台小姐姐订房,然后将数据和指令安排入住到房间里(这一过程其实是酒店管理人员负责,程序员不用管),操作系统会执行这些指令去处理数据,待处理结束,再将处理好的数据永久保存到外存或输入到其它地方(比如打印出来)。这里会涉及到退房,像C和C++语言,需要程序员来退房,像C#语言则不需要,因为,实际上程序员委托了一家代理商(CLR公共语言运行时)来做开房和退房的工作。

然而在实际程序运行时,有可能出现房间已满无法开房的状态,这个时候可以申请超出物理大小的内存 ,这是因为操作系统提供的其实是虚拟内存(把隔壁的仓库拿出一部分临时改造成酒店的房间),很大一部分申请到的内存,只是建立了映射关系,并没有落到 RAM 里,也有可能一部分内存被交换到了磁盘的 swap 区里。

二、内存装入

不管是操作系统,还是应用程序,它们都存储在硬盘(外存)里面。当我们启动计算机时,首先会点亮主板电源,进而加载并启动主板上的输入输出引导系统(俗称BIOS),这个引导系统会找到硬盘上的操作系统,然后加载操作系统,这个过程实际上是将硬件上的操作系统程序读入到内存。待操作系统完全启动后,将接管对硬件的管理,包括内存的管理。这时,一个16G的内存区域,除了操作系统本身占用了一部分,剩下的区域就等待其它软件和数据去使用。

而程序员要作的,就是开发软件,从操作系统那里申请内存空间,用来存放软件要处理的数据。至于应用软件本身会占据多少内存,如何分配和装入,这一切都交由操作系统来处理。

程序员如何从操作系统哪里申请内存

这一点十分简单,C#有多种数据类型,每种数据类型所占的内存空间大小是不同的,我们会按需申请,绝不浪费,而申请内存的工作其实是交给C#的“运行时”去完成的,我们只需要告诉它一声就行了。即通过new关键词来告诉运行时帮我们开辟内存空间。

在C语言和C++语言中,程序员需要自己主动向操作系统申请空间,待使用完后,再主动销毁,将借来的内存还给操作系统。但是,由于在操作系统和C#之间还存在一个叫CLR运行时的框架,所以,C#程序员在申请内存空间时,其实并不是直接向操作系统申请,而是由CLR运行时在帮助我们完成这一操作。所以,我们申请了内存空间后并不需要还给操作系统,只要这段内存空间不再使用,CLR运行时会帮我们还给操作系统的(即CLR的垃圾回收器支持自动内存管理)。哈,多么人性化的操作!

凡是都有利有弊。CLR的垃圾回收器有时候并不会及时回收内存,而程序员开发出来的软件,因某些业务要不断的申请新的内存空间,总有一刻,内存会被申请完,导致内存不足,程序崩溃。所以,了解内存的结构和正确使用内存,对于立志成为一名高级程序员而言,尤为重要。

C#里面也有及时回收内存的指令,特别是我们申请了超大的连续内存空间,在使用完后,最好及时告诉CLR的垃圾回收器,有借有还,再借不难。

——重庆教主 2023年11月30日

标签:操作系统,程序员,申请,内存空间,如何,内存,工作,CLR
From: https://blog.51cto.com/wpfsoft/9516750

相关文章

  • [经验] 城市道路绿化如何有效实施
    城市道路绿化是指通过在城市道路中种植绿化植物,创建绿色空间,以达到美化城市环境、改善城市气候和生态环境等目的的活动。在城市道路绿化的实践中,还应注意绿化植物的品种选择、养护管理等问题,以确保城市道路绿化的效果和质量。一、城市道路绿化的优势城市道路绿化具有以下几个方面的......
  • [office] 如何理解Excel公式中的各种符号?
    Q:在Excel公式中,我们会使用各种符号连接数字、单元格或函数,从而获得想要的结果,例如,=SQRT((1234-234)/1)^2。能够总结一下这些符号的使用吗?A:下面是Excel公式中使用的常用符号及说明。+–*/基本的算术操作符:加、减、乘、除。例如,1+2,9-6,11*9,63/7,3+5*2%百分数值。例如,4/5%,结果为8。......
  • [office] excel2010工作表的切换与重命名
    在使用excel工作表时,我们可能会对多个工作表进行来回切换查看,今天小编为大家介绍一下如何切换工作表及重命名工作表。一、切换工作表切换工作表主要有两种方法:1、直接使用鼠标对工作表标签sheet进行点击切换;2、使用快捷键,ctrl+pageup和ctrl+pagedown键,可以快速进行工作表切换。二......
  • [office] excel如何加粗表格边框
    excel表格中,表格边框都是细细的,想要进行加粗,应该怎么做呢?下面随小编一起来看看吧。excel加粗表格边框的方法一选中单元格区域,点击“开始”选项卡直接选择边框按钮中的粗匣框线,即可excel加粗表格边框的方法二右击单元格区域,点击“设置单元格格式”切换......
  • 火山引擎ByteHouse:分析型数据库如何设计并发控制?
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群分析型数据库设计并发控制的主要原因是为了确保数据的完整性和一致性,同时提高数据库的吞吐量和响应速度。并发控制可以防止多个事务同时对同一数据进行修改,导致数据不一致的情况发生。通过合......
  • [word] Word小技巧:如何替换多个文字
    Word如何替换多个文字?我们写用word文档写一些文章,或者是一些使用说明书,在我们写完的时候检查时,发现说明书里面的产品名称都写错了,因为产品名称出现的次数比较多,要一个一个修改的话会很耗时间,小Q来教大家一个快速替换多个文字的方法。1、打开word文档,按快捷键:Ctrl+H调出替换面板。2......
  • EasyCVR接入单兵设备后如何配置移动规矩
    近期有用户需要将单兵设备接入EasyCVR进行轨迹展示,让技术人员协助对EasyCVR配置,具体步骤如下:1、首先在EasyCVR配置文件easycvr.ini中找到订阅subscribe=1,开启订阅;2、随后在单兵设备里面把相机ID编码配置和设备ID编码保持一致并以GB28181方式接入到EasyCVR平台中;3、接入到EasyCVR平......
  • ComfyUI 安装教程 Animatediff 1000张工作流分享 请收藏
    最近SD的大更新比较少,所以最近转战到ComfyUI,从流程节点,到工作流搭建,使用ComfyUI实现webui的大部分功能,且节点的定义性很强,这就造就了ComfyUI的多样性,但是不得不承认,多节点之间的搭配,是否符合整个底层流程,通过一个工作流实现多节点插件的配合工作是比较复杂的,而ComfyUI不近支持GPU还......
  • 记录--你的网站如何接入QQ,微信登录
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助主要实现步骤对接第三方平台,获取第三方平台的用户信息。利用该用户信息,完成本应用的注册。qq登录接入接入前的配置qq互联登录后,点击头像,进行开发者信息填写,等待审核。邮箱验证后,等待审核。审核通过后,然......
  • vue3-setup中如何通过ref调用子组件的函数
    vue3-setup中如何通过ref调用子组件的函数子组件通过defineExpose向外导出需要调用的函数在父子间中定义ref引用来调用子组件关键代码:<scriptsetup>import{ref,reactive,defineExpose}from'vue'constshow=ref(false);consttitle=ref('添加收款方式');con......