【摘要内容】什么是计算机系统

最早把程序加入计算机里的方法是搬开关,一位一个开关来代表高低电位。后来打卡片(和纸带),再用转换器读入。再后来出现了磁介质,存储和加载靠程序对磁介质读写来完成,这就不需要借助体力和外部设备了,存储和加载都在计算机内部完成。那么这个“最初的加载程序”当然不是靠程序加载的,是靠人力加载的(可以搬开关,也可以打孔。)

    再后来呢,由于输入汇编指令太累,所以有人就开发了一中程序,叫“自动编程器”,就是输入一条高级指令,由那个程序解释成多条机器指令,这就是后来的高级语言。

    ps:其实计算机的本质就是一条条电信号(机器指令)来推动运行的,和一台内部有很多齿轮的精密大钟没什么两样,都是机器!什么操作系统啦,什么程序啦,都是我们抽象后给他们起的名字,他们本质还是一个个机器指令,注意,我很反对某些人说机器指令就是1、0数字组成的,这很不确切容易使人误解(可能他自己就误解了),应该说是由高低电位组成的,只不过我们把高电位看作1,低电位看作0。


计算机 = 硬件 + 操作系统 + 应用程序

 

有人说过,计算机世界的绝大部分问题都可以通过分层的方法来解决。从一个程序员的角度,我比较喜欢将计算机分为三层,自底向上分别为:

1) 硬件(Hardware),按照冯氏的结构定义,一个处理器由5个部分构成,分别为:存储器;控制器;运算器;输入设备;输出设备。对于常见的计算机而言,存储器如常见的外存储设备;CPU则包含运算器、控制器和内存储;输入输出(I/O)很好理解,这里就不写了。

2) 操作系统:Operation System,操作系统主要负责管理计算机硬件资源,控制其他程序运行并为用户提供交互操作界面的系统软件的集合。讲的具体一点如进程、线程管理;内存管理;信号量机制;IO管理等。最常见OS的如Windows,又如HP-UX、SUSE、VxWorks(嵌入式)。

3) 应用程序层:Application,应用层,指使用各种不同的编程语言(C、C++、JAVA、Ruby、Python,太多了,写不完)、通过各种开发工具并基于各种操作系统开发的——软件。该部分是大部分程序员工作的一层,也是构成我们丰富多彩的生活最直接的一部分。常见的如Word是软件,QQ亦是软件。

 

2.那些围绕在我们身边的“计算机”

 

根据上面的分层,对应一下常见的计算机:

【摘要内容】什么是计算机系统_第1张图片

最常见的计算机莫过于个人PC,其硬件部分(主要讲CPU)当前最主流的当属Intel和AMD的产品,操作系统对应的如Windows(现在应该是Windows8了,当然如果自己装Linux也有可能),对于基于Windows的应用程序开发,其IDE如微软提供的Virual Studio, VC 6.0等。APP如Word,还有当前用来写文章的Maxthon。

再如华为公司的ATAE,其CPU主要采用Intel的x84_64,操作系统采用SUSE10 Linux,编译器为gcc/g++,其应用程序如FTP。

在服务器世界里,还有惠普公司的HP-UX、IBM的工作站,其对应的操作系统分别为HP Unix、AIX,编译器分别为aCC与xLC。还有那个曾经的SUN也有对应的产品,这里就不提了。

 

3.程序员在做什么?

 

对于一个程序员而言,主要在从事APP层的开发工作,如果主要从事C/C++,最直接接触的当属OS层。所以要写好程序,必须去了解操作系统的机制,不同的操作系统都有着不同的限制和调度机制。首当其冲的编译器的机制必须要去了解,比如gcc和g++,其常用的参数有哪些,每个参数代表什么含义,有什么限制?Makefile如何编写?基于该OS开发的程序如何进行调试?操作系统的信号量机制有哪些?同理,对于JAVA的开发而言,最直接的打交道的应该是JVM,可以理解为一个简单的操作系统,所以必须去了解JVM的调度机制,如内存管理、GC机制如何运作?调试工具如jvisualVM、jMap如何使用?

再深一层,就要了解到硬件的限制,如CPU的调度机制、汇编指令、IO等。比如代码a = a+1和a++转变成汇编指令有什么区别,怎样写才是高效的?HP Unix的aCC编译器,“+u1”参数后对生成的汇编指令有何影响?大尾端和小尾端有什么区别,与网络字节序又有何关系?再如,为什么要使用多线程编程,在编码时引入多线程的目的是什么?

上面主要简单描述了一个程序员眼中的计算机分层,那么对于我们的产品——APP或者叫做“软件”,内部又是怎样构成的呢?

 

4.软件/程序 是什么?

 

从技术角度而言,软件在运行态可以理解为一个个的进程,其内部可能有几个线程构成。上过操作系统课的同学应该有两句话印象深刻(上课睡觉,作业抄袭的除外):“进程是拥有资源的最小单位,线程是CPU调度的最小单位。”

画个图吧:

【摘要内容】什么是计算机系统_第2张图片

每个运行态的应用程序,可以称其为Process,每个Process对应有一个身份标识(PID)。其内部包含1到N个线程,每个线程也有自己的线程句柄。CPU以线程为单位进行调度,资源如MEMORY, CPU, IO等统一由进程拥有,换句话讲Thread1至Thread N均可以直接访问进程所拥有的资源。因此对于多线程程序而言,其资源存在并发访问的可能性,比如对于同一个变量a,Thread1在进行a = 1的时候,Thread 2可能“同时”在进行a = 2的操作,这个操作的结果就是a的赋值结果不可预知。如果Thread1在前,Thread 2在后,那么a最终等于2,反之a最终等于1。对于类似于a这类资源,我们可以定义其为“临界资源”,对于临界资源的保护,成为多线程编程必须面临而又必须解决的问题。

由于进程拥有着计算机的资源,因而其内部线程可以方便的访问其内部的各种资源。比如对于内存而言,Thread1可以通过地址访问到Process内部相应的内存块,Thread2也可以访问到Process内部的对应地址。

 

5.程序世界

 

每个计算机上面都不可能仅仅存在一个Process,运行期间,必然是有各种各样的Process构成,如下图:

【摘要内容】什么是计算机系统_第3张图片

但问题来了,如果Process1想访问Process2内部的数据,该如何处理呢?进程与进程间的数据访问,通过进程间通信(IPC)来解决,Linux下常见的进程间通信方式如共享内存、管道、Socket等(参见《Linux环境高级编程》,这里不多写了,后面再详细写)。

进程的构造弄清楚了,那进程/程序究竟在做什么?我理解的,程序无非是对于输入的信息/数据进行一定的处理,然后提供一定的输出。

【摘要内容】什么是计算机系统_第4张图片

 

对于输入的数据,可能是数据库的数据存储、可能是网络上的一串码流、抑或是我们单击了一下鼠标。逻辑处理即是对这些输入进行了一系列的数学运算,比如点击了12306上面的“订票”按钮,后台就要计算当前的余票信息,提交的订票信息,最终告诉你有没有票。“有没有票”即是程序的输出。更广泛意义的讲,输出可能是一个网络消息或修改数据库的某个字段的值(软件的所有输出均限制于计算机世界中,记得当年还曾怀疑过究竟人会不会被计算机病毒感染)。所以有人说了:“程序其实很简单,无非是找个编程语言,写串逻辑,处理下数据,偶尔连下数据库,或跟其它进程通通信”。


操作系统     计算机系统结构

计算机系统是由硬件系统和软件系统两部分组成,操作系统是软件系统的一个组成部分,它是直接在硬件系统的基础上工作的,所以在研究操作系统之前,先必须对计算机系统的结构有一个基本的了解,本章就是讲述计算机系统结构的基本知识。


本章的考核 知识点 是: 1.计算机系统的层次结构 2.硬件环境 3.操作系统结构


学习本章要求:了解计算机系统的结构,有关硬件的I/O中断和存储结构,硬件的保护措施;有关操作系统的结构,操作系统提供的使用接口。


重点 是:硬件环境和操作系统的结构


一、计算机系统的层次结构 ( 识记 )


现代的通用计算机系统是由硬件和软件组成的一种层次式结构,最内层是硬件系统,最外层是使用计算机系统的人,人与硬件系统之间是软件系统



操作系统的运行方式






中断机制


中央处理器 CPU 在任何时刻 只能被一个程序占用 ,在它执行程序的时候,如果有另外的事件发生,比如用户又打开了一个程序,那么这时候怎么办呢? 这就需要由计算机系统的中断机制来处理了。中断机制包括 硬件的中断装置 和 操作系统的中断处理服务程序 。当出现新的事件时, 中断装置 就判别到有新事件发生,于是送出一个 中断信号 ,告诉 操作系统 ,操作系统根据这个中断的优先级来确定先执行新事件还是继续执行原来的任务。






中断现场的保护和恢复






二、 硬件环境( 识记 )


(1)CPU和外设的并行工作


在一台通用的计算机系统中,通过 输入输出控制系统 完成外围设备与主存储器之间的信息传送。各种外设连接在相应的 设备控制器 上,通过 通道 把设备控制器连接到 公共的系统总线 上。这种结构允许CPU和各种外围设备同时并行工作。


(2) I/O中断的作用


当中央处理器执行到一条“启动外设”指令时,便把设备的控制权交给输入输出控制系统,然后,中央处理器和外围设备便可以并行工作,直到外设工作完成。之后,会形成一个“I/O中断”事件(输入输出结束),通知操作系统的服务处理程序完成后继工作。


利用硬件的中央处理器与外围设备的并行工作能力,以及各外围设备之间的并行工作能力,操作系统能让多个程序同时执行。


(3)存储结构


主存储器 是CPU能直接访问的 惟一 的存储空间,任何程序和数据都必须被装入主存储器之后,CPU才能对它进行操作。主存储器以“字节(BYTE)”为单位进行编址,若干字节组成一个“字(WORD)”。中央处理器可以按地址读出主存储器中的一个字节或一个字的内容。


辅助存储器解决了主存储器容量不足,以及主存储器无法保存信息的问题。辅助存储器的优点是容量大且能永久保存信息,缺点是无法被中央处理器直接访问,必须通过主存储器才能访问。


中央处理器存储信息的速度依次为:存取寄存器中的信息速度最快;通过系统总线存取主存储器的速度居中;使用辅助存储器的信息速度最慢。


寄存器用来存放临时的工作信息和系统必须的控制信息。


主存储器中存放操作系统的核心部分,以及当前需执行的程序和数据。


辅助存储器是存放操作下的非核心部分和其他程序和数据。


磁盘的信息可随机存取,磁带上的信息只能顺序存取。


(4)硬件保护


在资源共享的计算机系统中,只有有了必要的保护措施,才能使个别的错误不致影响其他程序。


<1> I/O保护 
   · 特权指令 
   为保护输入输出的完整性,把“启动I/O”等的一类 可能影响系统安全的指令 定义为 特权指令 。


特权指令只允许操作系统使用,用户程序不能使用特权指令。


用户程序 若要启动I/O,必须 请求 操作系统代为启动,这种方式不但可以保证安全地使用外围设备,正确地传送信息,而且可减少用户为启动设备而必须了解外围设备特性以及启动等工作,大大方便了用户。


<2> 管态 和 目态


中央处理器有两种工作方式:管态和目态。


在 管态 下,中央处理器可执行包含特权指令在内的一切指令;在 目态 下,中央处理器不准执行特权指令。


操作系统在管态下工作,用户程序在目态下工作。


<3> 存储保护


硬件中设置了两个寄存器来限定用户程序执行时可以访问的空间范围。这两个寄存器是 基址寄存器 和 限长寄存器 。


中央处理器在目态下执行程序时,只有在判定访问地址符合以下关系式时候才允许访问:


基址寄存器值 ≤ 访问地址 ≤ 基址寄存器值 + 限长寄存器值


中央处理器在 管态下执行 程序时候,对访问主存的地址 不进行核对 。


三、操作系统结构( 识记 )


(1)操作系统的层次结构


层次结构的最大特点是把整体问题局部化。把一个大型复杂的操作系统分解成若干单向依赖的层次,由各层的正确性来保证整个操作系统的正确性。


采用层次结构,能使结构清晰,便于调试,有利于功能的增、删和修改,正确性容易得到保证,也提高了系统的可维护性和可移植性。


操作系统的一种层次结构如下图所示:


作业管理
文件管理
设备管理
存储管理
处理器管理
硬件
这种结构具有单向依赖关系,即外层依赖内层的关系。


层次结构 的主要优点是有利于系统设计和调试;主要困难在于层次的划分和安排。


<1>作业控制语言和控制命令


操作系统提供给用户表示作业执行步骤的手段有两种: 作业控制语言 和 操作控制命令 。


用户用作业控制语言编写“作业控制说明书”,从而形成批处理作业。用户使用键盘输入操作控制命令或者选择菜单命令,进行交互处理。


<2> 系统调用


操作系统编制了许多 不同功能的子程序 ,供用户程序在执行中调用,这些子程序称为“系统功能调用”程序或“系统调用”。


·系统调用过程


系统调用 往往在 管态 下执行。用户程序在调用系统调用时,编译系统会生成一条“访管指令”。程序执行时,CPU取到访管指令就产生中断事件,操作系统即调用相应的系统调用子程序为其服务,并在管态下工作,处理完后,返回目态及用户程序。


·系统调用分类


操作系统提供的系统调用主要有: 文件操作类 ,如打开文件,读、写文件等; 资源申请类 ,如请求主存分配和归还,外设的分配和归还等; 控制类 ,如程序正常结束,异常结束和返回断点等; 信息维护类 ,如日期时间的设置和查询,文件属性的设置和查询




你可能感兴趣的:(编程语言)