转----操作系统与应用程序的关系

操作系统与应用程序的关系

——原博地址:http://blog.csdn.net/maochengtao/article/details/8943284

操作系统与应用程序的关系:

  操作系统主要可以分为两大部分:内核和内核之外的一些程序。

  内核就是直接控制最底层的硬件,而我们日常所用到的软件,大都是通过内核之外一些程序与内核之间的接口完成的,例如WINDOWS API就是为我们提供了应用程序与内核的接口,以实现硬件上的一些操作。操作系统(Operating System,简称OS)是一管理电脑硬件与软件资源的程序,同时也是计算机系统的内核与基石。

  操作系统是一个庞大的管理控制程序,大致包括5个方面的管理功能:进程与处理机管理、作业管理、存储管理、设备管理、文件管理。目前微机上常见的操作系统有DOS、OS/2、UNIX、XENIX、Linux、Windows、Netware等。

  应用软件是用户可以使用的各种程序设计语言,以及用各种程序设计语言编制的应用程序的集合,分为应用软件包和用户程序.应用软件包是利用计算机解决某类问题而设计的程序的集合,供多用户使用。

内核系统与应用程序的关系:   

  在linux系统中,内核为用户程序提供了两方面的支持。

  其一是系统调用接口,即中断调用int 0x80;另一方面是通过开发环境库函数或内核库函数与内核进行信息交流

  不过内核库函数仅供内核创建的任务0和任务1使用,它们最终还是去调用系统调用。因此内核对所有用户程序或进程实际上只提供系统调用这一种统一的接口。lib/目录下内核库函数代码的实现方法与基本C函数库libc中类似函数的实现方法基本相同,为了使用内核资源,最终都是通过内嵌汇编代码调用了内核系统调用功能。

  系统调用主要提供给系统软件编程或者用于库函数的实现。而一般用户开发的程序则是通过调用像libc等库函数来访问内核资源。这些库中的函数或资源通常被称为应用程序编程接口(API),其中定义了应用程序使用的一组标准编程接口。通过调用这些库中的程序,应用程序代码能够完成各种常用工作,例如,打开和关闭、对文件或设备的访问、进行科学计算、出错处理以及访问组和用户标识号ID等系统信息。

  在UNIX类操作系统中,最为普遍使用的是基于POSIX标准的API接口。Linux当然也不例外。

  API与系统调用的区别在于:为了实现某一应用程序接口标准,例如POSIX,其中的API可以与一个系统调用对应,也可能由几个系统调用的功能共同实现。当然某些API函数可能根本就不需要使用系统调用,即不使用内核功能。因此函数库可以看做实现像POSIX标准的主体界面,应用程序不用管它与系统调用之间到底存在什么关系。无论一个操作系统提供的系统调用有多么大的区别,但只要它遵循同一个API标准,那么应用程序就可以在这些操作系统之间具有可移植性。

  系统调用是内核与外界接口的最高层。在内核中,每个系统调用都有一个序列号(在include/unistd.h头文件中定义),并且常以宏的形式实现。应用程序不应该直接使用系统调用,因为这样的话,程序的移植性就不好了。因此目前Linux标准库(Linux Standard Base,LSB)和许多其他标准都不允许应用程序直接访问系统调用宏。

  库函数一般包括C语言没有提供的执行高级功能的用户级函数,如输入/输出和字符串处理函数。某些库函数只是系统调用的增强功能版。例如,标准I/O库函数fopen和fclose提供了与系统调用open和close类似的功能,不过是在更高的层次上。在这种情况下,系统调用通常能提供比库函数略微好一些的性能,但是库函数却能提供更多的功能,而且更具检错能力。

  实际上软件程序还可以细分成两种:系统程序软件和应用程序软件。系统程序软件实际上就是我们所说的驱动程序,它们的目的只有一个,就是为了驱动硬件,使之能正常地完成某种硬件功能,比如网卡的发送数据功能,声卡的播放声音功能。应用程序软件则用来接收用户的输入请求,进行很多业务运算后,再通过驱动程序驱动硬件去完成用户所要求的任务,有时候应用程序软件也负责把运算的最终结果反馈给用户。画成图就是图一那样,注意,在整个软件系统中,也只有驱动程序最清楚硬件的功能及工作方式,如果上面应用程序想要硬件完成什么样的任务,必须使用相应的驱动程序所提供的那些接口才行。驱动程序直接驱动硬件进行工作,而应用程序则只需要知道这些接口,通过它们间接去驱动硬件来完成任务。这种策略看似简单好用,但也会受到两方面因素的制约。

图一

  首先,一个计算机系统里面的硬件设备通常不会只有一个。比方我的魅族MP3里除了音频解码器外,自然也有用来存储歌曲的设备。这些设备各具不同的功能,完成这些功能的操作也就各不相同,就决定了写出来的驱动程序也是各式各样的,最后导致他们提供给应用程序使用的接口也是千变万化的,如图二那样,用不同颜色的箭头表示不同的接口使用。这大大增加了应用程序开发的难度,因为应用程序开发者不仅要考虑上层业务逻辑的处理,还要非常熟悉各种驱动所提供出来的不同接口。

  图二: 一个应用使用多个硬件设备

  其次,一个计算机系统里面同时运行着的应用程序通常也不会只有一个,这些应用程序会竞争使用总量特定的硬件设备资源。比方你和朋友在用qq聊天的同时,也听着千千静听放出来的音乐,他们都要使用屏幕设备show出界面,也都要使用物理内存(2)来运行程序代码。但是屏幕只有一个,内存也只有那么多,所以在整个计算机系统范围内,必须有某种机制来管理分配这些特定硬件资源的使用。如图三,设计的时候,这种机制要么放在应用程序中实现,要么放在驱动程序中实现,但无论放在哪一方,都是会给这一方的程序开发者带来额外的负担。

图二 一个应用使用多个硬件设备

图三: 多个应用使用多个硬件设备

  引入操作系统之后:上面之所以说额外,那是因为对于应用程序开发者来讲,其重点要考虑的是业务逻辑如何实现,而不是去考虑硬件资源的管理分配,也最好用不着去区分那么多驱动程序的不同接口。类似的,对于驱动程序开发者来说,其要考虑的重点是如何正确的驱动特定的硬件,而不是去考虑硬件资源的管理分配上。那这部分“额外”的工作由谁去做呢,这正是后来出现的操作系统(3)的职责所在。

图五: 引入操作系统后的情况

  如图五,操作系统帮我们考虑对各种硬件资源的分配管理,并完成对各种驱动程序所提供接口的抽象,形成一套简单一致的接口给上层的应用程序去使用。如此,应用程序开发人员只需要知道操作系统所提供的这套编程接口(API),就可以实现不同的业务应用。前面我们讲系统程序软件实际上就是驱动程序,但这里我们讲系统程序软件是操作系统。概念上,我们认为操作系统依赖于驱动程序这一层,但实际上,驱动程序是嵌入到操作系统中去的,所以我们认为驱动程序是操作系统的一部分。这种镶嵌大大增加了以往驱动程序开发者的工作难度,因为他们不仅要熟悉手头的硬件工作原理,更重要的是要确保他们写的驱动能正确的镶嵌到操作系统里面去,这就要求他们同时也必须熟练掌握操作系统提供出来的,用来完成镶嵌工作的各种接口。

时间: 2024-10-26 20:29:15

转----操作系统与应用程序的关系的相关文章

windows操作系统下java程序使用sigar的使用问题

今天,处理了一个windows操作系统下java程序使用sigar的使用问题.之前是将dll文件放置在C:\Windows\SysWOW64下.后来,还是会报错(调用获取cup信息时出错),网上找了好久,发现需要在你运行程序时依赖的jdk的安装路径下的bin目录下,放置对应的dll文件(sigar-x86-winnt.dll或sigar-amd64-winnt.dll),重启服务,运行,ok ps:可使用System.out.println(System.getProperty("java.li

【源码分析】动态分析 C 程序函数调用关系

By Falcon of TinyLab.org 2015/04/15 缘由 源码分析是程序员离不开的话题.无论是研究开源项目,还是平时做各类移植.开发,都避免不了对源码的深入解读. 工欲善其事,必先利其器. 之前已经介绍了如何通过 Callgraph 静态分析源代码,这里介绍如何分析程序运行时的实际函数执行情况,考虑到应用部分和内核部分有比较大的差异,该篇先介绍应用部分. 主要介绍三款工具,一款是 gprof,另外一款是 valgrind,再一款则是能够把前两款的结果导出为 dot 图形的工具

X86(32位)与X64(64位)有什么区别,如何选择对应的操作系统和应用程序?

X86就是我们一般用的32位的系统,指针长度为32位(386起):X64就是64位的系统,指针长度为64位. 选择硬件对应的软件,建议通过以下三条考虑:1.64位操作系统相对32位操作系统理论上性能会相应提升1倍:2.64位操作系统支持多达128 GB的内存和多达16 TB的虚拟内存,而32位CPU和操作系统最大只可支持3.5G内存:3.64位软件比32位软件要少,64位电脑可以安装32位操作系统,64位操作系统可以安装32位软件. 具体两者区别:1.设计初衷不同.64位操作系统的设计初衷是:满

MVC (M-V-C启动程序调用关系)

在网上有很多mvc程序启动,调用之间的关系与顺序.而且还有很多很不错的网站.推荐一个      http://www.cnblogs.com/QLeelulu/archive/2008/09/30/1302462.html. 但是那些都说的比较理论,对于一些第一天开始学mvc的朋友来说,可能看起来感觉好像懂了很多,但是用起来的时候就感觉有问题,还经常遇到http 404问题. 我也摸索了一下,终于算理解跟会实际应用.以下我按实际操作来讲,不说那些太理论的东西. mvc的调用顺序:C => V =

计算机运行原理?什么是操作系统?应用程序的启动

计算机组成:应用程序 操作系统 计算机硬件 什么是操作系统 是一个协调.管理.控制计算机硬件与软件的控制程序 操作系统分成两部分: 接口程序:将硬件的功能封装成简单的接口,用来给应用软件或者给用户使用 内核:具体控制硬件,对下 内核态与用户态(了解) cpu的两种工作状态 用户态:cpu执行用户程序/应用程序所处的状态,处于用户态不能控制硬件 内核态:cpu执行操作系统内核所处的状态,处于内核态能够控制硬件 应用程序的启动:(重点!!!) 前提:先启动操作系统 1.向操作系统提交程序启动文件的路

思考程序与写程序的关系

首先引用孔夫子的一句话:学而不思则罔,思而不学则殆. 首先,学而不思者罔这句话的意思就是如果做一件事情,我们只是为了完成任务才去做这件事情,如果我们不对问题进行思考,那么我们就会感觉知其然而不知其所以然. 思而不学则殆这句话就是,如果我们不动手去做,而一味的去思考结果,那么就会在一个点停滞不前. 其实我很赞成孔夫子的话,我个人认为这2句话很适合编程的人,当然“学而不思者罔”这句话,我个人觉得更适合于我们程序员. 其中造成学习而不去理解它的原理有几点原因. 任务本身的进度很赶,没时间去研究那么深刻

java程序运行关系

源代码不能被执行的,所编写的语言是给程序员看的,计算机无法读写其内容. ①如此这般就需要运行叫java编译器的文件(javac.exe)把它编译成java字节码的文件. ②形成字节码文件之后再由解释执行器文件(java.exe)将字节码文件加载到java虚拟机(jvm). ③字节码文件就会在jvm中执行,执行之后,jvm针对计算机的平台生成对应机器的令,由平台机器执行这些指令.

操作系统--进程、程序和作业的区别

程序与进程之间的区别: (1)进程更能真实地描述并发,而程序不能. (2)进程由程序和数据两部分组成,进程是竞争计算机系统有限资源的基本单位,也是进程处理机调度的基本单位. (3)程序是静态的概念:进程是程序在处理机上一次执行的过程,是动态的概念. (4)进程有生存周期,有诞生有消亡.是短暂的:而程序是相对长久的. (5)一个程序可以作为多个进程的运行程序:一个进程也可以运行多个程序. (6)进程具有创建其他进程的功能:而程序没有. 作业与进程的区别: 一个进程是一个程序对某个数据集的执行过程,

关于程序结构关系软件

我从业20多年,这个软件是比较复杂的,虽然遵照结构化.模块化.对象化等,还是不能满足要求.因为各模块.对象等关系复杂,堆叠在一起,千丝万缕经常搞的昏头眼花,糊糊嘟嘟.为此我用自创的结构图表明作用,流向,接口依赖等,瞬间清晰明了,还帮我找到了不足.问题是画图太费时间,表现能力也有限,如果以软件形式,通过图示,模板,类图,结构,流向,属性,源码等方式输入,设置,展现,将事半功倍.如果以源码形式展现,还可导出源程序,挂到工程下即可直接使用,避免了重复劳动.这个软件是创造性的,我一个人是按数年完成的,现