请结合自己生活、学习的体验,谈一谈我们普通人的日常生活中哪些地方用到了大数据

昨夜今晨:海能达被判赔偿摩托羅拉53亿 新版个人信息安全规范发布

2020年3月9日 驱动中国昨夜今晨


受新冠疫情影响 苹果iPhone 5G可能会延迟发布
据cnBeta报道彭博社援引美国银行分析师的报告称,苹果备受期待的5G iPhone可能会由于新冠病毒的爆发而推迟发布 分析师认为,苹果的“ 5G iPhone”可能会在今年秋天推迟一个月发布
分析人士认為,除了推迟苹果“ iPhone 12 ”的发布时间外苹果传闻中的“ iPhone 9 ”或“ iPhone SE 2 ”的发布日期也可能推迟“数月”,理由是由于新冠病毒爆发导致的供应链問题和对设备的需求疲软新设备的发布将“取决于4月和5月产量的增加方式”。
此外出于对COVID-19的担忧,苹果的股价在过去几周内一直在波動自2月12日创下 驱动中国手机端

1、嵌入式系统中对内存分配的要求

①快速性嵌入式系统中对实时性的保证,要求内存分配过程要尽可能地快因此在嵌入式系统中,不可能采用通用操作系统中复杂而唍善的内存分配策略一般都采用简单、快速的内存分配方案。当然对实性要求的程序不同,分配方案也有所不同例如,VxWorks采用简单的朂先匹配如立即聚合方法;VRTX中采用多个固定尺寸的binning方案

②可靠性。也就是内存分配的请求必须得到满足如果分配失败可能会带来灾难性的后果。嵌入式系统应用的环境千变万化其中有一些是对可靠性要求极高的。比如汽车的自动驾驶系统中,系统检测到即将撞车洳果因为内存分配失败而不能相应的操作,就会发生车毁人亡的事故这是不能容忍的。

③高效性内存分配要尽可能地少浪费。不可能為了保证满足所有的内存分配请求而将内存配置得无限大一方面,嵌入式系统对成本的要求使得内存在其中只是一种很有限的资源;另┅方面即使不考虑成本的因素,系统有限的空间和有限的板面积决定了可配置的内存容量是很限的

2、静态分配与动态分配

究竟应用使鼡静态分配还是动态分配,一直是嵌入式系统设计中一个争论不休的总是当然,最合适的答案是对于不同的系统采用不同的方案如果昰系统对于实时性和可靠性的要求极高(硬实时系统),不能容忍一点延时或者一次分配失败当然需要采用静态分配方案,也就是在程序编译时所需要的内存都已经分配好了例如,火星探测器上面的嵌入式系统就必须采用静态分配的方案另外,WindRiver公司的一款专门用于汽車电子和工业自动化领域的实时操作系统OSEKWorks中就不支持内存的动态分配在这样的应用场合,成本不支持内存的动态分配在这样的应用场匼,成本不是优先考虑的对象实时性和可靠性才是必须保证的。当然采用静态分配一个不可避免的总是就是系统失去了灵活性,必须茬设计阶段就预先知道所需要的内存并对之作出分配;必须在设计阶段就预先考虑到所有可能的情况因为一旦出现没有考虑到的情况,系统就无法处理这样的分配方案必须导致很大的浪费,因为内存分配必须按照最坏情况进行最大的配置而实际上在运行中可能使用的呮是其中的一小部分;而且在硬件平台不变的情况下,不可能灵活地为系统添加功能从而使得系统的升级变得困难。

大多数的系统是硬實时系统和软实时系统的综合也就是说,系统中的一部分任务有严格的时限要求而另一部分只是要求完成得越快越好。按照RMS(Rate Monotoin Scheduling)理论这样的系统必须采用抢先式任务调度;而在这样的系统中,就可以采用动态内存分配来满足那一部分可靠性和实时性要求不那么高的任務采用动态内存分配的好处就是给设计者很大的灵活性,可以方便地将原来运行于非嵌入式操作系统的程序移植到嵌入式系统中比如,许多嵌入式系统中使用的网络协议栈如果必须采用静态内存分配,移植这样的协议栈就会困难得多另外,采用动态内存分配可以使設计者在不改变基本的硬件平台的情况下比较灵活地调整系统的功能,在系统中各个功能之间作出权衡例如,可以在支持的VLAN数和支持嘚路由条目数之间作出调整或者不同的版本支持不同的协议。说到底动态内存分配给了嵌入式系统的程序设计者在比较少的限制和较夶的自由。因此大多数实时操作系统提供了动态内存分配接口,例如malloc和free函数

3、RTOS提供的内存分配接口

不同的RTOS由于其不同的定位,采用不哃的内存分配策略例如VRTX中,采用类似于GNU C中由Doug Lea开发的内存分配方案即Binning算法,系统内存被分成了一些固定尺寸的内存块的算法系统内存被分成了一些固定尺寸的内存块的集合。这种方法的优点是查找速度快而且不会产生内存碎片但是,它的缺点也很明显就是容易造成浪费,因为内存块的尺寸只有有限个分配时只能取较大的内存块来满足一个较小的需求,累积起来浪费就很大了;而且操作系统管理這样一个内存分配表也是一个很大的负担。

VxWorks的内存管理函数存在于2个库中;memPartLib(紧凑的内存分区管理器)和memLib(完整的内存分区管理器)前鍺(memPartLib)提供的工具用于从内存分区中分配内存块。该库包含两类程序一类是通用工具创建和管理内存分区并从这些分区中分配和管理内存块;另一类是标准的malloc/free程序提供与内存分区的接口。系统内存分区(其ID为memSysPartId是一个全局变量)在内核初始化时由usrRoot调用memInit创建其开始地址为RAM中緊接着VxWorks的BSS段之后,大小为所有空闲内存如图1所示。


当创建其它分区时一般需要先调用malloc从系统内存分区中分配一段内存才能创建。内存汾区的结构定义为mem_part包含1个对象标记,1个双向链表管理空闲块1个信号量保护该分区及一些统计信息,如总尺寸、最大块尺寸、调试选项、已分配的块数、已分配的尺寸等其语句如下:

一般系统中只有1个内存分区,即系统分区所有任务所需要的内存直接调用malloc从其中分配。分配采用First-Fit算法(注意这种算法容易导致大量碎片)通过free释放的内存将被聚合以形成更大的空闲块。这就是VxWorks的内存分配机理分配时可鉯要求一定的对齐格式。注意不同的CPU架构有不同的对齐要求。为了优化性能malloc返回的指针是经过对齐的,为此的开销随构不同而不同唎如,68K为4字节对齐开销8字节;SPARC为8字节对齐,开销12字节;MIPS为16字节对齐开销12字节;I960为16字节对齐,开销16字节

MemLib库中提供了增强的内存分区管悝工具,并且增加了一些接口而且可以设置调试选项。可以检测2类错误:①尝试分配太大的内存;②释放内存时发现坏块有4种错误处悝选项,当发生错误时记录消息或挂起任务

但是,使用动态内存分配malloc/free时要注意到以下几方面的限制①因为系统内存分区是一种临界资源,由信号量保护使用malloc会导致当前调用挂起,因此它不能用于中断服务程序;②因为进行内存分配需要执行查找算法其执行时间与系統当前的内存使用情况相关,是不确定的因此对于有规定时限的操作它是不适宜的;③由于采用简单的最先匹配算法,容易导致系统中存在大量的内存碎片降低内存使用效率和系统性能。

针对这种情况一般在系统设计时采用静态分配与动态分配相结合的方法。也就是對于重要的应用在系统初始化时分配好所需要的内存。在系统运行过程中不再进行内存的分配/释放这样就避免了因内存的分配释放带來的总是。而且在系统初始化因为没有内存碎片,对于大的内存块的需求容易满足对于其它的应用,在运行时进行动态内存分配尤其是某些应用所要求的大量固定尺寸的小内存块,这时就可以采用一次分配多次使用的内存分配方案下面详细介绍这种内存分配方案及其应用场合。

4、一次分配多次使用的内存分配方案

在嵌入式系统设计中经常有一些类似于内存数据库的应用。这些应用的特点是在内存Φ管理一些树比如以太网交换机中的MAC地址表、VLAN表等,或者路由器中的路由表这些树是由许多相同尺寸的节点组成的。这样就可以每佽分配一个大的缓冲池,比如包含多个内存单元的数组每个内存单元用于1个节点。我们用一个空闲链表来管理该数组中的空闲内存单元每次程序需要分配内存以创建1个新的节点时,就从空闲链表中取1个单元给调用者程序删除节点并释放内存时,将释放的内存单元返还給空闲链表如果链表中的空闲内存单元取空了,就再次调用malloc从系统内存中分配一个大的内存块作为新的缓冲池采用这样一种方案主要囿如下优点:①减少了malloc/free的调用次数,从而降低了风险减少了碎片;②因为从缓冲池中取一个内存单元是时间确定的(当然,如果缓冲池耗尽从而需要重新调用malloc分配除外)因此它可以用于严格时限的场合从而保证实时性;③它给用户以自由来添加一些用于内存分配和释放嘚调试函数以及一些统计功能,更好地监测系统中内存的使用情况

这种方案必然涉及到一个缓冲池的结构。一般缓冲池的结构由以下几蔀分组成:单元尺寸、块尺寸(或者单元数目)、缓冲池指针、空闲链表、用于统计和调试的参数等对缓冲池的操作包括创建缓冲池、釋放缓冲池、从缓冲池中分配1个内存单元、释放内存单元回缓冲池等。下面举2个例子说明一下该方案的具体使用情况

4.1 Intel交换机驱动程序Φ内存分配

在以Intel的交换芯片为基础的交换机方案中,因为采用的是软件地址学习的方式需要在内存中维护许多数据,如MAC地址表的软拷贝、VLAN表、静态单播地址表、组播地址表等这些表都是由一些树组成,每个树由一些固定尺寸的节点组成一般每个节点几十个字节,每棵樹的节点数是可增长的少则几十,最多可到16K个节点因此,很适合于采用该方案具体的实现如下:

/*下面的变量为预定义的每个管理器朂多包含的块数,如64

结构中的参数包括:单元尺寸、块尺寸、已用块数、所有块的地址、空闲链表(单向链表)

(2)缓冲池的管理函数

◆block_mem_create:创建块内存管理器,参数包括内存指针(如为NULL表示自己分配)、块尺寸、单元尺寸、返回管理器指针。

②单元尺寸4字节对齐计算烸个块中的单元数。对内存指针进行4字节对齐或者分配内存指针

③初始化结构BlockMemMgr,包括单元尺寸和块尺寸设置第1个内存块的指针。如果內存是外来的设置块已用标志(已用为0),表示不能增加块;否则已用块数设为1。

④创建空闲链表将块内所有单元添加到链表中,朂后一个单元处于链表的最前面

◆block_mem_destroy:解构一个块内存管理器,释放它所分配的所有内存调用者负责外部内存的释放。参数为BlockMemMgr返回成功失败标志。

②删除单向链表(设链表指针为NULL)

③如果块是动态分配的,释放它们

◆block_malloc:从块内存管理器中分配1个单元

◆block_malloc:从块内存管悝器中分配1个单元。参数为BlockMemMgr返回数据单元指针。

②判断空闲链表是否为空(是否为NULL)如果为空,判断是否可以动态分配块如果不能,返回失败;如果可以动态分配块则分配1个块,执行与block_mem_create一样的操作

③从空闲链表中分配第1个单元,返回其指针

注意这里有一个小技巧,即数据单元在空闲时其中存放空闲链表的节点信息而分配后则存放数据内容。

◆block_free:释放1个数据单元返回块内存管理器。小心不要對1个单元释放2次参数为BlockMemMgr和单元指针。

②地址比较判断数据单元属于哪个块。

③判断数据单元的内容是否为空闲链表节点信息(也就是塊内某单元的地址)从而确定是否为2次释放。

④将该数据单元插入到空闲链表的前面

⑤引用该单元的指针设为NULL。

内存管理代码遵守如丅约定:①管理的内存是实际可写的内存;②分配内存是4字节或32位对齐;③block_malloc、block_free在中断级调用是部分安全的除非BLOCK中已经没有空闲CELL,需要重噺调用malloc分配新的BLOCK(而malloc和free就不是安全的因为其中使用了信号量和搜索算法,容易引起中断服务程序阻塞)当然,block_mem_create和block_mem_destroy必须在进程级调用

4.2 TMS中的内存分配

TMS是WindRiver公司为可管理式交换机推出的开发包。它用用IDB来管理各种协议的数据比如STP和GVRP等。为了支持IDB它建立了自己的缓冲池管悝方案,程序在bufPoolLib.c中该程序包含用于缓冲池管理的函数,这些函数允许从1个池中分配固定数目和大小的缓冲区通过预先分配一定数目固萣大小的缓冲区,避免了反复的小的内存块分配/释放相关联的内存碎片和浪费既然它从1个单一的块中分配缓冲池,也比对每一个缓冲区執行1次分配有更高的空间效率模块对每个缓冲区加上1个标记(MAGIC),释放时会检查标记模块给用户提供分配和释放操作定义回调函数的能力。这样可以做到自动的对象创建和解构同时允许由多个缓冲池分配的成员组成的对象做为1个单一的实体删除。这类似于C 中自动的对潒构建和解构不过是用C语言并且没有堆栈分配的负担。模块既允许从堆栈中分配缓冲池(通过calloc)也可以在用户分配的空间中创建它们。模块用1个单向链表来维护未分配的缓冲区但不跟踪已分配的缓冲区。模块并不是任务安全的用户需要用信号时来保护缓冲池。

结构Φ的参数包括检查标记MAGIC、是否本地分配、空闲链表、内存指针、创建缓冲池的回调函数指针、释放时的回调函数指针、回调函数参数

◆BufPoolInitializeStorage:分配和初始化存储区。参数包括存储区地址(如为NULL则本地分配)、缓冲区大小、缓冲区个数。

①根据缓冲区大小和个数获得所需的内存大小

②如果指针为NULL,则调用calloc分配内存设置本地分配标志。

④初始化指针分配的内存块最前面为缓冲池结构buf_pool_t。实际的存储区紧随其後Buf_pool_t包含参数检查标记、是否本地分配、存储区地址、分配时回调函数、释放时回调函数、回调函数变量。此时只设置存储区指针

◆BufPoolCreate:創建缓冲池。参数为内存制止缓冲区尺寸和个数,创建时回调函数、释放时回调函数、回调函数参数

③用传入参数填充buf_pool_t结构。

④将缓沖区添加到空闲链表中最后的缓冲区在最前面。

①检查缓冲池结构中的MAGIC字段是否被个性

②如果是本地分配的则翻放内存区。

◆BufPoolAlloc:从缓沖池中分配一个缓冲区参数为缓冲池结构指针。如果存在空闲缓冲区则从空闲链表中除并提供给调用者,执行创建时回调函数如果囙调函数返回错误,则将缓冲区返还给空闲链表

①检查缓冲池结构中的MAGIC标记是否完好。

②从空闲链表中取出头一个节点

③如果节点不為空,清空节点以其地址为参数调用回调函数。

④如果回调函数返回错误则将节点还给空闲链表。

⑤返回得到空闲缓冲区地址

◆BufPoolFree:將缓冲区返回给缓冲池。如果定义了回调函数将在归还缓冲之间调用回调函数。参数为缓冲池结构和缓冲区指针

①缓冲池MAGIC标记是否完恏。

②如果定义回调函数、调用之如果返回错误,则设置错误号

③将缓冲区添加到空闲链表中头部。

注意该函数有2点:①回调函数返囙错误照样归还缓冲区。②没有检查缓冲区是否二次释放这一点与Intel的驱动程序不同。

另外TMS的缓冲池没有BLOCK要领,不需要判断哪个CELL属于哪个BLOCK简化 了操作。

许多嵌入式应用在RTOS提供的malloc/free的基础上编写自己的内存管理方案编写这样的内存管理方案,目的无非有两个:一是减少對malloc/free的依赖从而避免由之带来的内存碎片、时间不确定等总是;另一个是增强程序的查错能力,送还内存使用错误对于在嵌入式系统中廣泛存在的数据库类型的内存需求,即分配多个固定尺寸的内存单元的要求“一闪分配,多次使用”的方案无疑是一种很好的解决之道文中介绍的2个例子很好地体现了它的优越性。

我们在日常生活中所做的一切都會留下数字痕迹也就是大数据,我们可以利用和分析这些数据来让我们的生活更加美好

世界正变得越来越数字化,大数据正在以这种戓那种方式影响着每个人的生活

我们在日常生活中所做的一切都会留下数字痕迹(或者数据),也就是大数据我们可以利用和分析这些数據来让我们的生活更加美好。

下面让我们看看大数据应用的真实例子:

· 在医院儿科部会记录早产儿和患病婴儿的每一次心跳,然后将這些数据与历史数据相结合来识别模式基于这些分析,系统可以在婴儿表现出任何明显的症状之前就检测到感染这使得医生可以早期幹预和治疗。

· 来自Nike & Fitbit的健身腕带可以收集有关我们走路或者慢跑的数据例如我们走了多少步,每天燃烧了多少卡路里我们的睡眠模式戓者其他数据,然后结合这些数据与健康记录来改善我们的健康状况

· 在学校和大学,流媒体视频课程和数据分析可以帮助教师跟踪学苼的学习情况根据他们的能力水平定制教学内容,以及预测学生的执行情况

· SmartThings公司可以帮助你在家里安装动力、湿度和其他传感器,讓你了解家里正在发生的事情同时通过iPhone上的应用程序来控制家里的所有设备。

· 当我们每天在公路上开车时我们的智能手机会发送我們的位置信息以及速度,然后结合实时交通信息为我们提供最佳路线从而避免堵车。结合位置应用程序AroundMe还可以为你提供附近的餐馆、、加油站等信息。

· 当我们去购物时我们的数据会结合历史购买记录和社交媒体数据来为我们提供优惠券、折扣和个性化优惠。

· 最后EarlySense等公司正在开发健康和水平监测传感器,位于床垫下面自动监测和记录心脏速率、呼吸速率、运动和睡眠活动。该传感器收集的数据鉯无线方式被发送到智能手机和平板电脑进行进一步分析。

大数据的其他一些创造性的用途是:

· WNYC开发的Transit Time NYC让纽约人可以点击纽约市的五個区域来获取地铁或火车的时间他们从开源行程平台OpentripPlanner获取数据,并将这些数据域公开下载的地铁时间表结合来创造400万虚拟旅程

· 美国公共卫生协会开发的FluNearYou调查了用户的症状感觉,并存储和分析庞大的数据量然后生成报告显示用户所在地区的流感活动。

· 针对建设、改慥和翻新住宅的“一站式商店”Buildzoom拥有约250万承包商、5万以上客户意见信息来帮助50万用户带来更多客观性和透明度的决策意见。

· 美国联邦調查局正在结合来自社交媒体、闭路电视摄像机、电话和文本的信息来追踪犯罪和未来恐怖袭击活动

· 奥巴马在2012年总统竞选中使用大数據分析来收集选民的数据,再加上一流的分析引擎让他可以专注于最有可能投他的选民。

· 谷歌的自动驾驶分析来自传感器和摄像头的實时数据以在道路上安全驾驶

· 智能电视和机顶盒能够追踪你正在看的内容,看了多长时间甚至能够识别多少人坐在电视机前,来确萣这个频道的流行度

· 在希腊,政府正在使用Google Earth来看看谁能够在后院有游泳池然后核对其纳税记录

最终,我们都将从大数据分析中获益如果我们的银行能更好地了解风险,我们的经济将更加强大如果政府能够降低其欺诈开支,我们的税收也会降低如果疾病能够更早治疗,我们将会更加健康

著作权声明:畅享网文章著作权分属畅享网、网友和合作伙伴,部分非原创文章作者信息可能有所缺失如需補充或修改请与我们联系,工作人员会在1个工作日内配合处理

我要回帖

 

随机推荐