【Linux】操作系统

目录

一、操作系统是什么

操作系统是一款进行软硬件资源管理的软件,当我们打开电脑,操作系统是第一个启动的软件。

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(例如函数库,shell程序等等)

二、设计操作系统的目的

操作系统将软硬件资源管理好(手段),给用户提供良好(稳定、高效、安全、易用)使用环境(目的)。


三、通过计算机层状结构理解操作系统

下面这张图片是计算机的层状结构图。

要想学好操作系统,就要了解计算机的层状结构,我将分为下三层 (操作系统、驱动程序、底层硬件)和上三层(用户、用户操作接口、system call)两个部分进行讲解


3.1 计算机层状结构下三层

3.1.1 底层硬件

上面冯诺依曼体系结构讲的是纯硬件结构,计算机层状结构中的硬件部分就是以冯诺依曼形式组织的。

3.1.2 驱动程序

在计算机层状结构中有一个部分叫做驱动程序,几乎所有的硬件都有自己配套的驱动程序,一般这里的硬件指的是外设,例如输入输出设备,但是CPU和内存一般不包括在内,因为驱动程序存在的意义就是为了操作系统更加方便的管理硬件,而操作系统可以直接访问CPU和内存,所以CPU和内存不需要对应的驱动程序。

那么如何证明驱动程序的存在呢?

相信大家都向电脑中插入过U盘,当我们刚插入U盘的时候,电脑中并没有显示U盘的相关信息,而过了几秒 钟就会显示驱动安装成功类似的弹窗,接下来就可以访问U盘了,在最开始的几秒钟里,操作系统在为针对的硬件做出反应,安装对应的驱动程序,操作系统一般都是电脑中自带的。

3.1.3 操作系统

操作系统将软硬件资源管理好(手段),给用户提供良好(稳定、高效、安全、易用)使用环境(目的)。

我们在操作系统是什么和设计操作系统的目的中都看到了管理这个词,操作系统是一款管理软硬件资源的软件,那么又要如何管理呢?

我将通过一个生活中的故事带领大家理解这个概念。

在生活中,我们一辈子都在做两件事,做决策和做执行。

什么是一个管理者,做决策的叫做管理者。

接下来用简化后的学校关系来为大家讲解管理这个词。

学校中有校长(管理者),学校中也有学生(被管理者),如果学校要给学生发奖学金,不可能是从学生中随便抽几个学生,这样难以服众,发奖学金一定是发个成绩好、品德好的学生,那么如何知道哪些同学成绩好呢?这一定需要一个角色来统计数据,也就是老师(执行者)做出统计,最终交给校长做决策选出成绩好、品德好的同学颁发奖学金。学生们就可以发现也许我们读了几年书,就没见过或是只见过几次校长,而校长却能把学生们管理的很好,校长是如何管理学生的呢?校长是通过学生的数据来管理学生的,而学生的数据则是通过老师收集来的。

通过这个故事我们可以得到一个很重要的结论:
管理的本质不是管人,而是管理数据!!!

在上面的故事中继续拓展,若一个学校中只有几个人,那么校长就可以轻松的获取并处理好数据了,那么如果一个学校中有成千上万的学生,那么这么多数据校长应该怎么管理呢?

首先校长可能会想到使用一个表格来管理学生的数据,需要学生的信息(例如姓名、性别、电话、身份证号、籍贯、成绩、身高等),让老师收集好这些信息再发给校长,那么校长就从管理数据转变为了对结构化的数据做管理,以前学生的信息太多了,校长认为不太好管理,现在将自己需要的信息收集起来,这就是对结构化的数据做管理。下面举两个例子体现出对结构化数据做管理的好处,(1)若是上面的人要求校长找到成绩最好的几个人颁发奖学金,那么校长就可以手动的查询找到这几个学生,通过这几个学生的信息分别找到这几个学生的老师,通知老师给他们颁发奖学金。(2)若上面的人要求校长找出学校中最高的5个人去参加篮球比赛,那么校长就可以从表格中手动的找到这几个学生。但是校长一天事情也非常的多,若是活动太多,校长每次都要手动的去查找,就会导致校长完全没有时间去干其他的事情。

然后校长去偷偷的学习了编程,想通过编程来实现自动化管理学生来,先定义了一个struct Person{//... 学生的属性},在struct中定义校长所需要的信息,再根据每个学生不同的情况去实例化各自的对象,那么实例完对象后,校长对学生的管理就变成了对这些对象进行管理,但是校长发现这些对象都是相互独立的,那么在这些对象中查找信息和上面的表格查找是没有什么太大区别的,然后校长就想到了在struct中添加struct Person* next这么一个指针,通过struct中的指针就可以将对象全部连接起来,再为struct Person{}这个结构体写一些配套的函数,例如 插入函数void insert(struct Person* pStu){// 向链表中添加一个学生节点}、删除函数 void erase(char* name){// 从链表中删除一个学生节点}、查找函数 struct Person* find(char* name){// 在链表中查找一个学生节点}等函数,校长就可以定义一个链表的头结点struct Person* head再通过上面的方法就可以将学生信息全部连接起来,那么校长对学生的管理就被转换成了对链表的增删查改。如果认为链表不好,就可以换成其他的数据结构对对象进行管理。

上面的故事就是对学生管理的应该建模过程。

到此为止就可以输出一个最终结论,在日常的任何管理工作都可以抽象为先描述再组织进行计算机建模。

先描述就是将被管理者以什么结构体的形式描述起来,通过先描述的过程,我们就可以将描述得到的结构体来代替被管理对象。

再组织就是将描述后的结构体以某种数据结构进行管理起来。

如何理解先描述呢?在我们生活中要描述一个西瓜是如何描述的?西瓜通常是圆形或椭圆形的,外皮通常为深绿色,里面的果肉是红色的,这些都是西瓜的属性。下面我描述一件物品,该物品通常呈半月形或元宝状,在春节期间等重要节日大家都会吃,大家就会想到我描述的是饺子。所以我们人是没办法充分认识这个世界的,而我们人是通过属性来认识世界上任何事物的,我们描述事物是描述这个事物的最重要的一些属性,所以重要属性的集合就代表着事物。人是通过上面这种方式认识世界的,计算机又是人发明的,所以基本上都遵循着先描述再组织这种规律。大部分语言,在随着时间的发展,都在执行一种特性就是面向对象,面向对象的本质就是将事物所以的属性放在一起描述事物,面向对象是一种更符合认识世界的方式。

相信大家都写过一些小程序,而在写小程序之前,我们都需要先写struct/class,例如小程序三子棋,首先要定义一个struct来表示坐标,再在定义一个二维数组,在二维数组中放的就是一个一个的坐标,那么这里就是先描述 坐标,使用二维数组再组织

再比如我们在学习C++中的封装继承多态时,就是研究的class/struct过程,也是研究先描述的过程,而后面学习的STL本质上就是数据结构,解决的就是再组织的过程。管理的本质就是先描述再组织,而C++的设计就是围绕着先描述再组织设计的,所以C++能解决生活中的问题。

通过上面的故事再来理解计算机层状结构中的下三层会更好理解,操作系统作为管理者要将软硬件资源管理好,软件还没学这里先指硬件,操作系统要管理硬件,但操作系统不能与硬件直接交互,而操作系统也并不需要与硬件直接交互,只需要将硬件的数据进行管理即可,底层硬件的各种数据则通过驱动程序来获取,操作系统就可以通过驱动程序获得底层硬件的数据,但这样获取的数据种类繁多,并不一定都是操作系统需要的,操作系统为了对硬件做出管理,就必须先描述再组织,将操作系统所需要信息进行描述,形成对应的结构体,每个硬件按照结构体实例化出对象,再通过数据结构对这些对象进行组织,最后操作系统对硬件的管理就转换为操作系统对各个硬件的结构体对象的数据结构的管理


3.2 计算机层状结构上三层

3.2.1 用户

用户:用户是指使用计算机硬件和软件的个人或组织。

3.2.2 用户操作接口

用户操作接口:用户操作接口是用户与计算机系统交互的环境和方式。

3.2.3 系统调用接口

系统调用接口:系统调用(System Call)是用户程序与操作系统之间的接口,是用户程序请求操作系统为其服务的唯一方式。

如果用户想要知道自己的计算机已经用了多少内存、还剩多少内存,直接向操作系统要数据要可以吗?如果用户想要访问文件,那么就直接访问操作系统可以吗?

答案是不可以,因为使用计算机的人鱼龙混杂,操作系统并不知道用户访问操作系统是干什么的,为了防止用户非法操作,如窃取信息、破坏数据等操作,操作系统选择不相信任何用户,到这里可能就会有人问了,操作系统是为用户提供服务的,操作系统不信任用户怎么为用户提供服务呢?操作系统在软件层提供了一个系统调用,其实就是操作系统提供的函数,用户想要访问操作系统底层的数据,就必须贯穿整个计算机层状结构,也就必须要通过系统调用。在现实生活中就存在不相信用户,却依然要给用户提供服务的一个机构,那就是银行。

可能就有人要问了,啥?系统调用?我好像没有见过啊?

其实大家都用过并且还经常使用,在大家使用C/C++写代码时,会使用printf/cout函数,这两个函数的作用就是将数据输出到显示屏上,显示屏是硬件,而我们却是使用软件调用的这两个函数,这代表着我们直接在用户层面上直接访问底层硬件,但是我们知道用户层面上没有直接访问底层硬件的能力,所以我们可以知道实际上是printf/cout函数里封装了系统调用。

有一个问题就是,系统调用是操作系统提供的接口,对于一般人而言,使用起来太麻烦了,但是我又必须要使用,所以就有了外壳程序(Linux中的Shell,Windows中的图形化界面),当你在使用Linux时输入了ls指令,外壳程序将ls转换为对应的系统调用,为你显示当前目录下的文件名,当你使用Windows双击某个文件或软件时,外壳程序会将双击转换为对应的系统调用,为你打开这个文件或运行这个软件。那么对于开发人员而言,一部分人会使用系统调用,但也有一部分人不会使用,但单从开发的角度来说是不需要了解操作系统的,若每个人都要实现相同的基础功能,那么就会拉低开发效率,为了让人们更好的使用,可以将系统调用封装成各种各样好用的函数,打包形成库,那么对于开发者而言,要使用某些基础的功能时,不需要自己去写,直接调用库函数即可。


3.3 总结

3.3.1 如何理解"管理"

非常重要!!:先描述再组织

  1. 描述起来,用struct结构体
  2. 组织起来,用链表或其他高效的数据结构

3.2.2 系统调用和库函数

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

四、操作系统源代码

操作系统的源代码非常复杂,早一点的版本代码相对来说比较少,如果大家想下载下来学的的话,可以点击下面链接下载。

linux-0.11


如果大家想下载后面版本操作系统的源代码,可以在LInux内核官网进行下载。


选择自己想要下载的版本,一般建议大家下载.tar.gz的操作系统源代码学习。


结尾

如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。

希望大家以后也能和我一起进步!!🌹🌹

如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹

相关推荐
TeYiToKu2 分钟前
笔记整理—linux驱动开发部分(12)I2C总线与触摸屏设备
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件
南猿北者4 分钟前
docker compose
运维·docker·容器
jokerest12344 分钟前
web——upload-labs——第二关
运维·服务器
yyycqupt1 小时前
多路转接之poll
服务器·c++·后端·网络协议
坚持学习的你1 小时前
Ubuntu24.04 network:0 unclaimed wireless adapter no found
linux·ubuntu
NMBG221 小时前
[JAVAEE] 网络编程
java·服务器·网络·tcp/ip·udp·java-ee
东软吴彦祖1 小时前
将已有的MySQL8.0单机架构变成主从复制架构
服务器·mysql·架构
2401_881278081 小时前
搭建 PostgreSQL 主从架构
运维
 嘘 1 小时前
Centos使用Mysql
linux·mysql·centos
 嘘 2 小时前
Centos使用人大金仓ksql
linux·运维·centos·人大金仓