0%

接近一年未更新博文,忙着适应工作环境,当然自己也变懒了不少。感觉还是得多抽时间充实自己,本文开始分析stl源码。

本系列分析的stl 版本为 sgi v3.3。

首先分析内存分配器,因为容器需要依赖内存分配器来实现。如最常用容器的定义:

1
2
3
4
5
// alloc 是 SGI STL 的空间配置器
template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class vector : protected _Vector_base<_Tp, _Alloc>
{
// requirements:

这里的 __STL_DEFAULT_ALLOCATOR 定义为:

1
2
3
4
5
6
7
# ifndef __STL_DEFAULT_ALLOCATOR
# ifdef __STL_USE_STD_ALLOCATORS
# define __STL_DEFAULT_ALLOCATOR(T) allocator< T >
# else
# define __STL_DEFAULT_ALLOCATOR(T) alloc
# endif
# endif

allocator 内部实现也为 alloc, 所以本文分析的对象为 alloc

关于 alloc 的实现,文件目录为 allocator/stl_alloc.h

关于alloc的定义有两种:(通过宏来开关是哪一种):

  1. 第一级配置器:
1
2
typedef __malloc_alloc_template<0> malloc_alloc;
typedef malloc_alloc alloc; // 令 alloc 为第一级配置器

此时实际类为 __malloc_alloc_template

  1. 第二级配置器:
1
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc;  // 令 alloc 为第二级配置器

此时实际类为 : __default_alloc_template

阅读全文 »

0. 前言·

本实验为MIT6.s8081的第十一个实验,也是最后一个实验,主题为 网卡驱动 相关。实验要求实现网卡驱动的收发过程核心逻辑。

本实验的前置知识较多,上来就是E1000网卡手册,但实际上需要阅读和理解的部分很少,实现的代码也只是几十行。

阅读全文 »

0. 前言·

本实验为MIT6.s8081的第九个实验,主题和 文件系统 相关。实验任务有两个:

  1. 增大xv6的最大文件size限制
  2. 实现软链接

整体来看,实验相对简单。

阅读全文 »

0. 前言·

本实验为MIT6.s8081的第八个实验,主题和 相关。实验任务有两个:

  1. 增加内核内存分配器的并发性
  2. 增加文件系统buffer cache的并发性

本实验是第二个难度较大的实验。很值得一做。

阅读全文 »

0. 前言·

本实验为MIT 6.s081的第七个实验,主题和 多线程 相关。实验任务有三个:

  1. 实现user level的thread switch
  2. 完善并发hash table
  3. 实现一个Barrier,类似Java的CyclicBarrier
阅读全文 »

0. 前言·

本实验为MIT 6.s081的第六个实验,主题为 copy-on-write(cow, 写时复制)相关。实现进程在fork时的cow机制。

要求:

更改xv6内核 fork 机制,实现延迟分配物理page给子进程。具体而言,在fork时,只用创建子进程的页表,但无需拷贝实际的物理页,并同时更新父子进程对应页的PTE为 not writable。 当父或子进程对物理页进行实际更新时,CPU产生page fault, 内核此时才分配新物理页,执行拷贝和页表项重映射。

阅读全文 »

0. 前言·

本实验为MIT 6.s081的第五个实验,主题和内存的lazy allocation相关,是page table的应用之一。其余应用包括不限于(copy on write, zero fill on demand, demand paging)。

本实验分为三个task:

  1. 取消sbrk系统调用中的内存分配。即准备从eagerly分配变为lazy分配。
  2. 实现lazy allocation,然后通过echo hi测试。
  3. 继续完善lazy allocation,完成所有测试。包括lazytests和usertests。
阅读全文 »

0. 前言·

本实验为MIT 6.s081的第四个实验,实验相对简单,主题和trap相关,目的是使学生了解syscall是如何从用户态到内核态,又是如何内核态回到用户态的。

本实验分为三个task:

  1. 检验学生是否熟悉RISCV-V汇编。出了几个问答题目。
  2. Backtrace,实现类似gdb中bt命令的打印结果
  3. Alarm,实现sigalarm系统调用,使得内核周期性回调用户提供handler函数。类似于一个定时器。
阅读全文 »