操作系统笔记1- 计算机硬件介绍

概述

操作系统也是一种软件,但是操作系统是一种非常复杂的软件。操作系统提供了几种抽象模型

文件:对 I/O 设备的抽象
虚拟内存:对程序存储器的抽象
进程:对一个正在运行程序的抽象
虚拟机:对整个操作系统的抽象

学习操作系统可以让我们有效解决并发问题。
欢迎关注我的个人主页<anobility.github.io>

操作系统入门

操作系统

代计算机系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。

在硬件的基础之上,有一层软件,这层软件能够响应用户的输入指令达到控制硬件的效果,这种软件被称之为‘操作系统’。

我们一般常见的操作系统主要有 Windows、Linux、FreeBSD 或 macOS ,这种带有图形界面的操作系统被称为 图形用户界面(Graphical User Interface, GUI),而基于文本、命令行的通常称为 Shell

计算机硬件介绍

CPU

CPU 是计算机的大脑,它主要和内存进行交互,从内存中提取指令并执行它。一个 CPU 的执行周期是从内存中提取第一条指令、解码并决定它的类型和操作数,执行,然后再提取、解码执行后续的指令。重复该循环直到程序运行完毕。

中央处理单元(CPU)主要由运算器、控制器、寄存器三部分组成,从字面意思看运算器就是起着运算的作用,控制器就是负责发出CPU每条指令所需要的信息,寄存器就是保存运算或者指令的一些临时文件,这样可以保证更高的速度。

CPU都有一组特殊的可以执行的指令集,主要分为X86架构和ARM架构。
CPU架构可以被分为两大类,即所谓的“复杂指令集”与“精简指令集”系统,也就是经常看到的“CISC”与“RISC”。 Intel和ARM处理器的第一个区别是,前者使用复杂指令(CISC),而后者使用精简指令集(RISC)。

可以这么说,X86指令集中的指令是复杂的,一条很长指令就可以很多功能,而ARM指令集的指令是很精简的,需要几条精简的短指令完成很多功能。例如吃饭,在x86系统中就是一条长指令,而吃菜又是一条长指令;在ARM中 吃饭=张嘴+夹饭+送到嘴里+闭上嘴+咽下去,而吃菜=张嘴+夹菜+送到嘴里+闭上嘴+咽下去 一系列简单的指令构成。

X86的方向是高性能方向,因为它追求一条指令完成很多功能,而ARM的方向是面向低功耗,要求指令尽可能精简。X86和ARM的各自主要方向决定了他们的市场。X86的市场主要是PC和服务器,因为需要高性能。ARM的市场主要是手机和平板,因为需要低功耗。

由于访问内存获取执行或数据要比执行指令花费的时间长,因此所有的 CPU 内部都会包含一些寄存器来保存关键变量和临时结果。因此,在指令集中通常会有一些指令用于把关键字从内存中加载到寄存器中,以及把关键字从寄存器存入到内存中。还有一些其他的指令会把来自寄存器和内存的操作数进行组合,例如 add 操作就会把两个操作数相加并把结果保存到内存中。

多线程和多核芯片

多线程(multithereading) 由Intel公司提出,X86处理器大部分是多线程的,近似地说,多线程允许 CPU 保持两个不同的线程状态并且在纳秒级(nanosecond) 的时间完成切换。线程是一种轻量级的进程,我们会在后面说到。例如,如果一个进程想要从内存中读取指令(这通常会经历几个时钟周期),多线程 CPU 则可以切换至另一个线程。多线程不会提供真正的并行处理。在一个时刻只有一个进程在运行。

进程:一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,且至少有一个线程。
线程:与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。

并行:同时进行,如:一边打电话,一边炒菜;
并发:在一段时间内交替进行,显得好像是“同时”进行,如:在厨房炒菜,听到座机响了,于是去客厅接电话,然后再回到厨房炒菜,再去客厅接电话……
单 CPU 多线程提供的是并发能力;而多 CPU 则可以提供并行能力

存储器

计算机中第二个主要的组件就是存储器。理想情况下,存储器应该非常快速(比执行一条指令要快,从而不会拖慢 CPU 执行效率),而且足够大且便宜,但是目前的技术手段无法满足三者的需求。于是采用了不同的处理方式,存储器系统采用一种分层次的结构

寄存器

存储器的顶层是 CPU 中的寄存器,它们用和 CPU 一样的材料制成,所以和 CPU 一样快。程序必须在软件中自行管理这些寄存器

高速缓冲 cache

位于寄存器下面的是高速缓存,大多集成在CUP内部。
CPU先查询Cache中是否有数据,如果有,直接读取即可。

如果Cache中没有,则从内存中读取数据,同时把数据放入Cache中,然后把数据返回给CPU。
整个流程其实很简单,但对于Cache和内存信息的交换,需要考虑一些问题:

对于CPU读取数据,如果Cache中没有数据,从内存中读取数据后,如何分配到Cache中?
如果Cache满了,采用什么策略替换?
对于CPU写入数据,如何保证Cache和内存数据的一致性?
对于这3个问题,下面依次来分析是如何解决的。
这些问题的答案可以参考Kaito大佬的博客

主内存

主内存也叫主存,通常包括RAM(Random Access Memory)和ROM(Read Only Memory),其他还有EEPROM(Electrically Erasable PROM)和闪存(Flash Memory)。

RAM:RAM又称随机存取存储器,存储单元的内容可按照需要随机取出或存入,且存取的速度与存储单元的位置无关。这种存储器在断电时,将丢失其存储内容,所以主要用于存储短时间使用的程序。它主要用来存储程序中用到的变量。凡是整个程序中,所用到的需要被改写的量(包括全局变量、局部变量、堆栈段等),都存储在RAM中。
ROM:它是一种只能读出事先所存的数据的固态半导体存储器。ROM中所存数据稳定,一旦存储数据就再也无法将之改变或者删除,断电后所存数据也不会消失。其结构简单,因而常用于存储各种固化程序和数据。
为了便于使用和大批量生产,进一步发展出了可编程只读存储器(PROM)、可擦除可编程只读存储器(EPROM)。EPROM需要用紫外线长时间照射才能擦除,使用很不方便。1980s又出现了电可擦除可编程只读存储器(EEPROM),它克服了EPROM的不足,但是集成度不高、价格较贵。于是又发展出了一种新型的存储单元结构同EPROM类似的快闪存储器(FLASH MEMORY)。FLASH集成度高、功耗低、体积小,又能在线快速擦除,因而获得了快速发展。

磁盘/硬盘

这一类的存储器也叫外部存储器/辅助存储器,或者外存/辅存,一般处理速度较慢、价格较低、容量较大。

虚拟内存机制

这种机制使得期望运行的存储空间大于实际的物理存储空间。其方法是将程序放在磁盘上,而将主存作为一部分缓存,用来保存最频繁使用的部分程序,这种机制需要快速映像内存地址,用来把程序生成的地址转换为有关字节在 RAM 中的物理地址。这种映像由 CPU 中的一个称为 存储器管理单元(Memory Management Unit, MMU) 的部件来完成。

I/O设备(Defalt)

实现I/O的方式有四种,分别为:

程序直接控制方式,会造成忙等待。
中断驱动方式,做到了CPU和I/O设备并行工作。
DMA方式,彻底解放了CPU。
通道控制方式,实现CPU、通道和I/O设备三者的并行操作。
举个通俗易懂的例子助大家理解:
想象一位客户(CPU)要去裁缝店(I/O设备)做一批衣服,

程序直接控制,客户必须每隔一段时间去裁缝店看看裁缝把衣服做好没有,浪费客户不少时间。
中断驱动,裁缝店有客户的联系方式了,每做好一件衣服就给客户打个电话,让客户来拿,仍然比较浪费时间。
DMA,客户有了个单线秘书,并向秘书交代把衣服放在一个仓库,裁缝直接联系秘书,秘书负责把衣服取回来并放在合适的位置,每处理完100件衣服,才向客户报告一次,大大节省了客户的时间。
通道,秘书拥有更高的自主权,如可以决定把衣服放在哪里,何时向客户报告。相比于DMA,通道的优势在于如果客户在多个裁缝那里订了货,一个DMA的秘书只能与一个裁缝沟通,而一个通道的秘书可以与多名裁缝进行沟通。

总线

总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线。总线是一种内部结构,它是 cpu、内存、I/O设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。

总线可以分为以下三大类:片内总线、系统总线和通信总线

片内总线

片内总线是指芯片内部的总线,如在 CPU 芯片内部,寄存器与寄存器之间、寄存器与算逻单元 ALU 之间都由 片内总线连接。

系统总线

系统总线可以分为三个:数据总线、地址总线和控制总线

系统总线是指 CPU、主存、IO 设备(通过I/O接口)各大部件之间的信息传输线。由于这些部件通常都安放在主板或各个插件板(插卡)上,故又称板级总线(在一块电路板上各芯片间的连线)或板间总线

数据总线
数据总线用来传输各功能部件之间的数据信息,它是双向传输总线,其位数与机器字长、存储字长有关,一般为 8 位、16 位或 32 位。数据总线的位数称为数据总线宽度,它是衡量系统性能的一个重要参数。

地址总线
地址总线主要用来指出数据总线上的源数据或目的数据在主存单元的地址或 I/O 设备的地址。例如,欲从存储器读出一个数据,则 CPU 要将此数据所在存储单元的地址送到地址线上。又如,欲将某数据经 I/O 设备输出,则 CPU 除了需将数据送到数据总线外,还需将该输出设备的地址(通常都经 I/O 接口)送到地址总线上。可见,地址总线上的代码是用来指明 CPU 欲访问的存储单元或 I/O 端口的地址,由 CPU 输出,单向传输。地址线的位数与存储单元的个数有关,如地址线为 20 根,则对应的存储单元个数为 220。

控制总线
由于数据总线、地址总线都是被挂在总线上的所有部件共享的,如何使各部件能在不同时刻占有总线使用权,需依靠控制总线来完成,因此控制总线是用来发出各种控制信号的传输线。
通常对任一控制线而言,它的传输是单向的。例如,存储器读/写命令或 I/O 设备读/写命令都是由 CPU 发出的。
但对于控制总线总体来说,又可认为是双向的。例如,当某设备准备就绪时,便向 CPU 发中断请求;当某部件(如 DMA 接口)需获得总线使用权时,也向 CPU 发出总线请求。
此外,控制总线还起到监视各部件状态的作用。例如,查询该设备是处于“忙”还是“闲”,是否出错等。因此对 CPU 而言,控制信号既有输出,又有输入。
常见的控制信号如下:

  • 时钟:用来同步各种操作。
  • 复位:初始化所有部件。
  • 总线请求:表示某部件需获得总线使用权。
  • 总线允许:表示需要获得总线使用权的部件已获得了控制权。
  • 中断请求:表示某部件提出中断请求。
  • 中断响应:表示中断请求已被接收。
  • 存储器写:将数据总线上的数据写至存储器的指定地址单元内。
  • 存储器读:将指定存储单元中的数据读到数据总线上。
  • I/O读:从指定的I/O端口将数据读到数据总线上。
  • I/O写:将数据总线上的数据输出到指定的I0端口内。
  • 传输响应:表示数据已被接收,或已将数据送至数据总线上。

通信总线

通信是用于计算机系统之间或计算机系统与其他系统(如远程通信设备、测试设备)之间信息传送的总线,通信总线也称为外部总线。

更多关于总线的知识请看博客总线介绍

计算机启动过程

计算机的启动步骤主要分为四步,BIOS → 主引导记录 → 硬盘启动 → 操作系统

BIOS

当电源开关启动后,主板会通电并初始化固件(即芯片集等),而BIOS(Basic Input Output System 基本输入输出系统)的运行代码则早已被刷入集成在主板的ROM芯片中。

BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test),缩写为POST。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。

硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。这时,BIOS需要知道,“下一阶段的启动程序"具体存放在哪一个设备。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做"启动顺序”(Boot Sequence)。

主引导记录

计算机中可能存在有许多个存储设备,诸如硬盘、可移动硬盘、U盘等等,这些设备按用户预先设置好的优先级安排一个“启动顺序”。BIOS则根据这个顺序将计算机的控制权交给排在第一位的存储设备.
BIOS按照"启动顺序",把控制权转交给排在第一位的储存设备。这时,计算机读取该设备的第一个扇区(0号扇区),也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。这最前面的512个字节,就叫做"主引导记录"(Master boot record,缩写为MBR)。

"主引导记录"只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。主引导记录由三个部分组成

第1-446字节:调用操作系统的机器码。
第447-510字节:分区表(Partition table)
第511-512字节:主引导记录签名(0x55和0xAA)
其中,第二部分"分区表"的作用,是将硬盘分成若干个区。

硬盘分区有很多好处。考虑到每个区可以安装不同的操作系统,“主引导记录"因此必须知道将控制权转交给哪个区。分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以,一个硬盘最多只能分四个一级分区,又叫做"主分区”。每个主分区的16个字节,由6个部分组成。

第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。

第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。
第5个字节:主分区类型。
第6-8个字节:主分区最后一个扇区的物理位置。
第9-12字节:该主分区第一个扇区的逻辑地址。
第13-16字节:主分区的扇区总数。
最后的四个字节(“主分区的扇区总数”),决定了这个主分区的长度。也就是说,一个主分区的扇区总数最多不超过2的32次方。如果每个扇区为512个字节,就意味着单个分区最大不超过2TB。再考虑到扇区的逻辑地址也是32位,所以单个硬盘使用MBR分区表类型可利用的空间最大也不超过2TB。如果想使用更大的硬盘,只有2个方法:一是提高每个扇区的字节数,二是增加扇区总数。也就是GPT分区表类型。

相关问题请见MBR和GPT区别

硬盘启动

这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成三种情况。

  1. 情况A:卷引导记录
    上一节提到,四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做"卷引导记录"(Volume boot record,缩写为VBR)。
    "卷引导记录"的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。

  2. 情况B:扩展分区和逻辑分区
    随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成"扩展分区"(Extended partition)。
    所谓"扩展分区",就是指这个区里面又分成多个区。这种分区里面的分区,就叫做"逻辑分区"(logical partition)。
    计算机先读取扩展分区的第一个扇区,叫做"扩展引导记录"(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。
    计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。

  3. 情况C:启动管理器
    在这种情况下,计算机读取"主引导记录"前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的"启动管理器"(boot loader),由用户选择启动哪一个操作系统。

操作系统

控制权转交给操作系统后,操作系统的内核首先被载入内存。

以Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。至此,全部启动过程完成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340