您的位置:首页 > 理论基础

计算机系统漫游

2017-08-20 07:42 148 查看
图灵机:基本思想是用机器来模拟人们用纸笔进行数学运算的过程。

他把这样的过程看作下列两种简单的动作:

在纸上写上或擦除某个符号;

把注意力从纸的一个位置移动到另一个位置;

图灵机的组成:

一条无限长的纸带TAPE,纸带划分为很多小格,每个小格包含有限的数据。

一个读写Head,可以再纸带上移动,读取、修改纸带的数据。

一套控制规则,根据状态和小格的数据决定读写头的下一个位置。

一个状态寄存机,保存图灵机当前的状态。

计算机脱胎于图灵机的构想,能够执行有限逻辑数学过程的计算模型。

冯·诺伊曼结构1945 年发表的 101 页报告,不但提出了二进制的构想,更将计算机分成五大组件(存储器、控制器、运算器、输入、输出),我们现在使用的大部分计算机都符合冯诺依曼架构。和图灵机相比,这种架构最重要的突破就是增加的存储器,这使得程序和数据的存储成为可能,也因此衍生出来了数据传输(即 IO)的概念,再加上六十年代末出现的计算机网络,计算机要完成的工作,远不止执行程序这么简单。

1.1系统的硬件组成



总线:贯穿整个系统的一组电子管道,携带信息字节负责在各个部件之间传递。总线被设计为传送定长的字节块(字word),字中的字节数是一个基本的系统参数,现在的大多数机器字长要么是4个字节(32位),要么是8个字长(64位)。

IO设备(输入/输出):系统与外接设备联系的通道。用户输入的鼠标和键盘、显示屏、保存数据的磁盘、其他网络类设备。

主存:一个临时存储设备,在处理器执行程序是用来存放程序和程序处理的数据。从物理上讲主存一组动态随机存储存储器(DRAM)芯片组成,从逻辑上讲是一个线性的字节数组,每个字节都有唯一的地址(数组索引)。

处理器:包括运算器和控制器,解释执行保存在主存中指令的引擎。处理器的核心是一个大小为一个字的寄存器(PC),从系统通电开始,处理器一直在不断的读取PC寄存器的指令,在更新指令寄存器。

CPU在指令的下可能会执行的操作


[b]加载:从主存复制到寄存器[/b]

存储:从寄存器复制到主存的某个位置,更新原来的内容。

操作:把寄存器的内容复制到ALU(算数逻辑单元)进行算数运算。

跳转:执行指令更新指令寄存器的内容。

1.2运行hello.c程序

我最近在学习Linux因为进度有点慢所以看看计算机基础再转战Linux,我的操作系统是ubuntu16.04LTS。

shell是一个命令行解释器,它等待你的输入,如果输入的第一个单词不是内置shell命令,shell会认为它是一个可执行文件。







当我们敲回车时,shell执行一系列命令加载可执行程序hello,把代码和数据从磁盘复制到主存。

执行hello程序的main函数里面的机器语言指令,把“hello world”从主存复制到寄存器,从寄存器复制到显示设备。

这个示例揭示了一个重要的问题,系统花费了大量的时间进行了信息的传递

hello程序最初在磁盘上,当程序加载时复制到主存,程序执行时指令要复制到处理器。相似的字符串“hello world”开始在磁盘,然后被复制到主存,最后从主存复制到显示设备。从程序员的角度看,这些复制就是开销,系统设计这的主要目的就是使这些复制尽可能快的完成。针对这种差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(简称为cache或者高速缓存)。





1.3操作系统

操作系统看成是应用程序与硬件之间插入的一层软件。

两大基本功能:

防止硬件被失控的应用程序滥用。

向应用程序提供简单一致的机制来控制复杂的低级硬件设备。

操作系统通过几个基本的抽象(进程、虚拟内存、文件)来完成实现这两个功能。

进程:对处理器、主存和IO设备的抽象表示。

虚拟内存:对主存和磁盘和IO设备的抽象。

文件:对IO设备的抽象表示。

1.3.1进程

进程是操作系统对一个正在运行的程序的一种抽象。

并发执行:一个进程的指令和另一个进程的指令交替执行。

一个CPU并发的地执行多个进程,这是通过处理器在进程间切换实现的。操作系统这种交错执行的机制称谓“上下文切换”。

进程运行的所有状态信息称为“上下文”,单处理器只能处理一个进程,当操作系统进行进程转换时,它会保存当前进程的上下文,并恢复新进程的上下文,然后将控制权交给新进程。

hello程序执行时的上下文切换

最开始shell程序在执行,等待命令行输入。 shell通过一个系统调用执行我们的请求,系统调用将控制权传递给操作系统。操作系统保存shell的上下文,创建一个新的hello进程及其上下文,将控制权传给hello进程,hello进程结束后,操作系统恢复shell进程的上下文,并将控制权传递给它。

进程之间的上下文切换是由操作系统的内核管理的,内核是常住内存的操作系统代码部分。当应用程序需要操作系统的某些操作时,比如读写文件,他会执行特殊的系统调用命令,将控制权传递给内核,然后内核执行请求的操作并返回应用程序。内核不是一个独立的进程。它是系统管理全部进程所用代码和数据结构的集合。

1.3.1.1线程

线程:是操作系统能够进行运算调度的最小单位。是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间等等。但同一进程中的多个线程有各自的调用栈,自己的寄存器环境,自己的线程本地存储。多线程之间较多进程之间更容易共享数据。

1.3.1.2并发与并行

如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。并发系统与并行系统这两个定义之间的关键差异在于“存在”这个词。

在并发程序中可以同时拥有两个或者多个线程。这意味着,如果程序在单核处理器上运行,那么这两个线程将交替地换入或者换出内存。这些线程是同时“存在”的——每个线程都处于执行过程中的某个状态。如果程序能够并行执行,那么就一定是运行在多核处理器上。此时,程序中的每个线程都将分配到一个独立的处理器核上,因此可以同时运行。

我相信你已经能够得出结论——“并行”概念是“并发”概念的一个子集。也就是说,你可以编写一个拥有多个线程或者进程的并发程序,但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时涉及多个执行流程的编程模式或者执行行为,都属于并发编程的范畴。

摘自:《并发的艺术》 — 〔美〕布雷谢斯

1.3.2虚拟内存

虚拟内存是计算机系统内存管理的一种技术,它为每个进程提供了一个假象,即每个进程都是独立的使用内存,将内存视为一个非常大的字节数组。

其实每个进程看到的主存都是一样的,并且被分隔成多个物理内存碎片。虚拟内存技术是经过特殊的处理将内存(DRAM)、闪存、磁盘存储器、特殊硬件、操作系统软件结合起来,为程序提供一个看上去统一的字节数组。

1.3.3文件

文件就是字节序列的容器,仅此而已。每一个IO设备,包括磁盘、键盘、显示器、甚至是网络,都可以看成是文件。系统中的所有输入输出都是通过使用一小组称为Unix I/O的系统函数调用读写文件来实现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: