【OSTEP】Introduction:操作系统介绍 | 程序运行时会发生什么?

简介: 【OSTEP】Introduction:操作系统介绍 | 程序运行时会发生什么?

💭 写在前面

本系列博客为复习操作系统导论的笔记,内容主要参考自:

  • Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy PiecesA. Silberschatz, P. Galvin, and G. Gagne,
  • Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

0x00 引入:程序运行时会发生什么?

" 一个正在运行的程序会做一件非常简单的事情:执行指令 "

处理器从内存中获取(fetch)一条指令,对其进行解码(decode),然后执行。完成这条指令后,处理器继续执行(execute)下一条指令,以此类推直到程序最终完成:

当然了,现代处理器为了让程序运行的更快,在这背后做了很多骚操作。比如一次性执行多条指令,甚至扰乱执行顺序执行并完成它们,为了让程序运行的更快处理器不择手段,只要能让程序运行得更快,其目的也就达到了。但这并不是我们关心的问题,我们只关心大多数程序所假设的简单模型 —— 指令似乎按照有序和顺序得方式逐条执行。

这样,我们就描述了冯诺依曼计算机模型的基本概念。如果只是反复做以上三件事,那这看上去似乎很简单。但是为了让系统更易于使用,一个程序运行的同时其实还有很多疯狂的事情也在同时进行!

操作系统也是软件,操作系统就是负责让程序运行起来更容易、同时运行多个程序、允许程序共享内存、让程序能够与设备交互等一系列有趣的工作的载体。这就是操作系统(Operating System, OS)。

操作系统的另一个早期名称叫监管程序(super visor),也叫主控程序(master control program),其实叫这样的名字能更容易突出它是一款软件,理解他在做什么 —— 监管程序的软件、主要控制程序的软件。但最后大家还是去叫他 Operating System —— 操作系统的软件,这么一看似乎也挺合理的。

运行程序执行的指令:

  • fetch Instruction:
  • Decode:
  • Get Data:
  • Excute instruction:

0x01 操作系统的作用

操作系统是一种在计算机用户之间起媒介作用的程序(或程序)和计算机硬件。

操作系统负责的事:

Making it easy to run programs - 使得运行程序变得容易。

Allowing programs to share memory - 允许程序共享内存。

Enabling programs to interact with devices - 使程序能够与设备交互。

🔺 总结:OS is in charge of making sure the system operates correctly and efficiently(操作系统负责确保系统正确、有效地运行)

OS provides various services for programs to run (操作系统为程序运行提供各种服务)。

0x02 如何使用操作系统

System Call(系统调用)允许用户告诉操作系统要做什么(服务)。

  • 操作系统提供了一些接口(API、标准库)。
  • 一个典型的操作系统输出几百个系统调用。
  • 运行程序、访问内存、访问设备等。

📚 概念:The OS is a Resource Manager - 操作系统是一个资源管理器。

操作系统可以:

  • 让你同时跑多个程序 → Sharing the CPU(CPU共享)。
  • 让许多程序同时访问自己的指令和数据 → Sharing Memory(共享内存)。
  • 让许多程序访问设备 → Sharing disks(共享磁盘)。

为了实现共享,操作系统将物理资源虚拟化(To implement sharing, the OS virtualizes physical resource)。

0x03 操作系统是一个虚拟机

The OS takes a physical resource and transforms it into a virtual form of itself.

操作系统利用物理资源,将其转化为自身的虚拟形式。

有时,我们可以把操作系统当作是一个虚拟机:

0x04 CPU虚拟化

系统有非常多的虚拟CPU,我们可以把一个CPU变成一个看似无限多的CPU,允许许多程序貌似同时运行。  → CPU虚拟化

A program that loops and prints (cpu.c):

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <assert.h>
#include "common.h“ // Contains Spin() function
int main(int argc, char *argv[])
{
 if (argc != 2) {
 fprintf(stderr, "usage: cpu <string>\n");
 exit(1);
 }
 char *str = argv[1];
 while (1) {
 Spin(1); // Repeatedly checks the time and returns once it has run for a second
 printf("%s\n", str);
 }
 return 0; 
}

🚩 运行结果如下:

尽管我们只有一个处理器,这四个程序似乎都在同时运行!这都归功于操作系统将CPU虚拟化了!

0x05 虚拟化内存(Virtualizing Memory)

物理内存是个字节数组

一个程序将其所有数据结构保存在了内存中:

  • 读取内存 - Read memory (load)指定一个地址,以便访问数据。
  • 写入内存 - Write memory (store)指定要写到给定地址的数据。

🚩 运行结果1:

新分配的内存在地址00200000处,它更新数值并打印出结果。

每个运行的程序都有其私有内存(own private memory)。

  • 每个运行的程序都在相同的地址上开辟内存空间。
  • 他们似乎都在独立更新 00200000 的值。

0x06 虚拟内存空间

每个进程都有其自己的虚拟内存空间 - virtual address space (VAS)

操作系统将虚拟地址空间映射到物理内存上。一个正在运行的程序中的内存引用并不影响其他进程的地址、其他进程的地址空间。物理内存是一种共享资源,由操作系统管理。

0x07 并发的问题(The Problem of Concurrency)

操作系统会立即决议许多事情,决定先跑谁,后跑谁……

现代的多线程程序也显现了并发性问题,多线程是指一个进程中的控制流可以同时运行。

A Multi-threaded Program (thread.c):

循环决定了两个任务在一个循环中各自增加多少次共享计数器。

❓ 怎会如此?

增加一个共享计数器(counter++)→ 需要三条指令。

1. 将计数器的值从内存加载到寄存器(reg ← 内存)。

2. 增加它(reg ← reg + 1)。

3. 将其存回内存(memory ← reg)。

这三条指令不是原子执行的(也就是交错执行)。

→ 发生并发的问题。

操作系统提供了一个机制来处理这个问题。

0x08 持久性(Persistence)

像DRAM这样的设备以易失性(volatile)的方式存储数值,需要硬件和软件来持久地(persistently)存储数据。

与CPU和内存不同,操作系统不会为每个应用程序创建一个私有的、虚拟化的磁盘。

相反,它假定用户会想要共享文件中的信息。

❓ 操作系统对持久性有什么作用?

What OS does in order to write to disk?

Figure out where on disk this new data will reside.

Issue I/O requests to the underlying storage device with a device driver.

File system handles system crashes during write.

Journaling or copy-on-write.

Carefully ordering writes to disk to ensure that if a failure occurs during the write sequence, the system can recover to reasonable state afterwards

为了向磁盘写入,操作系统会做什么?

  • 弄清新数据在磁盘上的位置。
  • 用设备驱动程序向底层存储设备发出I/O请求。

文件系统在写入时处理系统崩溃。

  • 写入日志或写时拷贝。
  • 谨慎地安排写入磁盘的顺序,以确保如果在写入序列中发生故障,系统可以恢复到
  • 写入序列时发生故障,系统可以在事后恢复到合理状态

0x09 文件系统(What is File System?)

操作系统设计目标(OS Design Goals):

建立抽象(abstraction)

  • 使系统更方便使用。

提供高性能(performance)

  • 将操作系统的开销降到最低。
  • 操作系统要在保持没有过多开销的前提下提供虚拟化。

保护(Protection)

  • 高度的可靠性

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.9.5
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces

A. Silberschatz, P. Galvin, and G. Gagne,

Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

相关文章
|
Shell Linux
Linux操作系统实验七 Shell编程之循环程序编程(下)
Linux操作系统实验七 Shell编程之循环程序编程(下)
173 0
|
Java Linux Windows
在Windows操作系统上运行Java程序
在Windows操作系统上运行Java程序
119 2
|
1月前
|
Web App开发 Shell Linux
MacOS环境-手写操作系统-41-mem 第一个控制台程序
MacOS环境-手写操作系统-41-mem 第一个控制台程序
17 1
|
1月前
|
小程序 iOS开发 MacOS
MacOS环境-手写操作系统-44-运行简单的程序
MacOS环境-手写操作系统-44-运行简单的程序
22 0
|
存储 缓存 Linux
【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
【看表情包学Linux】冯诺依曼架构 | 理解操作系统 | 基于 Pintos 实现新的用户级程序的系统调用
112 1
|
6月前
|
存储 程序员
操作系统(10)----从写程序到程序运行
操作系统(10)----从写程序到程序运行
64 1
|
Shell Linux
Linux操作系统实验七 Shell编程之循环程序编程(中)
Linux操作系统实验七 Shell编程之循环程序编程(中)
135 0
|
6月前
|
Shell Linux 开发工具
操作系统(Linux)外壳程序shell 、用户、权限
操作系统(Linux)外壳程序shell 、用户、权限
|
前端开发 安全 Go
在Mac OS X上运行Go语言的GUI程序
在Mac OS X上运行Go语言的GUI程序
383 3
|
Shell Linux Go
《Linux操作系统编程》第七章 shell的交互功能: 了解shell的启动过程,shell的功能,shell的命令形式,shell程序的建立和运行,理解管道和重定向,环境变量和系统变量以及变量引用
《Linux操作系统编程》第七章 shell的交互功能: 了解shell的启动过程,shell的功能,shell的命令形式,shell程序的建立和运行,理解管道和重定向,环境变量和系统变量以及变量引用
108 0
下一篇
无影云桌面