【Linux系统编程】操作系统的概念、定位 及系统调用

news2024/11/24 22:29:14

文章目录

  • 前言
  • 1. 操作系统的概念和定位
  • 2. 如何理解“管理”
  • 3. 操作系统为什么要做管理
  • 4. 系统调用和库函数概念
  • 5. 局部性原理
  • 6. 计算机体系结构

前言

上一篇文章我们学习了冯诺依曼体系结构(属于计算机硬件的范畴),其中我们提到,因为有了内存的存在,我们可以把数据预加载到内存中,然后供CPU进行获取处理。
那我问大家一个问题,就是我们的数据可能非常多,那预加载的时候要先预加载那一部分数据呢?如果内存不够了怎么办?CPU在处理数据的时候如何快速找到内存里面预加载的数据?CPU处理任务的时候是一个任务执行完在执行下一个,还是同时执行多个?还有如果我们把输出的数据写到文件中,那我们如何去快速找到它呢?目录结构是谁来给我们维护的呢?
这些工作是由硬件完成的吗?
硬件呢就可以认为好比是医院里面的各种医疗设备和仪器,那医院里面只需要这些设备就可以了吗?
当然是不行的,还需要由医生等各种工作人员,比如不同科室需要有不同的医生帮助不同症状的病人看病。
那同样的,在计算机里面,光有那些硬件也是不行的,什么情况下把什么数据预加载到什么位置,内存空间不够了怎么办,输出结果要保存到文件,应该放到什么位置…等等这些问题都不是你硬件能解决的。
所以就需要另一种软件——操作系统。

在这里插入图片描述
那下面我们就来谈一谈操作系统

1. 操作系统的概念和定位

首先要知道:

操作系统是一种软件,这个我们之前也提到过。
那软件的话通过上一篇文章的学习我们知道软件想要运行的话就要先加载到内存里,那其实我们计算机开机的时候就是在加载操作系统。
那操作系统是一款什么样的软件呢?
这个我们之前也提过,操作系统是一款进行软硬件管理的软件!

概念:

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)

设计OS的目的:

与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境

定位:

在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件

那既然操作系统是搞管理的,那第一个问题,我们该如何理解这里的”管理“

2. 如何理解“管理”

我们先来讨论一下操作系统对硬件的管理

那要谈管理呢,就一定要谈这两种角色,即管理者和被管理者
举个栗子:

比如在学校里,我们学生就是被管理者。那下面为了方便大家理解,我们把学校的场景简化一下,假设只有下面这三种角色:校长、辅导员和学生
那大家想一下在这三种角色中谁是真正的管理者?
首先大家要明白我们做的事情无非就两种——决策和执行决策。
比如我们作为一个学生我今天醒来决定要不要去上课,下课只后我决定要不要打把游戏放松一下,如果决定了就去执行。
那学生的话其实对自己的生活即是决策者又是执行者。
而对于真正的管理者来说的话,其实它主要做的是决策。
所以,大家现在应该知道在校长、辅导员和学生这三种角色中谁是管理者了。
🆗,应该是校长。
比如校长告诉辅导员,让他下周一举办一个编程大赛,然后辅导员去落实,去准备,最后我们学生去执行。
所以可以认为这三个角色是这样的关系:
校长——决策者
辅导员——落实决策
学生——执行决策
(其它的关系我们不考虑太多,上面说了我们这里是简化的场景)

但是呢,大家想一下:

对于一个大学生来说,平时在学校和校长的接触多吗?
🆗,并不多,甚至一年都见不了一次面。
那这里就有一个问题,校长作为管理者,都没怎么见过学生,那他如何去很好的管理学生呢?
那管理者和被管理者一定需要经常接触,经常沟通吗?
答案是不需要的。
管理者和被管理者,不一定非要进行之间沟通的!

就像公司的员工,可能连老板的面都没见过,但是老板依然可以把他管理的很好。那这是怎么做到的呢?

🆗,其实只要管理者能拿到被管理者的数据就可以对其进行管理。
你在公司上班,跟老板见都没见过,但是你发现最后老板扣了你的奖金,因为老板能知道你每天的工作情况,知道你哪天迟到过,那天任务没有完成。
那既然管理者和被管理者没有之间接触,那他是如何拿到你的数据呢?
虽然你的老板和你没有之间接触,但是你的上一级,比如你们部门的领导,他和你有之间的接触,他知道你每天的情况,那他就可以把这些数据汇报给老板,那老板就知道了。
校长可以拿到学生的数据因为辅导员可以给它汇报。

下一个问题,对于管理者来说,被管理者的数据量可能非常庞大(比如一个学校有2万名学生,但是只有一个校长),那管理者如何做到对这些数据进行合理的分析呢?

🆗,虽然数据量非常大,但是这些数据的类型是一致的。

举个栗子:

比如校长要获取所有学生的信息都是它的学号、姓名、电话和期末成绩。
那如果我作为校长呢我就可以这样做:
我就可以定义一个结构体,然后把这些字段都定义为成员变量。然后我告诉辅导员,你按照这些字段把所有学生的这些信息给我汇总上来。
然后呢我就可以给这个结构体再加一个指针,我搞一个链表把这些学生的数据全部管理起来
在这里插入图片描述
然后呢我作为校长我做这样一个决策,我要让所有学生里面数学成绩最高的那个代表学校去参加一个数学竞赛,那我就可以遍历这个链表找出数学成绩的最大值,然后获取这个成绩对应的学生姓名,然后把辅导员叫过来,告诉他让他找这个学生去参加比赛。
那此时这个决策就转换成了对这个链表的遍历操作。
那后续其它的一些管理工作比如要开除一个学生,新转来一个学生,两个学生要换宿舍,其实就都转换成了对这个链表的增删查改。

那上述我们就完成了对管理工作的一个建模的过程。

那从中我们也能够得出:

计算机管理硬件,管理的本质:先描述、再组织
以我们上面举的例子来说
描述被管理对象——描述起来,用struct结构体
组织被管理对象——组织起来,用链表或其他高效的数据结构

那我们上面例子中提到的校长、辅导员、学生这个三个角色对应到计算机里面又是什么呢?

🆗,那校长其实就对应计算机中的操作系统,学生就对应计算机中的软硬件,而辅导员则对应硬件驱动。

3. 操作系统为什么要做管理

那操作系统为什么要对软硬件资源进行管理呢?

计算机本质是为用户服务的,所以操作系统对软硬件进行管理其实就是为了更好地为用户提供服务的,不能今天这个硬件出问题了,明天那个软件出问题了。
总结一下就是:
操作系统对下通过管理好软硬件资源(手段),对上给用户提供良好(安全、稳定、高效、功能丰富)的的执行环境(目的)。

那操作系统进行软硬件管理是为了给用户提供更好的服务,那在日常生活中,也有类似的例子:

比如说银行,银行里面肯定也有自己的管理体系来给人们提供良好的服务,在银行系统中,可以认为行长就对应计算机中的操作系统OS,他可以管理员工,也可以管理银行里面的各种设备,就像OS可以管理软硬件一样。

那我问大家一个问题,银行是给人们提供服务的,但是银行相信我们吗?

什么意思呢?
比如你想去银行的仓库里面看看,别人取钱的时候你想进行看看,或者你想看看银行工作人员的电脑,人家会让你干吗?
不会的,银行虽然是给我们提供服务的,但是他不相信我们。
在这里插入图片描述
它要保证自身的安全。

那对于操作系统也是这样的:

操作系统是给用户提供服务的,但是他不相信任何人,不允许用户访问它任何内部的细节,它要维护自身的安全。

4. 系统调用和库函数概念

那它如何做到即为我们提供服务,又要防备我们,保护自身的安全呢?

那大家先想一下银行是怎么做的?

在这里插入图片描述
🆗,他是不是提供了一个个的窗口,每个窗口都有厚厚的玻璃,只留一个开口来让工作人员为我们提供服务。
那它这样既可以为我们提供服务,同时也保证自己的安全。

那同样的,对于操作系统来说:

在这里插入图片描述
我们能直接访问或修改操作系统内部的东西吗?
当然是不行的,操作系统给我们提供服务,但是他不相信任何人。
在这里插入图片描述

所以,和银行的做法类似:

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
在这里插入图片描述
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
比如有些操作系统上有人就基于系统调用接口写了图形化界面,有的操作系统设计者就基于系统调用接口写了shell和工具集,还有比如C语言里面的一些库函数或者Linux上的一些命令,我们可以直接使用,但他的底层可能就是去调用对应的系统调用去完成对应的操作,是会贯穿体系结构的。

5. 局部性原理

再来补充一个东西

上一篇文章我们提到,由于内存的存在,数据可以预加载到内存,这可以提高了CPU的处理速度,那数据预加载到内存这个工作其实就是操作系统做的。
那问题就是:要处理的数据可能很多,操作系统如何决定要把那些数预先加载到内存呢?

这就是我们这里要了解的一个——局部性原理

局部性原理(Principle of Locality)是计算机系统设计和优化的重要原则,它基于观察到在计算机程序中,数据和指令的访问往往具有一定的局部性特征。局部性原理可以分为两个方面:时间局部性和空间局部性。
时间局部性(Temporal Locality):时间局部性指的是程序中执行的指令和访问的数据在一段时间内很可能会再次被使用。这意味着如果一个数据项或指令刚被访问过,那么在不久的将来它很可能会再次被使用。因此,在计算机系统中,对最近使用的指令和数据进行缓存,可以减少对主存的访问延迟,提高程序的运行速度。
空间局部性(Spatial Locality):空间局部性指的是程序中执行的指令和访问的数据往往具有空间上的连续性。即,如果一个数据项被访问,那么在接下来的一段时间内,其相邻的数据项也很可能会被访问。因此,通过预取相邻的数据项和指令到高速缓存中,可以利用空间局部性减少对主存的访问次数,提高访问效率。

6. 计算机体系结构

那通过我们前面的铺垫和讲解,我们最终就得出了计算机的整个体系结构:
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1015312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++静态成员变量与静态成员函数

一、静态成员变量 1、说明 1.1、所有对象共享同一份静态变量 1.2、编译阶段分配内存 1.3、类内声明,类外初始化操作 静态成员变量,不属于某个具体的类对象,多有的类对象共享同一份数据 因此静态成员变量有两种方式访问 2、…

阿里云大数据实战记录10:Hive 兼容模式的坑

文章目录 1、前言2、什么是 Hive 兼容模式?3、为什么要开启 Hive 模式?4、有什么副作用?5、如何开启 Hive 兼容模式?6、该场景下,能不能不开启 Hive 兼容模式?7、为什么不是DATE_FORMAT(datetime, string)&…

【小记录】jupyter notebook新版本

手欠升级 😅今天手贱,在anaconda navigator里面更新了最新版本的spyder,然后莫名奇妙地jupyter notebook就打不开了😅,报错说缺少模块”ModuleNotFoundError: No module named jupyter_server.contents“,…

给微信小程序添加隐私协议

前些日子,微信官方针对用户的安全信息又进行了增强,这次更新几乎要求所有的小程序都需要进行整改,只要是涉及到用户的隐私的小程序都需要进行整改,这次整改是强制性的。 点开相关指引之后会跳转到下面的链接:参考链接…

解决php导出excel中小数尾部0不显示的问题

调整代码前: 新增代码: //小数避免末尾0不显示的问题 foreach ($list as &$line) {foreach ($line as &$column) {if (is_numeric($column) && strpos($column, .)!false) {$column " {$column} ";}} } 效果&#xf…

【【萌新的riscV的学习之关于risc指令集的学习使用总五】】

萌新的riscV的学习之关于risc指令集的学习使用总五 opcode(操作码) 指令的基本操作 rd目的操作数寄存器 用来存放操作结果 funct3 一个另外的操作码字段 rs1: 第一个源操作数寄存器 rs2: 第二个源操作数寄存器 funct7: 一个另外的操作码字段 还有一种I型…

ApplicationContext实现

基于classpath下的xml格式的配置文件来创建bean对象 java代码 package com.example;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.Fi…

力扣刷题班 第3课 02-分治与回溯算法

分治(例题1)九键电话号码的字母组合 电话号码的字⺟组合 给定⼀个仅包含数字 2-9 的字符串,返回所有它能表示的字⺟组合。答案可以按 任意顺序 返回。 给出数字到字⺟的映射如下(与电话按键相同)。注意 1 不对应任何字…

【计算机视觉】Image Feature Extractors方法介绍合集(二)

文章目录 一、Mixed Depthwise Convolution二、Deformable Kernel三、Dynamic Convolution四、Submanifold Convolution五、CondConv六、Active Convolution七、Depthwise Dilated Separable Convolution八、Involution九、Dilated convolution with learnable spacings十、Att…

Elastic Stack 8.10:更简单的跨集群搜索和身份验证等等

作者:Tyler Perkins, Gilad Gal, Shani Sagiv, George Kobar, Michael Peterson, Aris Papadopoulos Elastic Stack 8.10 增强了跨集群和向量搜索、数据摄取、Kibana 和云注册。 配置远程搜索时获得更大的灵活性,并提供更多信息来分类问题,…

小白备战大厂算法笔试(八)——搜索

搜索 二分查找 二分查找是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮减少一半搜索范围,直至找到目标元素或搜索区间为空为止。 Question: 给定一个长度为n的数组 nums ,元素按从小到大的顺序排列,数组…

git基本手册

Git and GitHub for Beginners Tutorial - YouTube Kevin Stratvert git config --global user.name “xxx” git config --global user.email xxxxx.com 设置默认分支 git config --global init.default branch main git config -h查看帮助 详细帮助 git help config 清除 cl…

计网第五章(运输层)(二)(端口号、复用和分用)

一、端口号 (1)基本概念 在上部分(计网第五章(运输层)(一)_永无魇足的博客-CSDN博客)提到运输层用不同的端口对应不同的应用进程。 端口就是用来区分不同应用进程的标识符。 每个…

HarmonyOS/OpenHarmony应用开发-DevEco Studio新建项目的整体说明

一、文件-新建-新建项目 二、传统应用形态与IDE自带的模板可供选用与免安装的元服与IDE中自带模板的选择 三、以元服务,远程模拟器为例说明IDE整体结构 1区是工程目录结构,是最基本的配置与开发路径等的认知。 2区是代码开发与修改区,是开发…

分支分支分支分支

分支 查看分支 git branch -v 创建分支 git branch 分支名 切换分支 git checkout 分支名 合并分支 git merge 分支名 把指定的分支合并到当前分支上

【CMU15-445 Part-11】Join Algorithms

Part11-Join Algorithms Why Do We Need to Join? Join其实是关系数据库和范式化表时候所产生的副产物。 也就是说我们范式化表是为了减少冗余信息,而我们使用join就是为了去重建reconstruct 这些原本的tuple Join Algorithms 主要关注两表的inner equijoin a…

UE5学习笔记(1)——从源码开始编译安装UE5

目录 0. 前期准备1. Git bash here2. 克隆官方源码。3. 选择安装分支4. 运行Setup.bat,下载依赖文件5. 运行GenerateProjectFiles.bat生成工程文件6. 生成完成,找到UE5.sln/UE4.sln7. 大功告成 0. 前期准备 0.1 在windows的话,建议装一个Git…

基于SpringBoot的驾校管理系统

基于SpringBootVue的驾校管理系统、前后端分离 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色:管理员、用户、教练 管理员&#x…

Python 可迭代对象、迭代器、生成器

可迭代对象 定义 在Python的任意对象中,只要它定义了可以返回一个迭代器的 __iter__ 魔法方法,或者定义了可以支持下标索引的 __getitem__ 方法,那么它就是一个可迭代对象,通俗的说就是可以通过 for 循环遍历了。Python 原生的列…

(手撕)数据结构--->堆

文章内容 目录 一:堆的相关概念与结构 二:堆的代码实现与重要接口代码讲解 让我们一起来学习:一种特殊的数据结构吧!!!! 一:堆的相关概念与结构 在前面我们已经简单的学习过了二叉树的链式存储结…