动手学树莓派第3章:操作系统为何物?为什么要花这么大精力来使用他?

百度百科定义

操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。

帮我们管理好计算机硬件,我们可以通过操作系统友好的使用计算机。

操作系统分类

操作系统体系结构划分:
(1)简单体系结构。例如ucos系列、FreeRTOS、SylixOS、VxWorks(基本级)。特点:用户层与内核层在一个地址空间中。不使用或有限使用虚拟内存。
(2)单体内核(宏内核)。例如,Linux、Unix、Windows、MacOS。特点:操作系统的进程管理、内存管理、设备驱动、文件系统、网络协议栈等都在一个地址空间中,内核十分巨大。
(3)微内核。例如:QNX。特点:内核只保留进程进程管理、内存管理等内核组成模块,将设备驱动、文件系统、网络协议栈编程进程的方式运行,就是一个字:小。

微内核VS宏内核:
(1)系统可靠性:微内核只保留了最基本的内核组成模块,一旦像设备驱动、文件系统异常,不会影响内核运行;而宏内核中,例如你编写了驱动有bug,那整个系统基本都能挂掉了。微内核胜出。
(2)系统性能:宏内核中所有内核组成模块在一个地址空间,模块与模块间通信不涉及内存地址空间的切换,所以速度快;但微内核以像消息队列的方式,完成内核和网络协议栈、设备驱动等模块的通信,这其中涉及内存地址空间的切换,必然形象速度。宏内核胜出。

其实,微内核和宏内核都各有优势,在一个具体的操作系统设计时,会吸取各自的长处;例如,linux是宏内核,但其借鉴了微内核的设计思路,将内核模块引入操作系统中,可以在系统运行过程中,加载或卸载设备驱动等内核组成部分。

按实时性划分:
(1)实时系统。
<1>强实时系统。在指定时间内,一定完成该项任务。例如:VxWorks、SylixOS、QNX等。
<2>弱(软)实时系统。在指定时间内,尽量完成该任务。例如:增加实时性的linux系统。

(2)非实时系统。例如,windows。
影响实时性的几个因素:
(1)中断设计。一般芯片或者操作系统不会配置为中断可嵌套模式,所以CPU进入中断后,除非执行完毕中断处理程序才能执行其他任务。这是一个很重要的指标,我之前你看过linux的部分网络设备驱动程序,有的在中断中记录事件,利用系统提供的网络软中断模式(此时,已经退出中断模式,cpu可以继续响应中断了)进行数据的处理,但有的驱动在中断里进行数据处理,如果cpu正在中断中处理网络数据,但此时来了一紧急中断,那只能等了。
(2)内存管理。有了虚拟内存后,应用层进入内核,内核会应用层,必然消耗大量时间,影响指定时间内完成任务重要因素。
但是,不是你使用了强实时系统,你的设备就能保证强实时的要求,例如你写一个驱动,在中断中完成任务,那因为你的驱动而响应整个系统的实时性。
这么多种操作系统,我们该如何选择呢?

(1)实时性要求极高的系统。可以使用商业的VxWorks和SylixOS,商业的是要收费的,而且VxWorks是美国红河公司的,技术支持的难度可想而知;国产自主可控的SylixOS是一个很好的选择,只是起步晚,成功的案例正在逐步积累,被领域内所认可需要时间。对于非商业的,可以使用FreeRTOS,开源免费的,目前是商业免费的。
(2)任务要求多、功能复杂等的只能选择像linux这样的系统了。基本可以认为,计算机能完成什么样的功能,使用linux的嵌入式系统也能完成;当然要求你的芯片对性能是否有影响。

Linux内核组成部分

linux内核由7部分组成:系统调用接口、进程管理、内存管理、虚拟文件系统、网络协议栈、处理器体系相关部分、设备驱动。

(1)系统调用接口(SCI)。
内核为应用层提供的使用内核的接口,应用层可以通过系统调用接口,向内核申请服务。
SCI与API有何区别。SCI为系统调用接口,API为应用程序调用接口;应用程序使用API完成既定任务,一个API可以调用一个SCI函数、可以调用多个SCI函数、也可以不调用SCI函数(例如,数据计算库中的数值计算API接口)。

(2)进程管理。
进程是操作系统资源分配的基本单元,进程管理负责对进程的CPU使用、内存使用、IO使用的管理工作。

进程与线程。线程是操作系统调度的最小单位,线程建立在进程之内,一个进程包含至少1个线程;1个线程就是1任务执行过程,例如,线程1让led1灯以5Hz频率闪烁、线程2让led2灯以9Hz频率闪烁,就可以建立2个线程,线程1睡眠100ms点亮led1、睡眠100ms熄灭led1,线程2睡眠125ms点亮led2、睡眠125ms熄灭led2。进程为其上运行的线程同系统资源,例如内存、IO等。

多进程与多线程程序设计模式。通常来说,程序设计为多线程模式,可以提高系统的性能,在同一进程里的多个线程,使用想用的进程地址空间,同一进程上的线程切换不会更换页表(每个进程有自己独立的页表、彼此相同,页表切换会消耗大量时间)。多进程间切换虽然消化大量时间,但程序的可靠性好,在多线程模式中,一个线程异常,操作系统会改掉该线程所处的进程,同处该进程的其他线程也都停止服务了;但多进程模式,单个进程的异常被干掉了,其他进程可以继续提供服务。

进程和程序。进程是运行中的程序,是程序被执行时的状态。一个进程可以执行多个程序,一个程序可以被同时执行多次。

(3)内存管理。
内存是整个计算机系统中的核心,内存管理不好产生内存泄漏,系统会出各种意想不到的bug。

内部碎片和外部碎片。内部碎片就是你要申请100字节内存,系统给你分配了120字节内存,这20字节就成内部碎片了,不能被使用;外部碎片就是当前130字节空闲区域,这130字节之后是200字节已经被占用的内存,你申请100字节内存,系统将130字节内存中100字节给你了,你在申请100字节内存,上次剩下的30字节就不能用了,就是外部碎片,只能向后继续寻找看看有没有100字节空间给你。

如果系统运行了一段时间后,遍布这种小的外部碎片,例如有100个30字节的外部碎片,但你想申请100字节空间,但从剩余容量100*30=3000字节总容量是够得,但系统无法分配到连续的100字节空间给你,内存申请失败,这就叫内存泄漏。

linux使用的是伙伴系统(大块内存分配)和slab(小块内存分配)技术来降低内存内部碎片、避免内存外部碎片。

(4)虚拟文件系统。
虚拟文件系统使得“一切皆文件”的哲学思想在linux上成为了现实(推荐阅读《Linux/Unix设计思想》,人民邮电出版社出版。其中,给出“小既是美”、“三个系统”、“沉默是金”等Linux/Unix设计哲学思想)。 
虚拟文件系统,为用户提供统一的系统调用接口,例如:open、read、write等,用户在应用层不需关注是什么类型的设备,采用统一的处理函数,每种设备的差异隐藏在虚拟文件系统之下。

(5)网络协议栈。
linux之所以强大,其健壮的网络协议栈出了很大力。从服务器开始、向下经过各级路由器、到我们的中断手机(安卓手机)上,无不运行着linux的网络协议栈。本人有幸从socket层开始、向下经过传输层、网络层直达网络接口层,认真阅读了以太网驱动、无线网驱动,后面将尽我所能带大家来一场linux的网络协议栈之旅。

(6)处理器体系相关部分。
顾名思义,就是与cpu体系相关的,每种体系的处理器包含在一个目录下,例如包含x86体系的、ARM体系的、MIPS体系的等,此核心源代码所支持的硬件体系结构相关的核心代码。

(7)设备驱动。
设备驱动的开发,是现在国内linux开发者主要做的工作,就是对自行定制的硬件编写linux驱动程序、添加到linux系统中,让用户可以使用该设备。

世间设备千奇百怪,但linux内核的设计着花了大量精力对设备进行抽象,将设备分为字符设备、块设备和网络设备;同时,为linux驱动开发工程师提供了platform虚拟总线的框架,将设备描述和设备驱动程序进行分离,更加利于驱动程序的移植性。

Linux内核预览

下面这样“linux kernel map”图片够震撼吧,但liunx远比这张图更震撼。不要被这样图吓到,我会尽我所能,逐步向上攀登,等我们浏览完内核的核心景区后,回头再看看这张图片,你会感觉“内核在此,而不至于此”。

课程 bilibili 视频地址:https://www.bilibili.com/video/av71878718/?p=7

返回课程目录

课程 gitee 地址:https://gitee.com/shirf_taste_raspi/shirf_serial_share