计算机:理解操作系统:内存篇(上)

内存篇

  • 1. 什么是内存
  • 2. C/C++内存模型
    • 2.1 代码段和数据段
    • 2.2 堆和栈

本节是操作系统系列教程的第三篇文章,属于操作系统第一章即基础篇,在真正开始操作系统相关章节前在这一部分回顾一些重要的主题,算是温故知新吧,以下是目录,由于本文篇幅较多因此接下来会分三次发布,目录中黑体为本篇内容。

什么是内存
C/C++内存模型

堆区与栈区的本质
Java、Python等内存模型

  1. Java内存模型
  2. Jave中的堆区与栈区是如何实现的
  3. Python内存模型

指针与引用
进程的内存模型
幻想大师-操作系统
总结

1. 什么是内存

内存本身其实非常简单,内存的作用就是用来装数字0和1的,如图所示,图中的一个盒子就是内存的一个基本单元,装的不是0就是1。
在这里插入图片描述

  1. 而内存就是由一大堆的 “盒子”组成,每个盒子中要么是0 要么是1。
  2. 其中8个盒子被称之为 一个 “字节” ,每8个盒子也就是一个字节他们都有一个编号,这些编号就是简单的从 0开始依次累加,这个编号就是 “内存地址”。
  3. 你可以把内存地址理解为下面这张图,其中左边的数字是 内存地址,每一排是一个字节,图中展示的就是一个 8字节大小的内存。
    在这里插入图片描述
  4. 平时我们使用的 如 2G、4G 大小内存,就是盒子多一点,它在本质上和这里展示的 8字节大小的内存没有任何区别。
  5. 当计算机在执行我们的程序时,无论是我们的机器指令还是机器指令操作的数据,都需要存放在这些小盒子中(内存中)。
    在这里插入图片描述
    以上就是从硬件的角度来看内存,那么从编程语言上来看,程序员应该如何理解内存了 ?

2. C/C++内存模型

对于C++程序员来说,常用的 int, char 等变量都被装在盒子中,

  1. char 值只需要一排盒子就能装下(8bit)
  2. int 值需要 四排盒子才能装下。
    💚
  3. 连续几排装有同样类型变量的盒子就是数组 array
  4. 连续几排装有不同类型变量的盒子就是结构体 struct
    🧡
  5. 每一排盒子的地址就是我们熟知的 指针,请记住,指针就是你使用的变量在内存中的地址。
    🚀
  6. C++程序中被执行时,需要在内存中划出两段区域用于存放数据,这两个区域就是我们熟知的 堆(Heap) 和 栈(Stack)。
  7. 如下图所示:数据段和代码段
  8. 堆区紧邻数据段,在数据段之上,而栈在最上方,栈和堆之间是尚未被使用的内存,随着程序的运行,当程序申请内存时栈区和堆区之间的空隙会减小,当程序释放后内存间隙会扩大,这就是C++程序内存模型。
    在这里插入图片描述

2.1 代码段和数据段

编译器的任务就是把人类可以理解的代码转换成机器可以执行的机器指令,源文件编译后形成对应的目标文件。源文件被编译后生成的目标文件本质上只有两部分:

  1. 代码部分:这里的代码部分指的是集全集可以执行的机器指令,也就是源文件中定义的所有函数。
  2. 数据部分:源文件中定义的全局变量,如果是已经初始化的全局变量,该全局变量的值也存在于数据部分。

在这里插入图片描述

2.2 堆和栈

我们在2.1基础上进一步完善C++程序在内存的样子,细分出 堆和栈结构

  1. 栈变量:每个函数运行时都会在栈区开辟一块内存,这块内存中保存的是调用函数的桉树以及函数中定义的局部变量,这些变量在函数调用完成后自动释放。
  2. 堆变量:与栈变量不同,堆变量在使用完之后需要手动释放,否则就会造成内存泄漏。
    🚘🚘🚘
    举例:
#include<iostream>
void f2()
{
	int c;
	int* heap;
	c = 3;
	heap = (int*)malloc(sizeof(int));
	*heap = 4;
}

void f1(){
	int b;
	b= 2;
	f2();
}

int main()
{
	int a;
	a = 1;
	f1();
	return 0;
}
  1. 每个函数在被执行的时候都在栈区占用一小段,在这一小段中存放当前函数定义的局部变量和传入函数的参数,这一小段内存有一个很形象名字,叫做 栈帧。

  2. 这段代码中,main函数会调用 f1 , f1会调用 f2,其中变量a,b,c以及heap 一次被放在各自的函数的栈帧中

  3. heap 这个变量本身是在 栈上,但是 heap 所指向的内存分配在 堆上,heap 本身仅仅保存 这个值在内存中的 位置(如 这里 0x10)
    .在这里插入图片描述

  4. 函数栈执行规律遵循着:最先被使用的栈帧其实是最后才被释放的。
    在这里插入图片描述

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

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

相关文章

ICMP隧道技术实现防火墙穿透

1.在mac os的虚拟机里准备三台kali 三台主机ip地址分别是 192.168.1.15&#xff0c;192.168.1.16&#xff0c;192.168.1.17&#xff0c; 为方便描述 依次把他们暂且命名为主机A,主机B,主机C 2.在主机C 上打开终端&#xff0c;输入 cd /usr/local/src 然后新建一个hello.txt 文…

深入浅出JS定时器:从setTimeout到setInterval

前言 当谈到 JavaScript 编程语言最基本的概念时&#xff0c;定时器就是一个必须掌握的知识点。在编写网站时&#xff0c;你经常会遇到需要在一定时间间隔内执行一些代码的情况。这时候&#xff0c;JavaScript 定时器就可以派上用场了。 什么是定时器&#xff1f; JS 定时器是…

Mybatis(三)

1、mybatis中的连接池以及事务控制 原理部分了解&#xff0c;应用部分会用 mybatis中连接池使用及分析 mybatis事务控制的分析2、mybatis基于XML配置的动态SQL语句使用 会用即可 mappers配置文件中的几个标签&#xff1a; <if> …

Linux远程连接虚拟机超时,且ip地址找不到问题解决

ip地址虚拟机自动更改&#xff1a; 原因&#xff1a;Linux没有正常关机 解决&#xff1a;从虚拟机在自己电脑上的文件地址中bin目录下&#xff0c;前面几个以.lck的文件全部删除 Linux远程连接虚拟机超时&#xff1a; 原因可能跟上面是一样的&#xff0c;IP地址自动修改之后自…

交互式电子沙盘数字沙盘大数据系统开发第8课

交互式电子沙盘数字沙盘大数据系统开发第8课 这次我们完成的功能为拖动一个外部的UI对象到球球上&#xff1a; private void Button_PreviewMouseMove(object sender, MouseEventArgs e) { if(e.LeftButton MouseButtonState.Pressed) DragDr…

为docker安装图形界面和配置远程桌面连接

由于远程桌面访问必须要打开端口3389&#xff0c;所以在启动docker中ubuntu系统的时候要首先将linux系统的3389端口映射出来 docker run -tid -p 3389:3389 --name ceshi --privilegedtrue ceshi /bin/bash 接下来进入到ubuntu中 docker exec -it ceshi /bin/bash 首先安装X…

扬帆优配|TMT板块密集发布减持计划 火爆行情潜藏估值难以匹配隐忧

4月以来&#xff0c;多家上市公司发表股东减持公告&#xff0c;其中一季度大热的TMT&#xff08;科技、媒体和电信&#xff09;板块的股东减持最为引人注目。 32只TMT股拟减持上限占比超1% 到4月18日&#xff0c;4月以来已有61家TMT板块上市公司发布减持方案。从拟变动数量上限…

增广拍卖——二跳页下的拍卖机制探索

1. 引言 本文提出的方案已被WSDM 2023接收&#xff0c;论文&#xff1a;Boosting Advertising Space: Designing Ad Auctions for Augment Advertising&#xff0c; 下载&#xff1a;https://dl.acm.org/doi/abs/10.1145/3539597.3570381 信息流产品为了保障用户体验通常会严格…

程序地址空间(上)

目录 &#xff1a; 1.C/C程序地址空间回顾&#xff08;C语言&#xff09; 2.通过一段代码&#xff08;引出进程虚拟地址空间&#xff09; 3.进程虚拟地址空间是什么 ------------------------------------------------------------------------------------------------------…

CCF-CSP真题《202303-1 田地丈量》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202303-1试题名称&#xff1a;田地丈量时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 西西艾弗岛上散落着 n 块田地。每块田地可视为…

在 FPGA 上如何实现双线性插值的计算?

作者 | 殷庆瑜 责编 | 胡巍巍 目录 一、概述 二、What&#xff1f;什么是双线性插值&#xff1f; 二、Why&#xff1f;为什么需要双线性插值&#xff1f; 三、How&#xff1f;怎么实现双线性插值&#xff1f; 关键点1 像素点选择 关键点2 权重计算 升级1 通过查表减少…

城市地下综合管廊安全运营与智慧管控的分层架构研究

安科瑞 李亚俊 1、引言 1833年&#xff0c;市政管线综合管廊在巴黎城市地下建成至今&#xff0c;经过百年来的探索、研究、改良和实践&#xff0c;法国、英国、德国、俄罗斯、日本、美国等发达国家的管廊规划建设与安全运维体系已经日臻完善&#xff0c;截止目前&#xff0c;…

动态内存管理【下篇】

文章目录 ⚙️5.C/C程序的内存开辟⚙️6.柔性数组&#x1f514;6.1.柔性数组的特点&#x1f514;6.2.柔性数组的使用 ⚙️5.C/C程序的内存开辟 C/C程序内存分配的几个区域&#xff1a; &#x1f534;1.栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函…

春秋云境:CVE-2022-30887(文件上传漏洞)

目录 一.题目 二.蚁剑方式 三.POC方式 一.题目 该CMS中php_action/editProductImage.php存在任意文件上传漏洞&#xff0c;进而导致任意代码执行。 进入页面&#xff1a;登录页面 随意输入用户名和密码&#xff1a;admingmail.com admin 用于burp抓包&#xff1a; burp抓包…

Git入门指南(手把手教学)

Git入门指南 一、什么是Git二、Git的安装下载三、git的简单实践1.创建git仓库2.Windows上生成公钥以绑定GitHub仓库3.写一个Helloworld 四、帮助学习的网站 一、什么是Git Git是一种分布式版本控制系统&#xff0c;它是由Linus Torvalds为了管理Linux内核开发而开发的。与中心化…

MySQL数据库学习笔记(七)实验课三之拼命的李绿

一来就是实验课三了&#xff0c;那么实验课二呢&#xff1f;实验课二是装配mysql环境那些东西&#xff0c;而我们在前面的笔记中也有关于配置环境的&#xff0c;所以在这里就不再赘述了。 文章目录 注意&#xff1a;1&#xff0c;本地文件导入2&#xff0c;数据范围3&#xff…

故障重现, JAVA进程内存不够时突然挂掉模拟

背景&#xff0c;服务器上的一个JAVA服务进程突然挂掉&#xff0c;查看产生了崩溃日志&#xff0c;如下&#xff1a; # Set larger code cache with -XX:ReservedCodeCacheSize # This output file may be truncated or incomplete. # # Out of Memory Error (os_linux.cpp:26…

高比例可再生能源电力系统的调峰成本量化与分摊模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

学习着编写了一款chrome小插件

背景介绍 半年前有幸分享了一下浏览器开发者工具的技术分享&#xff0c;当时的PPT在写至最后处总感觉理论讲解多于代码分享&#xff0c;于是琢磨着编写一下相关的代码&#xff0c;在经过一番苦思冥想后最终锁定了浏览器插件编写的实现上&#xff0c;所以在经过一番知识百科后&…

4.9、字节序

4.9、字节序 1.简介2.字节序举例3.判断电脑存储方式代码 1.简介 现代 CPU 的累加器一次都能装载&#xff08;至少&#xff09;4 字节&#xff08;这里考虑 32 位机&#xff09;&#xff0c;即一个整数。那么这 4字节在内存中排列的顺序将影响它被累加器装载成的整数的值&#x…
最新文章