`
liangguanhui
  • 浏览: 112901 次
  • 性别: 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的设计中,我们真的可以学到很多。
分享到:
评论

相关推荐

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

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

    API 接口 设计文档 模板

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

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

    我们从百亿流量交易系统 API 网关(API Gateway)的现状和面临问题出发,阐述微服务架构与 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依然在许多企业中...

    软件框架设计的艺术(Practical API Design)

    - 讨论了在设计和维护API过程中可能遇到的挑战和问题。 - 提供了实用的解决方案和技术建议。 - 分享了作者个人的经验教训,帮助读者避免常见的错误。 #### 三、关键知识点 **1. API设计的原则** - **简洁性**...

    易用API伴侣 API工具 易用API伴侣 API伴侣 易用API 易用

    易用API伴侣是一款专为易语言用户设计的强大API工具,旨在提供全面且便捷的API接口调用服务。API,即应用程序编程接口,是软件系统之间交互的一种方式,允许开发者访问和利用操作系统、数据库或其他服务的功能。...

    FreeRTOS系统API使用手册

    FreeRTOS系统API使用手册 纤细说明每个接口函数的使用及参数说明

    互联网API网关架构设计.docx

    本文档主要介绍了互联网API网关架构设计的概念、架构设计、系统架构设计、性能考虑等方面的知识点。 一、API网关架构设计概念 API网关架构设计是指将各系统对外暴露的服务聚合起来,所有要调用这些服务的系统都...

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

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

    系统接口设计对接方案 .docx

    系统接口设计对接方案 系统接口设计对接方案是指系统与外部系统之间的对接方式,涉及到安全、方式、压缩、解压、规范、标准、口令、审计、责任等多个方面。 在系统接口设计中,需要考虑到安全性、可靠性、性能、可...

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

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

    JAVA_API1.6文档(中文)

    java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java....

    WebApi和访问WebApi两个项目

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

    C#调用api接口

    本文将详细介绍如何在C#中调用API函数获取系统信息。API函数是构筑Windows应用程序的基石,是Windows编程的必备利器。每一种Windows应用程序开发工具都提供了间接或直接调用了Windows API函数的方法,或者是调用...

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

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

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

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

    基于微信小程序图书馆座位预约系统设计与实现

    【微信小程序图书馆座位预约系统设计与实现】 随着信息化时代的快速发展,图书馆作为知识的集散地,其服务方式也需要不断更新以满足用户日益增长的需求。传统的图书馆座位管理模式已无法适应现代高校师生的学习需求...

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

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

    C# WebAPI示例

    2. **路由(Routing)**:WebAPI通过路由系统来解析HTTP请求,并将其映射到相应的控制器方法。默认情况下,路由模板是`api/{controller}/{id}`,但可以根据需求进行自定义。 3. **模型绑定(Model Binding)**:Web...

    京东 开放平台 api

    POP Open API提供了详细的技术说明,涵盖了API的架构设计、数据格式和安全机制,帮助开发者深入了解京东开放平台API的技术实现。 订单 API 订单API是京东开放平台API的组成部分,提供了多种订单相关的API接口,...

Global site tag (gtag.js) - Google Analytics