文章目录

1 用户与之交互的程序,基于文本的通常称之为shell

2.基于图标的则称之为图形用户界面GUI

1)软件中最基础的部门是操作系统,它运行在内核态,在这个模式中,操作系统具有对所有硬件的完全访问权,可以执行继器能够运行的任何指令。
2)那些会影响机器的控制或者可进行I/O操作的指令,在用户态中的程序里是禁止的。
3)操作系统运行在裸机之上,为所有其它软件提供基础的运行环境,eg:若用户不喜欢某个特定的电子邮件阅读器,他可以自由选择其它的,但是不能自行写一个属于操作系统一部分的时钟中断处理程序,因为这个程序是由硬件保护的,防止用户试图对其进行修改
4)有时候在嵌入式系统中,该系统是没有内核态
在这里插入图片描述

一,二、什么是操作系统?

操作系统就是一种运行在内核态的软件

1.作为扩展机器的操作系统

通过硬盘驱动(disk driver)的软件来和硬件交互,这类软件提供了读写硬盘块的接口,而不用深入细节,操作系统包含很多用于控制输入/输出设备的驱动。
就算在这个层面,对于大多数应用而言还是太底层了,因此,所有的操作系统都提供使用硬件的又一层抽象:文件。
操作系统的任务是创建好的抽象,并实现和管理它所创建的抽象对象。

操作系统的实际客户是应用程序。

在这里插入图片描述

2.作为资源管理者的操作系统

操作系统的任务是在相互竞争的程序之间有序地控制对处理器、存储器以及其它I/O接口设备的分配。

现在操作系统允许同时在内存中运行多道程序。操作系统的主要任务是记录哪个程序在使用什么资源,对资源请求进行分配,评估使用代价,并且为不同的程序和用户调解互相冲突的资源请求。

资源管理包括两种方式实现**多路复用(共享)**资源:时间上的复用和空间上的复用

1)时间上的复用(time multiplexing)

当一种资源在时间上复用时,不同的程序或用户轮流使用它。
eg:在这里插入图片描述

2)空间复用

通常在若干运行程序之间分割内存,这样每一个运行程序都可同时入驻内存(eg:轮流使用CPU)。
假设有足够的内存可以存访多个程序,那么在内存中同时存放若干个程序的效率,比把所有内存都分给一个程序的效率要高得多。

2.操作系统的历史

三、计算机硬件简介(计算机组成原理)

在这里插入图片描述

1)处理器

CPU的工作:从内存中取出指令,并执行
在每个CPU基本周期中,首先从内存中取出指令,解码以确定其类型和操作数,接着执行之,然后取指令、解码并执行下一条指令。

每个CPU都有一套可执行的专门指令集,所以,x86处理器不能执行arm程序,而arm处理器也不能执行x86程序。该指令集会将一个字从内存调入寄存器,以及将一个字从寄存器存入内存。

由于用来访问内存以得到指令或数据的时间要比执行指令花费的时间长很多,因此,所有的CPU内部都有一些用来保存关键变量和临时数据的通用寄存器

除了通用寄存器,还有专用寄存器。eg:程序计数器,堆栈指针,程序状态字寄存器(PSW)

a)程序计数器

它保存了将要取出的下一条指令的内存地址

b)堆栈指针

它指向内存中当前栈的顶端,一个过程的栈帧中保存了有关的输入参数,局部变量以及那些保存在寄存器中的临时变量。

c)程序状态字(Program Status Word,PSW)寄存器。

这个寄存器包含了条件码位(由比较指令设置),CPU优先级,模式(用户态或内核态),以及各种其它控制位。在系统调用和I/O中,PSW的作用很重要

CPU架构

a)流水线的CPU

一个CPU可以单独地取值单元、解码单元和执行单元,于是当它执行指令n时,还可以对指令n+1解码,并且读取指令n+2。这样的机制称为流水线(pipeline)

优缺点:由于流水线一旦一条指令被取进流水线中,它就必须被执行完毕。流水线使得编译器和操作系统的编写者很头疼。

在这里插入图片描述

b)比流水线更先进的设计是超标量CPU

这种设计中,有多个执行单元,只要有一个执行单元空闲,就检查保持缓冲区中是否还有可处理的指令。若有,就把指令从缓冲区中移出并执行之。
在这里插入图片描述


多数的CPU都有两种模式,内核态和用户态。
在台式机和服务器上,操作系统在内核态下运行,可以访问整个硬件,而在大所属嵌入式系统中,一部分操作系统运行在内核态,其余的部门则运行在用户态。
一般,在用户态中有关I/O和内存保护的所有指令是禁止的,将PSW中的模式位设置成内核态也是禁止的。

为了从操作系统中获得服务,用户程序必须使用系统调用(system call)以陷入内核并调用操作系统。TRAP指令把用户态切换成内核态,并启用操作系统,当有关工作完成后,在系统调用后面的指令把控制权返回给用户程序。

多线程和多核芯片

多线程允许CPU保持两个不同的线程状态,然后在纳秒级的时间尺度内来回切换。
线程是一种轻量级进程,即一个运行中的程序。
eg:若某个进程需要从内存中读出一个字(需要花费多个时钟周期),多线程CPU则可以切换至另一个线程。多线程不提供真正的并行处理在一个时刻只有一个进程在运行,但是线程的切换时间则减少到纳秒的数量级。

多线程对操作系统而言,因为每个线程在操作系统来看就像是单个CPU
除了多线程,还出现了包含2个或4个完整处理器或内核的CPU芯片
下图的多核芯片上,装有4个小芯片,每个小芯片都是一个独立的CPU。
eg
左边的图是intel多核芯片,一个L2缓存被所有的核共享;
右边的图是AMD多核芯片,每个核有自己的L2缓存,但是在保持L2缓存一致性上存在困难
在这里插入图片描述

GPU(Graphics Processing Unit)
GPU指的是,由成千上万个微核组成的处理器,他们擅长处理大量并行的简单计算。

2)存储器

理想情形下,存储器应该极为迅速(快于执行一条指令,这样CPU不会收到存储器的限制)。

存储系统采用一种分层次的结构,顶层的存储器速度快,容量小,与底层的存储器相比,每位成本较高,其差别往往是十亿数量级。
在这里插入图片描述

a)CPU的寄存器

材料与CPU相同,速度和CPU一样快;
存储容量:32位CPU中为3232bit,64位CPU为6464bit,存储容量都小于1KB;

b)高速缓存

多数由硬件控制;
主存被分割成高速缓存行cache line:大小为64Byte,地址0-63对应告诉缓存行0,地址64-127对应告诉缓存行1;

高速缓存命中:最常用的高速缓存行放置在CPU内部或者非常接近CPU的高速缓存中,当某个程序需要读一个存储字时,高速缓存硬件检查所需要的高速缓存行是否在高速缓存中,若是,缓存满足要求,就不需要通过总线把访问请求发送到主存

现代的CPU设计了两个缓存,L1缓存总在CPU中,通常用来将已解码的指令调入CPU的执行引擎,大小为16KB;L2缓存,对于那些频繁使用的数据字而言,二级缓存是用来存访近来使用过的若干兆字节的内存字。
L1和L2缓存之间的差别在于:L1缓存的访问,不存在任何延时,L2缓存的访问,则会延时1or2个时钟周期。

c)主存,通常称为RAM,所有不能在高速缓存总得到满足的访问请求都会转往主存
d)其它非易失性随机访问存储器

ROM:有些计算机中,用于启动计算机的引导加载模块
EEPROM,闪存flash:可以擦除和重写

e)CMOS:很多计算机利用CMOS存储器保持当前时间和日期

3)磁盘(硬盘)

磁盘唯一的问题是随机访问数据的时间大约慢了三个数量级。低速的原因是:因为磁盘是一种机械装置在这里插入图片描述

说明:
在任意一个给定臂的位置,每个磁头可以读取一段环形区域,称为磁道track
把一个给定臂的位置上的所有磁道合并起来,组成了一个柱面cylinder

在这里插入图片描述

eg:一些不是磁盘的磁盘,固态硬盘SSD

4)I/O设备

I/O设备一般包括两个部分:设备控制器和设备本身

控制器是插在电路板上的一块芯片或一组芯片,这块电路板物理地控制设备,并从操作系统中接收命令。在控制器中安装一个小的嵌入式计算机,该嵌入式计算机运行为执行这些工作而专门编号的程序。

I/O设备的另一个部分是实际设备的自身,标准化后任何一个SATA磁盘控制器就可以适配任一种SATA磁盘。
注:ATA代表高级技术附件(AT Attachment),而SATA表示串行高级技术附件(Serial ATA),AT代表:计算机高级技术(Advanced Technology)。

现在的SATA是很多计算机的标准硬盘接口,由于实际的设备接口隐藏在控制器中,so,操作系统看到的是对控制器的接口,这个接口和设备接口有很大的差别。

设备驱动程序device driver的定义:每类设备控制器都是不同的,所以,需要不同的软件进行控制。专门与控制器对话,发出命令并接收响应的软件,称为设备驱动程序。
为了能够使用设备驱动程序,必须把设备驱动程序装入操作系统中,这样它才可以在内核态运行(注:很少一部分系统,eg:MINIX 3,在用户态运行全部驱动程序)。

将设备驱动装入操作系统的三个途径:
在这里插入图片描述

设备寄存器的I/O端口的地址空间怎么进行处理的?

一类计算机是:
在这里插入图片描述

还有一类计算机是:
在这里插入图片描述

区别在于:前一种不需要专门的I/O指令,但是却占用了一些地址空间;
后者不占用地址空间,但是需要专门的指令
两者运用的都很广泛!

实现输入和输出的三种方式:

第一种方式是:轮询
在这里插入图片描述

第二种方式是:中断在这里插入图片描述
第二种方式需要中断,中断的具体过程如下:
在这里插入图片描述

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

第三种方式:DMA
在这里插入图片描述

5)总线

即插即用的I/O系统

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

在这里插入图片描述

主要的总线是PCIe(Peripheral Component Interconnect Express)。

大多数总线都是并行且共享的。

共享总线架构(shared bus architecture):表示多个设备使用一些相同的导线传输数据,so,当多个设备同时需要发送数据的时候,需要仲裁器决定哪个设备可以使用总线。

传统PCI使用**并行总线架构(parallel bus architecture)**表示通过多条导线发送数据的每一个字,eg:在传统的PCI总线上,一个32位数据通过32条并行的导线发送。

PCIe使用串行总线架构(serial bus architecture):通过一条被称为数据通路的链路传递集合了所有位的一条消息,像网络包。

USB(Universal Serial Bus)

在这里插入图片描述

SCSI(Small Computer System Interface)总线

在这里插入图片描述

6)启动计算机

基本输入输出系统BIOS的程序

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

四、操作系统大观园

1)大型操作系统

在这里插入图片描述

2)服务器操作系统

在这里插入图片描述

3)多处理器操作系统

在这里插入图片描述

4)PC操作系统

5)掌上计算机操作系统

谷歌的android和苹果的iOS

6)嵌入式操作系统

所有软件保存在ROM中在这里插入图片描述

7)传感器节点操作系统

在这里插入图片描述

8)实时操作系统:硬实时和软实时

在这里插入图片描述

9)智能卡操作系统:JVM虚拟机的应用

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

五、操作系统概念

1.进程

1)进程(proess)本质上是正在执行的一个程序。进程的资源集包括:寄存器(程序计数器和堆栈指针)、打开文件的清单、突出的报警、有关进程的清单、与运行该程序所需要的所有其它信息。
进程就是容纳运行一个程序所需要所有信息的容器

地址空间: 这是从某个最小值的存储位置到某个最大值的存储位置的列表

进程与地址空间的关系:进行在这个地址空间可以进行读写。在该地址空间中,存放的有:可执行程序、程序的数据以及程序的堆栈

2)进程表process table:与一个进程有关的所有信息,除了该进程自身地址空间的内容外,均存放在操作系统的一张表中。
进程表是数组或链表结构,当前存在的每个进程都要占用其中一项。

eg:一个挂起的进程包括:进程的地址空间,对应的进程表项。

3)管理进程最关键的系统调用是:进程创建和进程终止的系统调用。
其它可用的进程系统调用包括:申请更多的内存(或者释放不再需要的内存),等待一个子进程结束,用另一个程序覆盖该进程。

4)进程树与进程间的通信

在这里插入图片描述

若一个进程能够创建一个或多个进程(子进程),而这些进程又可以创建子进程,就可以得到进程树

进程间通信:合作完成某些作业的相关进程经常需要彼此通信以便同步他们之间的行为

5)**警告信号alarm signal:**此信号引起该进程暂时挂起,无论该进程正在做什么,系统将其寄存器的值保存到堆栈,并开始运行一个特别的信号处理过程,比如重新发送可能丢失的信息。

6)UID与PID
每个进程使用一个给定的UID(User Identification),每个被启动的进程都有一个启动该进程的用户UID

子进程拥有与父进程一样的UID

用户可以是某个组的成员,每个组也有一个GID(Group Identification)

2.地址空间

计算机主存的管理和保护:计算机的主存用来保存正在执行的程序。在同时运行多道程序的操作系统中,为了避免它们相互干扰(包括操作系统),需要有某种保护机制。

管理进程的地址空间与存储器相关:
a)在最简单的情形下,一个进程可拥有的最大地址空间小于主存,所以,进程可以满足其地址空间,而且内存中也有足够的空间容纳该进程。
b)“若进程有比计算机拥有的主存还大的地址空间,而且该进程希望使用全部的内存,那该怎么办?”
利用虚拟内存技术,操作系统可以把部分地址空间装入主存,而部分留在磁盘上,并且在需要时来回交换他们

3.文件

1)文件系统:独立于设备的抽象文件模型。
在文件可以读取之前,必须先在磁盘上定位和打开文件,在文件读过之后应该关闭该文件,有关的系统调用则用于完成这类操作。

目录directory:为了提供保存文件的地方,操作系统支持目录,可以把文件分类成组。系统调用创建和删除目录,可以将已有的文件放入目录中,并从目录中删除文件等等。

2)文件树
一般进程树的结构层次很少超过三层;
文件数的结构层次常常多达四层、五层或更多层;

eg:
在这里插入图片描述

说明:
a)
每一个文件都可以通过从目录的顶部即:根目录root directory开始的路径名path name来确定。
绝对路径名包含了从根目录到该文件的所有目录清单,它们之间用“/”隔开。
eg:
在这里插入图片描述
最开始的“/”表示这是从根目录开始的绝对路径。

工作目录working directory:每个进程都有一个工作目录,进程可以通过使用系统调用指定新的工作目录,从而变更其工作目录。

b)在读写文件之前,首先要打开文件,检查访问权限,若权限许可,系统将返回一个小整数,称作文件描述符filw descriptor,以供后续操作使用。若禁止访问,系统则返回一个错误码。

c)在mount调用之前,根文件系统在硬盘上,而第二个文件系统在CD-ROM,它们都是分离且无关的。

在这里插入图片描述

说明:CD-ROM上的文件系统安装到了目录b上,这样就允许访问文件/b/x以及/b/y.

d)特殊文件special file作用:为了使得I/O设备就像是系统调用读写文件一样。按照惯例,特殊文件是保存在/dev目录中。

块特殊文件block special file:指的是由可随机存取的块组成的设备,eg:磁盘;
字符特殊文件character special file:输出字符流的设备。

e)管道pipe:与进程,与文件都有关。
管道是一种虚文件,它可连接两个进程

eg:在Unix中两个进程之间的通信类似于普通文件的读写,对于管道,则需要使用特殊的系统调用。
在这里插入图片描述

说明:
在这里插入图片描述
件一样。

4.输入/输出

管理系统都有其I/O设备的I/O子系统,某些I/O软件部分可以同样应用于需多或全部的I/O设备上。I/O软件的其他部分,如设备驱动程序,是专门为特定的I/O设备设计的。

5.保护

管理系统的安全性完全依靠操作系统,eg:文件仅供授权用户访问,保护的内容有:电子邮件、商业计划等。

Unix操作系统通过对每个文件赋予一个9位的二进制保护代码,对Unix中的文件实现保护。该保护代码有三个3位字段:
一个用于所有者;
一个用于与所有人同组(用户被管理员划分成组)的其他成员;
一个用于其他人;

每个字段的rwx位中有一位用于读访问、一位用于写访问、一位用于执行访问。对一个目录而言,x表示允许查询,短横线表示:不存在对应的许可。
eg:rwx r-x --x表示(三个三个去看):
所有者可以读、写或执行该文件;
其他组成员可以读或执行(但不能写);
其他人可以执行(但不能读和写)该文件;

6.shell

操作系统是进行系统调用的代码。

Unix的命令解释器,称之为shell。shell同时也是终端用户与操作系统之间的接口。

eg:相关操作
在这里插入图片描述

7.个体重复系统发育

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

1)大型内存

2)保护硬件
保护硬件的作用是:可以让机器在内存中同时保持若干程序,并让他们流转运行(多道程序处理)。

单道程序处理——每个时刻只运行一个程序。

3)硬盘

4)虚拟内存
虚拟内存通过在RAM和磁盘中反复移动信息块的方式,提供了运行比机器物理内存大的程序的能力;
虚拟内存还使得程序可以在运行时动态地链接库,而不是必须在编译时链接。

六、系统调用

1)操作系统具有两种功能:为用户提供抽象和管理计算机资源,eg:创建、写入、读出和删除文件。

2)对用户而言,资源管理部分主要是透明和自动完成的。
这样,用户程序和操作系统之间的交互主要就是处理抽象。

3)
在这里插入图片描述

4)为了使系统调用机制更清晰,考察一下read系统调用。
该系统需要三个参数
第一个参数用来指定文件、
第二个参数指向缓冲区、
第三个参数说明要读出的字节数。

由C程序进行的调用形式如下:
在这里插入图片描述
系统调用(及库过程)在count中返回实际读出的字节数。这个值通常和nbytes相同。若系统调用不能执行,则不论是无效的参数还是磁盘错误,count都会被置为-1。

eg:用read系统调用read库的过程
在这里插入图片描述

说明:
a)第一个和第三个参数是值传递,第二个参数是通过引用传递,即:传递的是缓冲区的地址,而不是缓冲区的内容

b)第四步:是对库过程的实际调用

c)第五步:一般把系统调用的编号放在操作系统所期望的地方,eg寄存器

d)第六步:执行TRAP指令,将用户态切换到内核态,并在内核中的一个固定地址开始执行。

e)第七步:跟随在TRAP指令后的内核代码,开始检查系统调用编号,然后分派给正确的系统调用处理器,这通常是通过一张由系统调用编号所引用的、指向系统调用处理器的指针表来完成的。

f)第八步:系统调用处理器运行

g)第九步:系统调用处理器完成工作后,控制跟随TRAP指令返回给用户空间库。

h)第十步:以通常的过程调用返回的方式,返回到用户程序。

i)第十一步:编译后的代码准确地增加堆栈指针值。

j)TRAP指令与过程指令的差别:
在这里插入图片描述

5)POSIX系统调用中100个常见的过程调用,如下。
在这里插入图片描述

说明:
a)所包含的服务有:创建与终止进程,创建、删除、读出和写入文件,目录管理以及完成输出/输入。

b)POSIX标准定义了构造系统所必须提供的一套过程,但是并没有规定它们是系统调用、库调用还是其它形式

c)如果不通过系统调用就可以执行一个过程,那么就无需进入内核;
多数POSIX过程确实会进行系统调用,通常是一个过程直接映射到一个系统调用上;
所需要的过程仅是某个调用的变体时,一个系统调用会对应若干个库调用;

1.用于进程管理的系统调用

1)在Unix中,fork是唯一可以在POSIX中创建进程的途径。它创建一个原有进程的精确副本,包括:所有的文件描述符、寄存器等等。在fork之后,原有的进程及其副本(父与子)就分开了。
fork调用返回一个值,在子进程中该值为0,并且在父进程中,等于子进程的进程标识符PID(Process Identifier)。使用返回的PID,就可以在两个进程中看出哪个是父进程,哪个是子进程。

2)在下图中,用一个高度简化的shell来说明fork、waitpid以及execve的使用
在这里插入图片描述
说明:
waitpid函数
在这里插入图片描述

execve函数:是POSIX的全部系统调用中最复杂的一个,其它都很简单。
在这里插入图片描述

eg:execve函数来解释shell的一些指令:如cp file1 file2
a)含义:该命令将file1复制到file2。在shell 创建进程之后,该 子进程 定位和执行文件cp,并将源文件名和目标文件名传递给他。
b)cp命令主程序的声明:
main(argc,argv,envp)
第一个参数:是该命令行内有关参数数目的计数器,包括程序名称,eg:上面的cp的argc=3;
第二个参数:argv是一个指向数组的指针。该数组的元素i是指向该命令行第i个字符串的指针。eg:
在这里插入图片描述
第三个参数:envp是一个指向环境的指针。
在这里插入图片描述

3)Unix的进程将存储空间划分为三段: 正文段(eg:程序代码),数据段(eg变量),以及堆栈段。
在这里插入图片描述
说明:
堆栈是在需要时自动地向中间增长;
数据段的扩展是显示地通过系统调用brk进行,在数据段扩充后,该系统调用将指定一个新地址。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐