操作系统—— 1 操作系统概述

清华 陈渝

1.1 课程概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 什么是操作系统

1. 是什么

没有一个完整、精确、公认的定义
在这里插入图片描述
是系统软件

对上,用户角度

  • os是一个控制软件
  • 管理应用程序
  • 为应用程序提供服务
  • 杀死应用程序

对下,资源角度

  • 资源管理,因为计算机上可以运行多个程序,那么就需要协调管理CPU资源、外设资源等资源,来让每个程序公平的共享这些资源,同时让这些资源能够资源利用率得到保障
  • 管理外设、分配资源
    在这里插入图片描述

操作系统起到承上启下的作用,操作系统层次架构

  • 应用程序之下
  • 硬件之上
  • 应用程序要想访问硬件资源,需要通过操作系统,不能自己直接去访问,操作系统管理这些硬件资源,并为上层应用程序提供接口,使得应用程序不用去考虑底层硬件的细节

应用软件:办公软件、视频播放软件

  • 操作系统位于应用软件之下,是系统软件,为应用软件提供服务支撑

在这里插入图片描述
shell : 对外接口,面向应用程序,如windows的GUI
kernel : 面向内部,管理计算机内部的资源。

2. kernel

在这里插入图片描述
操作系统内部组件:

  • CPU调度器:CPU调度、进程和线程管理
  • 物理内存管理
  • 虚拟内存管理:在物理内存之上,为上层应用提供一块相对独立、尽可能大的内存空间
  • 文件系统管理:硬盘使用磁盘块作为基本的读写单位,这种访问比较底层,不方便用户和应用程序更好的存取数据,所以我们抽象出文件系统,以文件的形式为应用程序提供存储和访问、永久保存数据的环境
  • 中断处理与IO设备驱动:和底层硬件直接打交道

在这里插入图片描述
OS kernel的特征:

  • 并发
    • 计算机系统中同时存在多个运行的程序,需要OS管理和调度
    • 并发和并行:
    • 并发:一个时间段内有多个程序在运行
    • 并行:一个时间点上有多个程序在运行,需要一个计算机内存在多个CPU,一个CPU无法实现并行,即无法让两个程序在一个时刻同时运行
  • 共享
    • 互斥共享:在一个时间点上某一个内存单元只能有1个程序访问
    • “同时”访问:但是如果把一个内存单元分成2半,两者之间相互隔离,那么就可以让2个程序同时访问每一半
  • 虚拟
    • 利用多道程序设计技术,让每个用户都觉得有一个计算机专门为他服务,把一台计算机虚拟成多个计算机
  • 异步
    • 在只有1个CPU的情况下,每一个时间点只能跑一个程序,而下一个程序什么时候跑要取决于操作系统的调度,所以看上去程序的执行不是一贯到底,而是走走停停,向前推挤的速度不可预知
    • 但只要运行环境相同,OS需要保证程序运行的结果也要相同,如果相同输入导致了不同的输出,那么这个操作系统的设计就失败了

1.3 为什么学习操作系统

在这里插入图片描述

1.4 如何学习操作系统

1.5 操作系统实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
unix(apple)、linux(android\windows)

1.6 操作系统的历史

随着硬件、计算机体系结构等变化
在这里插入图片描述

  1. 早期计算机使用纸带传输程序和数据
    操作系统(monitor)只起到加载作用
    数据传到计算机上去,计算机简单计算,再把结果传出来(机械简单的过程)
    此时还体现不出操作系统的特征

  2. CPU等硬件快速发展,计算机速度得到提升,性能未得到充分利用

  3. 批处理阶段(体现了并发的特征):让输入-执行-输出形成流水线,使得计算效率提高
    在这里插入图片描述

  4. 内存的容量越来越大、CPU执行多个程序(多道程序设计,1个CPU)
    可以在内存中放多个程序,而不用每执行一个程序,就把一个程序从硬盘加载到内存中,直接可以把多个程序放到内存中,减少IO开销
    在这里插入图片描述
    在这里插入图片描述
    操作系统切换的过程:
    程序1和程序2都被加载到了内存中,
    程序1先开始执行,程序1执行read()这IO操作时,操作系统可以完成一个切换,让程序2占用CPU执行,这时程序1处于等待外设把数据读入的状态
    程序2在执行过程中,程序1等待的外设已经完成了,这个外设就会产生一个中断,通知操作系统,操作系统可以再完成一个切换,让程序2停下来,程序1继续执行
    以上过程不需要和人交互

  5. 为了更好的利用计算机资源,并且更好的和用户交互,出现了分时系统
    把时间分为很小的一段,例如现在的时间片为千分之一秒,人感知不到,一个千分之一秒执行这个程序,下一个千分之一秒就执行下一个程序,造成每一个人都在独自占用1台计算机的错觉
    时钟(外设)会定期产生中断,把控制权交给os,让os实现切换的过程,即中断帮助OS来完成分时

  6. 个人电脑操作系统
    在这里插入图片描述

  7. 多核多处理

  8. 网络的快速发展,出现了分布式操作系统(计算存储工作通过数据中心来完成,中间通过internet来连接在一起)
    在这里插入图片描述
    松、紧耦合系统

  9. 未来发展趋势:多台计算机围绕1个人工作
    在这里插入图片描述

1.7 操作系统的结构

  1. 简单操作系统:MS-DOS(1981-1994)

    • 部分模块的单体内核
    • 功能比较弱,没有分层设计
    • 汇编语言编写
    • 易受攻击、破环
    • 受制于硬件,操作系统很难有大突破
  2. Unix ,采用C语言,分层模块化
    汇编语言和C语言区别:
    汇编语言与机器绑定,不具移植性
    C语言有移植性

  3. 微内核的设计,尽可能把内核功能移到用户空间,内核中只放基本的功能,如中断处理、消息传递,文件系统和内存管理放在外面以程序或进程的服务形式存在,服务和服务之间通过内核的消息传递机制的松耦合方式进行通信。(之前使用的是函数调用的紧耦合方式进行通信)但如果文件管理和内存管理交互要把数据倒给内核,内核再倒给内存管理,性能不高,开销远远超过函数调用的方式
    在这里插入图片描述

  4. 学术界还有一种更极端的方式——外核。把内核分为2部分,一部分跟硬件打交道,完成硬件资源的复制;一部分与具体应用打交道,在第一部分之上,每个应用程序都有自己的lib os 。速度得到提高,主要在学术界研究
    在这里插入图片描述

  5. 虚拟机监控器(VMM):将单独的机器接口转换成很多的幻象,每个这些接口(虚拟机)是一个原始计算机系统的有效副本,并完成所有的处理器指令(虚拟出n个计算机系统(完整的计算机),使得在一台物理计算机上有多台的计算机系统给上曾使用,一台变多台)
    在这里插入图片描述
    操作系统之下是vmm,vmm之下才是硬件
    在这里插入图片描述
    为什么会出现VMM?因为现在的计算机通常有多个CPU,那么一个人用的话不会充分使用CPU的资源,所以可以把这个计算机放到数据中心去,让好多人一起使用,每个人一个虚拟机,为多个人服务

2.1 启动、中断、异常和系统调用

在这里插入图片描述

1. 计算机启动

按电源后,从计算机原理的角度看,主要是开CPU、内存和 I/O 三部分
在这里插入图片描述
开机主要是开上面3个
在这里插入图片描述
os最开始放在硬盘,不在内存,然后通过BIOS提供相应的支持
DISK:存放os
BIOS:基于I/O处理系统,功能是按电源后检测各种外设,检测完后才能加载相应的软件执行
Bootloader:加载OS(从硬盘加载到内存中去),然后让CPU执行OS
最开始时,内存中BIOS已经占了一部分,剩下全是空闲空间
在这里插入图片描述

第一步从特定的地址开始执行BIOS
CS:IP 形成一个内存地址,最开始设置默认值,一开始加电,BIOS就从这个地址开始执行,然后完成下面的操作:

  • POST(加电自检,检查设备能否正常工作)
    • 寻找显卡(屏幕)、键盘鼠标把数据存储到某地址上,这些都需要BIOS来进行检查,
  • 假设都正常的话,就把bootloader从硬盘加载到内存中

BIOS如何把bootloader从硬盘放到内存?
bootloader一般放在硬盘的第一个主引导扇区,然后bootloader会把os加载到内存中,即BIOS加载bootloader,bootloader加载os
第1个扇区为512个字节
在这里插入图片描述
x86为例,bootloader会放到内存的哪个地址?是由BIOS设定好的,比如放在0x7c00,之后连续512个字节都是bootloader的主要代码和数据

  1. BIOS把booltloader从硬盘加载到内存中,此时CPU的控制权交给bootloader
  2. bootloader把os的数据和代码从磁盘读取到内存中,把CPU的控制权交给os,也就是跳到os起始地址进行执行,这样os就可以在内存进行一些必要的工作(这时,硬件的管理都是在os)

2. 操作系统与设备和程序交互(中断异常系统调度)

面向外设通过中断,和IO进行处理
面向应用程序通过系统调用异常来启动相应的功能

定义

在这里插入图片描述

  1. 系统调用(来源于应用程序)
    应用程序主动向操作系统发出服务请求,希望操作系统能够提供相应的支持(应用程序向操作系统发送指令)
  2. 异常(来源于不良的应用程序)
    非法指令或其他换的处理状态(如内存出错)(应用程序在执行过程中出现异常,需os来完成相应的功能)
  3. 中断(来源于外设)
    来自不同的硬件设备的计时器和网络的中断

应用程序为什么要通过os与硬件联系?

  • 在计算机运行中,内核是被信任的第三方(应用程序不可信任,os可信任,os具有整个系统的控制权)
  • 只有内核可以执行特权指令
  • 为了方便应用程序(os使得应用软件屏蔽底层device的复杂性和差异性,os向上提供一个简洁的接口,使应用软件更具移植性)

中断、异常与系统调用的差异

源头:

  1. 中断:由外设产生
  2. 异常:应用程序意想不到的行为
    • 如除0操作,但程序并不能意识到他不能除0,此时需要操作系统发现这个错误并作出相应的操作。
    • 越过权限,访问了不该访问的地址空间,需要os去处理
    • 资源未得到满足,但os悄悄地在后端处理好,然后让应用程序去执行
    • 这些都不是应用程序主动要去发出的,而是让os去应对一些意外事件
  3. 系统调用:应用程序主动请求操作提供服务,如读写文件,有相应的指令和参数来说明自己需要什么样的服务,应用程序只需要调用相应的接口,给定参数,然后让os来完成

处理时间:

  1. 中断:异步 (应用程序不知道导致中断的事件什么时候产生)
  2. 异常:同步(执行特定的指令,如除0后,就会产生异常)
  3. 系统调用:同步(发出请求是同步的)或异步(返回是可能是同步也可能异步。应用程序发出请求后马上去做其他事情,返回就是异步的;发出请求后等待就是同步的)
    应用程序发出一个请求,如果应用程序一直在等待这个请求,那么就是同步的
    应用程序发出请求后马上去做其他事情,os完成相应的请求后再返回数据给应用程序,对于应用程序来说就是异步的

响应状态:

  1. 中断:持续,对用户应用程序是透明的
    对于中断而言,它打断了应用程序的正常执行,但是应用程序并没有感受到中断,因为操作系统会悄悄的把这个过程完成,他并没有想到去影响应用程序的执行
  2. 异常:杀死或重新执行意想不到的应用程序指令
    异常不同于中断,异常严重的话会把应用程序杀死,有可能会重新去执行产生异常的指令,因为有可能这个异常指令再次执行就不会异常了
  3. 系统调用:等待和持续后继续执行
    处理过程是等待服务完成后就继续执行了,不会重复去执行系统调用

2.2 操作系统的终端、异常和系统调用

中断和异常处理机制

在这里插入图片描述

  • 中断是外设的事件
  • 异常是内部CPU的事件
  • 中断和异常迫使CPU访问一些被中断和异常服务访问的功能

中断和异常都有硬件处理过程和软件处理过程

中断

产生中断或异常首先需要知道这个中断或异常应该由哪个特定的服务进程来服务,所以需要建立一个表-终端表,这个表的Key为中断号或异常号,因为编了号就可以很容易的区分出是键盘导致的中断还是其他导致的中断,不同外设采用不同的编号。对于编号还有一个地址,即表的value,产生中断的地址
除此之外,还有保存和恢复机制,用于中断后恢复之前的程序的执行
在这里插入图片描述

  • 硬件:
    • 设置中断标记(CPU初始化)
      • 将内部外部事件设置中断标记
      • 中断事件的ID
        中断事件的ID值是程序访问的中断向量地址
        中断就是打断了正在执行的程序去执行更为紧急的事件,对此需要对硬件和软件进行一定的保护(保存和恢复机制),以此保障处理完中断后还能继续执行原来的程序

在这里插入图片描述

  • 软件:
    • 保存当前处理状态,保存被打断的执行现场。产生中断后,首先要把程序的执行状态保存起来,如程序执行到什么地方了、寄存器的内容是什么,便于后续中断结束恢复的时候能够从被打断的地方恢复回来
    • 中断服务程序处理
    • 清除中断标记
    • 恢复之前保存的处理状态

中断过程程序不知道,操作系统悄悄完成的

异常:异常编号

在这里插入图片描述

  • 保存现场
  • 异常处理
    • 杀死产生了异常的程序
    • 重新执行异常指令:os认为产生异常是服务不到位,os进行弥补工作,处理异常,再次执行就可以了,这对应用程序来说也是透明的
  • 恢复现场

软件系统感知不到异常,不知道什么时候会异常

系统调用

在这里插入图片描述
应用程序调用printf(),会发出系统调用write(),write()会带一些参数,比如让哪个设备来显示输出,os获取到这些参数后,会去直接访问对应的设备,比如说屏幕,然后让屏幕把输出显示出来,应用程序只需要知道调用是否成功

  • 程序访问主要是通过高层次的API接口而不是直接继续进行系统调用
    在这里插入图片描述
    当使用Java的API时,最终还会调用所使用系统的系统调用
    在这里插入图片描述

在这里插入图片描述
应用程序直接或间接的通过Library 来访问系统调用接口,访问系统调用接口后会触发从用户态到内核态的转换,从而使控制权由应用程序交给os

  • 用户态:应用程序执行过程中CPU所处的一个状态,不能直接访问某些特殊的机器指令、访问IO指令
  • 内核态:os运行过程中CPU所处的一个状态,能执行所有指令,包括特权,IO。。。

当系统调用时,会实现从用户态到内核态的转变,控制权从应用程序交到os,os可以对发出的系统调用做出标识识别,以完成具体的服务
应用程序发出:

  • 函数调用,在一个栈空间内实现参数的传递和返回
  • 系统调用,os和应用程序有各自的堆栈,切换堆栈转换状态都需要开销,也就是说用户态到内核态的转换需要切换堆栈,开销大,开销的回报就是安全可靠

开销

在这里插入图片描述
开销是值得的必须的

中断表/异常表/系统调用表要提前建立好
操作系统有自己的堆栈,不能跟用户堆栈混为一谈
os不信任应用软件,应用程序发出系统调用时os会对参数进行检查
内核态的数据要拷贝到用户态
内存状态的转换

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值