操作系统概述(操作系统)

本文详细阐述了操作系统的基础特征,如并发、共享和虚拟性,以及其发展历程,涵盖了批处理、分时和实时操作系统。文章还介绍了操作系统的运行机制,涉及中断和异常处理,以及系统调用和不同的内核架构,如大内核、微内核和模块化设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        操作系统是存在于用户与硬件之间的一种软件。当用户想要进行一些操作的时候,操作系统会将用户进行的操作翻译成二进制数字传给CPU,CPU就会处理我们想要进行的操作。

一、操作系统的特征

        1.1并发(最基本的特征)

        并发是指两个程序在宏观上能同时使用一个单核CPU来运行,但是微观上是交替运行了。这也是为什么单核CPU也能同时运行多个设备的原因。并行与并发不同并行的概念就是某一时刻同时发生。

        1.2.共享(最基本的特征)

        共享分为互斥共享方式和同时访问方式,互斥共享的意思是当一个程序想要用某个系统资源时,比如QQ和微信不能同时在一台机器上同时用视频打电话。同时访问方式类似于并发,比如QQ和微信可以在同一台机器上同时给其他人发送文件,但是在微观上,QQ和微信也是交替着发送文件的。

        所以共享是基于并发来实现的,没有并发就没有共享;如果没有共享,两个程序不能共享系统资源,那么也就没有并发。所以并发和共享互为存在条件。

        1.3.虚拟

        虚拟是指用户看起来拥有多个“东西”,但是实际上只有1个东西。时分复用技术:时分复用技术也基于并发实现。一个单核CPU在同一时刻只能运行1个程序,但是在实际上,单核CPU可以运行多个程序,因为并发性,时分复用技术就是将1秒划分为若干个时间碎片,每个时间碎片上执行一个程序,这样CPU就可以做到一秒钟内运行多个程序的操作,用户看起来拥有很多个单核CPU来为自己服务,但是实际上只有一个CPU。

        空分复用技术:假如我们的电脑只有4GB的运行内存,而某个游戏运行也需要4GB的内存,按理来说,这台电脑只能运行这个游戏,而不能再运行其他程序了。单实际上电脑还能同时运行其他程序,这就用到了空分复用技术(我暂时还没学,不知道空分复用技术的实现原理,等我学了再补充)。

        1.4.异步:

        异步是指一个程序可能此刻正在运行,但是某一时刻由于某种原因,可能是系统资源正在被占用而无法继续运行,也就是从运行态被转化为阻塞态,也有可能是时钟管理使程序从运行态被转化为就绪态。总之就是程序不是一贯的一直为运行态,程序的运行是走走停停的,两个相同的程序同时运行,但是他们两个过程中可能并不是同步的,这就是异步性。

二、操作系统的发展与分类

        2.1.手工操作阶段

        这个阶段还谈不上操作系统,手工阶段的主要原理就是,程序员运用二进制的方式在纸带上打孔,然后写好二进制程序后将纸带放入计算机,计算机运算好后,再将运行结果以同样的方式来打印出,程序员就可以将这些打孔的纸带翻译过来。这一过程是非常缓慢的,手工打孔,还是打二进制数。但是计算机的运行是很快的,并且这个阶段一台计算机只能同时处理一个程序。故计算机的利用率可想而知是很差的。

        2.2.批操作阶段

        批处理阶段就是将打孔的纸带通过外围机来写入磁带中,而计算机读取磁带的速度比读取纸带的速度快。这个阶段分为单道批处理阶段和多道批处理阶段。

        单道批处理阶段:计算机读取磁带中的程序只能读一个然后将程序处理完成后再读下一个程序,这种方式虽然快了不少,但是计算机的利用率依然不高。

        多道批处理阶段:这个阶段操作系统就正式诞生了。这种方式的计算机处理分为读处理器,运行器,输出处理器。这样一来,在第一个程序读完后运行的时候,计算机的读处理器就闲置下来,以便于第二个程序读入计算机,第一个程序运行完后,运行器又空闲下来,第二个程序可以立刻运行。这种方式就大大的提高了计算机的利用率。

        这种方法似乎计算机一直在运行,利用率很高,但是也有一个缺陷,那就是程序一旦放入磁带中,程序员就不能更改程序,想为程序改参数之类的操作都无法进行,更别提调试程序了。

        2.3.分时操作系统

        分时操作系统是多个用户公用一个计算机的操作系统。操作系统会平均的为每个用户分配碎片化的时间来供用户使用计算机,可能在每一秒的过程中,操作系统平均的分给十个人每个人0.1秒的时间,这样一来每个人看起来就拥有单独的一台计算机。有点类似与并发性。

        但是这种操作系统由于绝对的公平性,分给每个人的时间都是相等的。所以处理不了一些紧急任务,比如程序员A的程序在1分钟内不运行完毕就会发生爆炸,但是这种操作系统还是只会给程序员A分配1/10分钟的时间。

        2.4.实时操作系统

        这种操作系统就很聪明,不会死板的为每个程序员分配相同的时间。实时操作系统分为软实时操作系统和硬实时操作系统。

        硬实时操作系统:就拿前面举例,程序员A的程序不在规定时间内运行完毕就会发生爆炸,那么此程序就会占用整个操作系统为他一个人服务。

        软实时操作系统:比如交通工具的买票程序,这种程序有点重要,但是又没那么重要,程序就算没在一定的时间内运行完毕也不会发生什么不可逆的损害。这种能被允许超时完成的程序就是软实时操作系统来完成的。

        三、操作系统的运行机制

        讲这个内容之前,我们要回忆一下,最初的计算机是怎么运行的:程序员通过在纸带上打孔来写出一段二进制序列,这个CPU能认知这种二进制序列的程序,然后运行该程序。那么现在的计算机是怎么运行的呢?现在我们都用高级语言来运行计算机,但是CPU还是最初的那个样子,他只认识二进制序列,而我们现在所知道的C语言之类的高级语言也是由二进制演变而来,让人类更容易理解的语言。

        CPU在运行的过程中分为用户态与核心态。顾名思义,用户态是CPU在运行一些非特权指令的时候的状态,当某个程序需要使用CPU的核心功能的时候CPU就会转化为核心态来运行该核心功能。那么CPU是如何实现状态的转变呢?

        就像正负数一样,负数的二进制序列的首位为1,而正数为0。CPU的变态过程也是如此,CPU中有一个存储空间叫做PSW,在这块空间中有一个二进制序列,如果为1则是核心态,如果为0则是用户态。CPU在很多情况下都会由用户态转化为核心态,例如:程序本身需要用到CPU的核心功能、黑客在程序中故意留下信号使CPU转化为核心态,好使用你的计算机CPU的核心功能;程序的并发过程……

        这些CPU由用户态转化为核心态的过程,都有一个共同点:CPU接收到一个信号,CPU识别信号后发现自己需要由用户态转化为核心态。我们将这种信号称之为“中断”(中断内容较多后面再讲),中断会使操作系统夺回CPU的控制权,当操作系统解决了中断的问题后,才会将CPU的控制权还回应用程序以便于程序继续运行,这个过程也是程序从运行态转化为就绪态的过程。

        而CPU当然也会从核心态转化为用户态,比如在电脑开机的过程中,CPU就会在核心态下完成一系列核心功能,当完全开机后,CPU会执行一条特权指令来修改PSW中的二进制序列,将其变为0,转为用户态,以便于我们使用电脑中的程序。

        四、中断和异常

        中断分为内中断和外中断,外中断被统称为中断,而内中断被称之为异常。在电脑开机的过程中,CPU处于核心态,运行内核程序,开机后在合适的时间操作系统会主动让出CPU的使用权,就是前面我们所说的PSW中二进制序列的转变,此时CPU就从核心态转化为了用户态。而我们接下来要讲的中断是CPU从用户态转化为核心态的唯一途径。

        想象一下,如果没有中断,那么一个程序就会永远霸占CPU,那么这个CPU就只能为这一个程序服务,那么也就谈不上并发的概念,而并发又是操作系统最基本的特征,所以可以说:没有中断就没有操作系统。

        4.1内中断

        内中断的中断信号来自于CPU的内部,也就是CPU遇到某些情况的时候自发的从用户态转化为核心态。例如:当某个人恶意的在某个程序中写入一条想要调用你的计算机的内核程序,但是此时CPU处于用户态,那么CPU就会察觉到此条指令非法,故CPU为了保护你的电脑,自发的从用户态转化为核心态来处理这条非法指令,不会让其运行你的核心程序。

        这种恶意的中断称为终止。

        当我们程序运行的时候也会产生内中断,例如:当程序运行到某个环节,需要操作系统的帮忙,使CPU的内核程序来完成这个环节时,程序会写入一条陷入指令也叫访管指令(这条陷入指令是写在程序内部的,他并不能算作核心指令),当CPU处理这条陷入指令的时候,CPU就知道,此时我需要转化成核心态,然后运行一些核心程序来完成该程序的这个环节。

        这种陷入的中断称为陷入/陷阱。

        我们所说的系统调用就是通过陷入指令来完成的。

        4.2外中断

        外中断的中断信号来自于CPU的外部,也就是外部信号使CPU将某个程序的使用权归还给操作系统。这种中断方式一般用于程序的并发。

        例如:时钟管理,我们的计算机中都有一个时间戳的概念,而这个外中断信号就是根据时间来间断的向CPU发送的。假如当我们的程序A已经霸占了CPU50毫秒,那么为了程序的并发性,时钟程序就会给CPU发送一个中断信号用来使CPU停止运行程序A,然后CPU进入核心态,运行核心程序处理该外部中断信号,当处理完成后,CPU再次转化为用户态吗,此时操作系统会选择一个就绪态的程序B,来让CPU运行程序B。这样一连串的操作下来,就保证了操作系统的并发性。

        这种中断叫做时钟中断。

        还有一个例子,当我们的程序想要使用某个具有互斥共享特性的硬件,例如摄像头,但是此时摄像头正在被另一个程序使用。那么此时摄像头就会向CPU发送一个外部中断信号,来使该程序从运行态进入阻塞态。

        这种由I/O设备发出的中断叫做I/O中断。

        说到这里不知道你们有没有发现,外部中断就是让程序从运行态转化为其他状态的操作。无论是从运行态转化为就绪态还是从运行态转化为阻塞态。这种进程的状态我将在下一篇博客《进程与线程》中讲述。

        4.3中断机制的基本原理

        前面我们讲了那么多种的中断信号,CPU在处理这些中断信号的时候不可能都用一种方式来处理,所以我们的磁盘种会储存一种叫做中断向量表的数据结构,CPU会通过查询中断向量表来判断某种中断应该用什么方式来处理。

        五、系统调用

        我们的系统调用分为5大类:1.设备管理   2.文件管理   3.进程控制   4.进程通信   5.内存管理 而我们操作系统的主要内容就是这5大类系统调用。

        系统调用的基本原理:系统调用是指应用程序或者程序员通过写入陷入指令来让CPU为其进行一些核心操作。应用程序是直接在程序内部就有一个陷入指令,CPU可以识别该陷入指令,然后对其进行相关操作。具体实现方法就是通过传入参数来让CPU通过参数来识别该陷入指令。

        而程序员则可以通过高级语言中的库函数就可以达到系统调用的目的,因为库函数中封装了系统调用的复杂细节。这些复杂细节就包括传参、陷入指令等。当CPU处理完成该库函数后,操作系统就会重新归还CPU的使用权。程序员除了通过库函数来进行系统调用之外,还可以通过汇编语言跳过库函数来直接进行系统调用。

        六、操作系统体系结构

        6.1大内核与微内核

        操作系统有很多的功能,我们所谓的核心态下CPU进行的核心功能就是操作系统的功能。而操作系统的功能也分三六九等。第一种是距离硬件最近的,最关键最基本的功能例如:时钟管理、中断处理、原语等。而第二种功能不是基本功能,更多的是为数据结构进行服务的功能,例如:进程管理、存储器管理、设备管理等。

        如果将所有的操作系统功能全部划分到操作系统的内核中,那么就称此操作系统为大内核的;如果只将操作系统最基本的功能划分到操作系统的内核中,就称此操作系统为微内核的。

        在微内核下,如果我们的一个程序在用户态想要同时使用进程管理、存储器管理、设备管理这三个功能时,由于这三个功能不在操作系统的内核中,但是想使用这三个功能却需要进行系统调用。那么此时就会出现每使用一个功能都需要CPU的一次状态切换,而CPU的变态过程是十分繁琐的过程,故微内核性能较差,且用户态下各功能模块不能直接相互调用,需要内核进行消息传递。但是由于操作系统内核中的功能较少,故维护调试操作系统也比较简洁。

        在大内核下,由于这三个功能都在内核中,故CPU至于要进行一次状态的切换,故大内核的性能比微内核高跟多,且各模块功能可以直接相互调用,但是相应的操作系统内核的功能太多,导致调试起来繁琐,如果某个功能出错会连带着整个操作系统崩溃,故不好维护。只能说二者各有各的好处。

        6.2分层结构内核

        分层结构是将操作系统的各个功能再次划分为更细的功能,硬件在最底层,而最基础的功能在倒数第二层,然后向上叠加,形成这种分层的结构,且各个层级之间只有一个接口可以使各个功能相互调用。

        这种内核可以说是清晰明了,哪个环节出错了,只要从底层按个向上遍历整个内核功能即可,及易于调试与维护。但是缺点也显而易见,这种分层结构等级分明,但是某些时候操作系统的各个功能是有一定联系的,例如进程和内存,不能将他们完全分开,所以难以定义一个严格的边界来进行分层。而第二个缺点就是,由于各层与各层之间只有一个接口,意思就是第二层只能与第三层和第一层联系,如果想与第五层联系就需要逐层的传递信息,这就导致效率低下。

        6.3模块化内核

        模块化内核类似于树,树的根结点为操作系统,而根结点上连接着操作系统最基础的功能模块,例如进程管理和存储器管理之类的模块,而这些模块下又包含各个子模块。而各个模块间又有接口,以便于相互调用。

        显然这种树状的模块化内核,如果想要添加一个功能是及其方便的,只需要在对应位置插入一个子模块即可,且模块之间可以相互调用,效率极高。缺点就是,各个模块间相互调用的时候如果出错,我们就无从而知到底是哪个环节出错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值