内存是如何工作的

一、什么是内存

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

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

内存一般按照字节来编址,从 0 开始,也就是说,地址 0 代表第一个字节,地址 1 代表第二个字节,4GB 的内存,有 210^32 个字节,最大的地址就是 210^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的垃圾回收器,有借有还,再借不难。
本文原发布于:WPF中文网 wpfsoft.com
——重庆教主 2023年11月30日

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

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

相关文章

一文搞懂系列——动态库的加载方式及应用场景

引文 我们在工作中经常会遇到动态库链接的问题,因为正常的方式并不能满足我们的场景。常见的问题可以总结如下: 系统路径默认路径、usr/lib、/lib 目录,不会集成第三方动态库。 同名动态库可能在多个路径中存在。 针对不同的场景&#xff0…

替代AMS1117-ADJ可调输出线性稳压器(LDO)

1、概 述 PC1117-ADJ/1.2/1.5/1.8/2.5/2.85/3.3/5是最大输出电流为1A的低压降正向稳压器,其中 PC1117-ADJ是可调输出电压版,只需要两个外接电阻即可实现输出电压在1.25V~13.8V范围内的调节,而PC1117-1.2/1.5/1.8/2.5/2.85/3.3/5是固定输出1.…

【陈老板赠书活动 - 19期】-2023年以就业为目的学习Java还有必要吗?

陈老老老板🦸 👨‍💻本文专栏:赠书活动专栏(为大家争取的福利,免费送书) 👨‍💻本文简述:生活就像海洋,只有意志坚强的人,才能到达彼岸。 👨‍&am…

vector向量详解,小白快速入门

1.vector是什么 vector名为向量&#xff0c;其实就是一个长度可变的数组 是连续的顺序的储存结构&#xff08;和数组一样的类别&#xff09;&#xff0c;但是有长度可变的特性。 2.vector的初始化 vector<int> v; 一维可变数组&#xff0c;类型为int&#xff0c;名称…

xampp环境安装

XAMPP是完全免费且易于安装的Apache发行版&#xff0c;其中包含Apache、MariaDB、PHP和Perl。 类似XAMPP的服务器套件还有很多&#xff0c;我用过的还有UPUPW&#xff0c;它们都极大的简化了开发环境的配置。 下载链接Download XAMPP 我选的最新的 一路next就安装好了。

Cesium 太阳光晕

Cesium 太阳光晕 基于后处理实现位置动态跟随太阳实际位置可以动态改变颜色 viewer.camera.flyTo({destination: { "x": -2471386.549378386, "y": 4838798.836366257, "z": 3329936.5717575867 },duration: 0,orientation: {heading: Cesium.M…

蓝桥杯真题:分巧克力(二分法)

由题目可知,该题的最终结果具有单调性,边长越大,可分蛋糕越少 可以用二分模板的向右找: 整数二分 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {static int n,k; //n个块蛋糕,k个学生static int N 10…

【开源】基于Vue.js的人事管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 079 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S079。} 文末获取源码&#xff0c;项目编号&#xff1a;S079。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员功能模块2.2 普通员工功能模块…

【网络安全】虚假IP地址攻击如何防范?

在当今的网络时代&#xff0c;虚假IP地址攻击已成为一种新型的网络攻击方式&#xff0c;给网络安全带来了极大的威胁。那么&#xff0c;什么是虚假IP地址攻击&#xff1f;又如何进行溯源和防范呢&#xff1f;本文将为您揭开这一神秘面纱。 一、虚假IP地址攻击概述 虚假IP地址攻…

ISP算法简述-BLC

Black Level Calibration, 黑电平矫正 现象 1)在纯黑条件下拍张图&#xff0c;你会发现像素值不为0 2)或者你发现图像整体偏色 这些问题可能是黑电平导致的。 原因 存在黑电平的原因有2个&#xff1a; 1)sensor的电路本身存在暗电流。暗电流主要产生在光电信号转换过程中&#…

quickapp_快应用_生命周期

生命周期 APP的生命周期页面组件的生命周期页面栈页面的生命周期onBackPressonMenuPress踩坑 onRefreshonConfigurationChanged页面滚动 自定义组件的生命周期父子组件初始化生命周期执行顺序 APP的生命周期 App的生命周期在app.ux 中定义的回调函数。 onCreate() {prompt.sh…

Apache solr XXE 漏洞(CVE-2017-12629)

任务一&#xff1a; 复现环境中的漏洞 任务二&#xff1a; 利用XXE漏洞发送HTTP请求&#xff0c;在VPS服务器端接受请求&#xff0c;或收到DNS记录 任务三&#xff1a; 利用XXE漏洞读取本地的/etc/passwd文件 1.搭建环境 2.开始看wp的时候没有看懂为什么是core&#xff0c;然…

动能芯片 | SI3262—高度集成的低功耗SOC芯片 刷卡触摸一体

Si3262是一款高度集成的低功耗SOC芯片&#xff0c;其集成了基于RISC-V核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等…

【ArcGIS Pro微课1000例】0046:深度学习--汽车检测

本实验讲述ArcGIS Pro中人工智能深度学习应用之–汽车检测。 文章目录 一、学习效果二、工具介绍三、案例实现四、注意事项一、学习效果 采用深度学习工具,可以很快速精准的识别汽车。 案例一: 案例二: 下面讲解GIS软件实现流程。 二、工具介绍 该案例演示的是ArcGIS Pro中…

C++ Easyx 让圆球跟随鼠标移动

目录 下载Easyx 检验 绘制窗口 画圆 响应事件的处理 清除原先绘图 渲染缓冲区 逻辑 代码托管 下载Easyx 在Easyx官网下载大暑版: 检验 写如下代码: 编译运行&#xff0c;如果控制台出现2023字样&#xff0c;代表配置成功: 绘制窗口 进入Eaxy官方网站&#xff0c;点…

51单片机项目(20)——基于51单片机的电机速度PID控制

1.功能设计 使用51单片机&#xff0c;控制电机速度&#xff0c;用了PID算法。有数码管显示实时速度&#xff0c;可以用按键设定速度。数码管也显示设定的预期速度。另外&#xff0c;还可以控制电机的换向和启停。 2.仿真图 3.PID算法介绍 PID算法&#xff0c;即Proportional-I…

【cmake】获取到某个目录下的所有子目录名

整体工程目录结构如下。现打算获取到vac目录下的所有子目录名。 cmake 实现如下: # 设定要遍历的目录&#xff0c;保存到 VAC_INCLUDE_DIR 变量 set(VAC_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/vac)# 获取到当前目录下的所有文件和目录&#xff08;以相对路径的方式&#xff09;&a…

NFTScan | 11.27~12.03 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.11.20~ 2023.11.26 NFT Hot News 01/ Web3 教育平台 Open Campus 获 Binance Labs 315 万美元投资 11 月 27 日&#xff0c;Binance Labs 已向社区主导的 Web3 教育平台 Open Campu…

2023-简单点-树莓派中的硬件通讯

树莓派中的通讯方式 串口通讯什么是串口通讯&#xff1f;串口设备的格式串口通讯的特点 tips并行通讯&#xff1f;基于网络的通讯?socket通讯 串口通讯 什么是串口通讯&#xff1f; 串行通信每次传输一个位元数据&#xff0c;并在连续进行单次过程的基础上进行通信。根据数据…

windows 11 家庭版怎样安装docker

这里写自定义目录标题 一、安装wsl1、开启硬件虚拟化2、安装wsl3.升级WSL到WSL24、下载安装linux分支5、测试运行6、出现如下问题7、迁移到非系统盘8、文件资源管理器9、配置网络10、更新和升级 一、安装wsl 1、开启硬件虚拟化 检查是否开启Hyper-V, 适用于Linux的Windows子系…