CS基础

avatarplhDigital nomad

c语言 hello world 经历的几个生命周期

#include <stdio.h>

int main()
{
  printf("hello world\n");
  return 0;
}
  • hello.c - 源程序文本
  • 🔽预处理器(CPP)🔽 可以将第一行的代码#include <stdio.h>直接插入文本
  • hello.i - 修改了源程序(文本)
  • 🔽编译器 (CCL)🔽 转成汇编程序
  • hello.s - 汇编程序
  • 🔽汇编器 (as)🔽 转二进制
  • hello.o - 可重定位目标程序(二进制)
  • 🔽链接器 (ID)🔽 将内置库函数 例如 printf, 打包进入程序
  • hello - 可执行目标程序(二进制)

系统硬件构成

  • 总线
  • I/O设备
  • 主存 临时存储设备 , 也就是动态随机存储器芯片集合
  • 中央处理器 - CPU 用于解释或执行存储在主存中的指令的引擎.从通电开始,处理器一直在执行程序计数器指向的指令,再更新计数器,使其指向下一条指令,处理器看似一下简单操作,如下:
    • 加载:从主存中复制一个字节到寄存器,以覆盖原来寄存器的内容.
    • 存储:从寄存器中复制一个字节到主存中,覆盖这个位置上原来的内容,
    • 操作:将两个寄存器中的内容复制到ALU中,对这两个进行计算, 并把结果覆盖其中一个寄存器中的内容
    • 跳转:从指令本身抽取一个字,并把这个字复制到程序计数器(PC)中,以覆盖原来PC中的值 看似简单的过程,其实有很多优化处理,来使它加速

hello world 的c程序执行 ./hello.c

  • 1.从硬盘中复制到主存,

  • 2.处理器开始处理主存中的程序的机器语言指令,

    • 1.主储存器
    • 2.内存总线
    • 3.I/O桥
    • 4.系统总线
    • 5.总线接口
    • 6.寄存器文件
    • 7.ALU来计算寄存器中的运算
    • 8.总线接口
    • 9.系统总线
    • 10.I/O桥
    • 11.I/O总线
    • 12.显示屏

缓存的重要性

第一个联想到的自然是内存条,但其实内存条,但其实CPU也有存储器,其实硬盘也是存储器的一种,网络文件,类似于图床也是一种存储器,由上到下,分成了7个级别

  • L0: 寄存器
  • L1: L1高速缓存
  • L2: L2高速缓存 SRAM - static + random - access -memory - 静态随机存储器
  • L3: L3高速缓存 SRAM - static + random - access -memory - 静态随机存储器
  • L4:主存DRAM - 动态随机存储器
  • L5:本地硬盘
  • L6:远程存储 - web服务器

其中,高一层是低一层的高速缓存, 但是其实,cpu有自己的随机存储器 ROM - read-only-memory, 只读存储器

进程的虚拟地址空间

  • 内存虚拟内存 : 用户不可访问
  • 用户栈 - 运行时候创建
  • 共享库内存映射区域
  • 运行堆
  • 读写数据
  • 只读代码和数据

并发和并行

  • 单处理器
  • 多核处理器 将多个核(多个芯集成到一个电路芯)
  • 超线程处理器 允许一个CPU同时执行多个进程,比如i7就是超线程处理器,所以4核理论上可以并行执行8个线程,超线程可以在单个周期的基础上决定应该执行哪个进程,这使得计算机能更好的利用资源,当然,前提是,这个程序是写成多线程的,

抽象

抽象是一个重要的概念,程序底层运行很复杂,比如"+",但是实际通过指令操作,简化了,比如封装一个函数,

  • 文件是对I/O设备的抽象
  • 虚拟内存是对程序储存器的抽象
  • 进程是对一个正在运行的程序的抽象.,
  • 虚拟机是对整个计算机的抽象

网络

其实就是一种的I/O设备

信息的表示和处理

二进制构成的数字王国

信息存储

大多数机器使用8位的块,或者字节,来作为最小的可寻址的内存单位,而不是访问内存中单独存在的单位,,机器级程序将内存视为一个庞大的数组,-虚拟内存,实际上就是将动态随机访问存储器,(DRAM),闪存,磁盘存储器,特殊硬件和操作系统软件结合在一起,为程序提供一个看上去统一的字节数组.C中的指针就是指向内存中某个存址,,虽然C维护这这类型信息,但是,他生成的机器级程序并不包含数据类型的信息,..每个程序都可视为单个字节块,而程序就是一个字节序列.

给C初学者的提示, - C语言中指针的作用

它提供了引用数据结构的元素的机制,,与变量类似,指针不是变量,指针有两个方面,值和类型,它的值表示某个对象的位置,它的类型表示那个位置上存储对象的类型,比如整数和浮点数, 真正想理解指针,需要在机器及上的表现和实现.

十六进制 - 即Hex码

10进制和2进制交互困难, 事实上,一个字节由8位组成,,二进制中表示方法即是,0000000011111111,当然如果看成十进制 0 ~ 255,当然用16进制表示就简单了,00FF

序号12345678910111213141516
二进制0000000100100011010001010110011110001001101010111100110111101111
十进制0123456789101112131415
十六进制0123456789ABCDEF

在C中,0x开头的就是16进制数.FA1D37B 也写成 0XFA1D37B,事实上,2进制,16进制互转很简单.

字数据大小

字长大小决定虚拟空间大小 0-2^w-1 范围 最近的32位字长限制虚拟空间为4GB, 而64位的虚拟空间地址为16EB,大约是1.84X10^19字节,同时64位机向下兼容32位

逻辑门 三种基本逻辑 与门 或门 非门

与逻辑 &

01
000
101
a&b

串联电路图 image

或逻辑 |

01
001
111
a|b

并联电路图 image

非逻辑 !

01
10
!a

image

更高级的

异或门 只有当两个逻辑 不一样的时候才为true

01
001
110
// 这个利用 | & 逻辑结合实现
const xor = (a, b)=> (a|b) & (!(a&b))
// 简单来说 就是 利用
0,1   &   !(0,0)  =>     0,1
1,1    &   !(0,1)  =>     1,0

一位数的全加法机

0+0
0+1
1+0
1+1

image

三位数的全加法机呢???

...把一系列的一位数加法器串联就得出全家发机

溢出咋办,,,

减法呢

乘法...

除法/余数呢

Reference

深入理解计算机系统 芯片内部是如何实现加法运算的?模拟信号和数字信号有什么区别?李永乐老师讲解门电路 编码