• 深入理解计算机系统(1)


    一从hello world说起

    The only way to learn a new programming language is by writing programs in it.The first program to write is the same for all languages:

    Print the words

    Hello, world

                                                                                                                                                                   ——《TCPL》

    这是TCPL开篇的一句话,那么作为博客的开篇,就从这个对于学习所有计算机语言的统一入口——hello world程序说起。

    首先是这个程序的C语言实现

    #include <studio.h>

    int main()

    {

             printf("hello,world\n");

    }

    我们按照C语言的要求,将上述内容保存在名为hello.c的文件中。这就是——源代码文件。

    我们知道计算机只能识别0和1这两种字符,那计算机如何执行我们编写的程序呢?

    对于C语言而言,我们在用文本编辑器编写程序时,写下的是字符序列,而序列中的每一个字符,都有一个对应的编码。以最基本的ASCII编码来讲,上述程序的第一个字符”#”,其二进制表示为00100011,即ASCII码中的35,用16进制表示为23。按照这种方式,将所有的程序字符,都翻译一遍,就是如下这个样子:

     

    如果计算机要执行我们用C语言编写的源文件,就需要按照上面的方式,将字符序列转换为由0和1组成的bit序列。这样的序列,就是程序员的祖师们所采用的编程方式。

    幸好,我们已经有了C这样的“高级”计算机语言,编写程序的效率和程序的可读性,都大大提高。我们现在编写程序,几乎无需关心高级语言怎么转化为低级语言或者机器语言。那些工作都由“编译器驱动程序”去处理。那么C语言编译驱动程序到底做了哪些工作呢?我们这里先给出一个大致的步骤:C语言->汇编语言->二进制文件。

     

    二谈谈计算机的硬件

    下面我们谈谈计算机的硬件:

    1主板芯片组:有的主板芯片组分为南桥(SB)和北桥(NB),

    北桥主要负责与CPU的联系,控制内存,有的还提供集成的显示核心。

    南桥主要负责I/O总线之间的通信,如PCI总线,USB,LAN,音频等。

    现在的很多主板都没有北桥了,北桥的内存控制功能和集成显卡功能都由CPU来处理。

    2总线:总线是计算机各个部件之间通讯的线路,他是cpu,内存,输入设备,输出设备传递信息的公用通道,计算机的各种设备通过接口与总线连接,从而可以相互通讯。

    3I/O设备:常见的I/O设备有:键盘,鼠标,显示器,硬盘(磁盘驱动器)。

    4内存:内存是由一组DRAM芯片组成的,逻辑上可以看做一个一维字节数组,每个字节都有唯一的地址(数组索引),这些地址从0开始,内存的容量,即这个数组的索引范围。

    5cpu:cpu是解释或执行存储在内存中的指令的引擎。它的核心是程序计数器(PC)。

     

    从计算机通电开始,CPU就从程序计数器指向的内存地址读取指令,解释指令,并按照指令的要求执行简单操作。然后由算术逻辑单元(ALU)计算新的数据和地址,并更新程序计数器指向下一条指令。重复这个动作,计算机则运转起来。

    三程序与硬件的结合

    说完了硬件,我们继续回来说hello world,我们要执行一个C语言,要先对其进行编译生成可执行文件,然后通过一个控制台(Shell)中输入 ./hello,然后点击回车,这时控制台上会打印出hello world。

    我们放慢速度,详细说一下这个过程都发生了什么:

    1我们通过键盘,输入”./hello”字符

    2点击回车,这是一个不可见的字符,shell在接收到这个字符后,就会将我们输入的字符,通过总线,逐一读取到寄存器,然后再通过总线将字符存放到存储器。

    3接下来shell会判断本行输入的内容,是否是shell中的内置命令,如果是内置命令则按照内置命令来执行;如果不是,就会在硬盘对应的目录中寻找一个符合名称的可执行文件。

    4在找到文件后,会通过一系列指令,将硬盘上的这个文件的代码和数据拷贝到内存中。

    5此时,PC会指向这段程序的开始位置的地址,然后CPU读取程序二进制指令,然后按照指令执行。这些指令将”hello, world\n”从内存拷贝到寄存器文件,然后从寄存器文件拷贝到显示设备(显示器),这样我们在屏幕上就能看到打印的字符了。当然,这些字符在计算机实际存储的是由0和1组成的序列,只是在显示的时候,通过点阵形成了自然语言的字符的图形。

    由此可见,即使是最基本的hello world程序,要想执行,也会调用计算机的各种硬件设备。

    四存储的层次结构

    为了提高计算机的性能,在cpu的寄存器和内存之间,又增加了“高速缓存”。根据其速度和容量,又分一级缓存(L1),二级缓存(L2)以及三级缓存(L3)。

    按照这种存储器的分层思想,可以形成如下的金字塔结构。

     

     

    五操作系统

    刚才我们谈到,计算机调度各种硬件来实现hello world程序的执行,并不是由应用程序直接控制的,而是通过操作系统来统一控制的。

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

    1防止硬件被应用程序滥用;

    2对硬件的控制,提供简单一致的方法。

    操作系统有如下一些抽象概念:进程,线程,虚拟存储器,文件。

    下面逐一做简单介绍:

    进程:是操作系统对运行程序的一种抽象,操作系统保存进程运行的所有信息(上下文)。并通过上下文切换,实现进程的交错执行。

    线程:进程内部可以包含多个称为线程的执行单元,线程之间可以更高效的传递信息。

    虚拟存储器:每个进程都有其可以控制的一块独占的内存区域。这块独占的内存,就叫虚拟存储器,它由这样几个区组成。

    1程序代码和数据

    2运行时堆

    3共享库

    4用户栈

    5内核虚拟存储器

     

    文件:文件就是字节序列,每个I/O设备都可以看成是文件。

    通过操作系统与计算机硬件相互结合,实现了应用程序的执行。

    六总结

    最后总结一下:我们通过一段由C语言编写的hello world程序,来分析计算机都做了什么工作。而这个过程,就是计算机系统工作的过程。

    由此,我们得到了计算机系统的概念:计算机系统是由硬件和系统软组成的,它们共同协作,以运行应用程序,从而使计算机为人服务。

  • 相关阅读:
    对 getaddrinfo Android 返回错误 EAI_BADFLAGS
    getaddrinfo详解
    使用moment.js管理时间
    ejs循环实例
    Express优化-合并路由
    Express重定向
    Express中间件
    express.Router创建模块化路由
    Express路由
    nodejs + express访问静态资源
  • 原文地址:https://www.cnblogs.com/asenyang/p/5494371.html
Copyright © 2020-2023  润新知