zoukankan      html  css  js  c++  java
  • 计算机系统漫游

    前言

    • 计算机能运作,是基于硬件和软件来运行程序,系统会追着时间方式不断变化,但是内在的概念基本不会改变,所以单纯的学习新的工具,短期内收益增加会明显,但是长期来看,缺乏核心竞争力(-毕竟体力和精神力无法和年轻人相比),
      这样就会出现吃青春饭的现象,所以学习机器内在运行原理非常重要,因为这块儿东西,需要花费大量时间去学习和研究,是达到某个高点的必经之路.所以来学习这本教材

    1.1 信息就是 位 + 上下文

    程序的生命周期是从一个源程序(或者说源文件)开始的(比如我创建了一个hello.c的文件,并保存),这些文件本质上由值0 和 1 组成的位(又称 为比特)序列,8 个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符,
    就想下图,一个字节对应一个数值,比如
     等于10,#号对应的是35,
    hello.c的表示方法说明一个基本思想,系统终所有的信息,例如你能看到的文件,磁盘上的文件,都是比特表示的, 区分不同对象的唯一方法是上下文,一不同的上下文表达不同的数据
    

    • c语言编译成二进制可运行流程

    练习

    vi hello.c
    
    #include <stdio.h> 2
    int main()
    {
     printf("hello, world
    ");
     :return 0;
    }
    
    [root@instance-bhrt87fn code]# gcc -o hello hello.c # 编译hello.c文件
    [root@instance-bhrt87fn code]# ls 
    hello  hello.c  # hello 是被创建的可执行的二进制文件
    [root@instance-bhrt87fn code]# ./hello
    hello,word!
    

    1.2 系统的硬件组成

    • 了解硬件组织有助于我们更深入了解运行hello 程序时发生了什么
    • Intel系统产品族的模型图

    总线

    • 贯穿整个系统的一组电子管道,它主要负责携带和传递信息,通常总线被设计成传送定长的字节块(字 word),4个字节(32位),8个字节(64位)

    I/O 设备

    • I / 0 (输 入 / 输 出 )设 备 是 系 统 与 外 部 世 界 的 联 系 通 道, 示 例 系 统 包 括 四 个 I / O 设 备 :作为用户输入的键盘和鼠标,作为用户输出的显示器,以及用于长期存储数据和程序 的磁盘驱动器(简单地说就是磁盘)。最开始,可执行程序h e l l o 就存放在磁盘上。
      每个I/O 设备都通过一个控制器或适配器与I/O 总线相连。控制器和适配器之间的区别主要在于它们的封装方式。控制器是I/O 设备本身或者系统的主印制电路板(通常称作 主板)上的芯片组。而适配器则是一块插在主板插槽上的卡。无论如何,它们的功能都是 在 I/O 总线和I/O 设备之间传递信息。

    主存(临时存在变量的地方)

    • 主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从 物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储 器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始 的。一般来说,组成程序的每条机器指令都由不同数量的字节构成。与 C 程序变量相对应的 数据项的大小是根据类型变化的。比如,在运行Linux的 x86-64机器上,short类型的数据 需 要 2 个 字 节 ,i n t 和 f l o a t 类 型 需 要 4 个 字 节 ,而 l o n g 和 d o u b l e 类 型 需 要 8 个 字 节

    处理器

    • 中央处理单元(CPU), 简称处理器,是解释(或执行)存储在主存中指令的引擎。处理
      器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时 刻 ,P C 都指向主存中的某条机器语言指令(即含有该条指令的地址)
    • 从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令, 再更新程序计数器,使其指向下一条指令。处理器看上去是按照一个非常简单的指令执行 模型来操作的,这个模型是由指令集架构决定的。在这个模型中,指令按照严格的顺序执 行 ,而执行一条指令包含执行一系列的步骤。处理器从程序计数器指向的内存处读取指 令,解释指令中的位,执行该指令指示的简单操作,然后更新P C ,使其指向下一条指令, 而这条指令并不一定和在内存中刚刚执行的指令相邻。
    • 这样的简单操作并不多,它们围绕着主存、寄存器文件(register file)和算术/逻辑单 元(ALU)进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个 寄存器都有唯一的名字。A L U计算新的数据和地址值。下面是一些简单操作的例子, CPU在指令的要求下可能会执行这些操作。
    •加 载 :从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容。
    •存 储 :从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原
    来的内容。
    •操作:把两个寄存器的内容复制到ALU, ALU对这两个字做算术运算,并将结果
    存放到一个寄存器中,以覆盖该寄存器中原来的内容。
    •跳 转 :从指令本身中抽取一个字,并将这个字复制到程序计数器(P C )中,以覆盖
    P C 中原来的值。
    

    1.3 运行hello 程序的生命周期

    • 用户开始通过shell程序执行'./hello' 后,shell将字符串逐一写入寄存器,然后把它帮到内存中,一旦目标文件h e llo 中的代码和数据被加载到主存
    • 处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将“hello world'n” 字符串中的字节从主存 复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

    c语言的小知识

         •C 语言是贝尔实验室的Dennis Ritchie于 1969年 〜 1973年间创建的。美国国家标准学
    会(American National Standards Institute, ANSI)在 1989 年颁布了 ANSI C 的标准,后来 C 语言的标准化成了国际标准化组织(International Standards Organization, ISO)的责任。这 些标准定义了 C 语言和一系列函数库,即所谓的C 标准库。Kernighan和 Ritchie在他们的 经典著作中描述了 ANSI C , 这本著作被人们满怀感情地称为“K&R” [61]o 用 Ritchie的话 来说[92], C 语 言 是 “古怪的、有缺陷的,但同时也是一个巨大的成功"。为什么会成功呢?
         •C 语言小而简单。C 语言的设计是由一个人而非一个协会掌控的,因此这是一个 简洁明了、没有什么冗赘的设计。K & R 这本书用大量的例子和练习描述了完整 的 C 语言及其标准库,而全书不过2 6 1页。C 语言的简单使它相对而言易于学 习,也易于移植到不同的计算机上。
         •C 语 言 是 为 实 践 目 的 设 计 的 。 C 语 言 是 设 计 用 来 实 现 U n i x 操 作 系 统 的 。 后 来 , 其他人发现能够用这门语言无障碍地编写他们想要的程序。
    C 语言是系统级编程的首选,同时它也非常适用于应用级程序的编写。然而,它也 并非适用于所有的程序员和所有的情况。C 语言的指针是造成程序员困惑和程序错误的 一个常见原因。同时,C 语言还缺乏对非常有用的抽象的显式支持,例如类、对象和异 常 。像 C + + 和 J a v a 这 样 针 对 应 用 级 程 序 的 新 程 序 语 言 解 决 了 这 些 问 题 。
        
    
    • 说明:所有知识来自<<深入理解计算机系统>>( csapp ) 这本书 和自己的总结,仅供学习和交流,侵权删除.
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/zdoubly/p/13549855.html
Copyright © 2011-2022 走看看