0%

Linux 为每个进程维护一个单独的虚拟地址空间,如下图所示。

  • 内核虚拟内存包含内核中的代码和数据结构。
  • 内核虚拟内存的某些区域被映射到所有进程共享的物理页面,例如每个进程都共享内核的代码和全局数据结构。
  • Linux 也将一组连续的虚拟页面(大小等于系统中 DRAM 的总量)映射到相应的一组连续的物理页面。例如:访问页表,或对设备执行IO操作,这些设备被映射到特定物理内存位置时。
  • 内核虚拟内存的其它区域包含每个进程的独有数据,例如页表,内核在进程的上下文中执行代码时使用的栈,以及记录虚拟地址空间当前组织的各种数据结构。
    阅读全文 »

9.1 物理地址和虚拟地址

计算机系统的主存是由 M 个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址,地址范围从 0 到 M-1。计算机使用内存最自然的方式是使用物理地址,我们将这种方式称为物理寻址。

CPU 向内存发送一个地址,内存将该地址开始的四个字节信息传送到 CPU 中的一个 4字节寄存器。

阅读全文 »

快速排序的变种——快速选择算法

给出一个数组,例如[1,4,2,6,8,3],现在要求出第 k 大的数字,即将数组从大到小排列,选择第k个数。用什么算法更快找到这个数?

最容易想到的就是先将数组排序,就可以很容易找到第 k 大的数字。就算用快速排序,时间复杂度为 O(nlgn)。有没有更快的算法?

阅读全文 »

C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头<memory>

智能指针与普通指针混用

阅读全文 »

什么是拓扑排序?

拓扑排序就是对有向无环图的顶点进行线性排列,使得从顶点 u 到顶点 v 的每个有向边,u 在排序中都在 v 的前面。一个有向无环图的拓扑排序可能有多种。

阅读全文 »

列表

insertremovesort 等方法只修改列表,不输出返回值——返回的默认值为 None 。这是所有 Python 可变数据结构的设计原则。

不是所有数据都可以排序或比较。例如,[None, 'hello', 10] 就不可排序,因为整数不能与字符串对比,而 None 不能与其他类型对比。

阅读全文 »

单例设计模式的两种实现

单例模式的定义

保证一个类仅有一个实例,并提供一个它的全局访问点,该实例被所有程序模块所共享。

那么就必须保证:

  • 该类不能被实例化
  • 该类不能被复制。

对于 C++,意味着:它的构造函数,拷贝构造函数和拷贝赋值运算符不能被公开调用。

阅读全文 »

前缀和与二分查找的应用

题目链接:考试的最大困扰度

给出一个只有’F’ 和 ‘T’ 的字符串,和一个整数 k,可以对字符串种的字符进行两种修改:1. 把 ‘T’ 变为 ‘F’ ,2. 把 ‘F’ 变为 ‘T’。最多能修改 k 次,求由相同字符组成的连续子串长度的最大值。

阅读全文 »