[关闭]
@Chiang 2020-05-16T18:48:30.000000Z 字数 2635 阅读 531

Computer system roaming

C语言 2020-05


  • 写在前面,我觉得视野很重要,有一个全局的世界观,这样才不会迷茫,才能体会到当下做的事情具有的意义

示例代码 hello.c

  1. # include <stdio.h>
  2. int main()
  3. {
  4. printf("hello, world\n");
  5. return 0;
  6. }

信息就是位+上下文

首先不同的上下文是如何规范的可以参考下面链接,这里我就不整理了:
字符编码笔记:ASCII,Unicode 和 UTF-8
Unicode字符平面映射

  • hello 程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件, 文件名是hello.c.
  • 源程序实际上就是一个由值01组成的(又称为比特)序列,8个位被组织成一组,称为字节.每个字节表示程序中的某些文本字符.
  • 大部分的现代计算机系统都使用ASCII标准来表示文本字符.这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符.
  • hello.c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件.

基本思想:

系统中所有的信息--包括磁盘文件、内存中程序、内存中存放的用户数据以及网络上传输的数据,都是由一串比特表示的.区分不同数据对象的唯一方法是我们读到这些数据对象是的上下文.

程序被其他程序翻译成不同的格式

  • 要在系统上运行hello.c程序,每条C语句都必须被其他程序转化为一系列的低级机器语言指令.
  • 然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来.目标程序也称为可执行目标文件.

编译系统

在 Unix 系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:

  1. linux > gcc -o hello hello.c

GCC 编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello.这个翻译过程可分为四个阶段完成.
执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统.

hello.i 修改了的源程序hello.s 汇编程序printf.o hello.o 可重定位目标程序hello.c 源程序预处理器 cpp编译器 cc1汇编器 as链接器 ldhello 可执行目标程序
  • 预处理阶段: 引入头文件内容
  • 编译阶段: 转成汇编语言
  • 汇编阶段: 转成二进制文件
  • 链接阶段: 调用C库函数

处理器读并解释存储在内存中的指令

  1. # shell 命令行执行
  2. ./hello

系统的硬件组成

硬件组成

  • 总线
  • I/O设备
  • 主存
  • 处理器

运行hello程序

从键盘上读取hello命名

从键盘上读取hello命名

操作系统管理硬件

操作系统管理硬件

操作系统有两个基本功能:

  • 防止硬件被失控的应用程序滥用
  • 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备.

操作系统通过几个基本的抽象概念(进程,虚拟内存和文件)来实现这两个功能.

  • 文件是对I/O设备的抽象表示
  • 虚拟内存是对主存和磁盘I/O设备的抽象表示
  • 进程则是对处理器、主存和I/O设备的抽象表示.

系统之间利用网络通信

网络通信

我们一直把系统视为一个孤立的硬件和软件的集合体.实际上,现代系统经常通过网络和其他系统连接到一起.从一个单独的系统来看,网络可视为一个I/O设备.

有趣的短视频:
网络的诞生就是一场战争
跟着网络勇士们学习网络数据传输

计算机系统中抽象的重要性

计算机系统中抽象的重要性

  • 文件是对I/O设备的抽象
  • 虚拟内存是对程序存储器的抽象
  • 进程是对一个正在运行的程序的抽象
  • 虚拟机是对整个计算机的抽象,包括操作系统、处理器和程序.

参考资料:
深入理解计算机原理
字符编码笔记:ASCII,Unicode 和 UTF-8
Unicode字符平面映射
基本步骤与编程机制
网络的诞生就是一场战争
跟着网络勇士们学习网络数据传输

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注