Lesson1 - 操作系统概述与硬件视角

文章目录

  • 什么是操作系统
    • 操作系统的形成
  • 从程序看OS
    • 提出问题:从hello world文件开始
    • 目前编译器帮我们解决了诸多问题
      • gcc的编译过程
  • CPU的运作
    • CPU对任务的切换


什么是操作系统

  • 操作系统 Operating System 是一组控制和管理计算机 硬件软件 资源合理地对各类作业进行 调度,方便用户使用计算机的程序集合。
  • 操作系统的核心目标是,使系统资源的利用率高,系统的吞吐量大。

操作系统的形成

用户想要调用硬件,需要使用硬件的驱动程序,那么如果换了硬件就需要更换驱动,这样可移植性差,于是出现了操作系统。
操作系统负责提供设备驱动框架来驱动不同的底层设备,同时提供了用户接口框架给上层用户。
后来操作系统一并将软件驱动纳入,形成软件操作系统。
在这里插入图片描述


从程序看OS

提出问题:从hello world文件开始

  1. hello world文件在磁盘中是怎么存储的?
    • 怎么存决定了怎么读
    • 利用文件系统
  2. .c文件怎么变成让CPU认识的指令的?
    2.1 是否这些指令所有CPU都认识呢?
    2.2 是否编译成0101这种二进制文件系统就能运行了呢?
    • 我们现在的编程大多是 基于OS的程序设计
    • 而还有一种就是裸机编程,程序可以不需要操作系统直接调动硬件
  3. 软件多次运行或者同时运行,CPU如何管理多个任务的?
  4. 对于运行时的数据如何进行内存存放,内存如何管理?

总结下来就是,操作系统如何进行:

  • 管理CPU —— 进程和线程 —— 调度与同步机制
  • 管理内存 —— 内存管理
  • 管理磁盘 —— 文件系统
  • 管理IO —— IO设备

目前编译器帮我们解决了诸多问题

编译器帮助我们解决了前两个问题:管理CPU和管理内存。

  • 调用进程线程来运行程序
  • 编译器链接内存地址

调用指令

gcc -v

可以看到如下信息:

目标:x86_64-redhat-linux

说明gcc编译的指令集是面向x86架构的CPU,作用于linux操作系统的
gcc(编译器)解决了文件对于不同架构的CPU与不同的操作系统的问题。

gcc的编译过程

指令:

gcc helo.c -E -o a.i	# 将hello.c文件预处理
gcc a.i -S -o a.s		# 对预处理后的文本文件进行编译
gcc a.s -c -o a.o		# 对汇编文件进行汇编,生成二进制文件
gcc a.o -o a.out		# 对各种库和文件进行链接,生成可执行文件cc1 hello.c -o /tmp/cceVNE1I.s            		# 编译器ccl  gcc -S
as -o /tmp/cc8ATX9H.o /tmp/cceVNE1I.s			# 汇编器as  gcc -c
ld -o build /tmp/cc8ATX9H.o  ...../*.o   -lc   	# 链接器ld  gcc

指令:

file a.out

可以调出可执行文件适用的CPU,操作系统等信息


CPU的运作

在这里插入图片描述
CPU通过缓存对内存进行调度,其中,内存分为两种:

  • 数据内存:存放数据。
  • 控制器
    • 在硬件通信中,需要高低电压的信号来互相通信,而高低电压的持续时间需要软件控制,而代码中会需要进行休眠来控制电压持续时间,如果CPU自己来做,就会造成CPU休眠(死机),所以创造出了控制器。
    • CPU告诉控制器,我需要什么类型的信号,由控制器进行操作,这样就能让CPU在控制器发信号和休眠的时间内做其他事情了。

CPU对任务的切换

CPU在执行程序的时候,如何实现对任务的切换呢?

例如,对一个C程序:

#include <stdio.h>int reslut() {int a = 1;int b = 2;return a + b;
}int main() {int k = reslut();return 0;
}
  1. CPU开始执行main()
  2. 跳转到reslut()
  3. 在CPU的寄存器内记录下a, b的数据,然后进行运算
  4. 跳转回main()

那CPU是怎么知道要跳转到哪里的?

  • CPU的寄存器中有一个名叫程序计数器(Program Counter, PC),程序计数器指示了下一条需要从内存中提取的指令的地址。当指令被提取后,程序计数器会自动更新为下一条需要提取的指令的地址,从而确保指令能够按正确的顺序执行。
  • 另一个重要的寄存器是 栈指针(Stack Pointer, SP)。栈指针指向内存中当前栈的顶端。它包含了函数调用过程中传递的参数、局部变量以及未保存在寄存器中的临时变量。通过堆栈指针,CPU可以管理函数调用期间的数据和返回地址。
  • 在进行多任务时,由于CPU内寄存器只有那么多,所以在切换任务前,PC 指针会保存当前任务的下一条语句的地址,然后将栈指针SP以及栈内的数据保存到内存的TCB任务控制块中,之后再跳转到另一个任务中。在任务完毕时,根据PC指针位置跳转,然后将对应数据从内存下载到栈内,这就是CPU和内存间的load/store操作。
    • 任务切换,也称上下文切换(Context Switch)

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

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

相关文章

移动硬盘无法读取:问题解析与高效数据恢复实战

一、移动硬盘无法读取的困扰 在数字化时代&#xff0c;移动硬盘作为数据存储和传输的重要媒介&#xff0c;承载着大量珍贵的数据资源。然而&#xff0c;当移动硬盘突然无法读取时&#xff0c;我们往往会陷入深深的困扰之中。这种无法读取的现象可能表现为插入电脑后毫无反应、…

为什么e^x的导数是本身

参考Why is the derivative of exex?的解法如下。 主要是利用导数的定义&#xff0c;将 f ′ ( x ) f(x) f′(x)转化为另一个公式&#xff0c;其值为1。 lim ⁡ h → 0 e h − 1 h \lim_{h \to 0} \frac{e^h - 1}{h} h→0lim​heh−1​ 而如何求这个公式的值&#xff1f;有人…

【论文速看】DL最新进展20241005-Transformer、目标跟踪、Diffusion Transformer

目录 【Transformer】【目标跟踪】【Diffusion Transformer】 【Transformer】 [NeurlPS 2024] Parameter-Inverted Image Pyramid Networks 机构&#xff1a;清华大学、上海AI Lab、上交、港中文、商汤 论文链接&#xff1a;https://arxiv.org/pdf/2406.04330 代码链接&…

【文献阅读】Attention Bottlenecks for Multimodal Fusion

Abstract 在多模态视频分类中&#xff0c;将各模态的最终表示或预测进行后期融合&#xff08;“后期融合”&#xff09;仍然是主流范式。为此&#xff0c;本文提出了一种基于 Transformer 的新型架构&#xff0c;该架构使用“融合瓶颈”在多个层次进行模态融合。与传统的成对自…

D28【python 接口自动化学习】- python基础之输入输出与文件操作

day28 输入 学习日期&#xff1a;20241005 学习目标&#xff1a;输入输出与文件操作&#xfe63;-40 输入&#xff1a;如何接收用户通过键盘输入的数据&#xff1f; 学习笔记&#xff1a; 输入设备与输入方式 Input函数 命令行参数 可选参数 必填参数 强制转换参数类型 总…

Linux环境搭建git服务器和代码自动化部署

在开发过程中&#xff0c;我们经常遇到的问题就是提交代码到测试地址&#xff0c;然后进行线上测试。 要实现Git代码的自动化部署&#xff0c;考虑以下几种方法 FTP提交&#xff1a;可以使用FTP将代码上传到服务器自动化部署工具&#xff1a;如Jenkins、当代码被推送到仓库时…

【Kubernetes】常见面试题汇总(五十五)

目录 121. POD 创建失败&#xff1f; 122. POD 的 ready 状态未进入&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kube…

Java项目实战II基于Java+Spring Boot+MySQL的宠物咖啡馆平台的设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在快节奏的城市生活中&#xff0c;宠物咖啡馆作为一种结合了休闲与宠物陪伴的新型业态&#xff0c;正…

重学SpringBoot3-集成Redis(三)

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;三&#xff09; 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码&#xff1a;自定义过期策略 3. 配置…

I/O多路转接

目录 一、select 1.1、select概念 1.2、select 函数原型 1.3、理解 select 执行过程 1.4、select就绪条件 1.4.1、读就绪 1.4.2、写就绪 1.4.3、异常就绪&#xff08;了解&#xff09; 1.5、select 基本工作流程 1.6、select服务器 1.6.1、Sock.hpp 1.6.2、selectS…

【复习】html最重要的表单和上传标签

文章目录 imgforminput img <img src"https://tse1-mm.cn.bing.net/th/id/OIP-C._XVJ53-pN6sDMXp8W19F4AAAAA?rs1&pidImgDetMain"alt"二次元"height"350px"width"200px"/>常用 没啥说的&#xff0c;一般操作css多一些 for…

CSP-J/S复赛算法 动态规划初步

文章目录 前言动态规划动态规划常见形式动态规划求最值的几个例子1. **背包问题**2. **最短路径问题**3. **最小硬币找零问题**4. **最长递增子序列** 总结 最优子结构举个简单的例子其他例子条件 DP的核心就是穷举具体解释 递归的算法时间复杂度dp数组的迭代解法通俗易懂的解释…

LabVIEW提高开发效率技巧----使用动态事件

在LabVIEW开发过程中&#xff0c;用户交互行为可能是多样且不可预知的。为应对这些变化&#xff0c;使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧&#xff0c;并结合实际案例&#xff0c;说明如何通过动态事件提高程序…

招联2025校招内推倒计时

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

8648 图的深度遍历

### 思路 1. **图的邻接表存储结构**&#xff1a;使用邻接表存储图的顶点和边信息。 2. **基本操作函数**&#xff1a;包括创建图、查找顶点、获取顶点值、获取第一个邻接顶点、获取下一个邻接顶点等。 3. **深度优先遍历&#xff08;DFS&#xff09;**&#xff1a;从某个顶点出…

车载项目:HIL测试、功能安全测试、CAN一致性测试、UDS测试、ECU测试、OTA测试、TBOX测试、导航测试、车控测试

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

今日指数项目个股描述功能实现

个股描述功能实现 1 个股描述功能实现说明 1&#xff09;原型示意 2&#xff09;接口说明 功能描述&#xff1a;个股主营业务查询接口 服务路径&#xff1a;/api/quot/stock/describe 服务方法&#xff1a;GET 请求参数&#xff1a;code #股票编码 响应参数&#xff1a; {…

java计算机毕设课设—坦克大战游戏

这是什么系统&#xff1f; 坦克大战游戏是一款以坦克为主题的射击游戏&#xff0c;旨在为玩家提供一个刺激、有趣的游戏体验。该游戏不仅拥有丰富的功能&#xff0c;还注重玩家的互动体验。此系统是使用Java语言实现坦克大战游戏程序&#xff0c;玩家通过连接访问进入游戏&…

C语言指针plus版练习

上期我们讲了进阶的指针&#xff0c;本期内容我们来强化一下上期学的内容 一、字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 1.1 分析题目 假设字符串为abcde&#xff0c;左旋一个以后就变成bcdea&#xff0c;就是把第一个字符移到一个新的变量里面&#…

一、走进新语言

走进新语言 介绍环境配置JDK配置Kotlin配置 开发工具代码基本结构程序注释 介绍 Kotlin是一种现代但已经成熟的编程语言&#xff0c;旨在让开发人员更快乐。它简洁、安全、可与Java和其他语言互操作&#xff0c;并提供了许多在多个平台之间重用代码的方法。它由JetBrains公司于…