操作系统入门系列-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.mzph.cn/bicheng/13860.shtml

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

相关文章

8.11 矢量图层线要素单一符号使用三(插值线)

文章目录 前言插值线(Interpolated Line)QGis设置线符号为插值线(Interpolated Line)二次开发代码实现插值线(Interpolated Line) 总结 前言 本章介绍矢量图层线要素单一符号中插值线(Interpol…

基于地理坐标的高阶几何编辑工具算法(4)——线分割面

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理 工具步骤 选中待分割面,点击“线分割面”工具,绘制和面至少两个交点的线,双击结束,执行分割操作 应用场景 快速切分大型几何面,以降低面的复杂度&…

496.下一个更大的元素

刷算法题: 第一遍:1.看5分钟,没思路看题解 2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

【Makefile】Makefile 编译 Keil 工程(Linux 环境)

本文使用的开发板为 stm32f103C8T6,使用的驱动库为stm32标准库。 目录 一、软件下载 1、stm32 标准库 2、arm-none-eabi 工具链 3、烧录器 二、Keil 工程改造 1、Keil 工程 2、基本 Makefile 工程 3、添加启动文件 4、添加链接脚本 5、去掉 core_cm3.c 三…

05Django项目--前端公共文件和其他html文件的适配

对应视频链接点击直达 Django项目--前端公共文件和其他html文件的适配 对应视频链接点击直达前端页面准备Pubilc页面设置 OVER,不会有人不会吧不会的加Q1394006513结语 接着上一节 前端页面准备 为了方便大家更好的复制,我把整个项目及templates文件夹和…

Buffer Pool中是如何管理Page页

Page页分类:在BP的底层采用的是链表数据结构管理Page。Page根据状态可以分为3中类型 1)free Page:空闲Page,未被使用的Page。 2)clean Page:被使用的Page,但是数据没有修改过。 3)dirty Page:脏页,被使用过的Page,并且数据被修…

FastDfs快速安装和数据迁移同步。Ubuntu环境

一:防火墙 ufw status 二:下载 分别是(环境依赖,网络模块依赖,安装包) git clone https://github.com/happyfish100/libfastcommon.git git clone https://github.com/happyfish100/libserverframe.git …

nginx服务器执行的过程

一:打包 1.打包前的分析 文件路径下npm run preview -- --report 生成打包之后的内容 2.解决有些内容体积过大的问题 1.删除有些不使用但是占用较多的,将main.js上import删除,打包时不会有 2.不能删除但是内容较大的 vue.config.js文件夹下 externals: { vue: Vue,…

Jenkins动态slave

目录 所需环境 安装nfs 部署Jenkins 安装插件 ​编辑添加凭据 配置动态slave 连接kubernetes集群 ​编辑配置Jenkins地址 ​编辑配置Pod模板 ​编辑确认代理端口 创建任务测试 在当今软件开发生命周期中,持续集成/持续部署(CI/CD)已…

Selenium 异常类详解

在使用 Selenium 进行 Web 自动化测试时,经常会遇到各种异常情况。了解这些异常并掌握如何处理它们对于编写稳定可靠的测试脚本至关重要。本文将详细介绍 Selenium 中常见和不常见的异常类及其使用场景。 Selenium 常见异常类列表 序号异常类基类描述1selenium.co…

告别死记硬背!这一AI学习法让你和别人的差距越拉越大

文章目录 一、初步提问二、需求分析三、提示词初步设计四、提示词迭代五、需求扩展 今天我要分享的是如何利用GPT来辅助学习和理解各种繁琐、复杂、抽象的教材内容或者冗长的片段。 今天将以《操作系统教程》中的内存管理章节为例进行讲解。 本次采用的大模型是通义千问2.5&am…

STM32---蓝牙模块ECB02(从机模式_与手机通信)

目录 1、ECB02 重点 参数 2、引脚说明 3、AT指令使用重点 4、使用USB转TTL模块测试 5、STM32开发板的接线 6、STM32通信代码 7、手机小程序 连接ECB02 1、ECB02 重点 参数 蓝牙协议: 5.2主从模式:主、从一体,可设置睡眠模式&#xff…

职业规划与指导

文章目录 职业规划与指导2024心得2405架构师的必经之路 职业规划与指导2024 心得 但凡工作中,能够搞明白的就在工作中把原理使用等等搞明白,但凡工作中搞不明白的,业余也不用花时间在去搞明白,因为工作中都搞不明白的事&#xf…

mac远程桌面连接工具:Microsoft Remote Desktop正式版

Microsoft Remote Desktop 是一款由微软开发的远程桌面控制软件。它允许用户通过互联网连接到远程计算机,从而可以在本地计算机上访问和控制远程计算机的桌面、文件和应用程序。 下载地址:https://www.macz.com/mac/1004.html?idOTI2NjQ5Jl8mMjcuMTg2Lj…

x264 码率控制 MBtree 原理:mbtree_propagate_list 函数分析

mbtree_propagate_list 函数功能 是视频编码中宏块树传播算法的一部分,用于在编码决策过程中更新参考帧的传播成本。这个过程特别关注于如何处理运动向量(Motion Vectors, MVs)以及如何根据这些MVs对参考帧的成本进行加权,从而影响最终的编码选择。 该函数作为x264编码器…

深入理解Linux系统管理与网络配置高级指南

深入理解Linux系统管理与网络配置高级指南 目录 深入理解Linux系统管理与网络配置高级指南 一、Linux文件系统管理 二、Linux进程管理 三、Linux系统管理 四、Linux网络管理 五、Linux磁盘管理 一、Linux文件系统管理 1.1 文件和目录操作 在Linux中,一切皆…

React 组件三大核心之 ref

文章目录 用法React.createRef()useRef Hook 注意 ref 是 React 中的一个重要概念,它用于访问和操作 DOM 元素或者类组件实例。 在React中,ref 提供了一种方式,允许我们访问DOM节点或在render方法中创建的React元素。这对于执行DOM操作、读取…

Servlet的request对象

request对象的继承关系 1.HttpServletRequest接口继承了ServletRequest接口,对其父接口进行了扩展,可以处理满足所有http协议的请求 2.HttpServletRequest和ServletRequest都是接口,不能创建对象,因此在tomcat底层定义实现类并创…

modbus开源库libmodbus的C语言使用记录(实现简单的modbus主机/丛机程序,解决libmodbus库安装出现的问题)

libmodbus简介 libmodbus 是一个开源的、跨平台的C库,用于实现Modbus通讯协议。它支持Modbus RTU(RS-232/485)和Modbus TCP协议,可以使开发者方便地在项目中集成Modbus通讯功能。libmodbus的设计目标是简单、灵活和高效,适用于各种大小的嵌入式和桌面应用。 编译运行测试…

filter is not a function

"filter is not a function" 这个错误通常意味着你尝试在一个不支持 .filter() 方法的对象上调用这个方法。在JavaScript中,.filter() 是一个数组(Array)的内置方法,用于创建一个新数组,其包含通过所提供函数…