操作系统入门系列-MIT6.828(操作系统工程)学习笔记(一)---- 操作系统介绍与接口示例

MIT6.S081(操作系统)学习笔记

操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)---- 操作系统介绍与接口示例
操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建(wsl2+ubuntu+quem+xv6)


文章目录

  • MIT6.S081(操作系统)学习笔记
  • 文章摘要
  • 一、操作系统介绍
    • 1.大概理解操作系统
    • 2.操作系统的特性
    • 3.操作系统设计矛盾
  • 二、xv6接口示例
    • 1.进程创建
    • 2.进程替换
    • 3.进程创建+进程替换(Shell)
    • 4.IO重定向
  • 总结


文章摘要

本文对应MIT的6.S828,操作系统系列课程的第一节,“Introduction and Examples”。公开课的视频链接为:链接: 【操作系统工程】精译【MIT 公开课 MIT6.828】
本文主要讲解了操作系统的概念,以及基于xv6(课程自己设计的操作系统,基于Unix设计风格)进行内核接口的展示示例


一、操作系统介绍

1.大概理解操作系统

个人理解而言,操作系统就是对各种硬件资源的抽象,这些抽象能够让人们更好的使用各种硬件资源的各种功能。操作系统虽然本身是软件,但是它也可以理解为软件与硬件之间的桥梁,是一种特殊的底层的软件系统。

下图展示了操作系统在计算机软件架构中所处的位置和功能。
在这里插入图片描述

2.操作系统的特性

课程的讲义上给出了操作系统的功能:

  • Support applications
  • Abstract the hardware for convenience and portability
  • Multiplex the hardware among multiple applications
  • Isolate applications in order to contain bugs
  • Allow sharing among applications
  • Provide high performance

尝试理解操作系统,我们可以通过代入的方法。设想一下,如果我们要设计自己的操作系统,会实现一些什么功能。

  1. 最核心的功能,也就是对 硬件资源的抽象 ,我们需要实现一些很方便的接口,来操控键盘、内存、屏幕等硬件设备。
  2. 操作系统的一些 硬件资源 可能有很多的程序要使用,那么的 复用 也是操作系统需要实现的特性
  3. 接着就可以想到会有多个应用程序在操作系统上同时运行,就需要具有实现 多进程 同时运行的 并发性
  4. 那么多个应用程序之间的 隔离共享 也就显而易见了
  5. 如果一些设备是很多人共同使用的,那么不同用户的隐私和数据安全是需要保证的,即 安全性

通过模拟设计的过程,我们就可以大概理解操作系统的特性,进而去理解更加准确的定义与概念。操作系统在刚开始被提出来的时候,可能仅仅是为了硬件抽象,随着应用和不断的迭代,操作系统的功能特性随着需求的发展而不断发展,最后有了今天的现代操作系统。随着需求和技术的变化,操作系统的特性可能会越来越丰富。

3.操作系统设计矛盾

操作系统的困难在于有很多的矛盾需要处理。在课程中,提到的矛盾如下:

  1. 效率------抽象
  2. 强大的功能------简单的接口
  3. 灵活性------安全性

简单来谈一下为什么操作系统的设计会有很多的矛盾存在。逻辑上将,是由于操作系统本身就是作为桥梁,来连接软件和硬件两个不同的设计世界。大部分芯片都是要同时支持很多个软件程序,那么不同的软件程序对于硬件资源的使用需求不同,有的软件程序需要极致的性能;有点软件程序需要好的可移植性,能够在多种硬件平台很方便的运行,众多不同的需求注定会构成矛盾。那么作为桥梁的操作系统,就是需要考虑到所有软件程序的需求,结合实际情况处理好各种对硬件资源需求的矛盾。

最后,结合各种功能软件的实际需求,课程将操作系统的矛盾抽象总结出上面三点。1. 效率与抽象。效率可以理解为软件程序完成一个功能所需要的运行时间,不同程序有不同的效率,比如大部分情况下,Python运行的效率就低于C语言。抽象的意思是将硬件资源封装成接口的封装程度,也可以理解为接口函数功能的复杂程度。2.强大的功能与简单的接口。这个矛盾个人认为与“效率与抽象”在逻辑上是一致的,就是复杂的功能接口必然会带来额外的开销。3.灵活性与安全性。这个矛盾是从访问权限的角度来引出的,接口的灵活意味着对硬件资源的随意调用,但是我们有时候并不想让没有权限的人随意访问硬件资源(特别是存储机密隐私文件的存储资源)。

二、xv6接口示例

xv6是该课程自行设计的操作系统,与现今广泛使用的Linux、IOS都有几乎一致的设计风格,作为入门来讲有很高的学习价值。第一节课演示了一些接口的设计和调用,有一些知识点和巧妙的设计值得思考。下面是课程给的xv6的说明文档的中文翻译:
链接: xv6 中文文档

1.进程创建

#include "kernel/types.h"
#include "user/user.h"int main()
{int pid;pid = fork();printf("fork() returned %d\n", pid);if(pid == 0){printf("child\n");}else{printf("parent\n");}exit(0);
}

结果如下图:
在这里插入图片描述
fork函数是xv6内核实现的操作系统接口,用处是在当前父进程的基础上开启一个子进程,该子进程的内存内容(指令、数据、栈)复制于父进程。也就是说,子进程会从“fork()”处,往后执行与父进程一样的代码。子进程与父进程的不同点是:父进程中,fork()函数返回的是子进程的进程号(pid);而子进程中,fork()函数返回是0。

那么通过pid号的区别,我们可以用if else语句控制子进程和父进程执行不一样的功能,尽管他们的指令是一样的。

上面的运行结果来自课程截图,因为要运行上述代码需要配置运行环境,在环境中启动xv6操作系统,才能“include”对应的软件包。

2.进程替换

#include "kernel/types.h"
#include "user/user.h"int main()
{//构造一个命令字符串,结尾的0代表字符串的结束//命令字符串的第一个元素为进程文件的名字char *argv[] = { "echo", "this", "is", "echo", 0};//调用进程替换函数,用“echo”进程(程序)替换掉当前进程//echo 会将argv中的参数内容打印exec("echo", argv);//进程成功替换,将不会打印这个printf("exec failed!\n");exit(0);
}

结果如下图:
在这里插入图片描述
由图可知,echo的功能是打印参数内容,exec完成了进程替换,最终执行的是echo的功能。

3.进程创建+进程替换(Shell)

#include "kernel/types.h"
#include "user/user.h"int main()
{int pid, status;pid = fork();//子进程执行pid==0的情况if(pid == 0){char *argv[] = { "echo", "THIS", "IS", "ECHO", 0};exec("echo", argv);printf("exec faile\n");//unix 一般函数调用成功返回0;失败返回1exit(1);}//父进程执行elseelse{printf("parent waiting\n");//wait函数是阻塞至有一个子进程成功退出//子进程的返回值存储到status中wait(&status);printf("the child exited with status %d\n", status);}exit(0);
}

结果如下图:
在这里插入图片描述
这个程序实现的功能就是在当前进程执行过程中,跳转到另一个指定进程执行,执行完成后再返回。这个功能也就是Shell所实现的命令行控制。Shell相当于父进程,输入一个命令就是在从Shell跳转到另一个子进程执行。这个跳转本质上是用fork+exec实现的。

那么为什么 fork 和 exec 为什么没有被合并成一个调用,接下来会讲解,将创建进程——加载程序分为两个过程是一个非常机智的设计。

4.IO重定向

在 Linux 下,I/O 重定向可以称为是命令行最酷的特性了。命令的输入可以来自于键盘或者文件,输出可以打印在终端模拟器,也可以打印到文件,这里就需要用到 I/O 的重定向特性,利用 I/O 的重定向功能还可以实现强大的命令管道。

下面通过一组示例展示IO重定向的实现过程

#include "kernel/types.h"
#include "user/user.h"int main()
{int pid;pid = fork();if(pid == 0){//关闭文件描述符1,即标准输出close(1);//由于1被关闭,open会将最小的文件描述符分配给打开的文件//因此output的文件描述符就是1//那么echo是将参数输出到标准输出//这就实现了标准输出的替换open("output.txt", O_WRONLY|O_CREATE);char *argv[] = {"echo", "this", "is", "redirect", "echo", 0};exec("echo", argv);printf("exec failed\n");exit(1);}else{//传入空指针,意味着不返回状态wait((int *) 0);}exit(0);
}

结果如下图:
在这里插入图片描述
正是将创建进程(fork)——替换程序(exec)分为两个过程,这样子进程就可以再被替换之前,执行一些指令完成重定向。


总结

一边学习课程一边总结,理解不对和不深入的地方恳请各位读者指正。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins在windows上进行安装

今天为了实现jmeter接口测试脚本的持续性集成安装了jenkins,主要记录jenkins的安装和端口的修改。 前提条件:安装了jdk,我本机安装的jdk1.8。 1.下载jenkins安装包 安装jenkins我们需要先下载安装包,可以通过下面的链接进行下载&a…

Qt快速入门到熟练(电子相册项目(一))

经过一段时间的学习,相信大家对QT的基本用法都有所了解,从这篇文章开始,我准备记录一下电子相册的项目的一个学习过程。 实现项目创建功能 对于这个电子相册的项目,我并没有在一开始就把所有可能用到的功能模块去事无巨细的考虑周…

C# 结合 JS 暴改腾讯 IM SDK Demo

目录 关于腾讯 IM SDK Demo 范例运行环境 设计思路 服务端生成地址 IM 服务端接收 IM 客户端程序 小结 关于腾讯 IM SDK Demo 腾讯云即时通信 IM SDK 提供了单聊、群聊、关系链、消息漫游、群组管理、资料管理、直播弹幕等功能,并提供完备的 App 接入及管…

小猪APP分发:一站式托管服务,轻松玩转应用市场

在当今移动应用爆炸式增长的时代,开发者们面临的挑战不再仅限于创意的火花和代码的实现,更在于如何让精心打造的应用快速触达广大用户。这正是小猪APP分发www.appzhu.net应运而生的背景——作为一个全面、高效的APP托管服务分发平台,它为开发…

用于时间序列概率预测的蒙特卡洛模拟

大家好,蒙特卡洛模拟是一种广泛应用于各个领域的计算技术,它通过从概率分布中随机抽取大量样本,并对结果进行统计分析,从而模拟复杂系统的行为。这种技术具有很强的适用性,在金融建模、工程设计、物理模拟、运筹优化以…

F.费用报销【蓝桥杯】/01背包

费用报销 01背包 思路&#xff1a;f[i][j]表示前i个票据在容量为j的背包中能占的最大值。 #include<iostream> #include<algorithm> using namespace std; int day[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int dp[1005][5005]; int s[13]; int last[1005];…

Obsidian Git 多端同步

2023年6月&#xff0c;某云笔记限制了免费用户最多同时登录 2 台设备&#xff0c;想要增加设备数量需要付费开通会员。之后我一直想找一款合适的笔记本软件&#xff0c;年底尝试了Obsidian&#xff0c;断断续续摸索了好几天终于成功了。将那时的笔记拿来分享一下。 相关地址&am…

Golang单元测试

文章目录 传统测试方法基本介绍主要缺点 单元测试基本介绍测试函数基准测试示例函数 传统测试方法 基本介绍 基本介绍 代码测试是软件开发中的一项重要实践&#xff0c;用于验证代码的正确性、可靠性和预期行为。通过代码测试&#xff0c;开发者可以发现和修复潜在的错误、确保…

Elasticsearch集群搭建学习

Elasticsearch集群聚合、集群搭建 RestClient查询所有高亮算分控制 数据聚合DSL实现Bucket聚合DSL实现Metrics聚合RestAPI实现聚合 拼音分词器如何使用拼音分词器&#xff1f;如何自定义分词器&#xff1f;拼音分词器注意事项&#xff1f; 自动补全数据同步集群搭建ES集群结构创…

HarmonyOS鸿蒙应用开发——ArkTS的“内置组件 + 样式 + 循环和条件渲染”

一、内置组件是咩&#xff1f; 学过前端的都知道&#xff0c;一个组件就是由多个组件组成的&#xff0c;一个组件也可以是多个小组件组成的&#xff0c;组件就是一些什么导航栏、底部、按钮......啥的&#xff0c;但是组件分为【自定义组件】跟【内置组件】 【自定义组件】就…

java继承使用细节二

构造器 主类是无参构造器时会默认调用 public graduate() {// TODO Auto-generated constructor stub也就是说我这里要用构造器会直接调用父类。它是默认看不到的 &#xff0c;System.out.println("graduate");} 但当主类是有参构造器如 public father_(int s,doubl…

K8S集群中Yaml文件详解

目录 一、Yaml概述 二、Yaml基本语法 三、Yaml数据结构 四、K8S资源清单描述方法 五、api资源版本标签 六、Yaml文件示例详解 1.deployment.yaml文件详解 2.Pod yaml文件详解 3.Service yaml文件详解 七、Yaml文件相关操作 1.试运行 2.生成yaml格式 3.生成json格式…

超大Sql文件切分工具SQLDumpSplitter —— 筑梦之路

官网&#xff1a;PLB PLB - SQLSplitter 用于将大型MySQL转储拆分为可独立执行的小型SQL文件。 显示100%时并不是已经处理完了&#xff0c;而是才开始 优点 软件程序小巧&#xff0c;不需要安装&#xff0c;直接点击运行就可以最厉害的是SQLDumpSplitter可以自动将结构语句&…

JVM学习-执行引擎

执行引擎 执行引擎是Java虚拟机核心组成部分之一虚拟机是一个相对于物理机的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引擎是由软件自行实现的&#xf…

近临算法(个人总结版)

背景 近邻算法&#xff08;Nearest Neighbor Algorithm&#xff09;是一种基本但非常有效的分类和回归方法。最早由Fix和Hodges在1951年提出&#xff0c;经过几十年的发展和改进&#xff0c;已成为数据挖掘、模式识别和机器学习领域的重要工具。近邻算法基于相似性原则&#x…

vue源码2

vue之mustache库的机理其实是将模板字符串转化为tokens 然后再将 tokens 转化为 dom字符串&#xff0c;如下图 对于一般的将模板字符串转化为dom字符串&#xff0c;这样不能实现复杂的功能 let data {name:小王,age:18 } let templateStr <h1>我叫{{name}},我今年{{ag…

git分支常用命令

最近在用git提交代码的时候&#xff0c;发现有些命令不是很会&#xff0c;先记录几个常用分支命令&#xff0c;后续再补充&#xff0c;在执行git push命令提交代码的时候遇到报错&#xff0c;一并记录下。 1.git常用命令 新建分支&#xff1a; git branch <分支名称> 比…

2025第十届美陈展

展位又遭疯抢&#xff01;2025第十届美陈展释放“无界之美” 美是全球通用的语言&#xff0c;人类对美的追求始终如一&#xff0c;大众审美在经历了时代的变迁后开始趋同&#xff0c;东方文明深处的美学经济开始崛起。 在如今商业迈入存量阶段&#xff0c;以品牌为突破口打造…

Ai自动贴图直播项目的趋势,智享自动直播GMV增加工具

在当今社会&#xff0c;直播行业正在悄然地改变着人们的生活方式。无论是在闲暇时光中放松身心&#xff0c;还是在临睡前享受休闲娱乐&#xff0c;观众们越来越习惯于通过刷短视频或者观看直播来消遣自己。根据统计数据显示&#xff0c;到2023年全球将有超过10.74亿网民&#x…

前端日志收集(monitor-report v1)

为什么 为什么自己封装而不是使用三方 类似 Sentry 这种比较全面的 因为 Sentry 很大我没安装成功&#xff0c;所有才自己去封装的 为什么使用 可以帮助你简单解决前端收集错误日志、收集当前页面访问量&#xff0c;网站日活跃&#xff0c;页面访问次数&#xff0c;用户行…