很衰的一天,各种意料之外的问题,但都挡不住我每日一更的步伐

内存的逻辑结构大致分为以下几种:

数组

栈与队列

链表

二叉树

以上,数组,栈,链表是我这章要说明的

在学习前需要了解的两个问题:

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——内存的逻辑结构的更多相关文章

  1. 小白的CTF学习之路7——内存与硬盘

    前天去网吧跟朋友包宿,导致昨天一整天都报废,今天早上研究了一下nethunter导致手机成功变砖,感冒不停地咳嗽,这些理由应该足够我前两天拖更了吧,下面开始正题 磁盘学习路线 虚拟缓存 虚拟内存 节约 ...

  2. 小白的CTF学习之路4——内存

    明天要进行二模考试了,沉住气,加油,能过 内存是学C路上必不可少的一环,一定要非常认真的去学 内存的物理结构: ROM:只读内存——早期的手机 RAM:读写(数据断点既消) DRAM:经常更新 SRA ...

  3. 小白的CTF学习之路2——二进制数据基础与运算(上)

    今天的第二更,被我拖到了傍晚,嘿嘿,二进制这方面让本就数学不好的我很头疼,所以研究了一段时间 在学习之前我们先了解几个问题: 32位是几个字节? 01011100对于十进制是多少? 00001111向 ...

  4. 小白的CTF学习之路8——节约内存的编程方式

    今天第二更,废话不说上干货 上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法 ...

  5. 小白的CTF学习之路1——程序与CPU

    刚刚注册了这个博客园,尽量保持每日一更(*/ω\*) 今天看了po学院的教学视频,了解了程序是什么,如何在CPU当中工作的等各种之前未曾想过的问题,特此记录,以防忘记 首先我们学习程序与CPU之前需要 ...

  6. 小白的CTF学习之路6——阶段测评

    刚才考了自己一次,下面我把题和答案放到下面 CPU中不含有以下选项中的  C A:     运算器 B:      寄存器 C:     内存 D:     时钟 这是一道送分题,CPU包含以下几种原 ...

  7. 小白的CTF学习之路3——二进制数据基础与运算(下)

    处理了二进制的整数运算,下面我们来进行令人绝望的浮点数运算 我们先来看一下float事列程序: #include<"stdio.sh"> int main() { fl ...

  8. 新手小白的Linux学习之路

    大家好,我是一个零基础的新手小白,在此和大家分享一下新手小白的学习之路.欢迎各位大神指教!谢谢 Linux简介: Linux操作系统诞生于1991年10月,由芬兰赫尔辛基大学的在校生Linus Tor ...

  9. 小白的mapbox学习之路-显示地图

    刚接触mapbox,只是简单记下自己的学习之路,如有错误,欢迎大神指正 1-头部引入链接 2-body中定义一个div块,用来显示地图 3-在script中创建一个map对象,并设置相关参数 mapb ...

随机推荐

  1. hadoop streaming 中跑python程序,自定义模块的导入

    今天在做代码重构,以前将所有python文件放到一个文件夹下,上传到hadoop上跑,没有问题:不过随着任务的复杂性增加,感觉这样甚是不合理,于是做了个重构,建了好几个包存放不同功能的python文件 ...

  2. CSS 背景图像 填充整个页面示例

    background-image 属性可以设置背景图像. 背景图像可以填充整个页面的,也可以填写一部分. background-image 属性的使用很简单:background-image:url( ...

  3. 如何把ppt写好

    前言 这里不是总结ppt如何写的美观漂亮,而是总结写整体的结构,如何修辞 整体结构 前后呼应 就像做作文一样,前后呼应,产生共鸣和联想,切记过于离散 抽象化 不要把自己做的东西写小了,要有一定的抽象度 ...

  4. jquery取出checkbox多选的值(带全选功能)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. python-django(创建项目、应用、运行)

    1.创建项目.应用 方法一.命令行创建 <1>.创建项目命令 django-admin startproject  项目名称 <2>.创建应用命令 django-admin s ...

  6. 关于Mybatis浅谈

    1. 历史 MyBatis本是apache的一个开源项目iBatis. 2010年这个项目由apache software foundation 迁移到了google code,并且取名为MyBati ...

  7. linklist和arraylist区别

    ArrayList更适合读取数据,linkedList更多的时候添加或删除数据.

  8. hive上传数据到oracle

    # Oracle 建立hive外部表 使用oracle的大数据连接器向建立hive的外部表,在通过在oracle中根据外部表建立内部表(create table as select * from ex ...

  9. Solidity知识点集 — 溢出和下溢

    合约安全增强: 溢出和下溢 什么是 溢出 (overflow)? 假设我们有一个 uint8, 只能存储8 bit数据.这意味着我们能存储的最大数字就是二进制 11111111 (或者说十进制的 2^ ...

  10. 1. NES简介

    NES(Nintendo Entertainment System)简介 NES是北美地区对任天堂发行的第三代家用游戏机的简称. 1.CPU NES使用一颗理光[1]制造的8位2A03 NMOS处理器 ...