目录

操作系统概述

  前几天看面经,看到个问题:“你如何理解操作系统?”,我很难找到一个好的切入点来分析,所以在这里整理一下对操作系统的理解,以加深记忆,形成大局观。

操作系统的简单定义

  操作系统(Operating System)是计算机系统中的一个基本程序集合,负责与硬件交互,并为用户程序提供执行环境。

操作系统的作用

硬件资源的管理者

  为了允许我们的计算机能够运行多个程序,就要解决各个程序间的资源分配和保护问题,既要为一个程序分配足够的内存、CPU运行时长等资源以让其正常运行,又要防止程序恶意争夺其他程序的资源。操作系统的作用之一便是管理这些硬件资源,让程序正确且高效地运行。

封装底层硬件设备

  在不同的计算机中,处理器架构各有差异,IO设备也各不相同,必然造成了对他们的使用方式也不尽相同,然而如果让每个人在写程序的时候都要考虑这种不同,未免太过繁琐。操作系统为了解决这个问题,提供了一系列接口(API),供用户程序调用,以运行程序、访问内存和设备,这些接口称作“系统调用(System Call)”。这其中就包括了虚拟文件系统提供的一系列用于文件操作的函数,如fopen()用于打开文件、write()用于写文件等等;还包括了fork()clone()用于创建进程、线程的系统调用;还有如malloc()等用于内存操作的系统调用。

/posts/操作系统概述/systemcall.jpg
系统调用

虚拟化

  操作系统主要利用一种通用技术,叫做“虚拟化(Virtualization)”,也就是说,操作系统将物理资源(如内存、处理器、磁盘)转换为更通用、更强大且更易于使用的虚拟形式。

虚拟化CPU

  将单个CPU转换为看似无限数量的CPU,从而让许多程序好像是在同时运行,这就是所谓的“虚拟化CPU”。操作系统为正在运行的程序提供了一种抽象,叫做“进程”,通过对进程的调度来实现了多个程序在单个CPU上的“同时”运行。为了知道当前到底该运行哪个进程、这个进程该运行多长时间,操作系统还提供了一些策略来进行进程调度,即“进程调度算法”。

虚拟化内存

  计算机提供的物理内存模型非常简单,就是一个字节数组,需要一个物理地址来进行内存访问。程序运行时会不断进行内存访问以操作它的运行时数据,如何保证多个程序可以高效、无冲突地访问内存中属于自己的数据,这就是虚拟化内存解决的问题。每个进程都有属于自己的虚拟地址空间,并通过虚拟地址进行内存访问,这给程序提供了一种独占所有物理内存的假象,操作系统会以某种方式将虚拟地址映射为物理地址,并管理各个进程的虚拟地址空间,保证一个进程的内存访问不会影响到其他进程。

持久性

  在系统内存中,如果断电,其中保存的数据便会全部丢失,因此,我们需要磁盘来持久地存储数据。为此,操作系统提供了文件系统来管理磁盘,利用文件系统,用户可以高效地在磁盘上创建、删除文件,并保证其持久地存储。Linux中的文件操作会经历多个层次的处理,其主要结构如下图。

/posts/操作系统概述/块io分层.jpg
Linux块IO分层