权重存储器
㈠ 人脑是怎么存储记忆的,相当于电脑的多大内存的
根据此前的研究,有科学家认为人脑的存储容量大约为1TB,不过也有科学家认为应该有100TB。
人脑虽然不是自然界中最大的,但却是最发达的。在所有哺乳动物中,人脑占身体的比例最大。人脑虽然只占了身体重量的2%,却消耗着20%的能量。在人类的进化史中,人类的脑容量一直在增加,现在已经接近1500毫升了。
记忆是智力的基石,一个记忆力强的人,智力通常也比较强。可以肯定,人脑的记忆潜能很大,只要是智力正常的人,通过长期反复的学习,多学多用,一定能成为一个博学多识的人。
如果将一个图书馆中的内容都装进脑中,用处也不大,因为数据太多反而会拖累读取速度,我们需要的是在理解的基础上建立更有效的神经连接通路。
㈡ CACHE替换算法有哪几种,分别简要说明
其代表算法有:①Hybrid算法:算法对Cache中的每一个对象赋予一个效用函数,将效用最小的对象替换出Cache;②LowestRelativeValue算法:将效用值最低的对象替换出Cache;③(LCNR)算法:该算法使用一个关于文档访问频次、传输时间和大小的推理函数来确定替换文档;④Bolot等人提出了一种基于文档传输时间代价、大小、和上次访问时间的权重推理函数来确定文档替换;⑤SizeAdjustLRU(SLRU)算法:对缓存的对象按代价与大小的比率进行排序,并选取比率最小的对象进行替换
扩展知识:
Cache是一种根据程序局部性原则,通过小容量速度快的存储器缓存部分数据,以减少处理器对慢速大容量存储器的访问次数,从而提升处理器取指效率的机制。Cache替换算法是指当Cache缺失发生后,Cache按某种机制选中高速缓存中的某个地址进行数据更新。Cache替换算法对Cache的命中率有较大的影响。目前主流的Cache替换算法有伪随机、先进先出(FIFO——First In First Out)和最近最少使用(LRU——Least Recently Used)等。相较于伪随机和先进先出算法,LRU算法更符合程序局部性原则(当前执行的程序代码,在不久后会再次访问该代码段),Cache的命中率更高,但其硬件资源消耗非常大。
传统的LRU算法对Cache的每一路进行统计,在需要替换时,将最近最少被使用的那一路替换。由于传统LRU算法的数据使用频率统计为向上计数,故其计数器计数位宽较大,且需要额外的机制来处理计数溢出的情况。
㈢ Android系统内存管理
部分内容出至林学森的Android内核设计思想。
Android官网内存管理
部分出至 https://www.jianshu.com/p/94d1cd553c44
Android本质是Linux所以先从Linux说起。
Linux的内存管理为系统中所有的task提供可靠的内存分配、释放和保护机制。
核心:
虚拟内存
内存分配与释放
内存保护
将外存储器的部分空间作为内存的扩展,如从硬盘划出4GB大小。
当内存资源不足时,系统按照一定算法自动条形优先级低的数据块,并把他们存储到硬盘中。
后续如果需要用到硬盘中的这些数据块,系统将产生“缺页”指令,然后把他们交换回内存中。
这些都是由操作系统内核自动完成的,对上层应用”完全透明“。
每个进程的逻辑地址和物理地址都不是直接对应的,任何进程都没办法访问到它管辖范围外的内存空间——即刻意产生的内存越界与非法访问,操作系统也会马上阻止并强行关闭程序,从而有力的保障应用程序和操作系统的安全和稳定。
一旦发现系统的可用内存达到临界值,机会按照优先级顺序,匆匆低到高逐步杀掉进程,回收内存。
存储位置:/proc/<PID>/oom_score
优先级策略:
进程消耗的内存
进程占用的CPU时间
oom_adj(OOM权重)
Android平台运行的前提是可用内存是浪费的内存。它试图在任何时候使用所有可用的内存。例如,系统会在APP关闭后将其保存在内存中,以便用户可以快速切换回它们。出于这个原因,Android设备通常运行时只有很少的空闲内存。在重要系统进程和许多用户应用程序之间正确分配内存内对存管理是至关重要。
Android有两种主要的机制来处理低内存的情况:内核交换守护进程(kernel swap daemon)和低内存杀手(low-memory killer)。
当用户在APP之间切换时,Android会在最近使用的(LRU)缓存中保留不在前台的APP,即用户看不到的APP,或运行类似音乐播放的前台服务。如果用户稍后返回APP,系统将重用该进程,从而使APP切换更快。
如果你的APP有一个缓存进程,并且它保留了当前不需要的内存,那么即使用户不使用它,你的APP也会影响系统的整体性能。由于系统内存不足,它会从最近使用最少的进程开始杀死LRU缓存中的进程。该系统还负责处理占用最多内存的进程,并可以终止这些进程以释放RAM。
当系统开始终止LRU缓存中的进程时,它主要是自底向上工作的。系统还考虑哪些进程消耗更多的内存,从而在终止时为系统提供更多的内存增益。你在LRU列表中消耗的内存越少,你就越有可能留在列表中并能够快速恢复。
为了满足RAM的所有需求,Android尝试共享RAM来跨进程通信。它可以做到以下方式:
Android设备包含三种不同类型的内存:RAM、zRAM和storage。
注意:CPU和GPU都访问同一个RAM。
内存被拆分成页。通常每页有4KB的内存。
页面被认为是空闲的或已使用的。
空闲页是未使用的RAM。
已使用页是系统正在积极使用的RAM,分为以下类别:
干净的页面(Clean pages)包含一个文件(或文件的一部分)的一份精确副本存在存储器上。当一个干净的页面不再包含一个精确的文件副本(例如,来自应用程序操作的结果)时,它就变成了脏页。可以删除干净的页,因为它们始终可以使用存储中的数据重新生成;不能删除脏页(Dirty pages),否则数据将丢失。
内核跟踪系统中的所有内存页。
当确定一个应用程序正在使用多少内存时,系统必须考虑shared pages。APP访问相同的服务或库将可能共享内存页。例如,Google Play Services 和一个游戏APP可能共享一个位置服务。这使得很难确定有多少内存属于这个服务相对于每个APP。
当操作系统想要知道所有进程使用了多少内存时,PSS非常有用,因为页面不会被多次计数。PSS需要很长时间来计算,因为系统需要确定哪些页面是共享的,以及被有多少进程。RSS不区分共享页面和非共享页面(使计算速度更快),更适合于跟踪内存分配的更改。
内核交换守护进程(kswapd)是Linux内核的一部分,它将使用过的内存转换为空闲内存。当设备上的空闲内存不足时,守护进程将变为活动状态。Linux内核保持低和高的可用内存阈值。当空闲内存低于低阈值时,kswapd开始回收内存。当空闲内存达到高阈值,kswapd将停止回收内存。
kswapd可以通过删除干净的页面来回收干净的页面,因为它们有存储器支持并且没有被修改。如果进程试图寻址已删除的干净页,则系统会将该页从存储器复制到RAM。此操作称为请求分页。
kswapd将缓存的私有脏页(private dirty pages)和匿名脏页(anonymous dirty pages)移动到zRAM进行压缩。这样做可以释放RAM中的可用内存(空闲页)。如果进程试图触摸zRAM中脏页,则该页将被解压缩并移回RAM。如果与压缩页关联的进程被终止,则该页将从zRAM中删除。
如果可用内存量低于某个阈值,系统将开始终止进程。
lmkd实现源码要在system/core/lmkd/lmkd.c。
lmkd会创建名为lmkd的socket,节点位于/dev/socket/lmkd,该socket用于跟上层framework交互。
小结:
LMK_TARGET: AMS.updateConfiguration() 的过程中调用 updateOomLevels() 方法, 分别向/sys/mole/lowmemorykiller/parameters目录下的minfree和adj节点写入相应信息;
LMK_PROCPRIO: AMS.applyOomAdjLocked() 的过程中调用 setOomAdj() 向/proc/<pid>/oom_score_adj写入oom_score_adj后直接返回;
LMK_PROCREMOVE: AMS.handleAppDiedLocked 或者 AMS.() 的过程,调用remove(),目前不做任何事,直接返回;
为了进一步帮助平衡系统内存并避免终止APP进程,可以Activity类中实现ComponentCallbacks2接口。提供的onTrimMemory()回调方法允许APP在前台或后台侦听与内存相关的事件,然后释放对象以响应应用程序生命周期或表明系统需要回收内存的系统事件。
onTrimMemory()回调是在Android 4.0(API级别14)中添加的。
对于早期版本,可以使用onLowMemory(),它大致相当于TRIM_MEMORY_COMPLETE事件。
一个专门的驱动。(Linux Kernel 4.12 已移除交给kswapd处理)。
很多时候,kswapd无法为系统释放足够的内存。在这种情况下,系统使用onTrimMemory()通知APP内存不足,应该减少其分配。如果这还不够,内核将开始终止进程以释放内存,它使用低内存杀手(LMK)来完成这个任务。
为了决定要终止哪个进程,LMK使用一个名为oom_adj_score的“out of memory”分数来确定运行进程的优先级,高分的进程首先被终止。
后台应用程序首先被终止,系统进程最后被终止。
下表列出了从高到低的LMK评分类别。第一排得分最高的项目将首先被杀死:
Android Runtime(ART)和Dalvik虚拟机使用分页(Paging)和内存映射(mmapping)来管理内存。应用程序通过分配新对象或触摸已映射页面来修改内存都将保留在RAM中,并且不能被调出。应用程序释放内存的唯一方式是垃圾收集器。
㈣ 存算一体原理
存算一体芯片主流研究方向:
根据存储器介质的不同,目前存算一体芯片的主流研发集中在传统易失性存储器,如SRAM、DRAM,以及非易失性存储器,如RRAM,PCM,MRAM与闪存等,其中比较成熟的是以SRAM和MRAM为代表的通用近存计算架构。
通用近存计算架构:
采用同构众核的架构,每个存储计算核(MPU)包含计算引擎(Processing Engine, PE)、缓存(Cache)、控制(CTRL)与输入输出(Inout/Output, I/O)等,这里缓存可以是SRAM、MRAM或类似的高速随机存储器。
(1) SRAM存算一体
由于SRAM是二值存储器,二值MAC运算等效于XNOR累加运算,可以用于二值神经网络运算。
(2) DRAM存算一体
基于DRAM的存算一体设计主要利用DRAM单元之间的电荷共享机制[33,34]。
(3) RRAM/PCM/Flash多值存算一体
基于RRAM/PCM/Flah的多值存算一体方案的基本原理是利用存储单元的多值特性,通过器件本征的物理电气行为(例如基尔霍夫定律与欧姆定律)来实现多值MAC运算。每个存储单元可以看作一个可变电导/电阻,用来存储网络权重,当在每一行施加电流/电压(激励)时,每一列即可得到MAC运算的电压/电流值。
(4) RRAM/PCM/MRAM二值存算一体
基于RRAM/PCM/MRAM的二值存算一体主要有两种方案。第一种方案是利用辅助外围电路,跟上述SRAM存算一体类似,第二种方案是直接利用存储单元实现布尔逻辑计算。
㈤ 联想存储的特点是
联想存储器的特点是
联想存储器的特点是:
①除有存储功能外,还具有信息处理功能。它能根据送来内容的特征查找存储单元。
②对各个存储单元并行进行查找,因而能显着提高查找速度。这些特点与人脑的“联想”功能有所相似,因而被称为联想存储器。
存储器中所存的信息可用地址和数值(内容)两个参数描述。如要对两个存储单元中的内容作某种运算,并将结果存入其中一个单元,则选用按地址存取的存储器比较适宜。如果根据某些内容特征来查找存储单元,则使用联想存储器能更快地得到结果。而且存储空间的使用比较节省,修改记录时所花费的系统开销也较小。联想存储器用在大型数据库的实时检索和更新,以及通用计算机的虚拟存储和控制系统等方面。
联想存储器的组成。联想存储体中的每个存储单元都含有存储、比较、读写、控制等电路。查找变量被存放在比较数寄存器中。屏蔽寄存器用来屏蔽比较数寄存器的部分内容,而将未屏蔽部分作为查找变量送入联想存储体。查找时,每个存储单元将它的内容与送来的查找变量比较。如果相等,则响应寄存器中的对应位被置1。如不相等,则置0。这样,查找结果就被存入响应寄存器中。满足查找要求的存储单元称为响应单元。查找是并行进行的,因而响应单元可能不止一个,这称为多重响应。这时,如要写入信息,则可将信息先送入比较数寄存器,并经与屏蔽寄存器配合再送至联想存储体,并行写入这些响应单元。有时也可根据单元的地址写入信息。如要读出信息,则必须将这些单元逐一分解,确定地址顺序读出,这称为多重响应分解,由多重响应分解器完成。字选择寄存器用来选择参加查找操作的存储单元,起字间屏蔽的作用。“比较”是联想存储器最基本的逻辑操作,对于给定的查找变量能完成多种比较操作。
例如:全等、不等;小于、大于;不大于、不小于;仅大于、仅小于;区间内、区间外和最大值、最小值等。这些操作可在全等比较的基础上通过相应的算法来实现,也可以在存储单元内增加相应的逻辑线路来承担。