目录
什么是操作系统?
操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,它是用户与计算机硬件之间的接口。
操作系统的主要功能包括:
进程管理:操作系统负责创建和终止进程,同时管理进程之间的通信和同步。
内存管理:它分配内存给应用程序,并确保这些应用程序之间不会相互干扰,同时也回收不再使用的内存空间。
文件系统管理:提供文件创建、删除、读写等功能,以及组织和维护文件系统的结构。
设备管理:管理和控制各种外部设备,比如打印机、扫描仪等,使它们能够与计算机交互。
安全保护:确保系统的安全性和数据的完整性,防止未授权访问和恶意攻击。
用户界面:提供图形用户界面(GUI)或命令行界面(CLI),让用户可以方便地与计算机进行交互。
计算机的层状结构
为什么要有操作系统
操作系统到底层硬件
驱动程序
驱动程序(Driver)是一种特殊的计算机程序,它充当操作系统与硬件设备之间的桥梁,使得操作系统能够识别和控制各种硬件设备。每个硬件设备,无论是内置的(如硬盘、显卡)还是外接的(如打印机、鼠标),通常都需要相应的驱动程序才能正常工作。驱动程序提供访问硬件的接口,操作系统调用相关的接口来访问硬件。
操作系统如何管理硬件?
从生活中的例子来理解,以学校管理学生为例,每个学生都有自己的姓名、性别、学号、专业等,每个学生的姓名都是不一样的,但是每个学生都有姓名,姓名属于学生的一个属性,学校需要知道学生的相关信息,比如姓名、性别、学号、专业、绩点等,才可以决定哪些学生可以评奖学金、推优,哪些学生会被开除学籍。
在管理硬件上也是同理,操作系统需要知道硬件的设备名、状态(是开机还是关机)、优先级等,才能对硬件进行管理。
也就是说,我们需要知道硬件的相关属性,先描述这些属性,定义相关的变量来记录这些属性,才可以对硬件进行管理,即 先描述再组织!
可以用 struct 将多个相关联的数据项组织在一个单元中,便于管理和操作。
定义出结构体之后,这个结构体就可以看作链表的一个结点。
- 假设现在是开学季,需要对新生的数据进行管理,其实可以看作往链表中新增结点;
- 如果需要开除学生,其实可以看作把该学生对应的结点从链表中删除;
- 如果有学生转专业了,修改该学生的专业,也可以看作修改链表的结点中的变量;
- 如果期末周结束了,辅导员需要查学生的绩点,可以看作查找该结点的内容。
从上面的例子可以看出,对学生的管理,变成了链表的增删查改!
操作系统对硬件的管理也是相同的道理,对硬件的管理,变成对链表的增删查改!
操作系统除了管理硬件外,还需要管理驱动程序,而对驱动程序的管理和对硬件的管理是同理的,先描述再组织,定义出 struct 结构体后,变为对链表的增删查改!
操作系统到用户
系统调用接口
以银行为例,用户去银行办理业务时,并不是自己进入到银行的后台系统,随意操作后台系统,随意篡改数据,随便修改银行卡的余额,而是通过前台窗口,与工作人员沟通,办理完业务的,银行不直接对外暴露内部的信息,而是提供窗口,相对安全地向外界提供服务。
计算机也是同理,用户并不是直接进入操作系统,去访问硬件的数据,而是通过系统调用接口,用户调用系统调用,来访问数据,以保证访问数据的过程是安全的,且数据不会被随意篡改。
系统调用(System Call)是操作系统提供给应用程序的一组接口,用于请求操作系统内核执行特定的任务。通过系统调用,应用程序可以访问操作系统提供的底层资源和服务,如文件操作、网络通信、进程管理等。系统调用是用户态程序与内核态操作系统的桥梁,确保了应用程序能够安全、高效地使用系统资源。
库函数
在上面银行的例子中,如果用户是一个什么都不懂的老年人,而且有听力障碍,这位老年人来办理业务时,一般的窗口没办法很好地为这种群体提供服务,那么银行就需要面向这种群体开辟新的窗口,提高银行的服务能力。
其实用户在某种程度上和老年人一样,并不认识系统调用接口,我们对系统调用接口一无所知,用起来就会比较难受,不方便,所以需要对系统调用进行封装,库级别的封装,方便用户使用,降低使用成本,所以用户就不用直接使用系统调用了,直接使用库函数提供的函数即可,因为库函数更容易使用。
库函数(Library Function)是一组预编写的代码模块,它们被组织成库,供开发者在编写应用程序时调用。库函数提供了各种常用功能,帮助开发者简化编程任务,提高开发效率。
许多库函数是跨平台的,可以在不同的操作系统和硬件上运行,这为开发多平台应用提供了便利,使代码具有可移植性。世界上不止 Linux 操作系统,还有安卓、iOS等,这些操作系统提供的系统调用是不一样的,如果程序员要去记住每个操作系统的函数,是不太现实的,提供了库函数,就可以让同一份代码在不同的操作系统中运行起来。
比如我们要打印一个数据,在 Linux 和 Unix 类操作系统 中,通常使用
write
系统调用来向标准输出(通常是终端)写入数据,在 Windows 操作系统 中,通常使用WriteFile
或WriteConsole
函数来完成类似的功能,虽然各个操作系统的底层系统调用接口有所区别,但是高级语言(如C语言)提供了一套标准化的库函数(如printf
),这些库函数内部会根据所处的操作系统环境调用相应的底层系统调用来完成任务。这样做的好处是让程序员可以编写跨平台的应用程序,而不必关心底层实现的细节。
系统调用接口是由操作系统提供的,而库函数是由用户提供的,库函数封装了系统调用。
回到问题
操作系统需要对下管理好软硬件资源,对上提供一个良好(稳定、安全、高效)的运行环境,用户不能绕过操作系统直接去访问硬件,不能越级访问,必须贯穿操作系统!!