zhuzilin's Blog

about

6.828 笔记3

date: 2019-02-17
tags: OS  6.828  

这里会记录阅读6.828课程lecture note的我的个人笔记。可能会中英混杂,不是很适合外人阅读,也请见谅。

Lecture 3: C and gdb

这一讲基本上都是介绍工具,就不在此记录了,C的部分可以看K&R,gdb的部分可以直接搜课件。pointer.c的例子应该在lab1中已经进行了解释。

Lecture 4: Shell & OS organization

Lecture Topic

  • kernel system call API

    • 细节与设计
    • isolation, multiplexing and sharing.
  • 通过hw2来进行说明。

Overview Diagram

  • user / kernel
  • process = address space + thread(s),就是一个运行中的程序
  • app -> printf() -> write() -> SYSTEM CALL -> sys_write() -> ...
  • user-level library是每个app自己的东西
  • 而kernel internal function不能被用户调用

回顾作业(这部分就直接放在hw xv6 shell的那篇里面讲了,就不在这里赘述)。

UNIX system call observation

  • fork/exec看起来很浪费,因为需要先复制parent的内存到child,之后再用exec替代。为什么不合二为一呢?

    因为分开非常方便。同时实际上因为使用了一些技巧(在lab4中有实现,就是利用page fault进行lazy allocation),fork的开销很小。

  • file descriptor设计

    FDs are a level of indirection。

    • 真正的I/O环境被藏在内核里了。
    • 通过fork, exec进行保留。
    • imagine writefile(filename, offset, buf size) (这啥意思。。。)

    FD统一了console, pipe和files的接口

  • 整体的设计哲学:用简洁的接口相互组合实现复杂功能。
  • 为什么kernel需要pip而不用一个临时文件进行redirect:

    pipe有如下四点优势:

    • pipes automatically clean themselves up; with the file redirection, a shell would have to be careful to remove /tmp/xyz when done.
    • pipes can pass arbitrarily long streams of data, while file redirection requires enough free space on disk to store all the data. (这也是为什么pipe需要多个指令同时执行)
    • pipes allow for parallel execution of pipeline stages, while the file approach requires the first program to finish before the second starts.
    • if you are implementing inter-process communication, pipes’ blocking reads and writes are more efficient than the non-blocking semantics of files.
  • 为什么kernel的system call只用int char作为buffer,而不用一个pointer指向kernel file object?

    我不确定这个是为什么,感觉就是为了isolation吧,如果给一个pointer,那用户就很容易把kernel代码搞崩。

  • 核心的unix system call已经很古老了,have they held up well?

    yes, very successful!

    不过UNIX的一些地方不是完美的:

    • 很多时候system call并不需要很方便程序员使用,因为会被包装。
    • apps may have little to do with files &c, e.g. on smartphon (这个没懂。。。)

    一些UNIX abstractions不够高效:

    • 几个G的进程fork起来就很慢了
    • FD隐藏了一些可能很重要的细节内容,如硬盘上的block size,网络数据的timing and size (这两个应该都是被buffer给盖住了)

    所以一直都有备用方案:

    • 有的是一些新的system call
    • 有的就是完全抛弃UNIX的这一套另起炉灶。

OS organization

这部分最好先阅读一下xv6 book的第一章。

OS的主要目的之一是进行isolation。

  • 处理器提供了user mode和kernel mode,前者不能处理privileged instructions
  • OS是运行在kernel mode的

monolithic kernel

monolithic kernel

  • xv6用了一种传统的设计,monolithic kernel,也就是OS完全运行于kernel mode
  • kernel interface == system call interface
  • 这样的有点是方便子系统相互协调,缺点是子系统之间的interaction会很复杂,也就bug prone

microkernel design

microkernel

  • 另外一种设计,让OS作为一个普通的user program。如file system再一个file server里。
  • kernel implements minimal mechanism to run services in user space processes with memory 如IPC
  • kernel interface != system call interface
  • 好处是isolation更好了
  • 坏处是性能会比较差

exokernel

exokernel

  • apps可以semi-directly使用

    apps can use hardware semi-directly, but O/S isolates e.g. app can read/write own page table, but O/S audits e.g. app can read/write disk blocks, but O/S tracks block owners good: more flexibility for demanding applications jos will be a mix of microkernel and exokernel

    (这里不是很明白,可能写完JOS作业就懂了...)

之后会有不适用硬件支撑kernel/user mode的isolation,叫Singularity O/S,之后的课中会讲到。