OSTEP 笔记(一)

OSTEP 笔记

操作系统取得CPU、内存或磁盘等物理资源,并对他们进行虚拟化。它处理与并发有关的麻烦且棘手的问题。它持久地存储文件,从而保证它们长期安全。

进程的简单定义:

进程就是运行中的程序。程序本身是没有生命周期的,它只是存在磁盘上面的一些指令。是操作系统让这些字节运行起来,让程序发挥作用。


如何提供有很多CPU的假象?

时分共享:

通过让一个进程只允许一个时间片然后切换到其他进程,操作系统提供了存在多个虚拟CPU的假象。这就是时分共享CPU技术。

空分共享:

资源在空间上被划分给希望使用它的人。比如说磁盘空间,一旦把块分配给文件,除非删除文件,否则不可能将这个空间块分配给其他文件。

上下文切换:

是时分共享的实现方式,他让操作系统能够停止运行一个程序,并开始在给定的CPU上运行另一个程序。

在xv6中为上下文这么定义的:

1
2
3
4
5
6
7
8
9
10
struct context{
int eip;
int esp;
int ebx;
int ecx;
int edx;
int esi;
int edi;
int ebp;
}

对于停止的进程,寄存器上下文会将保存其寄存器的内容到当前内存位置。


抽象:进程概念

进程地址空间寄存器组成

寄存器包括:

程序计数器:告诉我们程序即将执行哪个指令

栈指针、帧指针:用于管理函数参数栈、局部变量和地址

分离策略和机制:

策略为“哪个”提供答案:操作系统现在应该运行哪个进程?

机制为“如何”提供答案:操作系统如何执行上下文切换?


程序如何转化为进程的?

  1. 将代码和所有静态数据加载到内存中,加载到进程的地址空间中
  2. 为程序的运行时栈分配一些内存(会将参数填入argc和argv数组)
  3. 为程序的堆分配一些内存(调用malloc申请一些空间)
  4. 执行一些其他初始化任务,如I/O相关的任务
  5. 通过main()启动程序

默认情况下每个进程都有3个打开的文件描述符:标准输入、输出和错误