跳转至

Lecture 1: Course Overview and Computer Organization

本页统计信息
  • 本页约 1390 个字, 11 行代码, 预计阅读时间 5 分钟。

  • 本页总阅读量

1. Introduction

这门课是布朗大学的CSCI300课程,课程名为Fundamentals of Computer Systems,主要讲一些计算机系统领域的入门知识。这门课的内容可以概括为以下四个部分: 1. 计算机系统基础 2. 操作系统基础 3. 并发和并行计算 4. 分布式系统

2. 计算机的组成

Q:为什么要讲这些内容? A:在现实世界中,处理器时间和内存是有开销的。像Facebook、谷歌或Airbnb这样的公司每年在其计算基础设施上花费数十亿美元,并不断购买更多的服务器。要想很好地利用它们,需要的不仅仅是快速的算法--内存中良好的数据组织可以使算法比糟糕的算法运行得更快,并节省大量的成本。为了理解为什么某些数据结构比其他结构更适合一项任务,我们需要研究计算机,特别是其内存是如何组织的。

从物理意义上来说,计算机就是由各种金属、塑料、玻璃、硅等材料组合而成的,这些材料本身没有所谓的“智能”,计算机能够帮助使用者实现各种各样的功能,是因为计算机中有大量的系统基础设施确保计算机能够正常地工作。本课程一个重要主题是更好地理解这种 "神奇 "的基础设施是如何工作的。 计算机中的核心组件主要有: - CPU,包含一个或者多个处理器,可以执行程序 - Memory,内存,是计算机存储的一种形式,并且也是CPU中的处理器可以直接访问的唯一一种数据存储形式 - Devices,各种设备,比如硬盘和SSD,可以存储计算机中的数据,比如鼠标和键盘,方便与外界进行交互 我们重点要关注的是内存,一台计算机的内存就像一连串的邮箱,每个邮箱对应了一个0到255的数字,可以用8bit,也就是1byte来表示,如果一套计算机有M bytes的内存,那么按照上面的比喻就有M个邮箱,分别编号为0到M-1,这个编号就是邮箱的地址,我们在访问内存的时候,通过一个具体的地址来访问那个地址所对应的数据。 我们在程序中使用的所有变量和数据结构,以及在计算机上运行的所有代码,都需要存储在这些字节大小的内存中。如何使用内存,将对代码和数据的安全已经性能产生非常大的影响。 那么计算机如何表示更大的数字(超过255)呢?计算机通过将若干个相邻位置上的bytes解释为一个数字来实现,比如2个相邻的字节是一个short类型的值,4个相邻的字节是一个int类型的值。这样一来内存能表示的数字就远远不止0-255了。

3. 如何解释内存中的字节

内存是计算机中唯一可以存储信息的地方,内存中的信息以字节的形式存储。根据软件程序的需要,这些字节可以被解释为程序代码,数据(整数,字符串,图像等等),或者元数据(Meta-data),了解复杂的程序如何归结为字节,将有助于调试程序,并理解它们的行为方式。 那么计算机是如何知道内存中的哪些字节是排在一起,可以一起被解释为某种数据的呢?答案是计算机并不知道,同一个字节可能意味着不同的东西,这取决于程序如何选择来解释这几个字节。 而计算机程序,实际上也是存放在内存中的字节,这时候,CPU会把代码对应的这些字节解释为机器码。

这里课程一个例子展示了C语言代码编译成.o文件后的机器码,具体如下:

addf.o:     file format elf64-x86-64

Disassembly of section .text:

0000000000000000 :
   0:   8d 04 37                lea    (%rdi,%rsi,1),%eax
   3:   c3                      retq
        ^                       ^
        | bytes in file         | their human-readable meaning
        | in hexadecimal        | (not stored in the file; objdump generated this)
        | notation

addf.c里面的函数被编译成了addf.o文件,这个二进制文件就包含了四个byte,分别是8d 04 37 c3,当这个函数被运行起来的时候,这些字节会被存放在内存的某处,处理器(即一块芯片)会读取这些字节并将其解释为下一步要做的指令。

4. 指针

内存中的这些box不仅可以存储数据,也可以存储其他box的地址,这样的box我们称之为指针,因为它指向了另一块内存。 C语言提供了&符号来获取任何变量的地址。如果你有一个变量local,写&local就可以得到存储local的内存盒的地址。我们可以定义指针让它们指向某个特定的地址,然后就可以通过这个指针来访问地址所对应的这段内存。指针本身需要占据8字节的内存,这8个字节就是用来存储地址的。 在定义指针的时候,旁边有星号的类型是指针类型。在使用指针的时候,&接收一个对象的地址并制作一个指针,*解除对一个指针的定义并跟随它到它在内存中所指的值。

颜色主题调整

评论区~

有用的话请给我个star或者follow我的账号!! 非常感谢!!
快来跟我聊天~