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

news2024/10/1 17:20:55

内存篇

  • 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.coloradmin.cn/o/437582.html

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

相关文章

瑞吉外卖项目——瑞吉外卖

软件开发整体介绍 软件开发流程 需求分析&#xff1a;产品原型、需求规格说明书 设计&#xff1a;产品文档、UI界面设计、概要设计、详细设计、数据库设计 编码&#xff1a;项目代码、单元测试 测试&#xff1a;测试用例、测试报告 上线运维&#xff1a;软件环境安装、配置…

Qt编写推流综合应用示例(文件推流/桌面推流/本地摄像头/网络摄像头/转发推流/视频分发)

一、功能特点 1.1 文件推流 指定网卡和监听端口&#xff0c;接收网络请求推送音视频等各种文件。实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。可指定多种模式&#xff0c;0-直接播放、1-下载播放。实时打印显示各种收发请求和应答数据。每个文件对…

Vivado布线和生成bit参数设置

本文主要介绍Vivado布线参数设置&#xff0c;基本设置方式和vivado综合参数设置基本一致&#xff0c;将详细说明如何设置布线参数以优化FPGA设计的性能&#xff0c;以及如何设置Vivado压缩BIT文件。 一、Vivado布线概述 Vivado布线是在FPGA设计中实现物理布局的关键步骤之一。…

C语言-字符串

sizeof和strlen 的区别&#xff1a; 区别1&#xff1a; 1.sizeof计算整个数组大小&#xff0c; 2.strlen 计算有效的数组大小 新建字符数组”hello“ char cdata[128]"hello"; printf("sizeof--cdata的长度&#xff1a;%d\n",sizeof(cdata)); pri…

Hive窗口函数全解

在SQL中有一类函数叫做聚合函数&#xff0c;例如sum()、avg()、max()等等&#xff0c;这类函数可以将多行数据按照规则聚集为一行&#xff0c;一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据&#xff0c;又要显示聚集后的数据&#xff0c;这…

零基础抽象MYSQL

既然完成了下载安装和密码登录&#xff0c;那么打开你的MYSQL MYSQL中最简单的 创建数据库、查看数据库、选择数据库、删除数据库 先从重要的创建数据库 直接输入create database data_a ; 注意了要打分号 &#xff1b; 如果查看你创建的数据库 show databases &#xff…

使用 Flask 快速构建 基于langchain 和 chatGPT的 PDF摘要总结

简介 这里不对 langchain 和 chatGPT 进行介绍&#xff0c;仅对实现过程进行整理 环境 Python >3.8 Flask2.2.3 Jinja23.1.2 langchain0.0.143 openai0.27.4 实现 总结功能 使用 langchain 和 openai 接口实现总结功能 实现逻辑&#xff1a;通过text_splitter 将pdf 分…

LeetCode 501: 二叉搜索树中的众数 | C++语言版

LeetCode 501. 二叉搜索树中的众数 | C语言版 LeetCode 501. 二叉搜索树中的众数题目描述解题思路思路一&#xff1a;使用迭代代码实现运行结果参考文章&#xff1a; 思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a; LeetCode 501. 二叉搜索树中的众数 …

Edius抠像过程(实践笔记)

最近的工作有点烦&#xff0c;一个月左右的时间全是在帮别人做视频的过程&#xff08;在我所在的行业里&#xff0c;就是打杂&#xff09; 因为自己不专业&#xff0c;所有的操作都是现学现用&#xff0c;前几个视频还好说&#xff0c;随便剪剪&#xff0c;就是看他们本人录的…

水务行业怎么运用智能配电

摘要&#xff1a;在构建智慧水务和“双碳”时代背景下&#xff0c;智能配电系统在水务行业中发挥日益突出的重要作用。本文首先回顾了智能配电系统在水务行业的发展历程&#xff0c;并对其应用现状进行了分析&#xff0c;进而展望了智能配电系统在水务行业的发展趋势。 关键词&…

走进小程序【五】微信小程序架构之【逻辑层】详解

文章目录 &#x1f31f;前言&#x1f31f;小程序架构&#x1f31f;逻辑层 App Service&#x1f31f;注册小程序&#x1f31f;注册页面&#x1f31f;使用 Page 构造器注册页面&#x1f31f;在页面中使用 behaviors&#x1f31f;使用 Component 构造器构造页面 &#x1f31f;页面…

信创实力认证,创邻科技荣获“2023爱分析·信创产品及服务创新奖”

近日&#xff0c;数字化市场研究咨询机构爱分析正式发布“2023爱分析信创产品及服务创新奖”评选结果。经过申报、初评、调研、终评多轮角逐&#xff0c;创邻科技凭借自研产品Galaxybase国产原生高性能图平台以及国产化替代方案成功获评“2023爱分析信创产品及服务创新奖”。 据…

KDZD606绝缘服试验装置

一、产品概述 KDZD606绝缘服试验装置是按照国家电力公司关于颁发DL/T 976-2017《带电作业用工具、装置和设备预防性试验规程》的要求的基础上研制而成&#xff0c;本产品各项指标均符合国标的要求。可以按DL/T 976-2017《带电作业用工具、装置和设备预防性试验规程》要求对绝缘…

Nginx的漏洞浮现

本文参考https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/ 环境搭建均是采用docker 拉取环境请移步到参考。 一、Nginx的配置错误案列 1. CRLF注入漏洞 配置错误文件error1.conf rootubuntu-virtual-machine:/vulhub/vulhub-master/nginx/insecure-confi…

「解析」Pytorch 自动计算 batchsize

日志是一个十分必要的操作&#xff0c;有助于后期分析实验结果&#xff0c;特别是在多台不同环境下训练&#xff0c;为了区分&#xff0c;还是十分有必要记录相关平台信息的&#xff0c;比如 hostname&#xff0c;Python版本信息&#xff0c;Pytorch版本信息等&#xff01; im…

SpringSecurity定义多个过滤器链

在Spring Security中可以定义多个过滤器链&#xff0c;一个WebSerityConfigurerAdapter的实例就可以配置一个过滤器链&#xff0c;我们只需要配置多个WebSerityConfigurerAdapter的实例即可 可以看到&#xff0c;当请求到达 FilterChainProxy 之后&#xff0c;FilterChainProx…

什么是 CDN

CDN 是一种用来分发内容的网络拓扑结构&#xff0c;在彻底搞明白它之前&#xff0c;我们需要先来理解另外两个名词。 1、节点 用户使用CDN网络前&#xff0c;CDN提供商会在全国/全球部署多个节点。这里的节点可以看做机房&#xff0c;或者服务器集群&#xff0c;专业的称呼是…

瑞吉外卖项目——前后端分离

前后端分离开发 介绍 前后端分离开发&#xff0c;就是在项目开发过程中&#xff0c;对于前端代码的开发由专门的前端开发人员负责&#xff0c;后端代码则由后端开发人员负责&#xff0c;这样可以做到分工明确、各司其职&#xff0c;提高开发效率&#xff0c;前后端代码并行开…

Compose 学习总结

ompose发布正式版已经有一段时间了。趁最近比较闲&#xff0c;抓紧学习一波。 学习过程中&#xff0c;主要以实战项目中常用技术为目标。下面是项目地址&#xff0c;会长期更新&#xff0c;希望能给正在学习Compose的小伙伴一点参考。同时您有什么好的建议&#xff0c;也可以提…

嗖的一下!3分钟用ChatGPT生成海南旅游思维导图!

大家好&#xff0c;我是菜鸟哥&#xff01; 五一长假即将来临&#xff0c;很多小伙伴都要准备出去玩了&#xff01;旅游肯定要做攻略啊&#xff0c;比如热门的景点海南三亚&#xff0c;北京&#xff0c;上海&#xff0c;成都这些都是打卡的网红景点&#xff01;小编比较喜欢去海…