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

2023-05-16

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

操作系统主要可以分为两大部分:内核和内核之外的一些程序。内核就是直接控制最底层的硬件,而我们日常所用到的软件,大都是通过内核之外一些程序与内核之间的接口完成的,例如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),就可以实现不同的业务应用。前面我们讲系统程序软件实际上就是驱动程序,但这里我们讲系统程序软件是操作系统。概念上,我们认为操作系统依赖于驱动程序这一层,但实际上,驱动程序是嵌入到操作系统中去的,所以我们认为驱动程序是操作系统的一部分。这种镶嵌大大增加了以往驱动程序开发者的工作难度,因为他们不仅要熟悉手头的硬件工作原理,更重要的是要确保他们写的驱动能正确的镶嵌到操作系统里面去,这就要求他们同时也必须熟练掌握操作系统提供出来的,用来完成镶嵌工作的各种接口。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • gerrit api使用curl方式

    curl digest u username password X GET 39 http gerriturl a projects 项目名称 config 39 password是gerrit上settings中的密码 项目名称中包含 记
  • lwip 基于select方式实现的tcp简易客户端

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • Kalibr相机矫正 ImportError: cannot import name PlotCollection

    Kalibr相机矫正 ImportError cannot import name PlotCollection 问题描述解决方法 其实非常简单的一个问题 xff0c 在网上找了一天都没找到解决方法 xff0c 一次偶然的操作 xff0c
  • esp32c3 nuttx 移植 micropython 尝试

    源码来自 https github com apache incubator nuttx apps pull 840 和 https github com apache incubator nuttx apps tree 787ac9060
  • 曼孚技术分享丨浅析自动驾驶车辆检测技术

    提到自动驾驶 xff0c 有人不禁会好奇 xff0c 自动驾驶系统如何感知周围环境并做出 人类 的决定 自动驾驶技术的主要模块共三大类 xff0c 即感知 规划和控制 它们之间相互协作 xff0c 共同为车辆的安全性与舒适性保驾护航 简单来
  • ros2话题的发布者和订阅者——ubuntu20.04+自定义话题接口类型

    文章目录 话题的发布者话题的订阅者自定义话题的接口类型将自定义的话题引入到程序中 话题的发布者 导入消息类型 xff0c ros自带的消息类型在std msgs msg 下面 xff0c 有string等类型定义一个类 xff0c 里面声明
  • 红外遥控器与红外接收器调试问题分析

    红外误码问题分析 目前开发的产品是带Qt界面的 xff0c 所以作为一款可视化控制产品 xff0c 遥控器是必不可少的 xff0c 前段时间正好调试了遥控器与红外接收模块 xff0c 现总结下遇到的红外误码问题分析解决过程 分析思路分为两个
  • Ubuntu18.04下安装Cuda8及以上版本

    Ubuntu18 04下安装Cuda8及以上版本 cuda8已经不支持GCC5及以上版本的安装 xff0c 而ubuntu18自带的gcc版本为7 5 xff0c 所以安装时会报错Error unsupported compiler 7 5
  • ubuntu安装cmake的三种方法(超方便!)

    Ubuntu安装cmake的三种方法 xff08 超方便 xff01 xff09 第一种方法 xff08 不推荐 xff09 直接使用apt安装 xff0c 但是安装的版本很老 xff0c 不推荐这种方法 span class token
  • ubuntu中eigen库的安装(所有历史版本均可安装)

    ubuntu中eigen库的安装 所有历史版本均可安装 xff09 目前官网以及一些文章给出的wget网址出现错误 xff0c 下载不了 The requested repository either does not exist or y
  • Ubuntu安装opencv及问题解决(所有版本通用)

    Ubuntu安装opencv及问题解决 xff08 所有版本通用 xff09 安装编译 获取源码 span class token function git span clone https github com opencv opencv
  • 华为云端服务器使用ModelArts跑MindSpore框架Yolov5

    华为云端服务器使用Modlearts跑MindSpore框架Yolov5 环境准备 云平台登录 xff0c 用于购买服务器https uconsole xckpjs com 我这里用的是昇腾Ascend 910点击ModelArts打开控制
  • git 环境搭建以及常用指令笔记

    目录 1 Git 环境搭建1 1 Git 配置正常显示中文文件名 2 Git 常用指令2 1 Git 生成差异文件补丁包2 2 Git 移除未纳入跟踪的文件2 3 Git 选择性合并分支 1 Git 环境搭建 1 1 Git 配置正常显示中
  • ROS命令 catkin_init_workspace 分析

    ros版本 xff1a Ubuntu18 04 Melodic 之前在调试ros工作空间环境变量的问题的时候修改了工作空间src文件夹下的CMakeLists txt以进行打印消息分析出错的原因 在我新建另外一个工作空间 xff0c 执行c
  • BundleFusion复现手册——Win10+VS2013+Cuda8.0+KinectV2实时重建

    文章目录 一 摘要二 操作环境三 工程环境配置3 1 装VS2013和CUDA8 03 2 DirectX SDK 安装3 3 Kinect SDK 2 0 四 VS2013代码生成 xff08 以离线数据为例 xff09 4 1 依赖配置
  • C++基础入门

    C 43 43 基础入门 C 43 43 初识HelloWord变量 常量和关键字 数据类型整型实型 xff08 浮点型 xff09 字符串 C 43 43 初识 HelloWord 打开Visual Studio xff0c 创建新项目
  • 二(两)视图多视图点云配准

    二视图多视图点云配准综述 多视图视图点云配准多视图点云粗配准基于生成树的粗配准基于形状生成的多视图粗配准算法 多视图点云精配准 点云配准 xff08 Point Cloud Registration xff09 是将两个或多个点云数据集对齐
  • 点云传统滤波算法

    点云滤波 分割功能滤波直通滤波条件滤波提取索引滤波 下采样类滤波体素滤波均匀采样滤波 去除噪声点类滤波统计滤波半径滤波高斯滤波双边滤波随机采样一致滤波投影滤波 本文介绍了各种滤波算法的原理以及给出了相关实现方法 分割功能滤波 分割功能滤波是
  • K-d树和八叉树

    K d树 xff1a 解决KNN近邻问题查找效率 对于一个k维的超平面 xff0c 在KD树每一层的构建中都选择一个维度来进行划分 xff0c 将k维的数据空间分为两部分 xff0c 并使其尽量平衡 然后如此递归下去 也就是说假如我们要储存

随机推荐

  • C++突击面试

    目录 1 编译内存相关 1 1 C 43 43 程序编译过程 1 2 C 43 43 内存管理 1 3 栈和堆的区别 1 4 变量的区别 1 5 全局变量定义在头文件中有什么问题 xff1f 1 6 内存对齐 1 7 什么是内存泄露 1 8
  • 自动驾驶 规划综述

    Motion Planning What is motion planning 规划的本质是 xff1a 搜索问题 好 的规划就是一个目标函数 xff1a 求最优解 Motion Planning的三个领域 Robotic Fields 生
  • 数值最优化

    书 xff1a Numerical Optimization 文档 xff1a 安全验证 知乎 知乎 xff0c 中文互联网高质量的问答社区和创作者聚集的原创内容平台 xff0c 于 2011 年 1 月正式上线 xff0c 以 让人们更好
  • Qlist的用法

    QList是一种表示链表的模板类 QList是Qt的一种泛型容器类 它以链表方式存储一组值 xff0c 并能对这组数据进行快速索引 xff0c 还提供了快速插入和删除等操作 QList QLinkedList和QVector提供的操作极其相
  • QT QTableView 获取某行的所有信息

    1 信号槽 显示信息 connect ui gt tableView SIGNAL clicked QModelIndex this SLOT show list 2 获取当前行的行号 int row 61 ui gt tableView
  • ubuntu 开发环境配置记录

    目录 1 VIM及zsh配置记录2 Ubuntu 配置FTP服务器3 Ubuntu 配置SSH服务器4 Ubuntu 更换软件源 1 VIM及zsh配置记录 xvim tools rar 是别人已经搭建好的环境 xff0c 下文仅为对其配置
  • CMakeLists.txt 编辑语法学习

    已hello cpp为源文件 构建一个CMakeLists txt 1 2 3 cmake minimum required VERSION 2 8 project hello add executable hello hello cpp
  • CentOS yum有时出现“Could not retrieve mirrorlist ”的解决办法——resolv.conf的配置

    错误如下 xff1a root 64 localhost svn yum install gcc c 43 43 x86 64 已加载插件 xff1a fastestmirror langpacks Could span class hlj
  • JSP九大内置对象的作用和用法总结

    JSP全名为Java Server Pages xff0c 中文名叫java服务器页面 JSP中一共预先定义了9个这样的对象 xff0c 分别为 xff1a request response session application out
  • 搭建vscode+vue环境

    一 安装vue js 1 简介 Vue js xff08 读音 vju 类似于 view xff09 是一套构建用户界面的 渐进式框架 与其他重量级框架不同的是 xff0c Vue 采用自底向上增量开发的设计 Vue 的核心库只关注视图层
  • 2G、3G、4G网络制式上下行频率、速率比较

    本文介绍第二代 xff08 2G xff09 移动通信系统和第三代 xff08 3G xff09 移动通信系统常见制式基础知识 xff0c 主要有2G xff08 GSM900 EGSM DCS1800 PCS1800 xff09 3G x
  • 23种设计模式UML图

  • lvs负载均衡基础知识梳理

    https www cnblogs com kevingrace p 6137975 html
  • 微内核和宏内核

    https zhuanlan zhihu com p 53612117
  • ARMv7-A/R/M系列 --- 简介

    1 简介在ARM11之后的处理器家族 xff0c 改采Cortex命名 xff0c 并针对高 中 低阶分别划分为A R M三大处理器 像是高阶手机用的Coretex A系列 xff0c 或者是微控制器所使用的Coretex M系列 xff0
  • ubuntu-C++Demo处理数据的一些小知识点

  • enum类型变量的使用和赋值

    enum 是枚举型 union 是共用体 xff0c 成员共用一个变量缓冲区 现在基本已经不用了 枚举类型 在实际问题中 xff0c 有些变量的取值被限定在一个有限的范围内 例如 xff0c 一个星期内只有七天 xff0c 一年只有十二个月
  • 单总线和多总线的区别

    在计算机系统的硬件组成中 xff0c 总线 xff08 Bus xff09 是不可缺少的一部分 xff0c 将各大基本部件按照一定的方式链接起来就构成了计算机硬件系统 就目前来讲 xff0c 许多微型计算机的各大部件之间都是用总线链接起来的
  • Win7系统下怎么扩大C盘容量 合并磁盘分

    C磁盘空间总是不够用 有没有想过把磁盘扩大点呢 下面小编就教你个办法 xff0c 把其他盘的空间转换成C盘的容量 xff0c 这要怎么弄呢 其实挺简单的 方法如下 xff1a 1 首先从电脑桌面左下脚开始里面进去找到 计算机 找到计算机名称
  • 操作系统与应用程序的关系

    操作系统与应用程序的关系 操作系统主要可以分为两大部分 xff1a 内核和内核之外的一些程序 内核就是直接控制最底层的硬件 xff0c 而我们日常所用到的软件 xff0c 大都是通过内核之外一些程序与内核之间的接口完成的 xff0c 例如W