数据是什么?数据又是如何在内存里面分布的?

老衲累了!但是老衲还是想问问数据是什么?那么又跟数据结构是什么关系呢?

咳咳!老衲也不给咱买瓶饮料,谁让喜欢呢!!!!

关于这块我想要结合这linux操作系统来好好絮叨这块,主要是linux确实有一些命令可以很方便的使用。

 一、数据是什么?

先拽一段数据概念:

数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的的原始素材。数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等

不知道老衲理解了没,反正我看的有点眉头紧凑!

数据:换种说法,可以是现实生活中的一些事物,比如电脑,饮料,以及电视剧等数字的表现形式。

数据要在程序中使用,那当然就得有载体不是,那么载体是什么呢?

问题1:我想问老衲了,那程序中的变量是指什么?

        老衲迷茫了,一脸懵,我哪知道。

        那就听听我的理解:变量其实是数据的容器。变量中所存储的数据是可以改变的。变量的实质是连续分配的一块特定大小的内存空间。

那么老衲,数据结构你知道是什么意思了吗?

        老衲说:我猜啊!难道是存放数据的一种结构吗!                    真聪明

数据结构某种意义上来说也是存放数据的一种容器。就像数组一样,把若干个数据沿直线排列起来的数据结构。(相比较,数据结构也有一些比如,链表,栈,队列,树,堆等)。

问题2:那么老衲又在问了,不对呀,我写代码的时候有这么道题叫反转链表,老师都说这是链表呀?

        其实我在引言里面就说了这些意思,数据结构跟算法他俩是分不开的。那我们来说说程序是啥吧。

程序是用来在计算机上实现现实世界中的业务和娱乐活动的,为了达到这个目的,曾许愿需要结合计算机的特性,用程序来表示现实世界中对问题的处理步骤,即处理流程。

        那么算法(处理问题的步骤)和数据结构(作为处理对象的数据排列方式)。

就像链表啊:

        

struct ListNode{
    int data;
    struct ListNode* next;

};

这个结构体就是什么呢,他就是一个容器,用来存放一个链表的节点。

这块我想给大家介绍候捷老师的一本书叫STL源码剖析。

里面呢分为了三大块:

  1. 容器(如字符串,vector(线性数组),list(双向链表),queue(队列),哈希表等等
  2. 算法(如查找、排序、插入、删除等操作)
  3. 迭代器,有兴趣可以看看,迭代器呢其实是把容器和算法柔和到一起,加快了开发项目的效率

好了!回到整体!

老衲说,那么这些数据在内存中是如何分布的呢?

二、数据,换言之程序的内存分布!

程序与内存的关系。好比鱼和水一般密不可分,内存是承载程序运行的介质,也是程序进行各种运算的表达场所。

我们上一篇博客提出了如何让程序(可执行文件)映射到计算机内存里面,然后让cpu通过调用来进行执行程序呢?(这块涉及到了cpu如何从内存中读取数据,以及分段和分页的由来,后面讲)

现在我大概的说一下,假如老衲写了一个hello.c文件,运行起来就是一个进程(后面会讲进程是什么)如下:

#include <stdio.h>
#include <stdlib.h>
struct List{
    int data;
    struct List* next;
}ListNode;
int main()
{
    //创建一个数组
    char a[10] ={0};
    //创建一个链表
    ListNode* P=NULL;
    p =(ListNode*)malloc(sizeof(ListNode));
    free p;

    return 0;
}

分别创建了两个数据结构,一个是大小为10字节的数组,另一个是链表。如果想要深入理解的话,进程结构和内存布局,看看这个(后面会更新面经经验关于程序和进程之间的关系)

这块我们就不过多阐述这个问题了!

计算机所处理的数据都存储在被称为内存的IC(IC又叫集成电路)。通俗来讲讲吧!

在一般的个人计算机中,内存内部被分割成了若干个数据存储单元,每个单元可以存储8比特位的数据(8比特位 =1字节),为什么是8比特位,因为在计算机cpu中,8位地址线进行传输。

因此:(AD0~AD7)就是地址线,感兴趣的话,可以重温一下计算机组成原理

在32位机器上,一次能读4个字节,也就是32位比特位

在64位机器上,一次能读8个字节,也就是64位比特位

 回到正题!

在一般的个人计算机中,内存内部被分割成了若干个数据存储单元,每个单元可以存储8比特位的数据(1字节),为了区分各个单元,每个单元都被分配了一个编号,这个编号也就是地址。

如果一个人计算机装配有64M内存,那么就会有0~6400万个地址,想想要是查找的时候,是不是超麻烦!那么内存的物理结构和程序关系是什么?

 后续会详细的解说这块内容!!!!!

结束语:老衲,你理解了吗?

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: LiteOS是一个嵌入式操作系统,其内存管理算法通常是基于内存池的。这意味着系统在启动时会分配一个固定大小的内存池,并在运行过程中使用这个内存池来分配内存给不同的应用程序和系统进程。 在内存分配方面,LiteOS使用的是链表动态分配算法。这意味着系统会维护一个链表,其中包含可用内存块的信息。当应用程序需要分配内存时,系统会在链表中查找第一个足够大的内存块,然后将其分配给应用程序。这种方法的优点在于可以有效地利用内存,避免内存碎片的产生。 LiteOS还提供了垃圾回收功能,可以回收应用程序不再使用的内存。这通常是通过一种称为“标记-清除”的算法来实现的。首先,系统会找出所有正在使用的内存块,然后将它们标记为“可用”。接下来,系统会扫描整个内存池,并清除所有未被标记的内存块,使其成为可用内存。这样,就可以有效地回收应用程序不再使用的内存。 总的来说 ### 回答2: liteos_m是一款轻量级的操作系统,其内存管理算法采用了基于链表的动态分配和释放的方法。 liteos_m的内存管理主要包括两个方面:内存分配和内存释放。其中,内存分配使用了链表数据结构,通过维护一个空闲链表和一个已分配链表来管理可用的内存块。当需要分配内存时,liteos_m会从空闲链表中找到一个合适大小的内存块,并将其从空闲链表中移除,然后将其加入到已分配链表中。如果空闲链表中没有合适大小的内存块,则需要进行内存碎片整理或者向操作系统申请更多内存。 对于内存释放,liteos_m会将需要释放的内存块从已分配链表中移除,并将其重新加入到空闲链表中,以便下次分配时使用。此外,为了提高内存的利用率和管理效率,liteos_m还会对连续的空闲内存块进行合并,以减少内存碎片。 总的来说,liteos_m的内存管理算法主要是通过链表数据结构来管理内存块的分配和释放,通过动态维护空闲链表和已分配链表,实现了对内存的高效管理。这种方式既能够灵活地满足多种内存需求,又能够提高内存的利用率和系统的性能。 ### 回答3: liteos_m的内存管理算法原理是基于分段算法和垃圾回收算法。 在liteos_m中,内存分为多个段,每个段大小相等且固定。每个段可以分配给不同的任务或对象使用。分段算法的优势是可以避免内存碎片的产生,提高内存的利用率。 在liteos_m中,还引入了垃圾回收算法,这是为了解决内存中已经不再使用的对象或任务所占用的内存无法被释放的问题。垃圾回收算法通过定期检查内存中的对象和任务的引用计数,当引用计数为0时,表示该对象或任务已经不再需要,可以释放其占用的内存。通过垃圾回收算法,可以更好地管理和释放内存,避免内存泄露的问题。 总结来说,liteos_m的内存管理算法原理是通过分段算法来管理内存的分配和释放,同时结合垃圾回收算法来管理内存中不再使用的对象和任务的释放,以提高内存的利用率和避免内存泄露的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟道xn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值