6.S081操作系统笔记

HarderHeng Lv5

一、操作系统简介

1.1 操作系统的目标

  • Abstract 将硬件和低层次的应用抽象出来便于管理和使用
  • Multplex 多任务
  • Isolation 多任务的隔离,每个任务之间互不干扰
  • Sharing 任务之间进行数据的共享
  • Security 保护不应该被应用或者其他用户共享的数据
  • Performance 充分利用硬件的性能

1.2 操作系统的结构

操作系统是一个覆盖在所有的硬件资源上的软件。

整个软件中,用户的应用程序成为用户空间程序,而除此之外还有一个特殊的程序叫做Kernel。在操作系统启动时Kernel总是最先被启动,它负责管理所有用户空间程序,同时管理下层的所有硬件资源,在用户空间程序需要时将硬件资源交给用户空间程序。

Kernel中同时运行着大量的服务,例如文件系统、进程管理和内存管理。

用户空间程序要使用这些服务,需要使用Kernel提供给用户的接口,这些接口被称为系统调用(SystemCall)。要使用系统调用,硬件就会运行在内核态。用户并没有直接操作硬件的权限,只有内核可以对硬件进行操作。

操作系统控制硬件,并向上层提供使用接口,就是操作系统的结构。

1.3 Process and Memory

Process是指进程,拥有独立的用户空间内存和软件硬件资源,kernel用PID标识每一个进程。

常用的syscall

  • forkint fork()

    让现在这个进程生成另外一个和当前进程内存完全相同的子进程。在父进程中fork的返回值是子进程的PID,在子进程中返回值是0。实际上在fork的具体实现中,主要流程为:

    • 分配子进程的空间和PCB
    • 复制内存空间和寄存器
    • 设置父子关系
    • 将子进程的返回值寄存器修改为0
    • 增加文件描述符表的引用计数,共享相同的文件资源
    • 设置子进程为可执行状态,子程序开始根据之前设置好的寄存器状态还有内存空间执行
    • 父进程返回子进程的PID

    在以上的流程中就实现了子进程的返回值为0。

    由于写时复制(CopyOnWrite)机制,fork之后会创建新的虚拟内存而不分配物理内存,而只有在子进程或者父进程要内存页时,才会给子进程分配物理内存页并且进行拷贝。两个进程的虚拟内存页将共享同一个物理内存页,直到某一个内存页要被修改。

  • exitint exit(int status)

    让调用这个函数的进程停止执行,并且将内存等占用的资源全部释放。需要一个整数的参数,0表示以正常状态退出,1表示以非正常状态退出。

  • waitint wait(int *status)

    等待子进程退出,并且返回子进程的PID,子进程的退出状态存储到status中。如果调用者没有子进程,将返回-1。

  • execint exec(char *file, char *argv[])

    加载一个可执行文件,并且传入参数。如果执行错误则返回-1,如果执行成功则不会返回。

    exec是一系列的系统调用,一旦成功执行exec,就会用新的可执行文件的内存空间完全替换掉其调用者的内存空间,所以如果成功执行就没有返回值了。因为是内存的替换,所以PID是不会改变的。

xv6shell使用上述的四个系统调用为用户执行程序,执行一个程序时先调用fork创建一个子shell,并且wait子shell的结束,在子shell中通过exec执行程序。

在shell的实现中,可以看到写时复制的好处。创建子shell之后,其内存空间不会分配实际的物理空间,在之后exec时会将之前的内存空间全部替换,之前的数据全都是没有用的。

1.4 I/O and File description

  • Title: 6.S081操作系统笔记
  • Author: HarderHeng
  • Created at : 2024-12-04 09:46:16
  • Updated at : 2025-02-26 14:50:46
  • Link: https://harderheng.life/2024/12/04/6-S081操作系统笔记/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments