文章目录前言正文内存如何使用:问题引入初始逻辑地址与物理地址运行时进行重定位。内存的分段机制如何在内存里面找到空闲分区。固定分区可变分区可变分区的三种适配方式可变分区造成的问题如何根据逻辑地址找到物理地址参考资料
前言
cpu的使用基本上告一段落,接下来是内存部分。
正文
内存如何使用:
内存使用就是放在内存中的程序能够按照正确的逻辑顺序执行
首先让程序进入内存:
问题引入
假设一段c代码
int main (int argc,...
vtale 内存布局分析
虚函数表指针与虚函数表布局
考虑如下的 class:
class A {public:int a;virtual void f1() {}virtual void f2() {}
};int main() {A *a1 = new A();return 0;
}
首先明确,sizeof(A)的输出是 16,因为:class A 中含有一个 int 是 4 字节,然后含有虚函数,所以必须含有一个指向 vtable 的 vptr,而 vptr 是 8 字节,8 + 4 = 12,对齐到 8 的边界,也就是 16
上述 class 的 AST record layout 如下:
*** Dump...
内存碎片 :内部碎片(占了不用)内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。外部碎片(太小&不连续 -》没法用)外部...
内存分配与回收
??对象的内存分配,往大方向讲,就是在堆上进行分配,对象主要分配在新生代的Eden区上,如果启用了本地线程分配缓冲,将按线程优先在TLAB上进行分配,少数情况下也会直接分配在老年代。
Minor GC 和Full GC
??Minor GC:回收新生代,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快。
??Full GC:回收老年代和新生代,老年代对象其存活时间长,因此 Full GC 很少执行,执行速度会...
#现在考虑有一个 jsonline 格式的文件 file.txt 大小约为 10K,之前处理文件的代码如下所示:
1. def get_lines():
2. l = []
3. with open(‘file.txt’,‘rb’) as f:
4. for eachline in f:
5. l.append(eachline)
6. return l
7. if __name__ == ‘__main__’:
8. for e in get_lines():
9. process(e) #处理每一行数据#
现在要处理一个大小为 10G 的文件,但是内存只有 4G,如果...
由于内存条种类繁多,参数多样,很多小白DIY电脑的,会发现购买内存条是件头疼的事。大家对内存容量以及内存频率关注较多,而对内存时序却关注的很少,其实内存时序也是内存的参数之一,内存时序究竟有多重要呢?
内存时序是描述同步动态随机存取存储器(SDRAM)性能的四个参数:CL、TRCD、TRP和TRAS,单位为时钟周期。它们通常被写为四个用破折号分隔开的数字,如16-18-18-36。宏旺半导体了解到,第四个参数经常被省略,而有时还会...
在直接内存回收过程中,有可能会造成当前需要分配内存的进程被加入一个等待队列,当整个node的空闲页数量满足要求时,由kswapd唤醒它重新获取内存。这个等待队列头就是node结点描述符pgdat中的pfmemalloc_wait。如果当前进程加入到了pgdat->pfmemalloc_wait这个等待队列中,那么进程就不会进行直接内存回收,而是由kswapd唤醒后直接进行内存分配。
直接内存回收执行路径是:
__alloc_pages_slowpath() -> __alloc_pages_direct_rec...
Advanced Content
以下章节专为时间富余和有意深究的学习者而设,其中将介绍更多中级技术,其中会涉及部分手动内存管理,以及使用非默认流重叠执行核函数和内存拷贝。
在了解以下所列的各项技术后,您可尝试运用这些技术进一步优化 n-body 模拟。Manual Memory Allocation and Copying
尽管 cudaMallocManaged 和 cudaMemPrefetchAsync 函数性能出众并能大幅简化内存迁移,但有时也有必要使用更多手动内存分配方法。这在已知只需在...
首先说这两个问题,都是由于一个原因。我的笔记本是4G内存,虽然提示是内存不足,如果你增加4G内存,会仍然不好用。看到有人问,这里我在网上搜索了有效的方法,现在分享给大家。
Win+R键盘,在“运行”窗口输入“Regedit”,打开注册表编辑器,找到计算机——HKEY_CURRENT_USER——Sofrware——Adobe——Photoshop——110.0,新建DWORD(32)位值,数据名称为:OverridePhysicalMemoryMB,数值数据为2000,基数选择十进制,确定!...
新生代满了会触发 Young GC,老年代满了会触发 Old GC。GC时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢?可达性分析算法,判断是否被 GC Roots 引用
判断引用类型:强引用、软引用、弱引用、虚引用
是否调用finialize()方法自救首先,JVM 会通过可达性分析算法来判断哪些对象会被回收,哪些不会被回收。可达性分析算法会从一个对象触发,一层层向上,分析有谁在引用它,看是否有一个 GC Roots。
被 GC Roots 引用的对...
UITableView的常用属性:分割线颜色设置:1》 设置separatorStyle: 分割线的颜色方法:tableView.separatorStyle =
UITableViewCellSeparatorStyleSingleLine;2》 设置separatorColor
不用系统枚举的值,自己设定颜色的值 24bitRGB R:8bit G:8bit B:8bit=========== 32bitRGBA R:8bit G:8bit B:8bit A:8bit 表示透明度alpha # ff ff ff 设置值的时候用三原色的值比/255.0,这...
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变成了下面的样子。 同样,根据摩尔定律,我们知道...
private static final ExecutorService threadPool= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);public void method(String str) {......if ([退出循环的条件]) {threadPool.execute(() -> {method(str)});} else {return;}
}
内存频率谁说了算?主板还是CPU?对于没有任何基础的初学者,这样的问题足以把人弄得七荤八素,到了东南找不到西北。今天宏旺半导体试图梳理一下这个它们的关系。
首先,要了解什么是内存频率?同CPU主频一样,内存频率通常用来表示内存的运行速度,并以MHz作为计量单位。目前市场上主流的内存条已经发展到DDR4、DDR3,从2133MHz、2400MHz的入门频率到3000、3600MHz的主流频率,再到4000MHz甚至更高的频率,多种多样的频率极大丰富...
操作系统--虚拟内存管理
Objectives? 背景? 请求分页? 即写即拷**页面替换**
?帧的分配抖动Objectives
? 描述虚拟内存的好处 ? 解释请求分页、页面替换算法和页面分配的概念
?讨论工作集模型的原理
? 背景
背景 虚拟内存 用户逻辑内存与物理内存的分离。 ? 只有部分程序需要在内存中执行 ? 因此,逻辑地址空间可以比物理地址空间大得多 ? 允许多个进程共享地址空间 ? 允许更高效的流程创建虚拟内存可以通过以下方式实 现:
? 请求分...