Loading

随笔分类 -  看书籍

摘要:在C中,特殊成员函数指的是那些编译器在需要时会自动生成的成员函数。C98中有四种特殊的成员函数,分别是默认构造函数、析构函数、拷贝构造函数和拷贝赋值运算符。而在C11中,随着移动语义的引入,移动构造函数和移动赋值运算符也加入了特殊成员函数的大家庭。本文主要基于Klaus Iglberger在CppC 阅读全文
posted @ 2022-02-20 22:07 shuo-ouyang 阅读(614) 评论(0) 推荐(0)
摘要:虚函数的问题 虚函数的主要问题是性能开销比较大,一个虚函数调用可能需要花费数倍于非虚函数调用的时间,尤其是当非虚函数被声明为inline时(注意,虚函数不能被内联)。 CRTP介绍 CRTP的全称是Curiously Recurring Template Pattern,中文可以翻译成奇异递归模板模 阅读全文
posted @ 2022-01-06 22:53 shuo-ouyang 阅读(1069) 评论(0) 推荐(0)
摘要:有时候人们会说,操作系统有两种方法,来解决大多数空间管理问题。第一种是将空间分割成不同长度的分片,就像虚拟内存管理中的分段。遗憾的是,这个解决方法存在固有的问题。具体来说,将空间切成不同长度的分片以后,空间本身会碎片化,随着时间推移,分配内存会变得比较困难。 因此,值得考虑第二种方法:将空间分割成固 阅读全文
posted @ 2020-05-06 09:28 shuo-ouyang 阅读(824) 评论(0) 推荐(0)
摘要:本章主要讨论关于内存空闲空间管理的一些问题。如果需要管理的内存空间被划分为固定大小的单元,空闲空间管理就很容易。在这种情况下,只需要维护这些大小固定的单元的列表,如果有内存分配请求,就返回列表中的第一项。但是,如果空闲空间由大小不同的单元构成,管理就变得比较困难。这种情况出现在用户级的内存分配库(如 阅读全文
posted @ 2020-05-03 21:30 shuo-ouyang 阅读(1754) 评论(0) 推荐(0)
摘要:到目前为止,我们一直假设将所有进程的地址空间完整地加载到内存中。利用基址和界限寄存器,操作系统很容易将不同进程重定位到不同的物理内存区域。但是,对于这些内存区域,一件有趣的事是:栈和堆之间,有一大块“空闲”空间。 从图中可知,如果我们将整个地址空间放入物理内存,那么栈和堆之间的空间并没有被进程使用, 阅读全文
posted @ 2020-04-27 16:15 shuo-ouyang 阅读(780) 评论(0) 推荐(0)
摘要:为了高效地实现内存虚拟化,并提供应用程序所需的灵活性,我们利用基于硬件的地址转换技术。通过该技术,硬件对每次内存访问进行处理(即指令获取、数据读取或写入),将指令中的虚拟地址转换为数据实际存储的物理地址。因此,在每次内存引用时,硬件都会进行地址转换,将应用程序的内存引用重定位到物理内存中实际的位置。 阅读全文
posted @ 2020-04-26 12:30 shuo-ouyang 阅读(1528) 评论(0) 推荐(0)
摘要:内存类型 在运行一个C程序的时候,会分配两种类型的内存。第一种称为栈内存,它的申请和释放操作是编译器来隐式管理的,所以有时也称为自动内存。假设需要在 函数中为一个整形变量 申请空间,我们只需要这样: 编译器完成剩下的事情,确保在你进入 函数的时候,在栈上开辟空间。当你从该函数退出时,编译器释放内存。 阅读全文
posted @ 2020-04-25 21:47 shuo-ouyang 阅读(275) 评论(0) 推荐(0)
摘要:在本章中,我们来看一个不同类型的调度程序——比例份额(proportional share)调度程序,有时也称为公平份额(fair share)调度程序。比例份额算法认为,调度程序的最终目标是确保每个工作获得一定比例的CPU时间,而不是优化周转时间和响应时间。它的基本思想很简单:每隔一段时间,都会举 阅读全文
posted @ 2020-04-22 20:21 shuo-ouyang 阅读(897) 评论(0) 推荐(0)
摘要:多级反馈队列(Multi level Feedback Queue,简称MLFQ)需要解决两方面的问题。首先它要优化周转时间,这可以通过优先执行较短的工作来实现。然而,操作系统常常不知道工作要运行多久,而这又是SJF等算法所必需的。其次,MLFQ希望给用户提供较好的交互体验,因此需要降低响应时间。然 阅读全文
posted @ 2020-04-21 21:23 shuo-ouyang 阅读(2116) 评论(1) 推荐(1)
摘要:探讨可能的调度策略之前,我们先做一些简化假设。这些假设与系统中运行的进程有关,有时候统称为工作负载(workload)。确定工作负载是构建调度策略的关键部分。这里做的工作负载假设是不切实际的,但我们会逐渐放宽这些假定,并最终开发出一个完全可操作的调度准则。 我们对操作系统中运行的进程(有时也叫工作任 阅读全文
posted @ 2020-04-21 11:16 shuo-ouyang 阅读(620) 评论(0) 推荐(0)
摘要:本章描述了一些实现CPU虚拟化的关键底层机制,并将其统称为受限直接执行(limited direct execution)。其基本思路很简单:让程序在CPU上运行,但首先确保设置好硬件,以便在没有操作系统帮助的情况下限制进程可以执行的操作。 直接执行 为了虚拟化CPU,操作系统需要以某种方式让许多任 阅读全文
posted @ 2020-04-20 20:26 shuo-ouyang 阅读(755) 评论(0) 推荐(0)
摘要:本章主要讨论UNIX系统中的进程创建。UNIX系统采用了一种非常有趣的创建新进程的方式,即通过一对系统调用: 和`exec() wait()`,来等待其创建的子进程执行完成。 系统调用 在上面的例子中,wc的输出结果被重定向到文件newfile.txt中。shell实现结果重定向的方式也很简单,当完 阅读全文
posted @ 2020-04-20 11:44 shuo-ouyang 阅读(446) 评论(0) 推荐(0)
摘要:操作系统为正在运行的程序提供的抽象,就是所谓的进程(process),一个进程就是一个正在运行的程序。为了理解进程的构成,我们必须理解它的机器状态:程序在运行时可以读取或更新的内容。一个明显的机器状态就是内存。指令、正在运行的程序读取和写入的数据都在内存中。因此进程可以访问的内存(地址空间,addr 阅读全文
posted @ 2020-04-20 09:19 shuo-ouyang 阅读(362) 评论(0) 推荐(0)
摘要:默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来。这里“在需要的时候”指的是编译器需要的时候。 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一个成员对象,该成员对象拥有默认构造函数,那么这个类的隐式默认构造函数就是非平凡的,编译器需要为该类合成默认构造函数。为了 阅读全文
posted @ 2020-03-24 18:10 shuo-ouyang 阅读(329) 评论(0) 推荐(0)
摘要:C++对象模式 非静态数据成员放置在每个类对象内,静态数据成员则被放置在所有类对象之外。静态和非静态的成员函数也被放置在所有类对象之外。每个类产生一堆指向虚函数的指针,放在虚表(vtbl)中。每个类对象维护一个指针(vptr),指向相关的虚表。虚表的首元素维护了每个类所关联的 对象。 优点:空间与存 阅读全文
posted @ 2020-03-20 19:57 shuo-ouyang 阅读(191) 评论(0) 推荐(0)