计算机基础概念

  1946年二月美国,世界上第一台电子计算机ENIAC诞生,似乎从这一年开始世界便逐渐变得不一样了。随着半个世纪的时间,计算机技术蓬勃发展,推动人类进入信息社会。

  计算机操作界面:

  ①图形用户界面

  ②命令行界面

  在ENIAC计算机研制的同时,冯.诺依曼与莫尔小组合作研制EDVAC计算机,采用了存储程序方案,即把解题过程中的每一步用指令表示,并按执行顺序编写成为程序,存放在存储器中,称为冯.诺依曼计算机。冯.诺依曼计算机有着如下几个特点。

  (1)计算机由运算器,控制器,存储器,输入设备,输出设备五部分组成。

  (2)采用存储程序的方式,程序和数据放在同一个存储器中,并以二进制码表示。

  (3)指令由操作码和地址码组成。

  (4)指令在存储器中按执行顺序存放,有指令计数器(PC)指名要执行的指令所在的存储单元地址。

  (5)计算机以运算器为核心,运算器进行数字运算有算术运算和逻辑运算两大类,由控制器协调操作运算器和其他设备之间的操作,存储器以随机存储器RAM为主,输入输出设备与存储器间的数据传送都通过运算器。

  根据电子计算机所采用的物理器件的发展,一般把电子计算机的发展分成五个阶段,习惯上称之为五代。

  第一代:电子管计算机计算机时代

  第二代:晶体管计算机计算机时代

  第三代:集成电路计算机计算机时代

  第四代:大规模集成电路计算机时代

  第五代:超大规模集成电路计算机时代

  计算机的硬件是计算机实现各种功能的基础,软件则是实现功能的方法,由指令加上数据构成的,将频率转换成信息类型让逻辑硬件能够理解并运行。如遥控器红外线操控功能和触摸屏进行逻辑转换变成二进制的机器语言形式能够让计算机理解。

  计算机语言有机器语言,微码语言(汇编语言)和高级语言三大类,机器语言作为计算机最底层的语言,它的普适性最强但针对性弱,是由二进制直接实现的,在计算机刚出现那会人们便是利用机器语言来对计算机进行操作,但由于机器语言都由二进制代码写成,这对于程序员的压力太大,效率更是低。基于这样的背景下汇编语言应运而生。汇编语言利用符号代替二进制码,因此汇编语言又叫做符号语言,使用汇编语言编写的程序,硬件不能直接识别,要利用汇编程序将汇编语言转化成机器语言这样硬件才能够识别。对于汇编语言来说这个过程我们称之为汇编过程,利用汇编器来达成。汇编语言与芯片的耦合度很高,但在某个芯片上编写的汇编语言基本无法移植到其它芯片上,移植性很差,所以就出现了高级语言。高级语言有很多种,C语言,JAVA,PHP,Python,perl等每种语言皆有其针对性。C语言和JAVA为系统级语言更接近于底层,PHP,Python,perl等则为应用级语言。虽然高级语言针对性强但越接近人类的自然语言,转化成机器语言的效率就低,会产生很多中间代码,在运行的时候所需要的额外开销越大。

  高级语言可分为:

  ①系统级,应用级。

  ②可分为面向过程:按照严格的逻辑结构来编写代码。面向对象:相对自由,更注重数据处理的过程,而不是数据结构。

  ③可分为强语言(编译性语言):C语言,C++,JAVA。不声名变量就无法使用,源代码必须经过编译,不编译无法使用。弱语言(解释性语言):PHP,Python,shell,不声明变量也可以使用,不经过编译,经过解释器也可以使用。

  操作系统基础概念

  操作系统(Operating System,OS)是配置在计算机硬件上的第一层软件,是对硬件系统,是对硬件系统的首次扩充。其主要作用是管理好这些设备,提高他们的利用率和系统吞吐量,并为用户和应用程序提供一个简单的接口,便于用户使用。

  目前我们使用的计算机是数字设备即能够进行数字信息处理和运算的设备。只能理解二进制代码的数字设备。因此任何一个程序想要在计算机上运行,必须编码成二进制代码形式才能被底层硬件所接受,但底层硬件太过简单和丑陋,所以为了方便程序员的开发,供货商会为这些底层丑陋的硬件分配汇编接口,但这些汇编接口也很底层。为了能够很很好的利用这些汇编接口则需要一个能完成汇编功能的程序——驱动程序。一开始,因为不同的硬件需要不同的汇编程序,为了能够对计算机底层硬件进行使用,会为每一个底层硬件的汇编接口编写一个对应的驱动程序进行驱动。但是随着计算机的不断发展,后来的人觉得使用一个硬件就要编写一个对应的驱动程序太过复杂,就有人专门开发这些计算机底层的硬件,封装成一个整体,并且共享出来,这样程序员在开发程序时就不需要自行编写这些代码,直接调用即可。这样程序员在开发程序时,直接调用驱动程序就可以访问硬件,汇编成二进制流就可以被CPU直接处理了。

  操作系统又称为硬件虚拟抽象层。是把硬件虚拟化抽象出来的。(如D盘图标等)不直接去使用硬件,而是用一种代替,虚拟的方式去使用硬件。给硬件分配资源,监控,防止出现资源分配不合理的情况。资源分配不合理,资源浪费会导致系统不运行。这里的操作系统即为内核(kernal)。kernal这个监控程序只是负责把底层的硬件驱动起来并且把底层硬件的各种资源虚拟化。如空间复用,时间复用。

  操作接口(shell),使用操作接口的程序显示在界面时容易管理,反之则不容易管理。有的应用程序是需要与操作接口作用,产生图标在界面上,有的直接通过操作系统访问内核,而不直接与操作接口作用显示在界面上(如***)。

  操作系统内核可以很好的承上启下,即操作系统的接口与内核kernal之间的联系。内核可以很好的屏蔽底层丑陋的硬件将虚拟化的硬件资源放在计算机界面上方便用户的使用。软件寻找操作系统接口和使用操作系统的接口的过程叫system call,利用这个接口把我们需要的信息,和需要做的操作通过接口传递到操作系统的内核中。即系统调用。调用系统接口的不是程序而是进程。程序是静态的是死的,进程是动态的,是活的。应用程序通过操作接口shell,经过系统调用到操作系统内核,由内核进行汇编,将高级语言翻译成汇编语言再翻译成计算机能够理解的机器语言,从而对硬件进行调用。

  一个完整的操作系统由内核和各种应用程序组成,内核通过屏蔽底层硬件丑陋的接口,虚拟硬件接口以方便用户使用。这些抽象出来的接口,我们称之为系统调用。在程序员编程时采用的代码需要哪些接口,这些需要事先了解清楚再编写代码,否则所编写的代码与操作系统的接口无法匹配上便无法在此操作系统上运行调试。因此程序员必须事先了解清楚操作系统有着哪些接口,但操作系统的接口有着上百个,这对于程序员来说也是一种很大的压力,于是就有一些人将一些常用的到操作系统接口封装成一个库即Library。Library中包含了大量的方法,程序员可以基于库接口进行编程也可以基于内核接口进行编程。在Linux领域,库接口的调用更加自由,方便。这些库也称为API(Application Program Interface).

  如果程序员在编程时使用的是windows操作系统接口,想要在Linux操作系统中运行调试这一段程序,就要确定起初在编写程序时的windows操作接口与现在要运行环境下的操作系统的API库能否统一调用。即POSIX(Portable Operating System)可移植操作系统。任何一个遵守了POSIX 规范的程序代码可以在不同的操作系统上使用。

  编程接口兼容并不意味着二进制接口兼容,也就是说,在程序员编写代码时对操作系统的接口能够兼容但并不意味着能将所编写程序的语言转化成二进制机器语言让硬件进行操作。这里的二进制接口兼容即ABI(Application Binary Interface)。将程序的源代码转化为二进制代码来实现。源代码能不能编译取决于API能不能兼容,源代码编译后能不能执行取决于ABI能不能兼容。

  访问界面程序可以分为两大类

  ①图形用户界面(GUI)

  ②命令行界面(CLI)

  我们常用的windows系统都有一个桌面,这个桌面就是图形用户界面,初学者使用电脑利用GUI会更容易上手,但是但凡是使用过CLI的人都知道,使用CLI的效率要比使用GUI的要高得多。CLI的入门门槛较高,这也导致了许多人不喜欢使用。但是只要一入门,你就会发现命令行界面是非常简单的。使用起来几乎是透明的,哪一个环节出现问题都能迅速找到并且解决。

  从1945年诞生的第一台计算机到50年代中期的计算机,都属于第一代计算机。这是还未出现OS,对计算机的全部操作都是由用户采取人工操作方式进行的。由程序员将事先已穿孔的纸带,装入纸带输入机,再启动它们将纸带上的程序和数据输入计算机,然后启动计算机运行。为了解决人机矛盾和I/O设备之间速度不匹配的矛盾,20世纪50年代末出现了脱机I/O技术。该技术是事先将装有用户程序和数据的纸带装入纸带输入机,在一台外围机的控制下,把纸带上的数据输入到磁带上,当CPU需要这些程序和数据时再从磁带高速地调入到内存。为了能够充分提高计算机资源的利用率,先把一批作业以脱机方式输入到磁带上,并在系统中配上监督程序,在它的控制下,使这批作业能够一个接一个地连续处理。虽然系统对作业的处理是成批进行,但在内存中始终只保持一道作业,故称为单道批处理。但单道批处理系统中的资源得不到充分的利用,因为内存中仅有一道程序所以该程序在发出I/O请求后,CPU便处于等待状态。为了进一步提高资源利用率和系统吞吐量,在20世纪60年代中期引入了多道程序的设计技术,由此形成多道批处理系统。在该系统中,,用户所I提交的作业先存放在外村上,并排成一个队列。然后由作业调度程序按一定的算法从队列中选若干个作业进入内存,使他们共享CPU的和系统中的各种资源,由于同时在内存中有若干程序,这样便可以在运行程序A时,利用其因I/O操作而暂停执行的空挡时间在调度另一程序B执行,使多道程序交替执行,这样就可以使CPU处于忙碌状态。