软件接口设计_接口定义的工作模型

接口定义是架构的最终结果。实际上,架构的外在表现常常表现为接口。我们用SDSA方法来看这个问题,可以这样看:作为计算系统,你的核心需求必然是数据加工。无论这个功能看起来多不像一个计算,计算机系统能干的也就是数据加工。我们拿一个计算辅助功能来举例,比如说,MMU。用DFD来讨论MMU功能,它是这样的:

v2-0c2df882a6ba0dd4b2af521e8c090dee_b.jpg
MMU处理的DFD图,上图是Context Diagram,下图是DFD。如果你觉得这个图缺了缺页流程,请再去看一下DFD图是什么,否则应该看不懂下文。

TLB填充,TLB查询是你必做的动作,因为它就是这个功能本身的定义。无论你把这个功能放在软件里面做,还是硬件里面做,你总是得做的。拿这个TLB填充为例,你要软件做,接口可以定义软件必须在发出VA前填充TLB,否则硬件停机或者异常。又或者让硬件查表的时候给软件发中断,要求它填。你要硬件做,可以让软件一开始就把整个页表放在内存中,TLB查询不到的时候,由硬件的某个部件来做这个填充。硬件还可以进行局部预估,每次加载一个TLB项的时候,根据机器学习得到某种Pattern,自动加载另外一些项进来,提前做好准备。你还可以软硬结合,把填充历史反馈给软件,让软件给出一组Hint,告诉你下次预装载哪些项……

所以其实接口这个东西,本身会产生数据流。我们通常不在DFD中放接口本身产生的数据流,因为DFD并非一个设计逻辑分析模型,而是一个需求分析模型。我们是通过DFD描述核心的“数据加工”需求是什么,然后决定如何分配里面的每个“加工”步骤,决定是哪个模块来负责。对于架构师来说,他其实在某种程度上不怎么在乎这个加工放在哪一边,因为放哪一边都是工作量。

插一句:其实,这还是个自由度的问题。如果你只有软件团队,而且平台都是买的,你能控制的就一两个模块,你的加工都得放在你可控的模块里,你可想的东西就会少很多,第三方的能做的,你只能让它做,不能做的,你只能自己做。所以其实限制越多,设计难度越低。就好像有人说的:最容易解决的问题就是钱的问题——要不有钱,要不没钱,不用多想。

但那个模块的负责人,就不是这样看了。

所以,复杂系统的架构师,经常在这种问题上碰到困难。模块之间,都希望拿好做,容易出成绩的加工放自己一边;把坑多,不好出成绩的加工放到别人的模块里。不过这个算是小问题了,大部分时候就是个利益的问题,分配好利益就好了。

其实更难的问题是:这个接口怎么定?因为每个模块都在问:你对我是什么要求?你严格定义好了,我一定给你实现出来。

但两个模块,到底应该A模块定义接口呢?还是B模块定义接口呢?我遇到的情况,大部分时候是都不想定义这个接口,一方面这个工作量巨大,出了任何错(接口部分信息传递不过去),都是妥妥的锅;另一方面,这通常是个吃力不讨好的工作,因为“加工”本身不是接口实现的,到时吹牛说某某特性是你做的,接口是最难吹的。

但接口定义决定了整个系统的性能,它才是整个架构工作的核心。一种方法当然是架构团队做,但架构团队根据什么做呢?这是个递归问题:你没有深入设计两边的模块,你就不知道这个接口怎么才是高效的。但你不定义这个接口呢,两边的模块无法深入设计。

更大的问题是,架构团队又不是神仙,我工作二十多年了,和各种团队和大拿共事过,交流过,从来没有见过真正的通才。不说别的,同时懂软件和芯片细节的专家我就没有见过。你凭什么设计这个接口?

你说你用中断通知软件破坏流水线,转头芯片设计团队就来告诉你这不会,因为人家分支预测能预判这种情况。你说你芯片可以根据虚拟机ID转发中断,转头Hypervisor团队告诉你,这用不上,因为按人家的流程,都是先在安全区收集所有的中断,判断过权限以后才重新分发出去的。你找谁说理去?

关键是,就算你是多领域的通才,这还是个细节问题,如果你把细节问题都解决了,你还要其他设计团队吗?你自己就都把设计都做了。我们定义接口,把某个加工放到接口的这一边还是那一边,判断条件是主要是:

  1. 这个加工需要的数据主要在哪一边
  2. 接口上是否有足够的带宽和实时性提供加工需要的数据
  3. 流程需要的驱动力是否可以插入某侧的驱动框架中(比如某一侧本来就有一个线程定期监控数据,那么就不需要另一侧主动创建中断来通知另一边)
  4. 某个加工是否可以和某侧已有的加工简单结合

这些都需要知道两边的细节设计才能做出合理判断。我举个最简单的例子,就事论事讨论这里的接口,你能想到在TLB表中加上ASID?你不做微内核这类频繁IPC的系统,你根本不可能想到要加ASID吧?

所以,接口定义这件事情,我们必须建立一个基本的认识:我们不可能一次到位的。它就是一个先做一部分关键功能,尽量不建立太多约束(留下余地),然后开始设计两边模块的内部,然后再升级调整,然后再进一步设计,然后在细化两边的模块设计。每次升级,都有可能对原来的定义产生一定的破坏(这考验定义时留余地的功夫)。这样小心翼翼做下去,我们最终可能可以拿到一个挺好的接口。而指望把责任推给任何一个模块或者团队,然后觉得自己没有错,花大量的时间希望接口一次成型,最终它就成不了型。

这又是某种意义上的“无名”。你问“有什么方法完成一个接口定义”?答案是没有。但你认为“那么接口就没法定义了?”,回答是“不是”。这个事情可以做,但它“无名”,你不要指望“精确定义它”,然后把它变成生产线行为。这个世界的主体就是“无名”(没有Pattern的)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中国移动无线城市集中运营服务平台系统项目 详细设计说明书 文档标识: 当前版本: 1.0 当前状态: 草稿 发布日期: 2012-8-28 发布  修改历史 日期 版本 作者 修改内容 评审号 变更控制号 2012-8-28 1.0 拓维 新建 目 录 1 总则 2 1.1 编写目的 2 1.2 读者对象 2 1.3 参考文档 2 1.4 术语与缩写 2 2 系统概述 2 2.1 模块结构 2 2.2 采用技术 3 3 模块设计 4 3.1 模块1 4 3.2 模块2…… 9 4 模块详细设计 9 4.1 模块1 9 4.2 模块2…… 12 1 总则 1.1 编写目的 明确任务和需求,使得软件开发人员知道软件开发流程,软件测试时更有条理 1.2 读者对象 描述该文档的阅读对象。 1.3 参考文档 描述该文档的参考文档。 1.4 术语与缩写 描述该文档的术语及解释。 2 系统概述 2.1 模块结构 描述软件系统的总体结构,可以使用结构图、层次分解图或包图来描述,并应说明系统结构划分的原则(例如,基于标准、协议所规定的体系结构,来自于分析模型的方案,或者基于原有体系结构的限制)。 示例: 2.2 采用技术 描述该系统所采用的技术。 示例: 数据ETL采用C++编程技术,经过FtpMain从外围系统抽取数据,Transfer_Main对数据进行清洗,load_data对清洗后的数据进行加载,完成ETL处理过程;前台流程配置界面采用JAVA编程技术,流程调度通过调度控件完成调度控制。 数据处理层(存储层、应用层、访问层)通过DB2存储过程技术实现对数据流的规则定义,通过调度程序完成数据流的流向控制。 最终展现,通过JAVA、JSP、HTML、GIS,视频监控等编程技术完成代码开发,并部署到WEB应用服务器(WebSphere等),主题采用BRIO工具结合WEB页面,地图技术,视频技术进行多维展现。 3 模块设计 按照需求进行模块分析和设计。 3.1 模块1 3.1.1 模块说明 描述该模块的功能,对该模块进行说明。 示例: 实体渠道:提供渠道发展用户分析、业务受理分析、渠道构成分析、资源分析、考核分析,监控和评估渠道的运营状况和管理能力。 如果采用面向对象的设计模式,则可以使用用例图等来说明这些设计类之间如何交互,实现本模块的典型功能。 示例: 用例主要包括购卡支付、购卡冲正、折扣查询、购卡历史记录查询等, 由于采用异步通信方式将支付、冲正分为请求和响应两个子用例。 用例说明: 购卡支付请求:该用例说明用户通过短消息、wap、web等通信接入手段购买卡系统提供的各种卡,以短信为例,用户通过短消息向系统提交购卡指令,系统查询卡类型及金额,如卡类型正确则生成订单消息,并向用户的银行帐号扣款的支付请求。 购卡支付响应:若支付请求返回正确响应,系统查询原订单和交易记录,返回相应的卡号和密码,以短消息形式通知用户;如出现超时或数据库操作异常,系统自动发起冲正请求 3.1.2 模块设计 描述模块设计。可以用流程图表示。 示例: 也可以用类图体现。 【利用Rose工具给出系统的主要类框图,描述系统的静态行为】 示例: 主要类说明 MpcpParseChainBean 包名 com.talkweb.card.buzi 类名 MpcpParseChainBean 父类名 ChainBean 责任描述  XML解析  短信指令解析  消息协议转换(MPCP2SpDeliverMsg->TradeInfo) 协同类 使用MPCP2SpDeliverMsg的unmarshal进行XML的解析; 使用TradeInfo作为内部交易协议; 使用DefaultDAO读取数据库中操作; 使用Log提供日志服务 属性 类型 描述 Logger Log 日志管理器 方法说明 方法名 process() 类型 protected Description 解析MPCP2SpDeliverMsg消息的XMLString转换为内部TradeInfo消息 Input InputMsg Output InputMsg Process  进行XML解析  调用MPCP2Trade()进行消息转换 方法名 MPCP2Trade() 类型 private Description MPCP2SpDeliverMsg消息转换TradeInfo Input MPCP2SpDeliverMsg(MPCP短消息) Output TradeInfo(本地交易报文) Process  调用parseCommand()解析短消息内容  将MPCP短消息转换为本地交易报文 方法名 parseCommand() 类型 private Description 解析短信内容为功能码 Input String(短信内容) Output Int(功能码) BUY_CARD= 100; QUERY_MONEY= 110; QUERY_FACE= 111; QUERY_HIS = 120; REPORT= 130; HELP = 140; UNKNOW_COMMAND= 0; Process 根据短信息内容产生功能码 3.1.3 数据结构 描述该模块对应的数据模型。 3.2 模块2…… 同3.1章节。 4 模块详细设计 4.1 模块1 4.1.1 功能点1 4.1.1.1 功能说明 对该功能点进行描述(比如:新增,修改,删除,查询等功能); 或者对该功能点的具体信息进行描述。 示例: 渠道发展用户日分析: 通过时间、地域、品牌、地理位置类型、排他性等角度分析各类渠道每日新增及离网用户的情况,实现对渠道的整体分析和监控。 支持切片、钻取,旋转等分析操作,以图表形式展现, 能够打印图表,并且能将图,表分别以图片格式,excel格式导出. 4.1.1.2 数据设计 描述后台的数据设计(存储过程)。 A示例(功能点): 存 储 过 程 名: CHLDW.ETL2_CUB_COUNTY_ADD_USER_DAY 分 析 类 型: 主题 结 果 表: CHLWI.CUB_CHL_ADD_USER_DAY 运 行 周 期: 日 调 用 方 式: CALL CHLDW.ETL2_CUB_COUNTY_ADD_USER_DAY (YYYYMMDD,0,999,?); 前 驱: 版 本: 1.0 设 计 人: 需 求 分 析 章 节: 1.5.1 需 求 编 码: WCMN000000001M 变 更 情 况: 统计步骤: 1) 开号用户数:取基础层的用户信息表(CHLODS.ODS_USR_INFO)与基本信息表(chlwi.t_channel_basicinfo)用渠道标志(CHANNEL_ID)关联,根据状态标志STS_ID=18,统计开号用户数量. 2) 销号用户数: 取基础层的用户信息表(CHLODS.ODS_USR_INFO)与基本信息表(chlwi.t_channel_basicinfo)用渠道标志(CHANNEL_ID)关联,根据状态标志STS_ID = 20,统计开号用户数量. 3) 预销号用户数:取基础层的用户信息表(CHLODS.ODS_USR_INFO)与基本信息表(chlwi.t_channel_basicinfo)用渠道标志(CHANNEL_ID)关联,根据状态标志STS_ID IN (19,21),统计开号用户数量. 或采用Sequence图来表示。 示例: 4.1.1.3 界面设计 示例: 主界面: 新增修改界面: 4.1.1.4 接口设计 描述接口。 4.1.2 功能点2….. 同4.1.1章节。 4.2 模块2…… 同4.1章节。
计算机组成与设计是指计算机系统的各个组成部分以及它们之间的相互关系和交互作用。硬/软件接口则是硬件与软件之间的交互接口,它定义了硬件与软件如何进行通信和协作。 RISC-V是一种基于精简指令集(RISC)架构的开源指令集架构(ISA),它被广泛应用于各类嵌入式、移动和服务器等领域。RISC-V的设计目标是简单、灵活和可扩展的,它具有可裁剪指令集和可扩展指令集的特性,可以根据具体应用需求进行配置和扩展。 在RISC-V的设计中,硬/软件接口扮演着关键的角色。RISC-V的硬件接口规范定义了处理器的指令集和寄存器、存储器等硬件设备的规格和功能,软件则通过这些接口与硬件进行通信和控制。 RISC-V的硬/软件接口规范采用了标准的、开放的方式,使得开发者可以自主设计和开发RISC-V架构的处理器核,并可以使用自定义的指令扩展。这种开放的接口设计有助于推动RISC-V的发展,使得不同厂家、组织和个人都能够参与到RISC-V生态系统的建设中。 为了更好地了解RISC-V的硬/软件接口,可以阅读《RISC-V指令集手册》(RISC-V Instruction Set Manual),该手册包括了RISC-V的指令集、寄存器和内存模型等详情,以及相关的规范和指导。这份手册通常以PDF文档的形式提供,可以在官方网站或其他可靠渠道上获取到。 总之,计算机组成与设计中的硬/软件接口在RISC-V架构中扮演着关键的角色,它定义了硬件与软件之间的通信和协作方式,通过RISC-V指令集和相关规范来实现。阅读RISC-V的硬/软件接口规范,特别是《RISC-V指令集手册》,可以帮助我们更好地理解和应用RISC-V架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值