操作系统和应用的关系

Posted 杨秉学的小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统和应用的关系相关的知识,希望对你有一定的参考价值。

几个问题

在步入正题之前先问几个问题就是


监控程序的主要功能是什么?

在操作系统上运行的程序称为什么?

 调用操作系统功能称为什么?


其实,每个人的答案都不一样,没必要完全按照标准答案,理解就可以了。


程序的加载和运行

应用或应用程序

系统调用(system call)


操作系统前身

在计算机中尚不存在操作系统的年代,完全没有任何程序,因此程序员就需要编写出处理相关的所有程序。用机器语言编写程序,然后再使用开关将程序输入,这一过程非常麻烦。

于是,有人开发出了仅具有加载和运行功能监控程序,这就是操作系统的原型。通过事先启动监控程序,程序员就可以根据需要将各种程序加载到内存中运行。

监控程序可以说是操作系统的原型


随着时代的发展,人们在利用监控程序编写程序的过程中,发现很多程序都有共通的部分。例如,通过键盘输入文字数据、往显示器输出文字数据等。这些处理,在任何程序下都是一样的。而如果每编写一个新的程序都要记述相同的处理的话,那真的是太浪费时间了。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了

操作系统和应用的关系

初期的操作系统


之后,随着时代的进一步发展,开始有更多的功能被追加到监控程序中,比如,为了方便程序员的硬件控制程序、编程语言处理器(汇编、编译、解析)以及各种实用程序等,结果就形成了和现在相差不大的操作系统。因此,操作系统本身并不是单独的程序,而是多个程序的集合体。

操作系统和应用的关系

操作系统


操作系统作用

制作应用的程序员们意识到一点,那就是你们制作的不是硬件,而是利用操作系统功能的应用。

计算机的硬件都是由核心(kernel)管理,那么如果我想要开发软件的话,自然就得要去参考这个核心的相关功能!就这样从原本的参考硬件函数变成参考核心功能,操作系统通常会提供一整组的开发接口给工程师来开发软件! 工程师只要遵守该开发接口那就很容易开发软件了!

由于操作系统诞生后,程序员无需再考虑硬件的问题,因此程序员的数量也增加了。哪怕是自称“对硬件一窍不通”的人,也可能会制作出一个有模有样的应用。

举个例子

操作系统和应用的关系

#include <stdio.h>#include <time.h>
int main(){    time_t tm;    time(&tm); printf("%s ", ctime(&tm));     return 0;}
在操作系统这个运行环境下,应用并不是直接控制硬件,而是通过操作系统来间接控制硬件的。变量定义中涉及的内存的申请分配,以及 time() 和 printf() 这些函数的运行结果,都不是面向硬件而是面向操作系统的。操作系统收到应用发出的指令后,首先会对该指令进行解释,然后会对时钟 IC(实时时钟)和显示器用的 I/O 进行控制。

操作系统和应用的关系

应用程序经过 OS 间接地控制硬件


操作系统和高级编程语言使硬件抽象化

#include <stdio.h>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对象(代码片段

C#程序员经常用到的10个实用代码片段 - 操作系统

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

Apollo Codegen 没有找到生成代码的操作或片段

操作栏标签片段中的片段?

进程和线程和协程之间的关系