VI. 程序运行环境
1 运行环境的概念
运行环境 = 操作系统 + 硬件。操作系统和硬件共同决定应用的运行环境。
2 操作系统
-
意义:克服计算机外围硬件构成的差异。
-
同一个操作系统在每个机型上都是不同的。
-
发展过程
早期操作系统 现代操作系统 例子 MS-DOS(Microsoft Disk Operating System 微软磁盘操作系统) Windows 特征 功能不完善,应用仍有直接操作计算机硬件的部分 应用基本不会直接操作计算机硬件,而通过Windows发送指令间接实现
3 API
- 同一类型的计算机页可以选择安装多种操作系统。操作系统的类型不同,应用程序向操作系统传递指令的途径也不同。
- API 程序编程接口(Application Programming Interface):应用程序向操作系统传递指令的途径。
- 不同操作系统的 API 有差异,因此将同样的应用程序移植到其他操作系统时,必须重写应用中利用到 API 的部分。
4 提供不依赖于操作系统的程序运行环境的方法
-
移植(ports)机制
- ports机制能够结合当前硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。
- 若目标应用源代码不在硬件上,会自动使用 FTP(File transfer protocol)连接到相关站点来下载代码。
-
虚拟机软件
-
Java虚拟机(Java Virtual Machine)
(Java有两个层面的意思。一个是作为编程语言的 Java, 另一个是作为程序运行环境的 Java。)- 原理:先将Java源文件(.java)编译生成字节代码程序(.class)(而非直接生成本地代码),再由Java虚拟机把字节代码转换为与硬件适配的本地代码。
- 不同环境需要专用的Java虚拟机。从应用的视角看,Java虚拟机就是运行环境。
5 BIOS
基本输入输出系统(Basic Input/Output System):一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序。
VII. 程序的生成与加载
1 程序的生成
// Sample1.c 返回两个参数的平均值的函数
double Average(double a, double b) {
return (a + b) / 2;
}
// 程序运行启始位置的函数
int WINAPI WinMain(HINSTANCE h, HINSTANCE d, LPSTR s, int m) {
double ave;
char buff[80];
ave = Average(123, 456);
sprintf(buff, " 平均值 = %f", ave);
MessageBox(NULL, buff, title, MB_OK);
return 0;
}
-
编译:由源文件(如.c)生成目标文件(.obj)。
编译器:执行编译的程序。 -
链接:把多个OBJ文件结合,生成1个EXE文件的处理。
链接器(linkage editor):运行连接的程序。 -
程序的启动:记述同所有程序起始位置相结合的处理内容。由一个特定OBJ文件记录。
即使程序不调用其他目标文件的函数,也必须要进行链接,并和启动结合起来。 -
库文件(.lib):把多个目标文件集成保存到一个文件中的形式。
链接器指定库文件后,会从中把需要的目标文件抽取出来,并同其他目标文件结合生成EXE文件。 -
导入库、动态链接库和静态链接库:
- 导入库 - 用于操作系统的API****函数
Windows操作系统提供的API函数(如Messagebox())的目标文件不存储在普通的库文件中,而是存储在DLL(动态链接库)文件中。
API函数的导入库存储着对应动态链接库的位置信息。 - 编程语言的标准函数存储在静态链接库中(如sprintf()函数存储于cw32.lib中)。
- 导入库 - 用于操作系统的API****函数
2 程序的加载
程序运行时的 EXE 内容:再配置信息、变量组、函数组、栈、堆。
-
再配置信息(虚拟地址分配)
- 在程序运行时,链接器在 EXE 文件的开头追加转换内存地址(虚拟地址 --> 物理地址)所需的必要信息,这种信息叫再配置信息。
- 链接后的EXE文件中,各变量(或函数)的内存地址可以用相对于变量组(或函数组)起始位置这一基点的偏移量来表示。
-
栈和堆:当程序加载到内存后额外生成,EXE文件开始运行时得到分配。
栈 堆 功能 用来存储函数内部临时使用的变量(局部变量) 用来存储程 序运行时的任意数据及对象的内存领域 生成机制 函数调用时自动申请分配 根据编写的程序明确申请 释放机制 函数处理完毕后自动释放 不会自动释放。若不明确释放,数据残留在内存,称为内存泄漏
VIII. 操作系统
1 操作系统功能历史
- 操作系统的原型 - 监控程序:具有加载和一次性运行程序的功能。
- 更多的功能被追加到监控程序中(硬件控制程序、编程语言处理器、各种实用程序等)。
操作系统成为多个程序的集合体。
2 操作系统的硬件控制:系统调用
- 概念:操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(system call)。
用高级编程语言编写的应用在编译后,转换成了利用系统调用的本地代码。
- 意义 - 硬件抽象化:通过使用操作系统提供的系统调用,程序员没必要编写直接控制硬件的程序。
实例:文件是操作系统对磁盘媒介空间的抽象化。
3 Windows操作系统的特征
-
32位/64位操作系统:XX位表示处理数据的基本单位
-
通过 API 函数集来提供系统调用
API:应用程序接口,是联系作成应用的程序员和操作系统之间的接口。
API 函数的实体被存储在 DLL 文件中。 -
提供采用了 GUI 用户界面
GUI:用户图形界面,可视化操作的用户界面。 -
通过 WYSIWYG 实现打印输出
WYSIWYG(What you see is what you get):显示器上显示的内容可以直接通过打印机打印输出。 -
多任务功能
Windows通过时钟分分割技术实现多任务功能:短时间间隔内,多个程序切换运行的方式。
-
提供网络功能及数据库功能
- 网络功能和数据库功能并不是操作系统本身不可欠缺的功能,但因为和操作系统联系密切,所以被统称为中间件(而不是应用)。
- 操作系统 + 中间件 = 系统软件
-
即插即用(Plug-and-play)实现设备驱动的自动设定
即插即用:指的是新的设备连接(Plug)后立刻就可以使用(Play)的机制。
设备连接到计算机后,系统会自动安装和设定用来控制该设备的设备驱动(Device Driver)程序。