超干货 | 这些概念但是操做系统的灵魂,你弄懂了几个?

前文中,咱们知道大多数操做系统都可以为底层硬件提供抽象的做用,做为中间人进行上层应用软件与下层硬件资源的管理,以及对下层硬件进行接口层面抽象以帮助上层应用软件的调用。程序员

在上下的资源和信息的交互中,操做系统的必需要提供一种从抽象到具体的实际概念用来帮助创建更好的通讯和交流。因此这篇文章也就是从操做系统的一些基本概念出发,介绍操做系统是如何在硬件与应用软件中创建起准确的通讯桥梁。web

操做系统六大概念

1 进程

进程与程序

操做系统之中最为通用的概念就是「进程」。与此相关的面试题以及各类技术优化策略也层出不穷,足以够证实它对于理解操做系统中举足轻重的地位。事实上,经过「进程」,程序员能够更为直观的理解本身所开发的软件,而且可以从中深入的认识到操做系统在软件运行作了些什么。面试

简单来说,进程就是正在执行的程序。每一个进程都包含有属于本身的一段地址空间,能够看做是一部份内存空间。在这样的地址空间中,进程可以根据须要进行内存的读写。算法

地址空间里面通常包含可执行程序,以及对应程序的数据及其堆栈。与每一个进程相关的还有一组资源,一般包括寄存器(包括程序计数器和堆栈指针)以及运行程序所需的全部其余信息。从这能够看出,程序自己只是指令、数据以及其组织形式的一种描述方式,而程序的实际的运行实例就是一个进程。缓存

不过进程与程序也并不彻底等同,他们不是简单的一一对应的关系,而是在不一样层面的表现形式。他们的主要区别在于:安全

  • 程序是进程的静态文本,而进程是执行程序的动态过程;
  • 进程与程序不是一一对应,同一程序可在不一样进程中运行,一个进程也能够执行多个程序;
  • 程序是一种长期可保存的文本,进程是暂时的一次执行过程;
  • 进程是操做系统分配调度的独立单位,而程序是操做系统层级之上的应用程序。

进程状态

从上面咱们知道,进程可看做是程序运行的动态过程。那么为了更好的对进程进行描述,咱们给运行中的进程定义了三种基本状态,包括就绪、执行和阻塞。微信

这就是所谓的三态模型,描述了进程在整个运行周期中状态变化。每一个状态的转移过程能够经过下图来表示。网络

三态模型

就绪状态 是指进程已经被分配到了全部必需的资源,除了CPU。在这个状态下,进程处于箭在弦上随时待发的状态,只要一得到CPU的执行权限,进程便会马上执行,从而进入执行状态。数据结构

当有多个处于就绪状态的进程时,不一样的进程会根据优先级被划分入不一样的队列。一个由于时间片用完而进入就绪状态的进程会被划分入低优先级队列,而由于I/O操做完成而进入就绪状态的进程,则会被划分入高优先级队列。架构

执行状态 是指进程正常运行的状态。而当处于执行状态的进程因为须要等待某个事件发送(一般为等待I/O)时,就会放弃CPU,从而进入暂时的阻塞状态。CPU这时一旦空出,经过不一样的调度算法,CPU又会被分配给另外一个就绪进程。

阻塞状态 至关于就绪状态和执行状态的一个缓冲状态。当处于执行状态的进程没法正常执行时,会先进入阻塞状态,等待须要的请求执行完成,再回到就绪状态,等待下一次的CPU分配和执行。

三态模式是用来描述进程状态转移最为精简的模型,实际上光这三种状态是没法处理复杂的进程运行过程的。因此为了对进程进行更好的管理和调度,在三态模型的基础上引入了两种进程状态,即建立状态终止状态,这就有了五态模型。

五态模型

建立状态 是指进程刚刚建立的状态,在这个状态下,须要等待操做系统完成建立和分配进程的各类所需信息,包括创建PCB(Process Control Block)、加载程序并建立地址空间等。在完成这些准备工做后,该进程的状态就会转移为就绪状态并划分入就绪队列中。

PCB:进程控制块,用于存放进程的管理和控制信息的数据结构

建立状态看起来好像没什么太多用处,毕竟进程就绪的时候确定完成了建立。可是之因此仍是要引入,仍是为了确保进程控制块的完整。只有在建立状态完成了进程完整的准备工做(PCB生成建立及资源分配),才能进入就绪状态。

这样就保证了处于就绪状态进程的正确性,同时也提高了操做系统对进程的管理的灵活性。操做系统能够从一开始就对进程的建立和资源分配进行管理,更大程度上节省了系统资源的调控。

终止状态 表明着进程的结束,当进程执行完成后,须要操做系统在终止状态对进程的运行结果进行善后处理。这样的善后处理包括对进程所使用的资源进行回收,并将其它进程所须要的信息传递出去。最后,操做系统还须要对终止的进程进行内存释放,将其PCB中的内容清空,并将这部份内存返还给系统。

终止状态意味着进程的执行周期的结束,但却并不表示进程是正常结束的。当一个进程出现了没法预知的错误或者被操做系统或其它进程所终止时,它都会进入终止状态,进行各类资源的回收。

事实上即便是进程的五态模型也不足以用来描述进程复杂的运行过程。因为系统内部资源的限制,并非为全部进程运行的要求都可以知足,所以在这个基础上,又引入了进程的挂起就绪状态以及对应的挂起阻塞状态。

进程的七态模型

在七态模型中,活跃就绪是指进程在主存而且可被调度的状态。而静止就绪状态是指就绪进程被对换到辅存时的状态,它是不能被直接调度的状态,只有当主存中没有活跃就绪态进程,或者是挂起态进程具备更高的优先级时,系统才会把挂起就绪态进程调回主存并转换为活跃就绪状态。

活跃阻塞状态是指进程在主存,一旦等待的事件产生便会进入活跃就绪状态。静止阻塞是指阻塞进程对换到辅存时的状态,一旦等待的事件产生便进入静止就绪状态。

进程相关的知识点实在是太多了,包括PCB、进程间通讯以及和线程相关的概念和基础都是很是重要的知识。可是因为这篇文章的篇幅限制,很差在这里过多展开。

只是点到为止的介绍线程的状态模型,具体进程和线程的内容将会在以后几篇文章中详细展开介绍。

之因此花大力气来介绍线程模型,只由于这是线程跟操做系统关系最为直观的联系所在。

不断优化线程模型的目的就是为了使得操做系统可以更好的去管理程序软件和资源分配的问题。

经过对线程的管理来达到资源合理调配的目的。这自己也就是操做系统做用的重要体现之一,可谓是操做系统的第一大灵魂概念。

2 地址空间

地址空间的概念在进程的介绍中略有说起,实际上也与进程有不可分割的关系。通常上的理解上,每一个进程拥有其对应的地址空间,存储着该进程用于程序运行时所需的信息和数据。

咱们知道,每台计算机都有一些主内存,用于保存正在执行的程序。在一个很是简单的操做系统中,一次只有一个程序在内存中运行。要运行第二个程序,必须删除第一个程序,而后将第二个程序放在内存中。

更复杂的操做系统就可以解决这样的问题,它们能够容许多个程序同时存储在内存中。同时为了防止它们相互干扰(以及与操做系统之间的串扰),会采起某种通常存在于硬件中的保护机制。

一般,每一个进程都有其可使用的一组地址,一般从0到某个地址最大值。在最简单的状况下,进程具备的最大地址空间量小于主存储器的总容量。这样,进程能够填满它的地址空间,而且在主内存中也有足够的空间容纳这些信息。

可是,若是某个进程的地址空间大于计算机的主内存,而且该进程想所有使用它,该怎么办?

在最初的计算机中,这样的要求是十分过度的。而现在,好在有一种称为虚拟内存的技术,操做系统可以将地址空间抽象化为进程能够引用的地址集,从而使得地址空间与计算机的物理内存分离。这样一来,进程的地址空间就有可能大于计算机的物理内存。

地址空间和物理内存的管理是操做系统功能的重要组成部分,一样也是深刻理解操做系统进/线程管理的基础。

3 文件

几乎全部操做系统都支持的另外一个关键概念就是文件系统。操做系统的主要功能是隐藏磁盘和其余I/O设备的特性,并为程序员提供一个与设备或硬件无关的文件的简洁漂亮的抽象模型。

显然须要经过操做系统的调用来建立文件,删除文件,读取文件和写入文件。在读取文件以前,必须先将其放在磁盘上并打开,在读取文件后应将其关闭,以便可以提供调用来执行这些操做。

层次结构

为了提供存放以及找到文件的位置,大多数PC操做系统都具备目录的概念,该目录是将文件分组在一块儿的一种方式。目录是以文件夹的形式进行展示,能够在文件夹中嵌套多个目录。

整个文件系统的模型是一个层次结构,就像是一颗多叉树。从最顶层的文件夹依次以树干、树枝的形式进行查找,就能够搜索到最底部的文件目录。

文件结构

目录层次结构中的每一个文件均可以经过在目录层次结构的顶部(根目录)给出其路径名来指定。这样的绝对路径名包含必须从根目录遍历才能到达文件的目录列表,并用斜杠分隔各个组件。

D:/study/学习资源/我的/私は学ぶのが大好きです.mp4

每一个进程都会有一个当前的工做目录,在该目录中查找不以斜杠开头的路径名。这就是所谓的相对路径。此外,进程能够经过发出指定新工做目录的系统调用来更改其工做目录。

须要注意的一点是,在读写文件以前,必须先打开该文件,而后再检查权限。若是容许访问,系统将返回一个称为文件描述符的小整数,以用于后续操做。若是禁止访问,则返回错误代码。

挂载

在操做系统的文件系统中,另外一个重要概念就是挂载。大多数台式计算机都有一个或多个光盘驱动器,能够在其中插入CD-ROMDVD和光盘。(下面以Unix系统为例进行介绍)

这些计算机之外的光盘驱动器实际上均可看做是一个文件系统,而且与计算机自己硬盘上的根文件系统是相互独立,彼此无关的。为了提供一种优雅的方式来处理这些可移动介质,操做系统容许将光盘上的文件系统附加到根文件系统的主树上,这就是挂载。

可是,因为没法在CD-ROM上指定路径名,所以没法使用该文件系统。UNIX不容许使用驱动器名称或数字做为路径名的前缀。这是操做系统应该消除的对于设备的依赖性。取而代之的是,系统调用容许CD-ROM上的文件系统附加到根文件系统。

在下图中,CD-ROM上的文件系统已安装在目录b中,所以能够访问文件/b/x/b/y。若是目录b包含其它文件,则在安装CD-ROM时将没法访问它们,由于/b将引用CD-ROM的根目录。不过通常而言,文件系统几乎老是挂在空目录上。若是系统包含多个硬盘,它们也均可以挂载到单个树中。

挂载前的文件系统
挂载后的文件系统

专用文件

文件系统中的另外一个重要概念是专用文件。提供专用文件的做用是为了使I/O设备看起来像文件。这样,可使用与读写文件相同的系统调用来读写它们。

存在两种专用文件:块特殊文件和字符特殊文件。块特殊文件用于对设备进行建模,这些设备由一组可随机寻址的块(例如磁盘)组成。经过打开一个块专用文件并读取进行,这样一来程序就能够直接访问设备上相应的块,而无需考虑其上包含的文件系统的结构。

一样,字符专用文件可用于对打印机,调制解调器和其余接受或输出字符流的设备进行建模。按照惯例,特殊文件保存在/dev目录中。例如,dev/lp多是打印机(曾经称为行式打印机)。

除此以外,还有一个特殊的文件,就是管道。没错,就是用来进程间通讯的那个。事实上,管道是一种伪文件,可用于链接两个进程。若是进程AB但愿使用管道进行通话,则必须提早进行设置。

管道

当进程A想要将数据发送到进程B时,它将写在管道上,就好像它是输出文件同样。实际上,管道的实现与文件的实现很是类似。进程B能够经过从管道读取数据来读取数据,就像它是输入文件同样。

所以,进程之间的通讯很是相似于普通文件的读写。更强大的是,当进程发现正在写入的输出文件不是真正的文件,而是管道时,就会进行特殊的系统调用。固然具体的实现这里就不展开了,以后在讲进程间通讯时再详细介绍。持续关注,收获更多哦~

4 输入/输出

全部计算机都具备用于获取输入和产生输出的物理设备,这就是所谓的I/O。毕竟,若是用户在完成要求的工做后不知道该怎么办而且没法得到结果,那么计算机将有什么用?

现代计算机中存在多种输入和输出设备,包括键盘,鼠标,显示器,打印机等。这些设备都是由操做系统进行管理和资源的分配。

所以,每一个操做系统都有一个I/O子系统来管理其I/O设备。某些I/O软件与设备无关,也就是说,它们一样适用于许多或全部I/O设备。其它的I/O软件(例如设备驱动程序)则会用于特定的I/O设备。

依据I/O设备工做方式的不一样,一般进行以下分类:

(1)字符设备character device,又叫作人机交互设备。用户经过这些设备实现与计算机系统的通讯。它们大可能是以字符为单位发送和接受数据的,数据通讯的速度比较慢。

例如,键盘和显示器为一体的字符终端、打印机、扫描仪、包括鼠标等,还有早期的卡片和纸带输入和输出机。含有显卡的图形显示器的速度相对较快,能够用来进行图像处理中的复杂图形的显示。

(2)块设备block device,又叫外部存储器,用户经过这些设备实现程序和数据的长期保存。与字符设备相比,它们是以块为单位进行传输的,如磁盘、磁带和光盘等。块的常见尺寸为512~32768B之间。

(3)网络通讯设备。这类设备主要有网卡、调制解调器等,主要用于与远程设备的通讯。这类设备的传输速度比字符设备高,但比外部存储器低。

5 保护

咱们知道操做系统能够对进程和资源进行管理和控制,而在这个管理过程当中,进程运行的正确性必需要得以保证。所以,操做系统内部须要提供一种保护机制来确保进程运行和获取资源的正确性。

从概念上来讲,操做系统的保护是指一种控制程序、进程或用户对计算机系统资源进行访问的机制。操做系统中的进程必须加以保护,使其免受其余进程活动的干扰。各类机制是为了确保只有从操做系统中得到了恰当受权的进程才能够操做相应的文件、内存段、CPU和其余的资源。

通俗点说,计算机包含大量用户常常但愿保护和保密的信息。这些信息可能包括电子邮件,商业计划书,纳税申报单等等。操做系统须要采起一些机制来管理系统的安全性。例如,某些重要文件只能由受权用户访问。

经过为每一个文件分配一个9位的二进制保护代码来保护系统中的文件。保护代码由三个3位字段组成,一个用于全部者,一个用于全部者组的其余成员,另外一个用于其余全部者。

每一个字段都有3位,一位表示读权限,一位表示写权限,一位表示执行权限,这3个位称为rwx位。例如,保护代码rwxr-x--x表示全部者能够读取,写入和执行文件,其余组成员能够读取或执行(但不能写入)文件,其余全部者均可以执行(但不能读取或写入)文件。

除了文件保护以外,操做系统还存在许多其余安全方面的保护机制。这些机制贯穿在操做系统的各个方面,从而可以保证其在资源分配以及程序运行中的可靠性。

6 虚拟内存

虚拟内存想必都不会陌生,它主要是解决物理内存所带来的一系列局限问题。虚拟内存可以经过在RAM和磁盘之间快速来回移动程序来运行比计算机物理内存更大的程序。

由于虚拟内存的存在,使得应用程序觉得它拥有了连续可用的内存,即一个连续完整的地址空间。而实际上,它在物理内存中可能并不连续,一般是被分隔成多个物理内存碎片,甚至还有部分暂时存储在外部磁盘存储器上,在须要时才进行数据交换。

总的来讲,虚拟内存将主存当作是一个存储在磁盘空间上的地址空间的高速缓存,主存中只保存活动的区块,并根据须要在磁盘和主存之间来回传送数据。同时,它为进程提供了一致的地址空间,从而简化了内存管理。

除此以外,操做系统为每一个进程提供了一个独立的虚拟地址空间,从而保护了每一个进程的地址空间不被其余进程破坏。

因而可知,虚拟内存的提出解决了内存空间利用率问题、读写内存的安全性问题、进程间的通讯安全问题以及内存读写的效率问题。如今大多数操做系统都使用了虚拟内存,已经成为操做系统中最为基础的概念之一。

7 总结

这几个概念在操做系统的学习体系中很是常见,是绕不开的理解点。固然了,若是将这几个概念展开来讲都不是几篇万字长文可以介绍得完的。因此也不用慌,收藏起来慢慢理解,逐渐深刻。

本文就是单从概念的角度来介绍这六个重要名词在操做系统中的做用,从而体现出操做系统设计管理的思想。

关于操做系统的文章以后还会持续放出,让你们按部就班的理解这一门及其重要的学科领域。以后关于线程和进程关系、进线程的通讯和同步、虚拟内存的实现机制、文件系统等等方面的文章都会依次推送,还请持续关注支持哦~~

大家的支持就是个人动力鸭!下期见~



做者简介:我是安酱,一个稀里糊涂地进了大厂的业余码农。分享全栈技术,目标架构师。关注我,一块儿向技术大牛进阶!

推荐阅读:

一文揭开操做系统的神秘面纱

我机械/电信/生物/化学专业出身,转行计算机还有机会吗?

「添加我为好友,拉你加入讨论群,一块儿努力进阶!」

本文分享自微信公众号 - 业余码农(Amateur_coder)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索