一、前言
在学习unix操作系统应用编程前,先来讨论一下什么是操作系统。本文将围绕此问题展开讨论,试图用最清晰简单的定义去解释何为操作系统。并介绍主流的几种操作系统以及unix操作系统的体系结构。
二、什么是操作系统?
先来说下结果:操作系统是用于管理硬件资源,控制应用程序运行的软件。
一说到操作系统,我们第一反应想到的可能是windows、mac os、android、ios,这几款是我们生活中直接或间接接触到最多的操作系统。但我们可能并没有想过,为什么需要操作系统?
要回答这个问题,先来对比一下身边能够接触到的电子设备,列了如下几种:
手机、电脑、扫地机器人、运动相机、蓝牙音箱、电风扇、电饭锅等等
上面列举的设备,哪些需要用到操作系统?(ps:本文说的操作系统不包括rtos)答案很明显:手机、电脑、扫地机器人。
仔细想一下上面列举的几种设备的区别,它们的功能复杂程度是不同的。如果要排个优先级的话,电风扇肯定是复杂程度最低的。只需要一个旋钮开关或几个按键开关就能够控制风扇的开关和风速的大小,完全不需要搭载操作系统,甚至都不需要使用到单片机。(高端点的风扇可能会用到。)
现在所能见到的电子设备,从工程师的角度上看,根据其复杂程度可以分为如下几种:
1.不带控制器(mcu/soc)的电子电路
2.带mcu的电路
3.带rtos的电路
4.带os以及soc的电路
随着功能的复杂化,我们希望电子设备能够在同一时间完成多个任务,比如说在手机上一边播放着音乐,一边看着小说。这就需要对处理器资源进行控制,协调好处理器处理这两个任务的时间(也就是我们常说的进程调度),以达到同时进行多个任务的功能,这其实就是操作系统的主要任务。
因此,能够搭载操作系统的都是SOC,mcu最多就是搭载rtos,因为soc的处理器资源更丰富,和优越的操作系统配合起来,就能够更快的响应应用程序。这也是为什么手机发布会上,处理器的性能以及操作系统的优化一直是厂商吹嘘的卖点。
三、主流的操作系统
我们从电脑以及移动设备的角度去看当前主流的操作系统。
电脑:windows、macos(unix系统家族的一员)、linux系统(Ubuntu、Debian、Cent OS、RHEL、Arch Linux、Gentoo等)、unix操作系统(主要用于服务器,没有用户界面)、DOS(磁盘操作系统,主要以命令集合的形式运行,通常作为后台程序出现)
移动设备:android(是基于Linux内核研发出来的“开放源代码”的操作系统,该系统主要应用于在移动设备终端上,比如手机、平板电脑、智能手表等。)、ios(是苹果公司开发的移动操作系统,最初是为iPhone设计的,后来扩展到了iPad和iPod Touch等设备上)、HarmonyOS(是华为公司开发的一款全新的面向全场景的分布式操作系统,创造一个超级虚拟终端互联的世界,将人、设备、场景有机地联系在一起,将消费者在全场景生活中接触的多种智能终端,实现极速发现、极速连接、硬件互助、资源共享,用合适的设备提供场景体验。)
四、unix操作系统的体系结构
linux是类unix系统,在设计上的很多理念都借鉴了unix系统,因此我们可以unix系统的学习来应用到linux操作系统中。
先来看下unix操作系统的体系结构,如下图所示:
(4-1)
操作系统最核心的部分是kernel,这部分包含了硬件驱动以及调度算法。在unix中,内核以及应用层是严格分开的,应用层想要访问内核,得通过系统调用接口,也就是图4-1的阴影部分。
公用函数库是构建在系统调用之上的,包括c标准函数库、posix函数库、soket编程函数库、数学函数库、字符串函数库、时间和日期函数库、其他专用函数库(如图形界面开发(Xlib、GTK+、Qt)、数据库访问(libpq、ODBC)、加密解密(OpenSSL)、图像处理(ImageMagick)、多媒体处理(FFmpeg)等)。应用程序可以通过系统调用、,也能通过公共函数库去访问内核。
图中的shell是一个特殊的应用程序,它为运行其他的应用程序提供了一个接口,这个在后续讨论。
严格来说,操作unix操作系统的组成包括:内核、系统调用、公共函数库、shell以及一些系统应用。
参考资料:
《UNIX环境高级编程(第3版) (史蒂文斯 (W.Richard Stevens) 拉戈 (Stephen A.Rago))
(Z-Library)》