操作系统(Operator System)

发布时间:2026/7/26 22:52:50
操作系统(Operator System) 操作系统Operating System概念一个基本的程序集合称为操作系统OS操作系统是一款用于管理软硬件的软件其本身也是一款软件。操作系统包括内核进程管理内存管理文件操作驱动管理其他程序例如函数库、shell程序等等狭义上的操作系统指的是操作系统的核心即内核。但是Linux的内核直接交给用户是无法使用的。为了能在Linux系统上进行开发需要提供函数库、shell程序、图形界面等。因此从广义上来说操作系统包括内核以及安装在其上的外壳程序shell、glibc、原生库和预装系统级软件。扩展安卓的底层使用的是Linux内核。那么安卓用了Linux内核的什么呢手机可以看作小型计算机具备内存、CPU、存储、显示和输入输出设备因此手机实际上也是一个小型的冯·诺伊曼体系结构计算机。手机上的内存、文件、软硬件、任务和APP都需要由操作系统管理。操作系统正是负责此类管理工作因此会将操作系统内核移植到手机上。手机的输入输出设备是整合在一起的屏幕同时作为输入和输出设备。Windows有Windows的界面Linux有Linux的界面手机也需要自己的界面。因此基于Linux内核通过改变其外壳设计一个专门的外壳程序这个外壳程序就称为安卓。安卓会提供基本的图形界面以及自己的库供开发者调用以创建不同APP在安卓系统下的界面从而形成了基于安卓的开发Linux操作系统提供了glibc这一C语言标准库我们可以基于glibc在Linux上开发同理也可以在安卓上开发。有人说安卓的底层是Linux意思是安卓系统在最核心的部分使用了Linux内核。Windows系统也是类似的道理。设计OS的目的计算机结构如上图所示。底层硬件在逻辑上是按照冯·诺伊曼体系结构组织的每个硬件设备都需要有对应的驱动程序例如网卡有网卡驱动硬盘有硬盘驱动等。在硬件层面每种硬件的访问模式各不相同比如读取键盘数据、读取鼠标数据、读取网卡数据、读取磁盘数据访问不同设备需要个性化的读取方式。因此访问不同硬件需要调用不同的驱动程序这是一个基本事实。案例电脑刚开机时没有连接鼠标之后我们物理上连接鼠标插上后动几下发现鼠标不动大概等上一两秒电脑右下角弹出一个小窗口提示“某某驱动安装成功”这时鼠标就可以使用了。换言之硬件必须在驱动程序安装成功后才能被访问。在驱动程序之上是操作系统。OS存在的意义是什么1对下OS与硬件交互需要向下进行软硬件资源的管理我们要打游戏结果操作系统告诉它管不住显示器显示器一下黑一下白的管不了所以操作系统必须保证每种硬件硬件是健康的需要把硬件的工作模式体现到用户层面上我们对一个设备进行更改操作系统都需要把这些设备统一管理起来但是操作系统把硬件管理起来并不是目的而是手段2对上OS为用户程序应用程序提供一个良好的执行环境我们打游戏不可能是10分钟一黑屏半小时一重启用户是无法接受的所以操作系统能不能把底层的硬件管理好不要让它们老是出错要给上层提供一个良好的工作环境所以操作系统存在的目的是给用户提供服务的OS是需要对底层的硬件包括未来的软件进行管理以此为手段为上层用户提供一个良好的稳定的环境1、软硬件体系层状结构—从硬件到用户高内聚、底耦合高内聚相同功能、相同逻辑的代码数据放在同一层的内部比如操作系统内都是操作系统的数据驱动程序内就是驱动程序自己的代码数据硬件就是纯硬件底耦合层跟层之间本身只使用一些接口的方式进行互相调用在数据的逻辑层面上没有强耦合这样我们之后修改计算机体系结构中的一个只需要在对应层级里修改不会影响到其他的层级我们改操作系统驱动和硬件都不需要修改我们修改硬件操作系统和驱动程序也不要修改这样做的目的是为了之后代码的可维护性就和我们写C语言代码我们最开始写代码都是把代码全部塞到main函数我们此时的代码难以维护没有高内聚、底耦合但我们学习了函数我们把main的各个方法封装到函数里用函数调用此时main函数是顶层是调用层而函数方法为方法层此时的代码就是可维护的有问题就到对应的函数找问题我们的C的面向对象三大特性封装继承多态的继承多态,这里的继承的基类子类这样的继承关系不久是这样的层状结构吗基类一层子类一层这样的层状结构是软件很常见的结构硬件设备是可替换掉我们的硬件设备可以是不同厂商提供的这恰恰说明了我们硬件的设计本身就满足了高内聚、底耦合的特性什么硬件坏了换什么硬件即整个计算机世界就是高内聚、低耦合的2、访问操作系统必须使用系统调用 – 其实就是函数只不过是系统提供的操作系统不允许用户直接访问内存进程文件和驱动操作系统要求必须使用它自己提供的C语言封装的接口来访问底层这个接口叫做系统调用理解操作系统才可以更好的使用系统调用3、我们的程序只要你判断它访问了硬件那么它必须贯穿整个软硬件体系结构我们向显示器上打印数据本质是把数据写到了硬件显示器不可能是我们写的C语言程序直接将数据写到硬件上计算机体系是层状的我做开发用到C标准库的方法最终确实达到了把数据写到硬件的结果但我们是不可能直接绕过操作系统直接访问硬件的不可能所以这个printf库函数的底层会被封装到系统调用然后通过操作系统对驱动进行访问访问对应的驱动然后才能把数据交到硬件上所以我们之前学习的很多操作如scanfprintf 这些IO操作有关的全都必须贯穿操作系统4、库可能在底层封装好了系统调用我们讲到数据访问硬件要通过系统调用等一系列贯穿操作系统的流程才可能但是我们以前学习从来没有看到过系统调用呀就printf来说我们平时都是直接使用printf这样的函数接口但是我们并没有去了解其底层其实printf底层是封装了一系列访问系统调用的接口以及系统访问IO的接口我们平时使用系统调用太麻烦了所以有人帮我们封装了这个操作形成了一个库我们之前所使用过的C语言标准库stdio.h 、iostream、STL模板库都是C标准提供的库本身给系统调用做了封装,所以用户在上层做硬件访问时只需要使用上层的代码就可以所以我们用户平时的开发场景是在用户层中进行的所以在用户层指令操作、开发操作、管理操作的任务都会通过应用程序转化为系统调用接口访问操作系统核心功能理解操作系统OS学习事务的三要素是什么、为什么、怎么做。我们首先会到“是什么”阶段好好理解操作系统。操作系统在整个软硬件层次中处于一个承上启下的位置。在整个计算机软硬件架构中操作系统的定位是一款纯粹的“管理”软件。如何理解“管理”管理的例子学生、辅导员、校长学生是被管理者、校长是管理者其实人在日常生活中做的事情无非就两件一个是决策二是执行我们个人平时是决策和执行一起的而在一个管理体系中管理者最大的能力是有决策权而真正的执行者往往是体系的中间层辅导员没有决策权只能执行将这个关系映射到软硬件体系的下三层中操作系统、驱动程序、底层硬件而操作系统相当于校长底层硬件相当于学生驱动程序相当于辅导员所以是如何管理的呢1要管理管理者和被管理者可以不需要见面2管理者和被管理者怎么管理呢根据“数据”进行管理管理者所需要的是被管理者的数据即使管理者去见被管理者其目的也不是见面而是获取被管理者的数据上课考勤情况学分绩点如何管理者是通过被管理者的数据进行一系列的决策即管理者和被管理者见面接触并不是管理的必要条件见面的本质是获取你身上的相关数据根据你的“数据”进行管理所以我们这个世界上的管理本质是通过数据进行管理的3不需要见面如何得到数据由中间层辅导员经理获取综上操作系统管理硬件并不需要与硬件打交道操作系统管理硬件是通过数据进行管理的而要管理数据是从驱动程序获取硬件数据系统刚开启的第一个决策是让驱动程序去获取底层硬件的数据管理者对数据也是要有限制有要求的不能随意的获取吧要有目的性校长1.0校长在一个excel表格中写了一系列的要求姓名、班级、年龄…让辅导员去找同学们收集这些信息完成要求最后校长拿到完整数据的表格为了方便管理在搞城云管理辅导员一在表格中修改数据校长就可以立马知道了所以校长的管理工作从管理学生到管理学生的数据校长每天都过一遍数据并下达一系列的决策XXX数学成绩好让辅导员去推荐他去参加数学竞赛并给他一系列备赛资料XXX挂科过多让辅导员去通知他被退学了并对管理的数据进行修改被退学的人的信息被删除掉之后有新同学入学也需要录入这些同学的信息综上我们可以知道校长管理学生转化成了对excel表格的数据的管理但是有个问题校长每天都要过一遍这个数据如果这个数据太大了校长每天看数据都会累的够呛根本管理不过来但是校长在管理数据的时候要么是找学习成绩最好的要么是找成绩最差的要么是找某个特定职位的校长管理数据的本质还是增删查改,但随着人数的增多增删查改对于校长负担越来越大了所以来讲讲校长2.0 — 前身为顶级程序员校长2.0 — 程序员校长2.0在想我们能不能不用excel表格来管理学生数据呢可以让计算机来管理数据吗我们可以发现excel表格中一行的信息是这个学生的相关属性不同行的同学的属性完全一样只是数值不一样想通过代码来处理学生的管理工作这首先要把一个学生管理起来在一个软件上如何将学生不同的属性集合到一起在数据上用这个集合代表同学C语言中使用数据类型结构体,在结构体中定义姓名、性别、年龄、籍贯…structstu{//姓名//年龄//性别//籍贯//.....}在excel表格中每行数据都是一个学生的对于属性值而我们上面的结构体的定义不就相当于excel表格表头的那一行属性吗要记录任何一个同学的信息通过结构体定义的类型定义变量struct stu ZhangSan {...}学生姓名以此类推下去这代表这我们学校有10W个人我们就可以用这样的结构体来定义10W个变量来代表这些同学这里每个变量保存的就是对应学生的基本信息了这里每个学生保存的基本信息也对应excel的一行在excel表格中有10W行数据而在C语言中有10W个变量对于校长来说管理学生用结构体来管但是现在的学生变量是一个一个独立的校长要找数学成绩最好的不可能对10W个变量一个一个穷举访问里面的数学成绩太麻烦了校长这个时候就在想能不能直接在学生结构体中再加一个学生结构体指针。设置一个学生结构体指针作为进入数据的接口第一个同学入学就为他开辟一个结构体变量这个指针就指向它随后又有同学入学又开辟了一个结构体变量让他们输入数据但是这两个变量之间是独立要如何将他们联系起来使用第一个节点的结构体指针指向下一个节点以此达到连接以此类推形成了一个学生链表以前的excel表格相当于顺序表但是操作都是人为操作的而我们有了链表事情就有了变化我们校长日常的决策找最高的人、成绩最好的人就转化为计算机中链表的遍历,校长日常的决策中找C语言成绩最好的同学去参加比赛在C语言中就是根据学生C语言成绩属性来遍历学生链表以此找到成绩最好的人其他决策同理我们可以发现日常的校长管理学生的工作现实人做的事情 - 对链表的增删查改计算机完成这里不一定是链表也可以是其他数据结构综上校长对学校的管理就转化成了我们不需要再对excel进行管理可以让系统管理学生即链表结构来实现增删查改所以现在有了新学生直接开辟节点输入数据再接入链表即可校长管理转化为链表的操作实际是做了校长日常管理建模的过程这个建模的过程高度精简就是“先描述 再组织”这里校长管理学生先描述起来把同学管理对象的所有属性封装到结构体中然后未来有学生管理对象出现就用该结构体来定义变量申请节点定义张三、李四的结构体变量最后在把节点组织起来使用恰当的数据结构来粗存节点所有先描述再组织可以完成对现实世界任何的管理情景进行建模回到计算机软硬件体系结构中操作系统是如何管理下层设备的呢底层硬件有名字有状态等属性操作系统是管理者那么操作系统可以在内部先描述再组织将各种硬件的一系列属性通过结构体struct device 的方式封装到一起定义一个类类内包含硬件的各种属性操作系统会在内部构建各种硬件的结构体对象将这些对象都管理起来即操作系统对硬件的管理转化为对硬件数据的增删查改进程的管理也是同理先描述再组织在操作系统内部构建进程结构体封装其属性在实现一系列要管理的对象将对象用恰当的数据结构储存起来转变为在数据结构内的数据的增删查改先描述再组织思想非常重要这也是C提供类和STL的原因也不仅仅是C,其他编程语言也提供类的概念和集成类的概念这是因为类是解决先描述的问题STL是容器容器即是数据结构是解决再组织的问题。这也是面向对象为主流的原因这也是这个世界的的特点是先描述再组织的世界这也是为什么要学习数据结构是对现实生活中所有管理的模型全都转化为结构化数据翻译成数据结构才能让计算机看懂描述被管理对象组织被管理对象13集20分钟以前谈了操作系统相关问题理解系统调用 和 库函数用户操作接口操作系统要向上提供对应的服务什么是服务我们在printf的时候本质是把printf字符串写到屏幕这个硬件上而scanf读入的时候是把键盘硬件的数据读入到软件程序当中这样的过程必然要有操作系统的参与操作系统需要为我们提供访问硬件的能力这个提供的能力就是为我们提供的服务操作系统不相信任何用户或者人感觉有点矛盾操作系统既要服务我们又不相信我们我们用一个例子来方便理解银行银行要为用户提供服务银行要为用户办理一系列的业务存款、贷款、理财等。银行是不相信任何用户或者人的银行是不可能允许我们去访问他们的金库的银行要保护客户的财产安全。银行为了防止非授权者访问金库又要为用户提供服务银行会在最外层设置业务窗口我们在银行窗口办理业务通过窗口把身份证、户口本递进去银行工作人员确认身份信息后再从银行金库中把你存的钱按你的要求取出来完成业务。所以操作系统要为用户提供服务又不相信用户操作系统要把自己也变成银行操作系统把自己封装起来不让用户访问操作系统任何的细节但也要为用户提供一个办理业务的窗口——系统调用系统调用本质上是操作系统给我们提供的函数调用比如 **fork、waitpid 、socket**这些系统调用所有用户访问操作系统获取操作系统内部的数据设置自己的信息全部都是通过函数调用实现的。Linux/Windows/macos --操作系统基本上是用C语言写的 -- 系统调用一般也是C语言函数函数有输入参数和返回值输入参数是用户给操作系统的而返回值是操作系统返回给用户的所有系统调用本质是操作系统和用户之间进行某种**数据交互**这样的交互只是通过数据耦合度也低了那我们为什么没有见过系统调用呢在银行的工作中用户通过业务窗口向银行申请业务但是大家也是知道的银行业务办理起来相对麻烦如果有有些老年人来办理业务怎么办假设我是一个90岁的老大爷看不清也不认识字想把2K存到银行中这时候怎么办呢一般好些的银行会有大堂经理在窗口外侧为协助用户办理业务有了大堂经理这位大爷办理业务就方便多了。同理让计算机小白直接访问系统调用的接口成本很高需要学会很多知识才能理解其中的意义所有这里操作系统会给开发者提供一些库、给操作者提供外壳、指令这些东西的底层无一例外都是直接或者间接的访问系统调用但是这些是别人做好了只要我们灵活使用这些工具也能访问系统调用即我们当前就是什么例子的大爷这些库、外壳、指令相当于大堂经理我们没有遇到、没感觉到系统调用是因为为操作系统封装的一批人帮我们为软件进行封装了使用用户是基于别人的设置、封装进行开发的在开发角度操作系统对外会表现为一个整体但是会暴露自己的部分接口供上层开发使用这部分由操作系统提供的接口叫做系统调用。系统调用在使用上功能比较基础对用户的要求相对也比较高所以有心的开发者可以对部分系统调用进行适度封装从而形成库有了库就很有利于更上层用户或者开发者进行二次开发。使用库函数和系统调用的上下层的关系所以对库文件库文件的函有没有在底层调用系统调用是可以直接到这个函数最终有没有调用硬件输入输出调用网络等