小白的CTF学习之路5——内存的逻辑结构
很衰的一天,各种意料之外的问题,但都挡不住我每日一更的步伐
内存的逻辑结构大致分为以下几种:
数组
栈与队列
链表
二叉树
以上,数组,栈,链表是我这章要说明的
在学习前需要了解的两个问题:
1.内存的一次存入仅能放8bit大的空间,那么我们想要存入32bit的内存怎么办呢?
2.什么样的操作是更适合(更快)我们内存呢?
学习前需要明白的两个术语:
char=1byte
int=4byte
我们上一章说过,内存就好比一栋楼房,每一层存着相应的数据,但内存的物理条件仅能限制我们每一层存入1char的数据,那么我们要想在一层中存入1int的数据怎么办呢?下面介绍一个原始的方法:

这就是我们原始方法大致存储int数据的方法,可以注意看下面的四层被去掉了,这样每一层可存放1char,四个加起来正好可以存储Int数据,虽然表示是这么表示,但是楼层不是真的被去掉了,但是访问除会提示错误,这种方法固然可以存放大于1char的值,但是我们的操作速度会非常慢,具体怎么个慢法,请看下面这张图:

我们可以通过图片可知,程序每储存一个数都会进行一次寻址,将数据放到寻到的地址空间内,在我们读写数据过程中cpu是不断在运算的,这样一来就大大增加了我们储存数据的速度,那么如何才能加快读写的速度呢?
我在前几章说过,cpu在做累加时的运算速度是最快的
根据这一概念,工程师们引入了一个数组的概念:

既然累加是最快的运算,那么我们就将所需的空间打包起来,让最开始的地址作为此数组的地址,这样一来,我们存入的数据只需要找到此数组的地址,就可以直接对此数组空间进行读取操作,这样无疑大大缩短了我们的读写时间,但是,我们删除数据的话,层与层间的顺序就会断开,这样cpu又无法进行累加运算了,我们还需要将下面的层向上位移,所以说,数组虽然读写很快,但删除却很慢
在数组的基础上,工程师们又研究了一个便于数据记录的栈:

栈这个概念比较抽象,栈用来记录查询和回溯,列入:在10:05分储存数据5,10:05分储存数据8,10:30分储存10......
栈有一个原则——FILO(first in last out)既第一个进入的最后一个出来,听起来很绕?我们看下图,最先存入的5被放到了最下面,我们栈的存出规则是从下往上存的
除了栈之外,他们还将数组进行了变形:

这是一个队列,就好似我们排队一样,从下往上写入
这些结构都有一个问题,他们都是数组结构的,数组的删除是非常慢的,为了解决这一问题,我们引入链表这一概念:

我们可以看到,存入的层内多加了一层,里面存储着下一个要查的地址,这样,在我们cpu的运算当中,就可以快速的查找到下一个数据,删除的话也不会影响cpu的运算速度,链表这一概念完美的解决了数组删除过慢的弱点
未完待续......
小白的CTF学习之路5——内存的逻辑结构的更多相关文章
- 小白的CTF学习之路7——内存与硬盘
前天去网吧跟朋友包宿,导致昨天一整天都报废,今天早上研究了一下nethunter导致手机成功变砖,感冒不停地咳嗽,这些理由应该足够我前两天拖更了吧,下面开始正题 磁盘学习路线 虚拟缓存 虚拟内存 节约 ...
- 小白的CTF学习之路4——内存
明天要进行二模考试了,沉住气,加油,能过 内存是学C路上必不可少的一环,一定要非常认真的去学 内存的物理结构: ROM:只读内存——早期的手机 RAM:读写(数据断点既消) DRAM:经常更新 SRA ...
- 小白的CTF学习之路2——二进制数据基础与运算(上)
今天的第二更,被我拖到了傍晚,嘿嘿,二进制这方面让本就数学不好的我很头疼,所以研究了一段时间 在学习之前我们先了解几个问题: 32位是几个字节? 01011100对于十进制是多少? 00001111向 ...
- 小白的CTF学习之路8——节约内存的编程方式
今天第二更,废话不说上干货 上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法 ...
- 小白的CTF学习之路1——程序与CPU
刚刚注册了这个博客园,尽量保持每日一更(*/ω\*) 今天看了po学院的教学视频,了解了程序是什么,如何在CPU当中工作的等各种之前未曾想过的问题,特此记录,以防忘记 首先我们学习程序与CPU之前需要 ...
- 小白的CTF学习之路6——阶段测评
刚才考了自己一次,下面我把题和答案放到下面 CPU中不含有以下选项中的 C A: 运算器 B: 寄存器 C: 内存 D: 时钟 这是一道送分题,CPU包含以下几种原 ...
- 小白的CTF学习之路3——二进制数据基础与运算(下)
处理了二进制的整数运算,下面我们来进行令人绝望的浮点数运算 我们先来看一下float事列程序: #include<"stdio.sh"> int main() { fl ...
- 新手小白的Linux学习之路
大家好,我是一个零基础的新手小白,在此和大家分享一下新手小白的学习之路.欢迎各位大神指教!谢谢 Linux简介: Linux操作系统诞生于1991年10月,由芬兰赫尔辛基大学的在校生Linus Tor ...
- 小白的mapbox学习之路-显示地图
刚接触mapbox,只是简单记下自己的学习之路,如有错误,欢迎大神指正 1-头部引入链接 2-body中定义一个div块,用来显示地图 3-在script中创建一个map对象,并设置相关参数 mapb ...
随机推荐
- 6993: Dominoes(纯bfs)
题目描述Orz likes to play dominoes. Now giving an n*m chessboard and k dominoes whose size are 1*2, Orz ...
- 使用TensorFlow训练模型的基本流程【转】
原文地址(https://github.com/wmpscc/TensorflowBaseDemo ) 本篇文章将介绍使用tensorflow的训练模型的基本流程,包括制作读取TFRecord,训练和 ...
- faiss索引基于数量级和内存限制的选择
它是一个能使开发者快速搜索相似多媒体文件的算法库.而该领域一直是传统的搜索引擎的短板.借助Faiss,Facebook 在十亿级数据集上创建的最邻近搜索(nearest neighbor search ...
- [SF] Symfony 标准 HttpFoundation\Request 实现分析
使用方式 /** * 如果直接示例化 Request 默认是没有参数的,可以自己传入 * 本方法将 PHP 超全局变量作为参数然后实例化自身(Request)进行初始化. */ $request = ...
- query did not return a unique result: 2错误的发生
org.springframework.dao.IncorrectResultSizeDataAccessException: query did not return a unique result ...
- ArcGIS 批量修改数据名称-arcgis案例实习教程
ArcGIS 批量修改数据名称-arcgis案例实习教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:批量修改数据/文件名称 使用方法: 输入:文件夹(或者 ...
- .net 语音,视频等格式转换
最近在做微信公众号开发的时候遇到一个问题,就是微信接收到语音消息的格式为amr,在网页上通常不能直接播放,需要先转为mp3,于是找到了一个办法,使用ffmpeg.exe,网上可以搜一下ffmpeg.e ...
- Centos7下杀毒软件clamav的安装和使用
目录 一.yum安装 二.编译安装 2.1:下载软件包 2.2:创建clamav用户和存放病毒库目录 2.3:解压安装包 2.4:安装依赖 2.5:编译安装 2.6:配置clamav 2.7:启动cl ...
- react-redux的使用
在react-redux 框架中,给我提供了两个常用的API来配合Redux框架的使用,其实在我们的实际项目开发中,我们完全可以不用react-redux框架,但是如果使用此框架,就如虎添翼了. 我们 ...
- Centos 7 docker 启动容器 iptables 报 No chain/target/match by that name
我也遇到这个问题,原因时启动docker服务时没有启动iptables服务导致的(有些docker需要再iptables开放有些端口)解决方法1.启动iptables服务 CentOS 7 以下版本 ...