操作系统和应用的关系
Posted 杨秉学的小屋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统和应用的关系相关的知识,希望对你有一定的参考价值。
几个问题
在步入正题之前先问几个问题就是
监控程序的主要功能是什么?
在操作系统上运行的程序称为什么?
调用操作系统功能称为什么?
其实,每个人的答案都不一样,没必要完全按照标准答案,理解就可以了。
程序的加载和运行
应用或应用程序
系统调用(system call)
操作系统前身
在计算机中尚不存在操作系统的年代,完全没有任何程序,因此程序员就需要编写出处理相关的所有程序。用机器语言编写程序,然后再使用开关将程序输入,这一过程非常麻烦。
于是,有人开发出了仅具有加载和运行功能的监控程序,这就是操作系统的原型。通过事先启动监控程序,程序员就可以根据需要将各种程序加载到内存中运行。
监控程序可以说是操作系统的原型
随着时代的发展,人们在利用监控程序编写程序的过程中,发现很多程序都有共通的部分。例如,通过键盘输入文字数据、往显示器输出文字数据等。这些处理,在任何程序下都是一样的。而如果每编写一个新的程序都要记述相同的处理的话,那真的是太浪费时间了。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了。
初期的操作系统
之后,随着时代的进一步发展,开始有更多的功能被追加到监控程序中,比如,为了方便程序员的硬件控制程序、编程语言处理器(汇编、编译、解析)以及各种实用程序等,结果就形成了和现在相差不大的操作系统。因此,操作系统本身并不是单独的程序,而是多个程序的集合体。
操作系统
操作系统作用
制作应用的程序员们意识到一点,那就是你们制作的不是硬件,而是利用操作系统功能的应用。
计算机的硬件都是由核心(kernel)管理,那么如果我想要开发软件的话,自然就得要去参考这个核心的相关功能!就这样从原本的参考硬件函数变成参考核心功能,操作系统通常会提供一整组的开发接口给工程师来开发软件! 工程师只要遵守该开发接口那就很容易开发软件了!
由于操作系统诞生后,程序员无需再考虑硬件的问题,因此程序员的数量也增加了。哪怕是自称“对硬件一窍不通”的人,也可能会制作出一个有模有样的应用。
举个例子
int main()
{
time_t tm;
time(&tm);
printf("%s ", ctime(&tm));
return 0;
}
在操作系统这个运行环境下,应用并不是直接控制硬件,而是通过操作系统来间接控制硬件的。
变量定义中涉及的内存的申请分配,以及 time() 和 printf() 这些函数的运行结果,都不是面向硬件而是面向操作系统的。
操作系统收到应用发出的指令后,首先会对该指令进行解释,然后会对时钟 IC(实时时钟)和显示器用的 I/O 进行控制。
应用程序经过 OS 间接地控制硬件
操作系统和高级编程语言使硬件抽象化
void main() {
//打开文件
FILE *fp = fopen("MyFile.txt", "w");
//写入文件
fputs("你好", fp);
//关闭文件
fclose(fp);
}
fopen() 是用来打开文件的函数;file open
fputs() 是用来往文件中写入字符串的函数;file put string
fclose() 是用来关闭文件的函数 file close
如果没有操作系统直接对硬件进行操作的话,那就变成了通过向磁盘用的 I/O 指定扇区位置来对数据进行读写了。
但是程序当中扇区根本没有出现过。传递给 fopen() 函数的参数,是文件名 "MyFile" 和指定文件写入的 "w"。传递给 fputs() 的参数,是往文件中写入的字符串 " hello world" 和 fp。传递给 fclose 的参数,也仅仅是 fp。也就是说,磁盘媒介的读写采用了文件这个概念,将整个流程抽象化成了打开文件用的 fopen()、写入文件用的 fputs()、关闭文件用的 fclose()
物理上的磁盘媒体被抽象化成了文件
提供多任务功能
多任务指的是同时运行多个程序的功能。Windows 是通过时钟分割技术来实现多任务功能的。
时钟分割实现多任务的机制
时钟分割指的是在短时间间隔内,多个程序切换运行的方式。在用户看来,就是多个程序在同时运行。也就是说,Windows 会自动切换多个程序的运行。此外,Windows 中还具有以程序中的函数为单位来进行时钟分割的多线程功能。
线程:是操作系统分配给 CPU 的最小运行单位。源代码的一个函数就相当于一个线程。多线程处理指的是在一个程序中同时运行多个函数的意思。
系统调用
操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(system call),也就是应用对操作系统(system)的功能进行调用(call)的意思。
C 语言等高级编程语言并不依存于特定的操作系统。
这是因为人们希望不管是 Windows 还是 Linux,都能使用几乎相同的源代码。因此,高级编程语言的机制就是,使用独自的函数名,然后再在编译时将其转换成相应操作系统的系统调用(也有可能是多个系统调用的组合)。
高级编程语言中,也存在可以直接调用系统调用的编程语言。
不过,利用这种方式做成的应用,移植性并不友好(也俗称为有恶意行为的应用)。
例如,直接调用 Windows 系统调用的应用,在 Linux 上显然是无法运行的。
高级编程语言的函数调用在编译后变成了系统调用
如果将整个计算机系统软/硬件绘制一下,大致如下
只要硬件不同核心(kernel)就要改变,核心只会进行计算机系统的资源分配,所以在上头还需要有应用程序的提供,用户才能够操作系统的。
操作系统的核心层直接参考硬件规格写成, 所以同一个操作系统程序不能够在不一样的硬件架构下运作。举例来说,个人计算机版的 Windows 不能直接在 ARM 架构 (手机与平板硬件) 的计算机下运作。
操作系统只是在管理整个硬件资源,包括 CPU、内存、输入输出装置及文件系统文件。如果没有其他的应用程序辅助,操作系统只能让计算机主机准备妥当(Ready)而已!并无法运作其他功能。所以你现在知道为何 Windows 上面要达成网页影像的运作还需要类似 PhotoImpact 或 Photoshop 之类的软件安装了吧?
应用程序的开发都是参考操作系统提供的开发接口, 所以该应用程序只能在该操作系统上面运作而已,不可以在其他操作系统上面运作的。现在您知道为何去购买在线游戏的光盘时,光盘上面会明明白白的写着该软件适合用于哪一种操作系统上了吧?也该知道某些游戏为何不能够在 Linux 上面安装了吧?
以上是关于操作系统和应用的关系的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段
Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段