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

news2024/11/15 21:51:16

内存

  • 1.堆和栈的本质是什么
  • 2. java、Python等内存模型
  • 3. java内存模型
    • 3.1 java中堆和栈是如何实现的
  • 4. Python内存模型

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

堆区与栈区的本质
Java、Python等内存模型
Java内存模型
Jave中的堆区与栈区是如何实现的
Python内存模型

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

1.堆和栈的本质是什么

  1. 在编程语言中,堆区和栈区本质上都是内存,二者没有本质的区别
  2. 在数据结构和算法中,我们也有堆和栈的概念,但是那里指的不是内存,而是两种数据结构。
    🚘🚘🚘
  3. 由于计算机的内存有限,我们才需要费劲心力提出堆栈的概念。
  4. 你会发现栈是一种非常巧妙的使用内存的方法,函数调用完毕后,函数运行过程中占用的内存就会被释放掉,只要你的程序写的合理(栈帧不会过大),那我们的程序就会一直运行下去,而不会出现内存不足情况,也不必担心内存释放的问题,这个过程是自动的。
  5. 但是如果程序员想自己控制内存,那么可以选择在堆上进行内存分配

2. java、Python等内存模型

  1. C++程序员面对的是 实实在在的物理内存,而 java、Python等程序面对的是 解释器,C++分配内存是直接在物理内存中进行,而Java、Pyhton等程序是将内存分配请求交给解释器,解释器再去物理内存上进行分配。
    下图所示:内存布局Java、Python等程序员是看不到的只有解释器才能看到这些。
    在这里插入图片描述
  2. java、Python等程序的一大优点就是内存自动化管理,而C++程序员需要自己来管理从堆上分配的内存,内存管理这一项被 Java、Python等程序中的解释器接管了,解释器的这项功能被称为“垃圾回收器”。

3. java内存模型

  1. java的内存模型直观同样有堆和栈的概念。内置数据类型比如 int ,直接放在栈上。引用类型:也就是 new 关键字定义的变量时分配在堆上的。
  2. 和C++一样,每个java函数在执行时都有自己的栈帧,随着函数的调用,栈不断扩大,函数调用完毕后栈帧回收。
    在这里插入图片描述

3.1 java中堆和栈是如何实现的

一般情况下,当JVM运行一个 java函数时需要在堆上创建java函数的栈帧,然后把这些栈帧放入栈中(这里的栈是指具有先进后出性质的数据结构)。
🚘🚘🚘
因为JVM是C++程序,如何组织栈帧完全是 JVM设计者来决定的,只要栈帧具备先进后出的性质就可以。

void RunJavaFunction(JVM* jvm, string javaFunction)
{
	// 先在堆上申请一块空间,用于存放java栈帧
	stackFrame*  frame = (stackFrame*) malloc(sizeof(stackFrame));
	// 再把要使用的 栈帧push 到 JVM的函数调用栈中
	jvm->stack->push(frame);
	// 在申请的栈帧上执行 java函数
	run(javaFunction, frame);
	// 执行完毕后 pop 掉该函数栈帧
	jvm->stack->pop();
}

JVM会在自己的堆中为 new修饰的对象创建内存,这里的 堆就是上图所示的堆。
在这里插入图片描述

4. Python内存模型

  1. Python的内存模型和Java其实类似。
  2. Python的解释器比较多,比如:CPython, PyPy等等。这里我们以Python默认的解释器 CPython为例说明。我们知道解释器其实就是一个C++程序,CPython也不例外。但是Python解释器将堆区分成了两部分:Object-specific memory 和 Python core两个区域。
  3. Object-specific memory 这个区域是专门存档PyObject对象的。 在Python中所有数据类型包括:int dict str 等都是一个对象,叫做 PyObject ,当我们在Python中创建一个变量比如 dict时,CPython就会在堆的上半部分(Object-specific memory)中分配一块内存创建一个 Pyobject 。
  4. Python core:所有非PyObject 的内存请求都在这里分配。
    在这里插入图片描述

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

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

相关文章

企业网站架构部署与优化 LNMP

【安装 Nginx 服务】 systemctl stop firewalld systemctl disable firewalld setenforce 0 1、安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 2、创建运行用户 useradd -M -s /sbin/nologin nginx 3、编译安装 cd /opt tar zxvf nginx-1.12.0.tar.gz -C …

Apifox软件的基础使用方式

Apifox软件的基础使用方式 简单方便的用途 该工具是接口在线调试工具,这里我给到连接供大家去官网下载,我个人觉得是比较于postman工具好用,提供的语言操作是中文版本的便于操作 下载和安装 https://apifox.com/?utm_sourcebaidu&ut…

【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】

目录 1.简介2.环境安装2.1安装torch相关库2.2 获取yolov8最新版本,并安装依赖 3. 如何使用模型用于各种CV任务3.1 目标检测任务实现检测图片代码检测视频代码 3.2 分割任务实现分割图片代码分割视频代码 3.3 追踪任务3.4 姿态检测任务姿态检测(图片&…

27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器

基本概念叫协议 什么叫协议? 协议是一个大家共同遵守的一个规则, 那么在这个网络通信当中,其实就是双方通信和解释数据的一个规则,这个概念 你也不用记,你只要心里明白就可以了, 分层模型, 物数网传会表应…

Tensorflow GPU 版本安装教程

非常详细的 Tensorflow GPU 版本安装教程 一、安装Anaconda二、TensorFlow GPU 一、安装Anaconda 这一步比较简单,也没有太多的需要注意的,去官网下载即可: 官网地址如下: https://www.anaconda.com/blog/individual-edition-2…

百家云在人工智能领域再有新动作,发布应用于多个行业的AIGC解决方案

4月17日消息,音视频SaaS上市公司百家云(股票代码:RTC)今日宣布,公司将正式推出应用于多个垂直行业及场景的人工智能生成内容及视频解决方案。 百家云总裁马义表示,此次发布的解决方案,将在极短…

谷歌SEO优化技巧方法

谷歌SEO排名对于许多公司和个人来说都非常重要。随着谷歌成为人们搜索信息的首选,拥有良好的谷歌排名可以帮助我们的网站在搜索引擎中展现出更高的可见度,吸引更多的访问量和潜在客户。优化谷歌SEO排名需要一定的时间和专业知识,无法一蹴而就…

Vulnhub项目:Lin.Security(Linux提权大合集)

靶机地址:linsecurity 靶机描述了用户名和密码 用户名:bob、密码:secret 登录后看到了IP地址,或者在kali上像之前那样进行ip收集,端口收集 开放的端口有很多,从22端口开始,知道用户名和密码&…

供水管网爆管预测模型研究现状

配水管网是供水系统中最昂贵的组成部分。管网运行管理和调度技术难度高,爆管事故 容易发生,对人民生活、工业生产、城市交通及社会安定造成不利影响,造成严重的经济损 失。合理的管道的修复更新计划是满足供水目标、实现对管网的科学管理的重…

回炉重造五--软件管理

1.软件管理 1.1软件包中的文件分类 二进制文件库文件配置文件帮助文件 1.2包查询–rpm -a:所有包 -p:针对尚未安装的程序包文件做查询工作 -l:查看指定的程序包安装后生成的所有文件 -i:查看包的信息 #常用的查询方法 -qa/q/qi2、yum和dnf 2.1 yum/dnf工作原理…

数据库基础篇 《5. 排序与分页》

目录 1. 排序数据 1.1 排序规则 1.2 单列排序 1.3 多列排序 2. 分页 2.1 背景 2.2 实现规则 2.3 拓展 1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC ( ascend ) : 升序 DESC ( descend ) : 降序 ORDER …

【Java 数据结构】栈的实现及相关OJ题

🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔🦾&am…

Flutter 通过 VS code 连接 Android 模拟器(Windows)

环境配置 Flutterhttps://flutter.cn/docs/get-started/install/windowsAndroid Studiohttps://developer.android.google.cn/studioVS code安装Flutter插件https://flutter.cn/docs/get-started/editor?tabvscode夜神模拟器https://www.yeshen.com 注意事项 Flutter安装之…

第五章_Redis事务

是什么 官网 能做什么 一个队列中,一次性、顺序性、排他性的执行一系列命令 Redis事务 VS 数据库事务 1 单独的隔离操作 Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可…

【浅学 Linux】

浅学 Linux 一、 Linux1. 目录2. 虚拟机的设置2.1 克隆与快照 3.系统与设置命令3.1 用户相关命令3.2 用户组3.3 管理用户组内成员3.4 日期管理3.5 显示用户3.6 id命令&sudo命令3.7 进程相关的命令top 查看进程ps 查看进展kill 杀死进程 4. Linux目录管理4.1 关机与重启命令…

RIP协议(路由信息协议)简介

一.动态路由简介 1.动态相对静态路由来说,找路更灵活,相互传递 2.分类: 二.RIP协议简介 1.三个版本RIPV1和RIPV2 (在IPV4中使用), RIPNG (在IPV6中使用) 2.原理简介 三.配置 1.启用Rip 并指定进程ID (进程ID 只具有本地意义…

即插即用! | 国防科大联合慕尼黑工业大学提出新型解耦头 TSCODE: 引入yolov5/yolov7助力目标检测器轻松涨点!

1.Task-Specific COntext DEcoupling, TSCODE 介绍 论文:https://arxiv.org/pdf/2303.01047.pdf 本文提出了一种新颖的即插即用的特定于任务的上下文解耦头(Task-Specific COntext DEcoupling, TSCODE),通过进一步解开两个任务的特征编码来提升网络整体的性能 TSCODE整体的…

SYSU程设c++(第九周)函数对象、友元函数、友元类

函数对象: 如果一个类定义了operator()运算符函数,则可以使用该类的对象名为函数名调用这个函数. 函数对象是一个对象,但调用形式和普通函数调用一样,因此取名叫函数对象 (注意operator()先有个括号,接着才是括号(参数…

XHR 和 AJAX 的结合 - API 测试

大家好,之前一期介绍了怎样通过工具类进行对API 接口测试,这一期将演示如何手写一个 Ajax的请求。 什么是 XHR ? 全称为 XMLHttpRequest ,它是浏览器内置的对象,使得 JavaScript 可以发送 HTTP 请求。 什么是Ajax ? Ajax是一种用…

Ubuntu用户权限、查看文件路径、防火墙

一、Ubuntu用户权限 1、设置root用户密码 sudo passwd root 新的 密码: 重新输入新的 密码: passwd:已成功更新密码2、普通用户赋予root权限 修改 /etc/sudoers 文件 su root vim /etc/sudoers把用户加入到root组 # root用户下操作 # -…