什么是操作系统
众所周知,计算机系统是有计算机硬件和计算机软件组成的,而计算机硬件主要是指大家所熟知的中央处理器(CPU)、硬盘、内存、主板、显卡等等,而计算机软件其实是分层次的,在计算机硬件上运行的计算机软件最底层其实就是操作系统。如下图所示,是计算机系统层次结构图:可以说操作系统就是直接运行在计算机硬件裸机上的第一层软件,是操作系统为上层应用提供了计算机硬件的操作接口和基础功能,并将计算机硬件外设的数据信号等获取到的数据传递给上层应用。
操作系统有哪些功能
知道了操作系统在计算机系统中所处的位置后,就应该明白操作系统的主要目的就是为了方便用户使用计算机系统和提高计算机系统资源利用率而诞生的软件系统。
操作系统的主要功能可用概况为以下两方面:
提供人机接口
管理计算机资源
人机接口
提供人机接口其实就是运行在计算机硬件上的操作系统为用户的使用提供了方式和方法。最简单的方式就是我们开发人员在计算机上基于操作系统进行软件的开发和使用,从而实现了程序的开发运行。
大家都知道,像 C 、C++ 一类的编译性语言编写的程序在真正运行起来之前是需要进行代码编译、链接后才能运行的。其中,代码编译是将高级语言编译成简单的二进制文件,而引入链接后就需要用到操作系统下的库的概念(尤其是动态库链接),最后到真正运行程序时,程序其实是在操作系统的基础上才运行起来的。
现在,我们大家来简单练习一个最基本的程序员入门程序 “hello world!” 。大家基于现在的 Ubuntu 操作系统环境,在终端窗口下使用 vim 编辑器编写代码,具体命令如下:
vim hello.c
#include
int main(int argc, char **argv)
{
printf("hello world!\n");
return 0;
}
# 仅进行编译操作,不进行链接
gcc -c hello.c -o hello.o
# 完成链接操作,产生可执行文件
gcc hello.o -o hello
此时,产生的 hello 可执行文件就是基于 Ubuntu(Linux)操作系统的可以运行的程序,如果简单脱离这个操作系统,这个程序是无法运行起来的。我们可以通过 file 命令来查看这个文件的基本属性:
file hello
通过这样简单的一个程序的编译、运行练习,大家应该明白操作系统所提供的人机接口是什么了吧?其实人机接口主要就是为了给人们提供与计算机进行交互的接口功能。
管理计算机资源
计算机系统的资源总的来说分为硬件资源和软件资源,硬件资源有处理器、存储器、外设等;软件资源则大部分指程序和数据。
操作系统提供了大量用于管理这些资源的功能。具体如下:
处理器资源管理:处理器调度、进程控制、进程通信、进程同步
存储管理:内存分配、地址转换、内存保护、内存扩充
设备管理:设备分配、缓冲管理、设备驱动、设备无关性
文件管理:文件存储空间管理、目录管理、文件操作、文件权限控制
下面通过一个简单的输入、输出程序来演示操作系统管理设备的功能,构建实现一个 input 的程序,创建源文件:
vim input.c
在源文件中添加如下内容:
#include
int main(int argc, char **argv)
{
char msg[128] = {0};
int ret = 0;
printf("Please Input message: \n");
scanf("%s", msg);
printf("Your input message : \n");
printf("%s\n", msg);
return 0;
}
gcc input.c -o input
./input
从这个程序的运行过程中能够看出,当程序执行开始,屏幕上会显示我们想要打印的字符串数据,这里就用到了操作系统的输出设备管理功能,将数据发送给显卡进行显示;然后我们通过键盘输入了消息数据,操作系统管理的输入设备(键盘)获取到我们敲击键盘的事件消息后拼成了最终输入的消息数据送给运行的应用程序,然后应用程序最终重新将获取到的数据打印显示到了屏幕上。具体流程参考如下:
操作系统的分类
从一开始的裸机到单任务处理的单片机,最后发展成为如今的多任务并发处理的现代计算机,计算机系统发展迅速,而在计算机系统中十分重要的操作系统也发展形成了多种类不同的操作系统。
由于应对的场景不同,操作系统根据处理多任务的不同方式可以分为:
分时操作系统:目前大部分桌面操作系统都属于分时操作系统,其中最主要的区别就是多任务分时共享计算机的处理资源。目前所见到的 Windows、Ubuntu、MacOS 等桌面操作系统都属于分时操作系统。
实时操作系统:实时操作系统针对工业和需要及时处理数据消息而设计的操作系统,有及时性、可靠性等特点。这类型操作系统多指嵌入式操作系统,有 rtos、uCosII 等等。
操作系统的结构组成
操作系统是一个大型的软件系统,是由许多独立功能的程序模块组成的,这些程序模块共同构成了一个完整的操作系统。大部分的操作系统都可以被分为这样两种结构:层次结构和微内核结构。
层次结构 层次结构操作系统的设计思想主要是按照操作系统各个模块的功能和相互之间的依存关系而设计。而操作系统应该分为多少层,各个层应该在什么位置其实都是层次结构操作系统的设计关键点。处于最底层的程序模块往往成为操作系统的内核。这部分程序模块的功能包括系统中断处理程序、各个外设驱动程序、高优先级处理频率高的程序模块(如时钟管理程序、进程调度程序、低级通信模块、内存管理模块等等)。一般情况下,为了整个操作系统的效率,系统内核部分会在计算机系统工作过程中常驻内存中持续运行。
微内核结构 与层次结构相对的就是微内核结构。微内核结构的操作系统其实就是把操作系统中的基本功能模块组织为操作系统的微内核,而其他功能模块尽量做到内核以外,通过调用内核来实现。微内核机构是具有如下优点:
- 简化内核代码维护工作:微内核代码量少,结构简单易于维护。当需要增加操作系统功能时,通常情况下仅需要在内核以外进行即可;
- 建构灵活:在微内核上可以开发实现多种类型的操作系统。例如:在微内核结构上提供一组 Unix 服务程序,那么操作系统对于用户来说就是 Unix 系统,而提供一组 Windows 服务程序则就像是 Windows 系统一样。
- 安全性高:由于大部分的功能模块都是处于内核以外的部分运行实现,其实类似高级用户一样的层次,则相对于操作系统来说更安全,大部分功能模块产生的漏洞不会影响到系统内核部分。
- 方便移植:由于硬件相关的部分都包含在微内核中,当需要进行系统移植时,只需要修改微内核代码以适应不同的硬件平台即可进行系统移植,而对于操作系统中各个功能模块以及更上层的应用层来说不需要做任何改变。
Linux 操作系统介绍
经过对操作系统的介绍,详细大家对于计算机系统中的操作系统应该有了一定的概念。本课程重点研究的操作系统是 Linux 操作系统,现在就简单介绍一下关于 Linux 操作系统。前面实现练习操作的 Ubuntu 桌面操作系统就是一个基于 Linux 内核实现的 Linux 桌面操作系统。
Linux 系统有两种不同的含义:
- 一方面单指 Linus Torvalds 维护的开源代码 Unix 类操作系统的内核 Linux;
- 另一方面指的是以 Linux 内核为基础的整个操作系统,所以这种方式表示的 Linux 指的是包含内核、系统工具、完整的开发环境和应用的类 Unix 操作系统;
Linux 现在是个人计算机和工作站上的 Unix 类操作系统。按照层次结构的观点,在同一种硬件平台上,Linux 可以提供和 Unix 相同的服务,即相同的用户级和程序员级接口。Linux 绝不是简化版的 Unix,相反,Linux 是强有力和具有创新意义的 Unix 操作系统,不仅继承了 Unix 的特征,而且在许多方面超过了 Unix 。作为 Unix 类操作系统,Linux 操作系统具有如下基本特征:
- 是真正的多用户、多任务操作系统
- 符合 POSIX 标准的操作系统
- 提供具有内置安全措施的分层的文件系统
- 提供 shell 命令解释程序和编程语言
- 提供强大的管理功能,包括远程管理功能
- 具有内核的编程接口
- 具有图形用户接口
- 具有大量有用的实用程序和通信、联网工具
- 具有面向屏幕的编辑软件
Linux 的诞生
Linux 操作系统最初的产生应该要追溯到 1990 年的秋天。此时的 Linus 正在大学学习 Unix 课程,但是由于在学校上机需要长时间的排队等待,于是在 Linus “一气之下” 决定自己攒一台计算机,并在此之上运行 Unix 操作系统的书自行设计微型的 Unix 操作系统 MINIX。开始的时候。Linus 并没有想过要去开发操作系统,但是随着需求一步一步升级,Linus 觉的他所用的这款 MINIX 操作系统在很多情况下已经不能满足他的使用。于是,Linus 决定自己手动实现一个完整可用的操作系统 ———— Linux。
Linux 的版本查看
Linux 内核采用的是双树系统,一棵树是稳定树,主要用于发行;另一棵树是非稳定树或者开发树,用于产品开发、改进。Linux 版本序号的形式为 x.y.z ,对于稳定树来说,y 是偶数;而对于开发树拉说,y 是相比稳定树大1的奇数。
我们可以在 Linux 操作系统的终端窗口下通过命令来获取当前操作系统的版本号,具体如下:
uname -a
'Linux 2a4d4399a3db 4.18.0-21-generic #22~18.04.1-Ubuntu SMP Thu May 16 15:07:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux'
Linux 未来发展方向
Linux 内核本身的发展方向主要是硬件支持、嵌入式系统和分布式系统三方面。
随着硬件产品的升级换代,更新、更好的硬件迅速在 Linux 系统下工作是 Linux 普及和广泛应用的基础;
随着计算技术、通信技术为主体的信息技术的快速发展和 Internet 的广泛应用,嵌入式软件成为新热点。在这方面,Linux 的可裁剪及硬件设备支持能力使得它在嵌入式领域有着独特的优势;
分布式系统是当前操作系统发展的另一个重要领域。以 Linux 内核为基础,按照自由软件开发模式,发展高性能的自由分布操作系统是操作系统发展的必然趋势。
此外,Linux 上的桌面系统、应用软件,尤其是软件开发工具是 Linux 发展的重要方面。桌面操作系统直接关系到 Linux 界面的友好性和易用性。随着各行各业的广泛应用和大家共同开发推动,相信 Linux 操作系统未来会越发壮大和重要。