小白的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 ...
随机推荐
- Python3 多线程、多进程
python中的线程是假线程,不同线程之间的切换是需要耗费资源的,因为需要存储线程的上下文,不断的切换就会耗费资源.. python多线程适合io操作密集型的任务(如socket server 网络并 ...
- 关于在centos6 + grub的旧版本中,如何关闭CPU throttling
由于个人需求,要编译安装ATLAS库,其中就有关闭CPU throttling的步骤, 最常规简单的方法是修改grub /etc/default/grub/ 之后再接一些简单的步骤 + 重启就完成了. ...
- 跑步“无核心,不PB”
核心力量不管是在跑步中,还是在生活中都有着重要的作用,核心能让你的身体机能更加强劲. 1.什么是核心肌群? 核心肌群就是指我们所说的躯干,包括脊柱.骨盆.及周围肌群. 核心肌群由腹直肌.腹横肌.腹斜肌 ...
- java后台动态生成导出excel
p ublic void export(List<WechatUser> wechatUserList, HttpServletResponse response) throws IOEx ...
- jmeter入门非GUI(三)
配置见https://www.cnblogs.com/wish5714/p/9722193.html 该篇介绍非GUI模式的测试方法,及结果报告分析 简介 使用非 GUI 模式,即命令行模式运行 JM ...
- 使用quaggaJS识别图片中的条形码
quaggaJS是一个纯JS的插件,用于识别图片中的条形码,很方便.一般用于移动端拍照识别,也可以在网页端上传图片识别. github下载地址 首先要指定正确格式的条形码,常见的条形码编码类型有EAN ...
- Linux-03
目录处理命令 目录处理命令:ls 命令名称:ls 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 功能描述:现实目录文件 语法:ls 选项[-ald] [文件或目录] -a ...
- npm 离线安装依赖
现实场景:一台自己的电脑可以连外网,一台开发机不能连网,开发机需要安装node_modules 依赖解决办法: npm 安装依赖分为两种,一是 -g 这种是安装在全局环境的,只有在电脑中 ...
- yum与rpm常用命令
1 yum常用命令 2 rpm常用命令 1 yum常用命令 (1)列出所有可更新的软件清单命令:yum check-update (2)更新所有软件命令:yum update (4)仅安装指定的 ...
- Mysql数据库左外连接,右外连接,模糊查询
内连接,左外连接,右外连接都是数据库的常用连接与使用手段 内连接 select * from assets_car c inner join category c on a.id = c.id; 左外 ...