`
liangguanhui
  • 浏览: 114065 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

【转载】思考系统API设计的问题

阅读更多
  (摘自 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 设计最佳实践的思考.pdf

    API设计不仅是技术实现的问题,更是人与人之间沟通的桥梁。本文将探讨API设计的一些核心准则,以帮助创建出易于理解、维护和扩展的接口。 首先,提供清晰的思维模型是API设计的基础。API设计者需要建立一个直观、...

    C++ API设计 中文高清扫描版 带完整目录书签 PDF

    《C++ API设计》探索了常常被忽视的技术性和非技术性问题,有助于推动成功的设计决策,从而产生高质量的、健壮的而且可以长期使用的API。” ——Eric Gregory,Pixar动画工作室软件架构师 “《C++ API设计》面向中...

    C++ API 设计

    对于这一软件工程上的难题,martin reddy 凭借长期的从业经验,对优质api 所应具备的各要素进行了全面分析,针对api 的不同风格及模式,以及大型长期项目的内在需求,给出了种种最佳设计策略,从而对api 设计过程的...

    visual Basic 6.0 win32 API程序设计(pdf格式)

    **Visual Basic 6.0 Win32 API程序设计** Visual Basic 6.0(VB6)是Microsoft开发的一种可视化编程环境,它允许开发者快速构建Windows应用程序。尽管现在Visual Basic已经发展到更新的版本,但VB6依然在许多企业中...

    C#之系统API详解教程

    本教程将深入探讨C#如何利用系统API来扩展其功能和访问操作系统底层服务。系统API,即应用程序接口,是操作系统提供给开发者用于与硬件和系统资源交互的一系列函数、类和方法。 首先,了解API在C#中的作用至关重要...

    API 接口 设计文档 模板

    ### API接口设计文档模板知识点详解 #### 一、概述 API(Application Programming Interface)接口设计文档是软件开发过程中不可或缺的一部分,它为开发者提供了清晰、准确的接口调用指南。一个良好的API文档应包括...

    百亿流量API网关的设计与实现.pdf

    我们从百亿流量交易系统 API 网关(API Gateway)的现状和面临问题出发,阐述微服务架构与 API 网关的关系,理顺流量网关与业务网关的脉络,带来最全面的 API 网关知识与经验。内容涉及: 百亿流量交易系统 API ...

    机票查询系统API,机票接口

    同时,优化查询性能、处理并发请求、确保数据的准确性和实时性也是系统设计的关键点。 总的来说,机票查询系统API是连接用户与航空公司信息的核心桥梁,通过一系列复杂的后端处理和交互,实现了便捷的机票查询功能...

    基于ArcGIS API的上海疫情可视化系统项目源码(毕业设计+期末大作业).zip

    基于ArcGIS API的上海疫情可视化系统项目源码(毕业设计+期末大作业)基于ArcGIS API的上海疫情可视化系统项目源码(毕业设计+期末大作业)基于ArcGIS API的上海疫情可视化系统项目源码(毕业设计+期末大作业)基于...

    软件框架设计的艺术 Practical API Design 英文PDF原版(吾乐吧提供)

    API设计者需要考虑如何防止未授权访问、数据泄露等问题,可能涉及认证、授权和加密等技术。书中可能包含实践案例和最佳安全实践。 另外,性能优化也是API设计的一部分。这包括减少网络延迟、提高数据传输效率等方面...

    Thinkphp3.2.3通用后台+API接口设计

    1.此项目是基于Thinkphp3.2.3+easyui做的权限管理系统,所有后台管理系统均可基于此项目开发。 2.项目集成php反射自动生成API文档,通过访问http://你的IP或者域名/文件地址/tpcs/index.php/Api/Doc/index.html即可...

    百度地图API开发的网格营销系统

    【百度地图API开发的网格营销...通过上述介绍,我们可以看到,这个“百度地图API开发的网格营销系统”集成了多种技术,包括Web开发、地图服务、数据管理、用户交互设计以及营销策略实施,是一个综合性的IT解决方案。

    金仕达API接口

    金仕达API接口是金融行业中一个重要的技术组件,主要用于第三方开发者构建与金仕达交易平台交互的交易系统。金仕达是一家知名的金融软件提供商,其API接口允许外部系统直接接入,实现自动化交易、实时数据获取、订单...

    用友NC开发API字典

    《用友NC开发API字典》是一份专为开发者准备的重要参考资料,主要涵盖了在使用用友NC(U8+)系统进行二次开发时所涉及的各种应用程序接口(API)。API是软件之间的桥梁,允许不同的系统之间交换数据和执行操作,极大...

    WebApi和访问WebApi两个项目

    WebApi和访问WebApi是开发过程中常见的两个概念,它们在构建分布式系统和提供网络服务时起着关键作用。本文将深入探讨这两个项目及其关联技术,包括WebApi的使用和通过HttpWebRequest类进行WebApi调用。 WebApi是...

    WebApi和访问WebApi两个项目(更新过)

    总结起来,"WebApi和访问WebApi两个项目(更新过)"涉及到的知识点包括WebApi的基本架构、控制器设计、路由配置、模型绑定、过滤器、HttpClient的使用、异步编程、JSON数据交互以及错误处理。通过这些技术,开发者...

    使用windows update API 获取补丁更新情况列表

    在Windows操作系统中,Windows Update API(WUA)是开发者用于集成和管理系统更新的重要工具。这个API提供了丰富的功能,允许程序直接与Windows Update服务交互,包括检查可用的更新、安装更新以及获取系统的更新...

    Win32 API参考手册(程序员必备API手册)

    作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的。本书首先对Win32 API函数做完整的概述;然后收录五大类函数:窗口管理、图形设备接口、系统服务、国际特性以及网络服务;...

    实现WinForm中嵌入外部EXE程序(调用系统api,源码)

    总之,通过熟练掌握Windows API和C#的进程管理,我们可以在WinForm应用中实现外部EXE程序的嵌入,但需要考虑兼容性和程序安全性问题。在实际应用中,应确保遵循最佳实践,以保证应用程序的稳定性和用户体验。

    《新编Windows API参考大全》PDF完全版

    《新编Windows API参考大全》是一本专注于Windows操作系统应用程序接口(API)的详细参考资料,适合于使用DELPHI等编程语言进行Windows应用开发的程序员。这本书深入浅出地讲解了如何利用Windows API来构建功能丰富...

Global site tag (gtag.js) - Google Analytics