1. hello程序的生命周期是从一个源程序(或源文件)开始的。
  2. 数字的机器表示方式,与实际的整数和实数是不同的。它们是对真值的有限近似值。

C语言的起源

c是贝尔实验室的Dennis Ritchie创建的的。起初是为了减少汇编代码的编写量。

  1. 大部分Unix内核以及所有的支撑工具和函数库都是用c编写的。

程序的编译

gcc编译c源文件的过程有:

  1. 预处理:根据#开头的命令,修改c程序。如把#include的h文件插入到程序文本中。最终得到一个以.i结束的文件。
  2. 编译:将i文件翻译成s文件。s文件包含了一个汇编语言程序。
  3. 汇编:汇编器as将s文件翻译成机器语言指令,并把这些指令打包成一个叫做可重定位目标文件的格式(o文件)。o文件是一个二进制文件。
  4. 链接:把o文件链接在一起。如hello程序中用到了printf,就把printf.o(预编译好的)和hello.o(上一步生成的)合并,形成最后的可执行文件hello

gnu项目

gcc是gnu(GNUL'S NOT UNIX)(有Richard Stallman发起的开源项目)的开发出来的工具之一。现代开放源码运动的思想起源是GNU项目中的自由软件概念(自由并不是说免费)。

了解编译的好处

  1. 优化程序性能
  2. 理解链接时出现的错误
  3. 避免安全漏洞(注:避免写成减少可能更好)

系统的硬件组成

  1. 总线:电子管道,用于携带信息字节,负责在各个部件间传递数据。通常被设计成传送定长的字节块,也就是字
  2. io设备:系统与外部世界的连接通道。常用的io设备有鼠标、键盘、显示器、磁盘。每个io设备都有一个控制器/适配器adapter。
  3. 主存:临时存储设备,用于存放程序和程序需要处理的数据。主存一般有动态随机存取存储器(DRAM)组成。是一个线性的字节数组。每个字节都有唯一的地址(从零开始)。
  4. 处理器cpu:核心是一个大小为一个字的存储设备(寄存器),即程序计数器pc。pc指向主存中某条机器语言的指令地址。cpu的工作:

    • 读指令
    • 解析指令
    • 加载数据,执行操作,存储结果
    • 更新pc(可能是加一,或者更新到指定值)

处理器看上去是它的指令集架构的简单实现。实际上当然是复杂的多。

缓存

高速缓存存储器(cache)的提出是为了解决cpu和主存的速度问题。cache将cpu常用、将要用到的数据、指令从主存加载到自己处,然后cpu读取cache的数据即可。为了更好的实现缓存功能,人们还实现了多级缓存。高级缓存比低级缓存快,但同时存储空间也相对小。

操作系统管理硬件

os有两个基本功能:

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

os通过几个抽象概念来实现这两个功能:进程、虚存、文件

Unix的层次文件系统、作为用户级进程的shell概念,都是从Multics(上世纪60年代的一个较为成功的系统)来的。后来加州大学的伯克利分校增加了虚存和internet协议,称为BSD(Berkeley software distribution)。后来很多厂商加入了一些其他的功能,但是不同产商的特性通常不兼容,为了解决这个问题,Richard Stallman和ieee标准化了Unix的开发。这个标注称为posix。

进程

进程是os对一个正在运行的程序的抽象。一个os可以同时运行多个进程(并发运行),是通过上线文切换来实现的(系统保持跟踪进程运行所需的所有状态信息,这种状态,就是上下文)。

内核不是一个独立的程序,它是系统管理全部进程所用代码和数据结构的集合。

线程

一个进程可以有多个线程(至少一个)。每个线程运行在进程的上下文中,共享进程的代码和全局数据,同时每个线程有自己的上下文。

线程分为内核级和用户级两种。

虚存

os为进程提供一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的。

  • 地址空间的最上面的区域是留给操作系统中的代码和数据的,这对所有进程来说都是一样的。空间底部存放用户进程定义的代码和数据。
  • 程序代码和数据:代码从一固定地址开始,接着是和c全局变量相对应的数据位置。
  • 堆:运行时通过malloc申请的空间,通过free释放。堆的地址是向上增长的
  • 栈:调用函数和导致栈增长,函数返回则栈收缩。通常的栈溢出,说的就是这个。(JVM除外,java有自己的栈)
内核
---------
用户栈
---------
共享库的内存映射区域
---------

---------
运行时堆
---------
读写数据
---------
只读代码和数据(程序开始的位置,注意,不是从0开始的喔)
---------
0

文件

文件就是字节序列,仅此而已。io设备都可以看成是文件,里面的数据就是字节序列。系统的输入输出都是通过使用一组称为Unix io的系统函数调用读写文件来实现的。

1991年,Linus Torvalds谨慎地发布一个新的类unix os内核,后来逐渐发展称为一个技术和文化现象。

网络通信

网络可以视为一个io设备。网络通过一个适配器,作为io介入计算机。

其他概念

  • 并发、并行
  • 超线程
  • 指令级并行:流水线
  • simd:单指令多数据

原文:https://blog.givenzeng.cn/book/computer_system/chapter_1/


曾纪文
201 声望22 粉丝