OSTEP阅读笔记:2_intro
Three pieces
Virtualization
操作系统管理物理资源(进程、内存、磁盘),将其转化成对应的虚拟形式。因此有时也称OS为虚拟机。
操作系统提供了一个标准库,应用系统调用来运行程序,访问内存和设备以及其他相关操作。
操作系统也被称为资源管理器,因为虚拟化使得多个程序可以同时运行(分享CPU)、并发的访问它们自己的命令和数据(分享memory),以及多个程序访问设备(分享disk)。其中CPU、memory、disk被称为是系统的资源,操作系统就是管理这些资源来更加有效地达到目的。
虚拟化CPU
//cpu.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <assert.h>
#include "common.h"
int
main(int argc, char *argv[])
{
if (argc != 2 ) {
fprintf(stderr, "usage: cpu <string>\n");
exit(1);
}
char *str = argv[1];
while (1) {
Spin(1);
printf("%s\n", str);
}
return 0;
}
上述程序意为:每隔一秒输出一次输入的数据。
操作系统在硬件的帮助下,拥有大量的虚拟CPU,从而使得 很多程序看起来可以同时运行,成为虚拟化CPU,这也是这本书的第一个主要部分。
问题:多个程序同时运行,如何决定哪一个应该运行?
虚拟化内存
物理内存的存储方式很简单:一系列的字节串。读取内存需要一个地址来访问该位置存储的数据,写入内存需要给要写入的数据一个地址。
//mem.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
int
main (int argc, char *argv[])
{
int *p = malloc(sizeof(int));
assert(p != NULL);
printf("(%d) address pointed to by p: %p\n", getpid(), p);
*p = 0;
while (1) {
Spin(1);
*p = *p + 1;
printf("(%d) p: %d\n", getpid(), *p);
}
return 0;
}
上述程序会分配一些内存,打印内存的地址,然后在分配内存的第一个位置写入0。程序循环,每秒钟把指针p内的数字增加1。
虚拟化内存意味着每个进程都访问它的私有虚拟化地址空间(private virtual address space, also called its address space),OS将其映射到机器的物理内存上。
物理内存实际上是一个共享资源,由操作系统进行管理。
Concurrency
并发是第二个主题,这个概念用于处理同一程序中同时处理许多事情时出现的一系列问题。在操作系统内部和多线程程序中都会发生并发问题。
//threads.c
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "common_threads.h"
volatile int counter = 0;
int loops;
void *worker(void *arg) {
int i;
for(i = 0 ; i < loops ; i++) {
counter++;
}
return NULL;
}
int main(int argc, char *argv[]) {
if (argc != 2){
fprintf(stderr, "usage: threads <value>\n");
exit(1);
}
loops = atoi(argv[1]);
pthread_t p1, p2;
printf("Initial value : %d\n", counter);
Pthread_create(&p1, NULL, worker, NULL);
Pthread_create(&p2, NULL, worker, NULL);
Pthread_join(p1, NULL);
Pthread_join(p2, NULL);
printf("Final value : %d\n", counter);
return 0;
}
上述代码中,主程序通过Pthread_create()函数创建了两个线程,在同一个内存空间同时运行。
问题:怎么建立正确的并发程序?OS需要体统什么?硬件提供什么结构?怎么利用它们来解决并发问题?
Persistence
系统内存中,数据很容易丢失。我们需要让软硬件能够持久性地存储数据。
文件系统是操作系统中用来管理磁盘的软件,它负责可靠且高效地存储用户在系统磁盘上创建的文件。
不同于CPU和内存,OS不会为每个程序虚拟化一个磁盘。通常我们认为各个文件之间需要通过磁盘来分享信息。
标准库:OS提供的一个标准、简单的方式来通过系统调用访问设备。
日志记录和写时拷贝策略。
问题:如何持久性地保存数据?
Design Goals
抽象:进程、虚拟内存、文件。
提高表现,最小化开销。OS的时空间开销。
提供保护:应用之间、应用与OS之间。通过隔离的方式来保护。
可靠性:操作系统不间断运行。
其他:能源效率;安全性;可移动性。
History
早期OS是进程调用命令的简单库。Atlas提出了系统调用的概念,提高硬件级别的优先权。多道程序设计时代正式形成OS的概念,注重内存保护和并发。现代PC出现,OS成熟并实现开源。
Summary
这部分在OSTEP中提及的较少。需要注意的是OS和硬件的借口、OS和应用软件之间的接口。