操作系统学习笔记(1)

在进行嵌入式开发的时候,尤其是在进行较大规模的嵌入式开发时,对于原来的裸机开发已经难以支撑一个较大项目的嵌入式开发,因此这里需要采用操作系统的方式,通过操作系统来实现各个任务的实现。

因此这里对于操作系统,进行一个学习。通过博客来记录一些学习笔记。

操作系统

操作系统五花八门,但是其内核的实现基本相似。一般来说,操作系统需要实现进程管理、存储管理、文件管理、设备管理这几个功能。

在具体介绍各个功能实现之前,我们需要对一些基本的内容进行了解,首先对操作系统内核进行简单的介绍。明白,操作系统功能的实现,实际上是中断机制和系统时钟相互配合的结果。

然后我们再来看进程管理、存储管理、文件管理、设备管理等功能是如何实现的。

内核

操作系统的内核,是操作系统中,实现进程管理和调度的程序模块。其实现离不开时钟与中断。

中断机制和系统时钟

操作系统内核的实现,离不开几个重要的机制:中断机制和系统时钟

首先先说,中断机制对于操作系统的重要性。

之所以操作系统可以进行进程管理,是因为中断机制具有以下几个特点:

  1. 1.程序在运行时是可以被打断
  2. 2.被打断的程序的执行状态是可以被保存的
  3. 3.中断程序执行完后,是可以返回断点(或从指定的断点)继续执行原程序的

有了上述特点,才能进行任务之间的切换、任务状态的保存,任务之间的选择执行。所以说,操作系统内核,离不开中断。

然后再说系统时钟,仅仅有中断机制并不能实现操作系统,因为操作系统需要对任务进行周期性的管理,而不是随意的进行中断,因此必须要有一个固定时间间隔的周期性信号,来帮助操作系统获得时间的概念,这就是系统时钟。由系统时钟引起的中断服务程序叫做时钟节拍服务。

内核的功能

提供中断处理、进程的调度管理、系统的基本操作三个方面的功能。

  • 中断处理:操作系统的运行离不开中断,内核的功能就是对中断进行管理和处理。
  • 进程的调度管理:内核需要对处理器的使用进行管理。
  • 系统的基本操作:承担时钟、设备、安全以及文件系统的操作任务。

内核是操作系统对裸机的一次封装。

宏内核与微内核

如果把所有的为进程服务有关的模块都放在操作系统的内核中,那么操作系统的内核可能就变得非常冗余。会产生许多问题,因此我们常常需要一个较小的内核。常见的两种实现方法为:
宏内核和微内核。
宏内核是虽然内核被划分成许多模块,但是其在运行时是一个整体,模块在内核内部,模块之间的通信不是信息传递,而是调用其他模块的函数。
微内核是,将操作系统中的许多模块如进程管理、设备管理、文件管理等,作为一个进程放在内核外面,操作系统的内核只负责信息传递,这样操作系统的内核就可以很小,并且还可以根据需要对操作系统的功能进行裁剪。

进程和线程

了解了操作系统实现的两个基础机制,我们来具体看操作系统的功能。首先就是进程管理。

什么是进程

首先我们要理解什么是进程,在我的理解,进程就是处理器对某些资源、代码、数据进行一系列的处理的行为就叫做进程,往往这一系列处理行为是以某些功能、目的的实现为联系的。

就像,处理器是一个老师,进程就是等待批改的一张试卷。

进程还有一个重要的特点,那就是进程是系统分配资源和进行调度的独立单位。

进程的组成

一个进程包括以下三个部分:

  1. 程序代码,程序代码是进程执行的依据。
  2. 数据集合,数据集合是进程在运行时所需要的数据全体。
  3. 进程控制块,是操作系统为了记录、描述、管理进程而分配给进程的数据结构。

就像试卷的姓名、学号等,进程控制块就是为了方便识别、管理、描述、记录等而给进程分配的数据结构。一般来说以一个结构体的方式来出现。

进程的状态

一般来说,进程至少具有以下三种状态:

  1. 就绪状态:一个进程已经获得了除处理器之外的所有必须资源,只需要执行器处理就能执行的状态。
  2. 运行状态:一个进程正在被执行器执行的状态。
  3. 阻塞状态:一个进程暂时无法运行,需要等待其他事件出现后才能实现就绪或运行的状态

进程的存储映像

从进程在内存中的所有存储映像来看,我们可以看到,在内存中的存储有一下几个部分:

1. 存有该进程的进程控制块:控制进程的运行
2. 该进程的数据存储区域:进程运行涉及到的数据
3. 该进程的程序代码存储区域:进程的运行代码
4. 该进程的堆栈存储区域:中断时用于存储进程的堆栈空间

四个部分

什么是线程

开始的时候,人们把进程作为系统分配资源的基本单位。但是这种系统进行进程运行的时间和空间开销太大,就像老师必须批改完一张试卷后才批改下一张试卷,每张试卷花费的时间太多。

因此后来人们把处理器的资源进行划分,出现了线程。因此有以下新的改变,对于存储空间资源的分配,仍然以进程为单位进行分配,但是对于处理器资源,则以线程为单位进行分配。总而言之,进程是系统分配资源的基本单位,线程是系统调度的基本单位。

进程管理

进程管理主要是以下几个方面的内容:

  1. 进程的调度:多个等待使用处理器的进程,按照一定的策略选择合适的进程,赋予其处理器的使用权。
  2. 进程的同步:对系统中的多个进程在对共享资源的使用出现竞争时进行协调和控制。
  3. 进程的控制:进程的创建、撤销以及进程状态的切换。
  4. 进程的安全:解决因多个进程争夺资源的使用权而进入死锁状态,从而保证系统安全顺利的运行。

进程的调度:
进程的调度有两类,一类是可剥夺方式,一类是不可剥夺方式
可剥夺方式下,优先级高的进程可以剥夺优先级低的进程的处理器使用权。
常用的调度算法有以下几种:
1.时间片轮转法:该方法是每个进程轮流占用处理器运行一个相同的时间片。通过队列的方式,从队首开始执行,执行一个时间片后,将该进程插入到队尾,然后执行下一个进程,这样不断循环执行。

2.优先级调度法:在调度器调度时,通过观察就绪进程的优先级,选择优先级级别大的进程来执行。

3.多级反馈队列调度法:把进程分成若干个优先级组,同一组的进程的优先级相同。并且把每组进程通过一个先入先出的队列进程组合,按照优先级级别高的组,应得的时间片越短的原则分配时间片。在调度的时候,调度器每次都从优先级高的分组开始,当优先级高的分组中没有进程了,才到低优先级的分组中选择进程来执行。

进程的切换

进程的切换,实际上就是将正在运行的进程的中间数据存在该进程的私有堆栈,并记录该进程的断点指针,然后将要运行的进程的中间数据从该进程的私有堆栈中提取出来,然后从该进程的断点指针处开始执行程序。
主要涉及到的寄存器是PC寄存器,PSW寄存器,SP寄存器等。以及主要通过压栈指令、出栈指令等汇编语言来实现。

进程的同步与通讯

进程之间可能会出现,多个进程需要共同使用一些共享资源,以及进程之间的通讯,进程之间的顺序同步等问题。

许多进程之间存在着互斥关系,或者说执行上有先后次序,因此需要进程之间进行同步。

进程之间的同步是通过进程之间的通讯来实现的。在操作系统中,进程之间通讯的方式,是通过信号量、邮箱、消息队列等被称作事件的中间环节来实现的把信息发送到事件上,叫做发送事件。读事件的操作叫做请求事件。

进程的控制

进程的创建,进程的删除,进程的挂起,进程的恢复都算进程的控制。

存储管理

操作系统另一个十分重要的功能就是对内存进行管理。

存储器的分层

首先先介绍一下计算机存储器的分层。

  1. 处理器内部有一个寄存器,例如运算寄存器,地址寄存器,这些寄存器主要用于处理器实时运算时储存中间数据。
  2. 处理器和主存储器(RAM+FLASH)之间存在一个高速缓存(Cache),它是位于CPU与内存间的一种容量较小但速度很高的存储器。CPU的速度远高于内存,当CPU直接从内存中存取数据时要等待一定时间周期,而Cache则可以保存CPU刚用过或循环使用的一部分数据,如果CPU需要再次使用该部分数据时可从Cache中直接调用,这样就避免了重复存取数据,减少了CPU的等待时间,因而提高了系统的效率。
  3. 主存储器,用来存放程序和程序运行所需要的数据。存放程序的存储器一般来说是掉电不丢失的存储器,如FLASH,而存放临时数据的内存空间一般来说是掉电丢失的,如RAM。虽然这两个存储器设备不同,功能不同,性能不同,但是其存储器的地址是在一个数字空间内的,例如我们通过32位的地址可以访问到FLASH,也可以访问到ARM,调用地址的人可以不用去关心该地址是指向FLASH的存储器还是指向ARM的存储器。
  4. 操作系统外存储设备,该部分的存储不属于操作系统存储管理的管辖范围,而是属于操作系统设备管理的管辖范围,这部分存储一般来说是掉电保存的存储设备。如磁盘、可移动存储介质等都属于这一范畴。

存储的距离离处理器越近,那么处理器读取和存放数据的速度越快。
我们在进行芯片选型的时候,常常关注芯片的存储大小,RAM和FLASH大小。
其中FLASH主要用于存放系统的运行代码,操作系统内核等,因此如果我们的项目工程量较大,所编写的代码较多或用到了较为复杂的操作系统内核,那么就需要较大的FLASH。
而RAM往往用于存储一些运行数据,其概念等同于PC电脑的内存大小。内存越大,那么操作系统在运行时就能够缓存和调用更多的数据。

存储器的分区划分

存储空间的划分是段页式的分区划分。
通常来说,一个存储单元的存储大小为一个字节(1B),而我们所需要占用的存储空间远大于一个字节,并且我们的存储器总量的大小也远大于一个字节,为了方便对存储器进行管理,操作系统对存储器进行了一些划分。
常见的操作系统先分段,再分页,页内的存储地址用偏移量来表示(页内偏移量),例如Linux操作系统;有些小的操作系统只分段,不分页,段内的存储地址用偏移量来表示(段内偏移量)。即通过以下两种方法来表示一个存储单元:
段号+段内偏移量
段号+页号+页内偏移量

这个概念就像,所有的存储空间是一个城市,一个存储单元是一个房子,如果我们直接在一个城市里面寻找一个房子,是比较困难的,因此我们对城市的房子进行划分,首先进行分区,武侯区,青羊区,等价于操作系统的分段;然后划分街道,望江路街道,等价于操作系统的分页;然后标出房号,等价于操作系统中的地址偏移量。有些小的城市只划分街道,不划分市区,相当于操作系统只划分段,不划分页。

通过分页管理存储空间,系统就可以将一个较大的程序按页为单位存储数据,这些页可以不用连续,而可以通过链表的方式将页联系起来。这样就可以减少内存碎片的存在,提高存储空间的利用率。

而分段管理存储空间,除了具有模块式的管理存储空间的功能之外,往往还有一些逻辑关系在其中,一个段内的程序往往具有相同的意义,例如主程序段、子程序段、数据段、堆栈段等。通过分段,我们就赋予了不同存储地址不同的功能,方便我们管理。

虚拟存储器

假如说,处理器的地址位数为32位,那么对应的内存容量为4GB,但是实际上计算机的真实内存空间(内存空间而不包括外部存储设备)肯定是远小于这个容量的。
为了避免地址空间的浪费,在编程的时候可用地址是全部地址位数,这样我们在编程的时候就可以不用考虑实际的存储地址,可以从地址0用到地址END。不过我们所编写的程序大部分情况下是存储在外部存储空间的物理地址中。
我们知道,一个操作系统的内存大小往往小于外部存储器的大小,因此计算机在运行时,将外部存储器中的数据先缓存到内存空间中,当需要用到其他部分时,再将其他部分缓存进来,把之前的卸回磁盘。
这就是虚拟存储技术。

设备管理

设备管理的设备无关性

设备管理时操作系统的又一大功能。
由于许多功能的实现往往需要操作系统和设备共同协调运行才能实现,因此操作系统需要对设备进行管理。
设备管理的主要思想是将设备管理抽象化,不具体的依赖于设备的细节,而是对设备的管理进行抽象。从而增加设备管理的适用性。
换句话说,如果操作系统需要对不同的设备提供不同的架构进行管理,那么这种操作系统只能对单一某些具体设备进行操作,灵活性差。因此我们将不同的设备都抽象成一种具有相同架构,相同特征的设备,操作系统需要对这一种设备进行管理,而设备只需要将自己封装成具有该架构的设备。
操作系统中最常用的设备就是存储器,因此我们把其他的设备也抽象成存储器,因此其他设备就需要有以下特点:

  1. 设备应该是可寻址的。具体做法就是,将设备的各种功能、状态、控制操作等都用一个个寄存器来表示,这样操作系统在管理设备时,只需要对设备对应的功能寄存器进行访问,就能实现。
  2. 使用逻辑设备名。我们在存储区域对设备标识时,应该使用逻辑设备名来进行标识,而不是物理设备的实际名称,例如我们通过CON表示所有具有输出属性的设备,这种设备可以是打印机,可以是显示器,操作系统可以不用去管具体设备是什么,只需要进行数据输出即可。
  3. 设备描述表。一个设备的属性、功能很多,为了便于对设备进行管理,我们将设备的属性成像出来用一个数据结构集中起来进行管理,这个数据结构就是设备控制表(DCT)或设备转接表(DST)。

操作系统对设备的管理

操作系统对设备的管理主要有三个内容,缓冲、调度、分配。

1.缓冲:

解决处理器和外围设备工作速度上的不匹配,如果外围设备数据传输速度大于处理器处理速度,那么就有可能造成数据的丢失;如果外围设备数据传输速度小于处理器处理速度,那么就有可能造成处理器一直在等待外围设备。因此操作系统通过缓冲的方法,如单缓冲、双缓冲、多缓冲等,将数据暂存在主存储区中,从而一定程度上改善速度不匹配的问题。

2.调度:

设备可以被进程访问,如果多个进程都要访问一个设备时,那么就需要操作系统对设备访问进行调度。换句话说,如果多个进程等待同一个设备时,设备如何选择进程来执行。
常用的设备调度方法是先来先服务,但是对于磁盘调度,出于提高磁盘的效率的考虑,采用寻道时间最短调度。

3.设备的分配:

设备的分配是指,当设备资源出现共享竞争时,按照分配策略为申请设备的进程分配设备。

文件管理

文件是一种信息的组织形式。存放在外存储器中。

文件结构

  • 按逻辑结构划分:文件可以分为流式文件和记录式文件。流式文件内的信息不再划分结构,如程序,文本等。记录式文件内的信息仍具有结构,如数据库文件。
  • 按物理结构划分:根据文件的物理存储方式,划分,文件可以分为顺序文件(连续存储)、链接文件(链表存储)、索引文件(索引表)。

文件系统

文件系统是操作系统中负责存取和管理文件的软件模块,主要有两个基本功能:

  • 1.建立文件时分配存储空间
  • 2.删除文件时回收存储空间

此外还有一些其他功能,例如文件和目录的操作接口,文件和文件目录的管理,多个用户共享文件时的安全措施等。

文件目录

创建一个文件时,文件系统会为该文件建立一个文件目录。文件目录是记录了文件属性的结构体,通常包括以下信息:

  • 文件名。一个唯一的符号名,用于文件的标识,用户可以按文件名对文件进行操作。
  • 文件的存储位置。表明了文件在外存中的存放地址,文件长度以及存放文件的设备名称。
  • 文件的结构。指示文件的逻辑结构和物理结构,决定了文件的寻址方式。
  • 文件的存储权限。用于实现文件的共享与安全。
  • 文件的使用信息。文件的创建日期、时间以及当前的使用状态等信息。

此外,为了方便对文件目录进行管理,操作系统将所有目录整合在一起组成一个文件,叫做目录文件。目录文件有单级目录文件、二级目录文件、树型目录文件

文件存储

文件存储涉及两个方面,一是存储空间的分配单位,二是空闲空间的组织、分配、回收。
前述所述,文件存储一般来说是按块存储。常见的存储大小为512B,1KB,2KB。
文件系统需要掌握存储空间中哪些物理块是空闲的,哪些是被占用的。记录和管理空闲空间的方法是建立一个位图,用0和1来表示物理块的空闲状态,或者通过链表的方式,将空闲块组成一个链表,分配空间时从表头摘取物理块,回收空间时,将回收的空闲块链入链表末尾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章