“深入理解计算机系统”小组学习的Task01-学习日志



前言

本文章为天池“深入理解计算机系统”小组学习的Task01-学习日志,旨在初步了解程序执行过程中所涉及的编译系统、硬件架构、操作系统管理等。


一、编译系统

在这里插入图片描述

1.工作流程

在这里插入图片描述

2.流程步骤定义

  • 预处理器:以 # 开头的代码,来修改原始程序。程序中引入了头文件,预处理器会读取该头文件中的内容,将其中的内容直接插入到源程序中,结果就得到了另外一个 C 程序。

  • 编译:编译器将 X.i 文件翻译成X.s 文件,包括词法分析、语法分析、语义分析、中间代码生成以及优化等中间操作。

  • 汇编:根据指令集将汇编程序 X.s 翻译成机器指令,并将机器指令按照固定的规则进行打包,得到可重定位目标文件 X.o 。该文件为二进制的文件,但不被执行,需进行链接。

  • 链接:负责把 X.o 和 printf.o 按照一定规则进行合并。X.o 被称之为可重定位目标文件。其中,调用了 printf 函数,这个函数是标准 C 库中的一个函数,存储在名为 printf.o 的文件中。最终经过链接阶段可以得到可执行目标文件 X。

二、硬件架构

在这里插入图片描述

1.硬件架构组成

1.1硬件架构图

在这里插入图片描述

1.2.CPU 架构

1.2.1.CPU 定义
  • 中央处理单元(CPU):也称处理器,包含 PC ( 程序计数器: Program Count )、寄存器堆(Register file)、 ALU(算数/逻辑计算单元:Arithmatic/logic Unit)三个部分。
1.2.2.CPU内部结构
  • 程序计数器 PC: 是一个 4 字节或是 8 字节的存储空间,里面存放的是某一条指令的地址。处理器不断执行PC 指向的指令,然后更新 PC,使其指向下一条要执行的指令。执行顺序不一定为相邻命令。
  • 寄存器: 临时存放数据的空间,会存在数据覆盖。
  • 算数/逻辑计算单元 ALU: 计算速度极快,且专攻算数与逻辑的计算,计算机核心部分。

1.3.内存

  • 主存:也称为内存、运行内存,处理器在执行程序时,内存主要存放程序指令以及数据。从物理上讲,内存是由随机动态存储器芯片组成;从逻辑上讲,内存可以看成一个从零开始的大数组,每个字节都有相应地址.

1.4.总线

  • 总线:内存和处理器之间通过总线来进行数据传递。总线负责将信息从一个部件传递到另外一个部件。通常总线被设计成传送固定长度的字节块,也就是字(word),根据系统不同,可分为32 位的机器(一个字长是 4 个字节)和64 位的机器(一个字长是 8 个字节)。

1.5.输入输出设备

  • 定义:例如键盘、鼠标等。每一个输入输出设备都通过一个控制器或者适配器与IO 总线相连。
  • 控制器与适配器区别:封装方式,无论是控制器还是适配器,其功能都是在 IO 设备与 IO 总线之间传递数据.

2.程序在架构中的执行流程

2.1.流程步骤

  1. 键盘输入”./hello” 的字符串,shell 程序会将输入的字符逐一读入寄存器,处理器会把 hello 这个字符串放入内存中。
  2. 完成输入,按下回车键时,shell 程序明确完成输入,然后执行后续指令来加载可执行文件hello。
  3. 指令将 hello 中的数据和代码从磁盘复制到内存。复制的过程将利用 DMA(Direct Memory Access)技术,数据可以不经过处理器,从磁盘直接到达内存。
  4. 当可执行文件 hello 中的代码和数据被加载到内存中,处理器就开始执行 main函数中的代码。

2.2.流程步骤图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.设备容量

  • 大容量的存储设备的存取速度要比小容量的慢,运行速度更快的设备的价格相对于低速设备要更贵。存储容量越小,速度越快,价格越高.

4.存储设备的层次结构

  • 针对处理器和内存之间的差异,系统设计人员在寄存器文件和内存之间引入了高速缓存(cache)。一般有三级高速缓存,分别为 L1 cache , L2 cache 以及 L3 cache。
    在这里插入图片描述

三、操作系统管理硬件

1.操作系统的作用

  • 无论是shell程序还是hello程序都没有直接访问键盘、显示器等硬件设备,真正操挫硬件的是操作系统,可以把操作系统看成是应用程序和硬件之间的中间层,所有的应用程序对硬件的操作必须通过操作系统来完成。
  • 作用:1. 防止硬件被失控的应用程序滥用
    2.提供统一的机制来控制这些复杂的底层硬件
  • 文件:文件是对 IO 设备的抽象;虚拟内存是对内存和磁盘 IO 的抽象;进程是对处理器、内存以及 IO 设备的抽象。

在这里插入图片描述

2.程序在操作系统中的进程

在这里插入图片描述

  1. shell等待合行输入指令
  2. 在shell进程加载hello进程,shell通过系统调用来执行请求,系统调用会将控制权从 shell 进程传递给操作系统,操作系统保存 shell进程的上下文,然后创建一个新的 hello 进程及其上下文,然后将控制权转交给新的 hello 进程。
  3. hello 进程完成后,操作系统就会恢复 shell 进程的上下文,并转回shell。整个进程均有操作系统参与。

四、虚拟内存

1.定义

  • 虚拟地址空间:操作系统为每个进程提供了一个假象,每个进程均独自占用整个内存空间,且内存一样。

2.结构

在这里插入图片描述

  • 由下至上,地址增大;
  • 最底层为0地址,该区域区域是用来存放程序的代码和数据的,该区域的内容是从可执行目标文件中加载而来的;
  • 顺着地址增大的方向,继续往上看就是堆(heap);
  • 之后为共享库的存放区域,这个区域主要存放像 C 语言的标准库和数学库这种共享库的代码和数据;
  • 再向上为用户栈,函数调用的本质就是压栈;
  • 最顶部的区域为内核保留的区域,应用程序代码不能读写这个区域的数据,也不能直接调用内核中定义的函数,该区域对应用程序是不可见的。

3.利用网络通信的流程

在这里插入图片描述


五、系统加速

1.定义与假设

  • 任务 (task):并行计算所处理的对象.
  • 工作量 (workload):处理某任务的所需的各种开销的总和.
  • 处理器 (processor):并行计算中所使用的最基本的处理器单元.
  • 执行率 (execution rat):每个处理器单位时间能完成的工作量.
  • 执行时间 (execution time):处理某任务所需的时间.
  • 加速比 (scalability):当处理器个数增多时,完成某固定工作量任务所需执行时间的减少倍数.
  • 理想加速比 (ideal scalability):处理器个数增多的比例.
  • 并行效率 (parallel effciency): 加速比 ÷ 理想加速比 ×100%.

2.阿姆达尔定律

  • 记 α ∈ [0, 1] 是某任务无法并行处理部分所占的比例. 假设该任务的工作量固定,则对任意n个处理器,相比于1个处理器,能够取得的加速比满足:S(n) < 1/α.

3.古斯塔法森定律

  • 记 α ∈ [0, 1] 是某任务无法并行处理部分所占的比例. 假设该任务的工作量可以随着处理器个数缩放,从而保持处理时间固定. 则对任意 n 个处理器,相比于 1 个处理器,能够取得的加速比 S(n) 不存在上界.

4.孙-倪定律

  • 记 α ∈ [0, 1] 是某任务无法并行处理部分所占的比例. 假设该任务的可并行部分随着处理器个数 n 按照因子 G(n) 缩放,则对任意 n,相比于 1 个处理器,能够取得的加速比S∗(n) 满足:
    在这里插入图片描述

5. 三定理关系

在这里插入图片描述


六、并发和并行

1.获得更高的计算能力三种途径

  1. 线程级并发: CPU 内部,像程序计数器类型的硬件部件有多个备份,而像浮点运算部件类型硬件还是只有一份,常规单线程处理器在做线程切换时,需要较长周期,而超线程处理器可以在单周期的基础上决定执行哪一个线程,CPU 可以更好利用处理资源。当一个线程读取数据进入等待状态时,CPU 可以去执行另外一个线程,其中线程之间的切换只需要极少的时间代价。
  2. 指令级并行:现代处理器可以同时执行多条指令的属性称为指佘级并行,近几年的处理器可以保持每个周期 2 4 条指令的执行速率。
  3. 单指令多数据并行:允许一条指令产生多个并行的操作,这种方式称为单指令多数据(Single Instruction Multiple Data)。SIMD 的指令多是为了提高处理视频、声音这类数据的执行速度。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值