操作系统介绍
2023-1-8
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
冯·诺依曼(Von Neumann)计算模型:处理器从内存中获取(fetch)一条指令,对其进行解码(decode),然后执行(execute)它。完成这条指令后,处理器继续执行下一条指令,依此类推,直到程序最终完成
 
在现代的操作系统设计中(考虑多程序同时运行),程序并不直接访问硬件(需要保护硬件资源),这时就需要一个软件来协调二者:通过受保护的方式分配资源给各个程序,允许程序共享内存,让程序能够与设备交互。
这一软件就是操作系统(Operating System,OS),因此操作系统也可以看作硬件与应用程序间的抽象层。
 
如何将资源虚拟化?
操作系统主要利用一种通用的技术——虚拟化(virtualization),将物理资源(如处理器、内存或磁盘)转换为更通用、更 强大且更易于使用的虚拟形式。因此,有时将操作系统称为虚拟机(virtual machine)
为了让用户可以告诉操作系统做什么,从而利用虚拟机的功能(如运行程序、分配内存或访问文件),操作系统提供了一些接口(API),供调用。由于操作系统提供这些调用来运行程序、访问内存和设备,甚进行其他相关操作,我们有时也会说操作系统为应用程序提供了一个标准库(standard library)。
 
因为虚拟化让许多程序运行(从而共享CPU),让许多程序可以同时访问自己的指令和数据(从而共享内存),让许多程序访问设备(从而共享磁盘等),所以操作系统有时被称为资源操理器(resource manager)。每个CPU、内存和磁盘都是系统的资源(resource),操作系统扮演的主要角色就是管理这些资源。
 
三大话题
操作系统的三大话题是:虚拟化(virtualization)并发(concurrency)、和持久性(persistence);细分下来,分别对应了操作系统中的数个组件(或技术)。
三大话题
对应技术 - 抽象
技术目标
虚拟化(virtualization)
CPU虚拟化- 进程
对每个程序提供“该系统拥有无限数量的CPU”的假象
虚拟化(virtualization)
内存虚拟化 - 地址空间
对每个程序提供“该程序独占系统的所有内存空间”的假象
并发(concurrency)
多线程并发 - 同步机制
让多个同时进行的程序以预期的顺序执行并得到预期的结果
持久性(persistency)
单机数据持久 - 文件系统
保持存储的数据长期稳定安全
持久性(persistency)
联机数据持久 - 分布式文件系统
使用不可靠的机器提供可靠的文件系统服务
 
 

虚拟化cpu

调用Spin()函数,该函数会反复检查时间应运行一秒后返回。然后,打印出用户在命令行传入的字符串,一直重复下去
 
 
系统开始运行程序时,会重复检查时间,直到一秒钟过去。一秒钟过去后,现码打印用户传入的字符串
notion image
 
 
让同一程序运行多个实例:
notion image
在单核CPU的情况下也会打印以上结果。 单个CPU看似无限数量CPU,从而让程序同时运行,即所谓的虚拟化
 
 
 

虚拟化内存

现现机器提供的物理内存(physical memory)模型非常简单。内存就是一个字节数组。要读取(read)内存,必须指定一个地址(address),才能访问存储在那里的数据。要写入(write)或更新(update)内存,还必须指定要写入给定地址的数据。程序运行时,一直要访问内存。程序将所有数据结构保存在内存中,甚通过各种指令来访问它们,例如加载和保存,或利用其他明确的指令,在工作时访问内存。不要忘记,程序的每个指令都在内存中,因此每一读取指令都会访问内存。
现代机器提供的物理内存模型非常简单。内存就是一个字节数组。要读取内存,必须指定一个地址,才能访问存储在那里的数据。要写入或更新内存,还需要指定要写入给定地址的数据。
程序运行时,一直要访问内存。程序将所有数据结构保存在内存中,并通过各种指令来访问它们,例如加载和保存,或利用其它明确指令,在工作时访问内存。不要忘记,程序的每个指令都在内存中,因此每次读取指令都会访问内存。
看一个程序通过调用malloc来分配内存
 
程序首先分配了一些内存。然后,打印出内存的地址,然后将数字0 放入新分配的内存的第一个空位中。最后,程序循环,延迟一秒钟甚递增p中保存的地址值。在每个打印语句中,它还会打印出所谓的正在运行程序的进程标识符(PID)。该PID 对每个运行进程是唯一的。
notion image
 
 
运行同一个程序的多个实例:
notion image
每个进程访问自己的私有虚拟地址空间(有时称地址空间) ,操作系统以某种方式映射到机器的物理内存上。一个正在运行的程序中的内存引用不会影响其他进程(或操作系统本身)的地址空间。对于正在运行的程序,它完全拥有自己的物理内存。
 
 
 

并发

一个多线程程序的例子:
 
 
主程序利用Pthread_create()创建了两个线程。 每个线程在worker()函数中运行,该函数为递增计数器,循环loops次。 下面运行这个程序,将变量loops的输入值设置为1000:
notion image
两个线程完成时,计数器值为2000,因为每个线程将计数增加1000次。也就是说,当loops的输入值为N时,预计程序的最终输出为2N
事实上:
notion image
一遍又一遍地使用较高的loops值运行程序,可能会发现有时甚至可以得到正确的答案!那么为什么会这样?
 
事实证明,这些奇怪的、不寻常的结果与指令如何执行有关,指令每次执行一条。遗憾的是,上面的程序中的关键部分是增加共享计数器的地方,它需要 3 条指令:一条将计数器的值从内存加载到寄存器,一条将其递增,另一条将其保存回内存。因为这 3 条指令并不是以原子方式(atomically)执行(所有的指令一次性执行)的,所以奇怪的事情可能会发生。
 
 

持久性

在系统内存中,数据容易丢失,因为像DRAM 这样的设备以易失(volatile)的方式存储数值。如果断电或系统崩溃,那么内存中的所有数据都会丢失。因此,我们需要硬件和软件来持久地(persistently)存储数据。
硬件以某种输入/输出(Input/Output,I/O)设备的形式出现。在现现系统中,硬盘驱动器(hard drive)是存储长期保存的信息的通用存储库,尽操固态硬盘(Solid-State Drive,SSD)正在这个领域取得领先地位。
操作系统中操理磁盘的软件通常称为文件系统(file system)。它负责以可靠和高效的方式,将用户创建的任何文件(file)存储在系统的磁盘上。
不像操作系统为CPU 和内存提供的抽象,操作系统不会为每个应用程序创建专用的虚拟磁盘。相反,它假设用户经常需要共享(share)文件中的信息。
 
一个进行IO的程序:
notion image
 
该任务向操作系统发出三个系统调用:
  1. open 打开文件并创建它
  1. write 将数据写入文件
  1. close 关闭文件,表明程序不会向它写入数据
这些系统调用(system call)被转到称为文件系统(file system)的操作系统部分,然后该系统处理这些请求,并向用户返回某种错误现码。
 
 
 

操作系统的开发历史

  • 早期计算机使用纸带传输程序和数据,操作系统只起到加载作用。
  • CPU等硬件快速发展,计算机速度得到提升(批处理阶段/离线处理)。操作系统初步形成,初步体现操作系统并发特征。
  • 内存容量越来越大、CPU执行多个程序(多道程序设计)。在程序1等待I/O操作时,操作系统去执行程序2,而不是等待程序1。
  • 但是多道程序设计交互性不够好。为了更好地利用计算机资源,并且更好地和用户交互,出现了分时交互系统。两个程序轮流占用资源,比如程序A占用千分之一秒,程序B接上,运行千分之一秒后,又交给A。外设(时钟)定期产生中断,帮助操作系统完成相应的分时调度。
  • 个人电脑操作系统,Windows的GUI更加用户友善。
  • 多核多处理普遍存在。
  • 网络快速发展,出现了分布式操作系统。松耦合、紧耦合系统由分布式操作性管理。
  • 未来,生活中存在大量嵌入设备。
 
 
 
 
notion image
 
UNIX 的重要性
在操作系统的历史中,UNIX 的重要性举足轻重。受早期系统(特别是MIT 著名的Multics 系统)的影响,UNIX 汇集了许多了不起的思想,创造了既简单又强大的系统。
最初的“贝尔实验室”UNIX 的基础是统一的原则,即构建小而强大的程序,这些程序可以连接在一起形成更大的工作流。在你输入命令的地方,shell 提供了诸如管道(pipe)之类的原语,来支持这样的元(meta-level)编程,因此很容易将程序串起来完成更大的任务。例如,要查找文本文件中包含单词“foo”的行,然后要计算存在多少行,请键入:grep foo file.txt | wc -l,从而使用grep 和wc (单词计数)程序来实现你的任务。
UNIX 环境对于程序员和开发人员都很友好,并为新的C 编程语言提供了编译器。程序员很容易编写自己的程序并分享它们,这使得UNIX 非常受欢迎。作为开放源码软件(open-source software)的早期形式,作者向所有请求的人免费提供副本,这可能帮助很大。
代码的可得性和可读性也非常重要。用C 语言编写的美丽的小内核吸引其他人摆弄内核,添加新的、很酷的功能。例如,由Bill Joy 领导的伯克利创业团队发布了一个非常棒的发行版(Berkeley SystemsDistribution,BSD),该发行版拥有先进的虚拟内存、文件系统和网络子系统。Joy 后来与朋友共同创立了Sun Microsystems。
遗憾的是,随着公司试图维护其所有权和利润,UNIX 的传播速度有所放慢,这是律师参与其中的不幸(但常见的)结果。许多公司都有自己的变种:Sun Microsystems 的SunOS、IBM 的AIX、HP 的HPUX(又名H-Pucks)以及SGI 的IRIX。AT&T/贝尔实验室和这些其他厂商之间的法律纠纷给UNIX带来了阴影,许多人想知道它是否能够存活下来,尤其是Windows 推出后并占领了大部分PC 市场……
notion image
 
幸运的是,对于UNIX 来说,一位名叫Linus Torvalds 的年轻芬兰黑客决定编写他自己的UNIX 版本,该版本严重依赖最初系统背后的原则和思想,但没有借用原来的代码集,从而避免了合法性问题。他征集了世界各地许多其他人的帮助,不久,Linux 就诞生了(同时也开启了现代开源软件运动)。
随着互联网时代的到来,大多数公司(如谷歌、亚马逊、Facebook 和其他公司)选择运行Linux,因为它是免费的,可以随时修改以适应他们的需求。事实上,如果不存在这样一个系统,很难想象这些新公司的成功。随着智能手机成为占主导地位的面向用户的平台,出于许多相同的原因,Linux 也在那里找到了用武之地(通过Android)。史蒂夫·乔布斯将他的基于UNIX 的NeXTStep 操作环境带到了苹果公司,从而使得UNIX 在台式机上非常流行(尽管很多苹果技术用户可能都不知道这一事实)。因此,UNIX 今天比以往任何时候都更加重要。如果你相信有计算之神,那么应该感谢这个美妙的结果。
notion image
 
 
notion image
 
 

抽象-机制-策略

抽象,是一种展现其外观而隐藏其细节的手段。例如操作系统是一层提供接口给程序而隐藏了对硬件细节的抽象;而进程、虚拟内存、文件等这些概念则是对相应资源或者数据的抽象。
机制则一般与策略成对出现,机制作为一个解决方案里的框架,相对模糊和广泛,而策略则规定了其中有限的细节,这种关系就像是应用程序与配置文件之间的关系。例如CPU调度是一种机制,具体使用哪种方法(如轮转调度、优先级调度等)则是策略;缓存替换是一种机制,而具体替换掉哪一个(例如LRU替换、随机替换等)则是策略。
 
  • 计算机基础
  • 操作系统
  • 控制单元的设计CPU虚拟化-进程
    目录