(摘自
http://www.cppblog.com/flagman/archive/2010/12/01/thinking_of_api_design.html)
最近正好在思考系统API设计中考量的一些问题,
引用
【某网友讨论到】
: 那地址是不是同一个地址呢。我现在的理解是这样的,假设有巨大的真实内存。windows首先将高2G的内存自己占了,用作各种内核对象。这2G内存共享给每个进程,但进程不能直接访问,只能通过windows给定的函数访问。
: 然后每个进程都给他2G内存,进程如果创建自己的对象就放到自己那2G内存里面,如果要建立内核对象就放到共享的那高2G里面去。
: 所以不同进程如果可以访问高2G内存的话,任何进程访问到同一个高地址实际上都是访问到同一个对象。但如果访问低2G地址的话,不同进程是对应不同的对象的。
在不同的进程中,询问同一个内核对象的实际地址(无论是线性地址还是物理地址),是无意义的:
首先,内核对象只能由在内核态下的例程才能直接访问,在我们日常的代码中,所调用的Windows API,比如CreateFile, (注意调用刚开始时是处于用户态下的),一般都会在ntdll.dll中找到对应的内核函数或例程,接着系统切换到内核态,开始调用实际对应的内核函数(KiCreateFile),这个时候才会去访问内核对象的实际地址,然后建立一个该内核对象对应当前进程的Handle,并把它返回给caller,同时切换回用户态;因此,对于用户态程序来说,只要且只能知道该内核对象在当前进程中的对应的Handle就可以对其进行操作了;
其次,这样的设计是出于对OS核心数据结构(当然包括我们正在讨论的内核对象)的保护;如果用户态程序可以轻易的获取内核数据结构的实际地址,那么对于整个OS的安全和稳定显然构成很大的问题;一个用户态的误操作可以轻易的引起整个OS的崩溃,而有了这一层的保护,崩溃的只是当前进程而不是整个系统;
接着上面这点,也可以看出,内核对象的如此设计达到了接纳OS本身的平滑演进的目的。从Windows 3.0到95/98,从NT到Win2k/XP,再到眼下的Vista/Win7,Windows操作系统本身发生了巨大的变化和进步,采纳了无数的新技术新方法,但是它基本的系统应用编程接口,也就是我们所熟知的windows API,却并没有发生太大的改变,很多Win 3.0 这个16位OS时代的程序代码只要当初设计规范编码规范,稍许修改就可以在最新版的OS上运行如飞;是什么做到了这些?也就是所谓的极为重要的向后兼容性,我个人认为,把操作系统的重要/主要功能抽象成内核对象,并通过一套极为solid的API暴露出来,达成了这个目标。
这是一种更高层次上的面向对象,把实现的细节,把系统的复杂,简单而优雅的封装了起来。你只要调用CreateFile去建个文件或管道或邮槽,不用担心当前OS是Windows 3.0还是Win7,获得的Handle,你也不用去关心它以及它所指向的内核对象是Windows 3.0的实现还是Win7的实现。
Windows上所有的精彩几乎都是基于这套通过内核对象概念抽象并暴露的API基础之上,COM/OLE,这个二十年前震撼性的ABI和IPC范畴的技术规范,其中很多的设计思路也是植根于内核对象的设计理念,如COM对象的引用计数和内核对象引用计数,IUnknown和Windows Handle(前者是指向某个二进制兼容的组件对象,后者引用或间接指向某个内核对象,都是对于某个复杂概念的一致性抽象表述),等等;
十年前的.net,本来是作为COM的升级版本推出,把COM/OLE的实现复杂性封装在了虚拟机平台CLR里面,而从这个虚拟机的开源实现SSCLI,我们可以看到大量的COM机制在.net的具体实现里面起了举足轻重的作用。在这些VM中大量symbol有着COR的前缀或者后缀,COR指代什么?Common Object Runtime, 原来CLR/SSCLI的设计思路也是把OS通过虚拟机VM的形式,并通过common object向应用程序暴露功能。
小结一下,
● OS内核对象API,三十年前系统级别的对象抽象;
● COM/OLE,二十年前二进制组件级别的对象抽象;
● .net/CLR, 十年前虚拟机平台级别的对象抽象;
写到这里倒是引起了我其他的一些思考,
软件工业界一直以来对面向对象OO是热火朝天,特别是语言层面,从C++/Java/C#到Python/JScript,不一而足;但是我们有没有从根本性的设计理念上对面向对象,察纳雅言了呢?
如果现在设计Windows这套API的任务放在大家面前,会采用内核对象/Handle方案还是直接指向OS内部数据结构的方式来暴露功能?
从三十年前的这套API的设计中,我们真的可以学到很多。
分享到:
相关推荐
Api-admin开源源码API数据管理系统正是为了解决这一问题而诞生的,它提供了全面的API管理和监控功能,使得开发者可以更加高效地进行API的开发、测试和维护。 Api-admin系统的核心特性在于其内置了20+条API接口源码...
以下是对微服务API设计的实践与思考的详细总结: 1. API先行策略:在敏捷开发环境中,API设计往往先于服务实现。在需求明确后,开发人员应迅速完成API设计,以便调用方可以提前Mock接口进行测试和准备工作。然而,...
本教程将深入探讨C#如何利用系统API来扩展其功能和访问操作系统底层服务。系统API,即应用程序接口,是操作系统提供给开发者用于与硬件和系统资源交互的一系列函数、类和方法。 首先,了解API在C#中的作用至关重要...
### API接口设计文档模板知识点详解 #### 一、概述 API(Application Programming Interface)接口设计文档是软件开发过程中不可或缺的一部分,它为开发者提供了清晰、准确的接口调用指南。一个良好的API文档应包括...
**Visual Basic 6.0 Win32 API程序设计** Visual Basic 6.0(VB6)是Microsoft开发的一种可视化编程环境,它允许开发者快速构建Windows应用程序。尽管现在Visual Basic已经发展到更新的版本,但VB6依然在许多企业中...
同时,优化查询性能、处理并发请求、确保数据的准确性和实时性也是系统设计的关键点。 总的来说,机票查询系统API是连接用户与航空公司信息的核心桥梁,通过一系列复杂的后端处理和交互,实现了便捷的机票查询功能...
基于ArcGIS API的上海疫情可视化系统项目源码(毕业设计+期末大作业)基于ArcGIS API的上海疫情可视化系统项目源码(毕业设计+期末大作业)基于ArcGIS API的上海疫情可视化系统项目源码(毕业设计+期末大作业)基于...
系统设计方面,将涉及到架构规划、模块划分、接口设计等,这些都是软件工程中不可或缺的部分。同时,毕业设计也是对学生的综合能力进行评估,包括独立思考、问题解决、文档编写等。 【压缩包子文件的文件名称列表】...
QQ API设计说明书(开发QQ第三方程序必备) 一、引言 3 1.1 编写目的 3 1.2 更新时间 3 二、总体设计 3 三、注册的系统消息 3 3.1 WM_QQAPI_REGISTER 3 3.2 WM_QQAPI_REGISTER_RESP 4 3.3 WM_QQAPI_AVAILABLE 4 四、...
易用API伴侣是一款专为易语言用户设计的强大API工具,旨在提供全面且便捷的API接口调用服务。API,即应用程序编程接口,是软件系统之间交互的一种方式,允许开发者访问和利用操作系统、数据库或其他服务的功能。...
FreeRTOS系统API使用手册 纤细说明每个接口函数的使用及参数说明
总之,API Monitor是一个强大的工具,对于深入理解应用程序如何与操作系统交互,以及在问题排查和性能优化中扮演着重要角色。掌握并熟练使用API Monitor,可以帮助提升开发者的调试技能和工作效率。
1.此项目是基于Thinkphp3.2.3+easyui做的权限管理系统,所有后台管理系统均可基于此项目开发。 2.项目集成php反射自动生成API文档,通过访问http://你的IP或者域名/文件地址/tpcs/index.php/Api/Doc/index.html即可...
【百度地图API开发的网格营销...通过上述介绍,我们可以看到,这个“百度地图API开发的网格营销系统”集成了多种技术,包括Web开发、地图服务、数据管理、用户交互设计以及营销策略实施,是一个综合性的IT解决方案。
java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....
《用友NC开发API字典》是一份专为开发者准备的重要参考资料,主要涵盖了在使用用友NC(U8+)系统进行二次开发时所涉及的各种应用程序接口(API)。API是软件之间的桥梁,允许不同的系统之间交换数据和执行操作,极大...
WebApi和访问WebApi是开发过程中常见的两个概念,它们在构建分布式系统和提供网络服务时起着关键作用。本文将深入探讨这两个项目及其关联技术,包括WebApi的使用和通过HttpWebRequest类进行WebApi调用。 WebApi是...
总结起来,"WebApi和访问WebApi两个项目(更新过)"涉及到的知识点包括WebApi的基本架构、控制器设计、路由配置、模型绑定、过滤器、HttpClient的使用、异步编程、JSON数据交互以及错误处理。通过这些技术,开发者...
总之,通过熟练掌握Windows API和C#的进程管理,我们可以在WinForm应用中实现外部EXE程序的嵌入,但需要考虑兼容性和程序安全性问题。在实际应用中,应确保遵循最佳实践,以保证应用程序的稳定性和用户体验。