操作系统(Operating System)是一组做计算机资源管理的软件的统称。目前常见的操作系统有:
Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙、mac系列、openwtr系列等。
总结来说,操作系统就是一个“软件”,是计算机中最重要,也是最复杂的软件之一。
操作系统主要做了两件事情:
操作系统是把硬件和软件连接起来的。
操作系统的定位
操作系统所提供的功能是非常复杂的,其中比较重要的就是进程(软件资源的管理),下面来介绍操作系统中进程。
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
进程(process)还有另外一个名字 任务(task)
什么是正在运行的程序
在我们下载软件的过程中,要下载一些文件,其中我们会发现一个文件的后缀名为.exe,这个文件为可执行文件。
如果我们不双击这个可执行文件,那么这个文件会在硬盘中,不会对系统有什么影响。
如果我们执行这个可执行文件,操作系统就会把这个可执行文件就会从硬盘加载到内存中,并且让CPU开始执行可执行文件内部的一些指令,这样程序就开始进行一些具体的工作了。
我们把这些运行起来的可执行文件称为“进程”。
上图就是在我电脑上正在运行的进程(可以从任务资源管理器中查看,当前电脑的进程)。
创建进程 — 先创建出PCB,再把PCB放到双向链表中。
销毁进程 — 现在双向链表中找到PCB,再删除相应的PCB。
查看任务管理器 — 遍历双向链表并打印。
上面的属性是一些基础的属性,下面的一组属性,主要是为了实现进程调度。
进程调度(是理解进程管理的重要话题)
现在的操作系统都是可以执行多任务的操作系统(一个系统同时执行了很多的任务)。像Linux系统,Windows系统等等。
在同一时刻很多的程序都在运行,像qq,画图板,qq音乐,idea等等,操作系统同时管理这些程序,这个就是进程调度。
我们系统上的进程数量,有几十个,上百个,但是我们的CPU核数就那么几个(6核或8核),那个这六个核心怎么调用这么多的进程。这就需要CPU进行并发执行。
并行和并发
并行:微观上,两个CPU核心,同时执行两个任务的代码。
并发:微观上,CPU一小段时间执行任务1,一小段时间执行任务2,一小段时间执行任务3…,只要执行的足够快,在宏观上就可以看成是同时运行。
CPU执行的到低有多快呢?
上面图片是我电脑上的参数,其中处理器是3.00GHz。
其中1G = 1024M, 1M = 1024K, 1K = 1024。
所以3GHz用计算器来算差不多就是34多亿次,这个是1秒钟可以执行指令的次数。所以就算计算机同时执行几个进程,我们在宏观上也是感受不到的。
正是因为我们在宏观上区分不了,并发和并行,所以我们一般用并发来代指 并行 + 并发。
只有我们在讨论操作系统调度这个话题的时候才作区分。
属性
在现在的操作系统上同时运行着多个进程,如果某一个进程出现了bug,进程崩溃了,但是不会影响其他的进程,能够做到这一点就是“进程的独立性”来保证的,而进程的独立性依仗着“虚拟地址空间”。
如果一个进程出现了bug,崩溃了,在早期的操作系统中,其他进程也会崩溃,这是因为早期的操作系统中的进程是访问同一个内存地址空间的。一个进程崩溃,其他的跟着崩溃。
为了解决早期的操作系统出现的问题,就出现了虚拟地址空间。
每一个进程在内存中都有一个不同的地址空间。其中有的进程分配的空间大,有的进程分配的空间小。具体的大小要根据进程的大小,然后由操作系统来分配。
进程之间通过虚拟地址空间,已经各自之间隔开了。
但是有的时候进程之间是需要进行交互的。
进程间,进行通讯是通过公共地址空间来实现的。这个公共地址空间,不在进程A中也不在进程B中。
进程A把信息存放到公共空间中,进程B再从公共空间中把信息读走。这样就实现了两个独立进程之间的交互。
在操作系统中,提供的“公共空间”有很多种,并且各有特点。
有的存储速度快,有的存储速度慢,有的存储空间大,有的存储空间小。操作系统中提供了多种这样的进程间通信的机制。
现在最主要使用的进程间通信方式,有两种:
在后面的文章中会详细讲解。这里想大致了解一下。