Project

2019/07/31

layout: post title: 程序是怎么跑起来的 categories: [计算机] description: 计算机相关概念 keywords: 计算机 —

程序是怎么跑起来的?

程序是什么? 程序是由什么组成? 什么是机器语言? 正在运行的程序存储在什么位置? 什么是内存地址? 计算机的构成元件中,负责程序的解释和运行是什么?

伪程序猿的我面对这些问题很无奈,一个问题都打不上。可怕,计算机通识方面竟可以做到这样

答案: 指示计算机每一步动作的一组指令(有先后顺序,一个动作一个指令)

指令和数据(console.log(‘你好呀’),中console.log是指令,你好呀是数据

CPU可以直接识别并使用的语言(所有的编程语言最后都会转化为计算机可以识别的二进制语言

内存(磁盘,硬盘上面保存的数据最后要复制到内存后才能运行,当我们运行很多软件的时候,电脑的内存不够时,会出现卡顿,所以电脑内存大的可以带动大型软件)

内存中,用来表示指令和数据存储的数值(整数值)

CPU(计算机的大脑,最重要的一部分

什么是CPU???

它是由寄存器(暂存指令,数据等处理对象),控制器(把指令数据等读入寄存器,根据指令的执行结果来控制整个计算机,运算器(内存读入寄存器的数据), 和时钟(计时器组成

高级语言编写程序会在编译后转化成机器语言,然后在通过CPU内部的寄存器来处理

储存指令和数据内存是通过地址来划分的,一个指令和数据通常被存储在多个地址上(局部作用域,函数

在程序中的比较指令,就是在CPU内部做减法运算

数组是同样长度的数据在内存中进行连续排列的数据构造,通过索引来区分查找各个数据

实际地址是基址寄存器的值(固定的+变址寄存器的值(变化的,数组索引。这样实现数组连续的储存空间

数据是用二进制数标示的

1字节=8位

把二进制的各数位的值和位权相乘之后在相加就是十进制数

二进制数左移一位变成原来的值的两倍,左移两位变成原来的四倍

要想对程序的运行机制形成一个大致印象,就要了解数据在计算机内部是以怎么样的形式来表现的,又是以怎么样的方法进行运算的(二进制

二进制数的位数一般是8的倍数,因为二进制数一般是8位,16位。。。,位是最小单位,字节是基本单位,字节是信息的最基本单位,读写数据,都是用位 ,用字节处理数据时,如果数字小于存在数据的字节数(二进制的位数)那么高位上就用0填充 在程序中即使是用十进制数和文字等记述信息,编译后也会转成二进制数值,所以计算机内部处理是用二进制表示的信息

位移运算指的是二进制数值的各数位进行左右移位的运算,在«左移,»右移。左移空出来的低位要进行补0操作(只适用左移,最高位或者最低位溢出的数字直接丢弃就可以了

在二进制数中表示负数值时,一般会把最高位作为符号位,符号位是0表示正数,1表示负数,计算机在做减法运算时,实际上内部是在做加法运算。表示负数时就需要 使用’二进制的补数’,补数就是用正数来表示负数,(把二进制数的各数位数值全部取反,然后将结果+1.补数求解的变换方法就是”取反+1”

当二进制的数值表示图形模式而非数值的时候,移位后需要在最高位补0——–> 逻辑右移

将二进制作为带符号的数值进行运算时,移位后要在最高位填充移位符号位的值(0或者1)—–> 算术右移

无论程序中使用的是几进制,计算机内部都会转化成二进制数来处理

算术计算是指加减乘除四则运算,逻辑运算是指对二进制各数数字位的0或者1分别进行处理

二进制数的小数点后第一位的权位是2的负一次方,也就是说二进制的0.1(2*^-1)是十进制的0.5。十进制的0.625是二进制的0.101

某些情况下程序运行后无法得到正确值,比如: let sum = 0

for(let i=0;i<1000;i++){ sum+=0.1 }(试一试golang)

原因是计算机内部所有的信息都是以二进制的形式来处理,(2^-1=0.5,2^-2=0.25,2*^-3=0.125….,这些二进制数是连续的,但是对应的十进制数,怎么也连续不起来)整数和小数并无差别,有一些十进制的小数无法转化成二进制,

指针:是一种变量,存储着数据的内存的地址

数组是多个同样数据类型的数据在内存中连续排列的形式(js数据是不限制类型和长度的,他是动态的,golang里面数组是限制了类型和长度的

对于数组操作,中途删除或者追加元素时,后面的元素就必须要全部移动

通过虚拟内存来提高磁盘访问速度,借助虚拟内存,哪怕是内存容量不足的计算机,也可以运行很大的程序

磁盘缓存是指把从磁盘中读取出来的数据存储在内存中,当数据再次被读取时,不是从磁盘而是直接从内存中高速读取(内存是高速高价,磁盘是低速廉价

虚拟内存:把磁盘中的一部分作为假想的内存来使用,这个与磁盘缓存是相对的,为了要实现虚拟内存,就必须把实际内存的内容和磁盘上的虚拟内存的内容进行部分置换,并且同时运行

DLL(Dynamic Link Library) 文件,是在程序运行时动态加载Library(函数和数据的集合)的文件,多个文件可以同一个DLL文件,从而达到节约内存的效果

时钟分割指的是在短时间间隔内,多个程序切换运行的方式。在用户看来,就是多个程序在同时运行。也就是说,Windows会自动切换多个程序的运行(图9-9)。此外,Windows中还具有以程序中的函数为单位来进行时钟分割的多线程[插图]功能。

网络功能和数据库功能,虽并不是操作系统本身不可欠缺的功能,但因为它们和操作系统很接近,所以被统称为中间件而不是应用。意思是处于操作系统和应用的中间

操作系统和中间件合在一起,也称为系统软件

中间件变更后应用往往也需要变更,因此中间件的变更也不是那么容易。

设备驱动是操作系统的一部分,提供了同硬件进行基本的输入输出的功能。键盘、鼠标、显示器、磁盘装置等,这些计算机中必备的硬件的设备驱动,一般都是随操作系统一起安装的

程序是操作系统、中间件、应用等所有软件的统称。因此,通常程序员制作的应该都是应用,而不是操作系统。不过,既然是应用,那么就肯定会通过某种形式来利用操作系统的功能

栈和堆的内存空间会在程序运行时生成

操作码表示的是指令动作,操作数表示的是指令对象。操作码和操作数罗列在一起的语法,就是一个英文的指令文本

能够使用何种形式的操作码,是由CPU的种类决定的

寄存器是CPU中的存储区域。不过,寄存器并不仅仅具有存储指令和数据的功能,也有运算功能

程序运行时,会在内存上申请分配一个称为栈的数据空间

函数调用是栈发挥大作用的场合。

函数的参数是通过栈来传递,返回值是通过寄存器来返回的”

在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量

为什么局部变量只能在定义该变量的函数内进行引用呢?这是因为,局部变量是临时保存在寄存器和栈中的。正如本章前半部分讲的那样,函数内部利用的栈,在函数处理完毕后会恢复到初始状态,因此局部变量的值也就被销毁了,而寄存器也可能会被用于其他目的。因此,局部变量只是在函数处理运行期间临时存储在寄存器和栈上。

表示存储局部变量的不仅仅是栈,还有寄存器。为确保c1~c10所需的领域,寄存器空闲时就使用寄存器,寄存器空间不足的话就使用栈。

要寄存器有空间,编译器就会使用它。因为与内存相比,使用寄存器时访问速度会高很多,这样就可以更快速地进行处理。局部变量利用寄存器

局部变量数目很多的时候,可分配的寄存器就不够了。这种情况下,局部变量就会申请分配栈的内存空间。虽然栈的内存空间也是作为一种存储数据的段定义来处理的,但在程序各部分都可以共享并临时使用这一点上,它和_DATA段定义及_BSS段定义在性质上还是有些差异的。例如,在函数入口处为变量申请分配栈的内存空间的话,就必须在函数出口处进行释放。否则,经过多次调用函数后,栈的内存空间就会被用光

汇编语言是对CPU的实际运行进行直接描述的低级编程语言,C语言是用与人类的感觉相近的表现来描述的高级编程语

因为软件的存在是硬件正常运行的必要条件

CPU内部的寄存器是用来进行数据运算处理的,而I/O寄存器则主要是用来临时存储数据的。

端口号也称为I/O地址。IN指令和OUT指令在端口号指定的端口和CPU之间进行数据的输入输出。这和通过内存地址来进行主内存的读写是一样的道理

IRQ是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为中断处理。

实施中断请求的是连接外围设备的I/O控制器,负责实施中断处理程序的是CPU。为了进行区分,外围设备的中断请求会使用不同于I/O端口的其他编号,该编号称为中断编号

中断处理程序的第一步处理,就是把CPU所有寄存器的数值保存到内存的栈中。在中断处理程序中完成外围设备的输入输出后,把栈中保存的数值还原到CPU寄存器中,然后再继续进行对主程序的处理。假如CPU寄存器的数值没有还原的话,就会影响到主程序的运行,甚至还有可能会使程序意外停止或者发生运行异常。这是因为主程序在运行过程中,出于某些原因用到CPU寄存器。而这时如果突然插入别的程序,主程序必然会受到影响。因此,在中断请求完毕后,各寄存器的数值必须要还原到中断前的状态。只要寄存器的值保持不变,主程序就可以像没有发生任何事情一样继续处理 (图11-8)。

在主程序运行的过程中,中断发生的频率有多大呢?实际上,大部分的外围设备,都会频繁地发出中断请求。其原因就是为了实时处理从外围设备输入的数据。虽然不利用中断也可以从外围设备输入数据。但那种情况下,主程序就必须要持续不断地检测外围设备是否有数据输入。 由于外围设备有很多个,因此就有必要按照顺序来调查。按照顺序调查多个外围设备的状态称为轮询

DMA是指在不通过CPU的情况下,外围设备直接和主内存进行数据传送。磁盘等都用到了这个DMA机制。通过利用DMA,大量数据就可以在短时间内转送到主内存。之所以这么快速,是因为CPU作为中介的时间被节省了

I/O端口号、IRQ、DMA通道可以说是识别外围设备的3点组合。不过,IRQ和DMA通道并不是所有的外围设备都必须具备的

虽然计算机领域的新技术在不断涌现,但计算机能处理的事情,始终只是对输入的数据进行运算,并把结果输出,这一点是不会发生任何变化的。

控制就是指CPU和各种设备之间配合进行数据的输入输出处理

人工智能是用计算机来实现人类智能的尝试


一名伪程序猿——sunseekers,曾被bug虐的体无完肤,却依旧待他如初恋。

如果我改过的某一个bug,吐槽过的某一个需求,写过的某一行代码

曾在你的心里荡起涟漪,那至少说明在逝去的岁月里,我们在某一刻,共同经历着一样的情愫。

有时候,虽然素未谋面。却已相识很久,很微妙也很知足。


如果你喜欢我写过的某一个文字,请支持我,鼓励我,你的鼓励是我最大的动力来源

当然恰好你也喜欢我的话,我们可以互相关注,相互学习的哟!

sunseekers

Search

    Table of Contents