*** 作系统导论:1.lambda是函数对象。lambda表达式会被编译器翻译成一个未命名类的未命名对象,这个类里面有一
个重载的函数调用运算符。
2.如果lambda表达式要使用值捕获/引用捕获来捕获n个变量,那么编译器要生成的未命名类里面还要
多含有一个拷贝构造函数/移动构造函数,以及n个数据成员。
3.标准库函数对象:标准库定义了一系列表示算数、关系和逻辑的类,这些类都含有函数调用运算
符,而且是模板类。它们的对象可以充当各种算法的谓词,甚至可以用于在算法中比较指针。
4.C++中可调用对象的类型有:函数、函数指针、lambda表达式、bind创建的对象、重载了函数调用
运算符的类。
5.调用形式:即可调用对象的某种参数类型和返回类型的统一体。显然不同种类的可调用对象可以有
相同的调用形式。如果希望一个map的值可以是众多调用形式相同的可调用对象(一个函数表),
那么需要C++11里新增的标准库function类型。
6.重载函数不能直接insert进function对象中因为存在二义性。解决办法是使用调用形式时就存储函数指
针而不是函数名。也可以使用lambda表达式来消除二义性。
7.如果想让一个对象通过默认构造函数来进行初始化,那么记住直接写对象名就行,不需要(也不能)在
对象名后面加空括号。
8.类型转换运算符:operator type() const { },没有显式的返回类型和参数,必须定义为成员函数,有
后置的const修饰,符号就是要转换为的类型。
注意,不允许转换为数组和函数,但允许转换为指针和引用。
9.将其他类型的值转换为某个类类型的过程其实要靠该类类型的各个转换构造函数。将类类型转换为
其他类型的过程要靠类型转换运算符。 这两个成员函数统称类类型转换,也叫用户定义的类型转换。
10.通常情况下,不要为类定义相同的类型转换,也不要为类中定义两个及两个以上的转换源或转换目
标是算数类型的转换。因为会有很复杂的二义性问题。
1.替换策略:决定 *** 作系统决定从内存中踢出哪一页(或哪几页)的策略。
2.缓存(cache):因为物理内存中保存的页只是全部页的一部分,那么,可以把物理内存看作是虚拟内
存页的缓存。可以在物理内存中找到目标页就叫缓存命中。
3.平均内存访问时间(AMAT) = (缓存命中概率PHit * 访问内存成本TM) + (缓存未命中概率PMiss * 访问
磁盘成本TD)。0 <= PHit、PMiss <= 1且PHit + PMiss = 1。
4.因为现代磁盘的访问速度仍然很慢,所以少量的未命中就会显著地提升AMAT。此时一个好的替换策
略显然是至关重要的。
5.最优替换策略:替换内存中在最远的将来才会被访问到的页。这几乎不可能办到,但确实是最优的
策略。通过与这个理论上最优的策略比较,可以评估其他策略还有多少改进空间。
6.缓存未命中分为三种:强制未命中(第一次引用引起)、容量未命中(缓存空间不足引起)、冲突未命中
(硬件位置限制引起)。
7.FIFO策略:先进先出策略。它实现很简单,但是完全无法确定页的重要性。自然地,它的AMAT也很高。
8.Belady的异常:如果使用FIFO,增大缓存,命中率反而会下降。
9.随机策略:也很简单,但命中率完全取决于运气。
10.最不经常使用策略(LFU):替换最不经常使用的页。
11.最少最近使用策略(LRU):替换最近最少使用的页。
12.因为LRU利用了程序的局部性,所以往往命中率比LFU更好。
13.因为找到真正局部最少使用的页代价昂贵,所以可以找到差不多最少使用的页作为替代是个好的选择。
14.近似LRU:新开辟了使用位(0表示最近没使用过,1表示最近使用过),并使用时钟算法。
15.脏页:即在缓存中被修改过的页。一般这种页必须移回磁盘。有对应的脏位。如果脏位为0,即干
净的话,就可以将其踢出并且不放回磁盘,没有额外成本。
16.其实,最好不去执行任何替换策略,干脆换个更大的内存就好了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)