编程架构思考

架构,作为程序员是必须的,好的架构提供代码重用的可能性(因为模块化/对象化,而且模块/对象间松散耦合),提供灵活的扩展性(方便加入其他模块和功能),代码维护性和可读性好 。
人类的认识总是连续性上升的,不会飞跃,所以随着时间推移,架构技术也在更新,所以你需要关心一些新的架构技术、新的通信技术、新的框架。例如ROS机器人系统第一代使用master方式,ROS2使用新的DDS技术方式。
其实很多技术的相似的,思想是相似的,你需要自己提炼一下,理解好,实际操作实践一下,从而提高自己水平。
《设计模式》是你必须学习的,设计模式其实不单单可以应用于某个程序编程,还可以应用于通信协议等等方方面面的思想上。取决于你如何提取各种事物的共性,如何思考他们的差异。永远记住:任何代码架构的问题都可以通过加入中间层解决。即模块化、对象化、去耦合。归根结底,各种设计模式就是研究把各种可能变化的设计点封装起来,以适应这种变化,从而实现代码可扩展和重用。
代码可以找参考的,算法可以找到参考例子,架构也可以找参考的。天下代码一大抄,并没有不妥。
正如写驱动,需要首先确定下层硬件接口使用的什么总线,从而确定对下使用什么总线API,然后确定要对上实现的功能,是网卡、sensor还是什么,也就可以确定对上层应用暴露的接口, 从而选择子系统,例如iio、input子系统等。也就是你得知道驱动作为架构中的一个中间层而已。同理你设计架构时得懂得分层的概念。驱动的架构相对固定,你需要思考的内容也相对固定,无非就是代码执行的上下文、函数的重入性、如何支持管理下层多设备、如何支持多个上层client等,就像神经网络的M:N网状链接关系,基本涉及《linux设备驱动模型》和《如何编写linux设备驱动》提及的那些内容。各种代码执行上下文包括中断、软中断、tasklet (基于软中断实现)、hrtimer (软中断或硬中断环境下执行)、timer (基于软中断实现)、kernel thread、普通线程内核态;代码执行过local_irq_disable、local_bh_disable、preempt_disable后的上下文。具体参考我的视频课程《linux设备驱动模型》和《如何编写linux设备驱动》。
linux的内存管理架构,其实就是围绕如何高效管理虚拟地址空间、物理内存。所谓高效就是随时代变迁利用各种技术做到安全、快速分配和释放、减少碎片提高分配大内存的可能性、各种方式节省物理内存(包括先文件映射后面用时才分配、写时复制等技术、ELF文件的section合并segment、linux VMA映射技术等)。具体参考我的课程《深入linux内核》和《elf file linker and loader与linux结合》

1、架构的通用性思考,《设计模式》等的松耦合,主要考虑的是通用性和可扩展性。越是通用,往往性能会有损耗,这需要权衡。
2、架构性能的思考,
(1)各种对慢设备访问的缓冲技术,cpu的cache、页表的TLB缓冲、目录项的缓冲、磁盘文件读写的内存页高速缓存、DMA访问方式;各种减少重复查找的技术和各种减少反复分配释放的技术,dlmalloc的dv记录、jemalloc的Tcache线程缓冲、kmem_cache的slab/slub/slob缓存、bitmap方式整体判断的f标记位的记录方式。
(2)各种减少拷贝技术,例如skbuff指针移动技术、写时复制技术、共享内存技术。
(3)更加高效的数据结构和算法,例如红黑树,具体参见《算法导论》
3、架构的安全性的思考,面向数据的数据安全的各种锁保护机制、数据完整性的检查、数据纠错的各种checksum方法、数据访问权限的各种保护(包括SeLinux的措施等)。
4、各种思想, 面向过程、面向对象、面向服务、面向数据,等等思想。都是你应该理解和思考的。
5、考虑到系统调用会有一定的性能损失,所以要区分进程间通信、进程内通信、机器内同一个SOC的各中子模块之间通信、不同机器(PC)间通信的不同。
(1)进程内,直接用函数直接调用、函数指针callback回调方式、queue队列传递、链表、树、hash表、全局变量等即可;没必要用socket通信、sharememory等涉及系统调用的相对低性能的方式交换数据和信息。
(2)进程间可以使用sharememory、socket等各种进程间通信方式。 同一个SOC的各个子模块,例如高通的Application arm cpu和modem dsp核模块之间,采用sharememory共享物理内存方式、总线通信方式、socket网络通信方式。
(3)不同PC机器之间采用socket网络通信方式、各种通信总线方式。

某些内容具体参考我的视频课程:
https://edu.51cto.com/lecturer/8896847.html
https://edu.51cto.com/topic/2385.html

原文地址:https://blog.51cto.com/8906847/2440589

时间: 2024-06-16 19:15:04

编程架构思考的相关文章

小钢的架构思考:架构设计

原创文章,转载请注明:转载自Keegan小钢并标明原文链接:http://keeganlee.me/post/architecture/20160621微信订阅号:keeganlee_me写于2016-06-21 小钢的架构思考:什么是架构小钢的架构思考:架构规划小钢的架构思考:架构设计 最近一个多月因为忙于工作上的项目重构,所以文章一直没能更新.现在,重构终于暂时告一段落,于是,赶紧抽时间把文章写完更新发布.下面进入正文. 当架构规划的结果,整理出一堆不同优先级的需求,尤其是质量需求之后,接下

数据层全栈式编程架构

CRUD全栈式编程架构之数据层的设计 CodeFirst 一直以来我们写应用的时候首先都是创建数据库 终于在orm支持codefirst之后,我们可以先建模. 通过模型去创建数据库,并且基于codefirst可以实现方便的 实现数据库迁移的工作.使用codefirst有以下几个技巧, 以EntityFramework为例,结合我这个设计做了以下改进 1.模型的识别 建立一个基类命名Entity,里面只有一个long类型的id字段. 所有需要映射到数据库的模型都继承自Entity, + 2.模型的

PLC编程再思考之二:SOA

随着AMAZON云服务的成功,许多人知道了BEZOS在AMAZON内部推广WEB SERVICE的故事,从而佩服他的技术眼光和执行力. 如果说AMAZON.COM的成功是因为长尾理论,是对万货商店的技术实现,那么从某个层面来说,AWS(AMAZON WEB SERVICE)是另一种形式的长尾,只不过它销售的是IT服务而不是物理产品. BEZOS基于SOA的思想,通过网络接口和服务打通了AMAZON内部的各种子系统,他把基础设施的接口进一步对外开放,从而形成了AWS的基础功能. 那么,SOA的思想

CRUD全栈式编程架构之界面层的设计

Layout的设计 模板模式 mvc的模板特别类似设计模式中模板方法模式,结合Layout中RenderSection和RenderBody方法可以将部分html展现逻辑延迟到具体的视图页面去实现里面实现.结合我们增删改查的逻辑,我们的用户界面,我们将页面分为这几个区域,实现部分逻辑以后,部分留给具体的页面去实现.例如图片中新增,编辑,删除,导入,导出,查询都是架构自带的操作,至于复制就给页面扩展,查询条件也留给具体的页面中扩展,模板中给出RenderSection即可. 执行顺序 这个执行顺序

一种基于Storm的可扩展即时数据处理架构思考

问题引入 使用storm可以方便的构建一种集群式的数据框架,并通过定义topo来实现业务逻辑. 但使用topo存在一个缺点, topo的处理能力来自于其启动时设置的worker数目,在很多情况下,我们需要能够根据业务压力来调整集群的处理能力,这时候单一的topo就无法解决这个问题了. 为了能够更加灵活的定义处理能力,可以考虑将原有的topo根据业务域进行拆分,做到互不干扰,灵活控制,而且为了能够更加经济的利用处理资源,可以考虑引入worker资源池的概念,达到对资源的充分利用. 但使用这种多to

工业4.0在工业企业内实施的架构思考【一】

德国“工业4.0”将积极部署 信息物理系统(CPS CPS,Cyber-Physical Systems))平台,实现工厂的“智能制造”. “智能制造”已成为全球制造业发展的新趋势,智能设备和生产手段在未来必将广泛替代传统的生产方式. 而CPS将改变人类与物理世界的交互方式,能够使未来制造业中的物质生产力与能源.材料和信息3种资源高度融合,对实现“智能工厂”和“智能制造”提供有效保障. 美国.德国等世界工业强国都高度重视信息物理系统的构建,加强战略性.前瞻性的部署,并已取得了积极的研究进展. 而

持久化内存编程及其思考

由于个人工作关系,接触到了持久化内存的概念,觉得这个概念特别有意思,对于未来的编程模型会有很大的影响,甚至,很多的软件(系统软件)优化和架构会有很大的不同,甚至重写. 背景知识 长久以来,我们一直接受的观念是,数据从磁盘读取到内存中,然后CPU从内存对数据进行操作,最后再从内存回写到磁盘保存,完成整个数据的读取,处理和保存.这个观念中,内存容量很小,很贵,磁盘容量很大但是很便宜.从4k访问延时或者吞吐量上来看,内存是要比磁盘快上1000倍或者以上的,然而,随着Intel的黑科技技术傲腾(Opta

PLC编程再思考之4 - 面向对象

PLC编程有诸多限制,如: 传统的西门子PLC单个DB的存储容量为64KB. 每次DB结构变更时,都需要编译并重新下载覆盖原DB. 每次DB结构变更时,OPC变量需要重新映射地址. 但有时候我们希望把DB设计得灵活一些,当给PLC增加一些小的元素时,我们不希望覆盖大量的DB. 有时我们希望PLC程序设计得模块化.产品化.基于配置. 在这些应用场景中,我们可以参考面向对象的方法进行PLC编程. 本文以质量安灯实例说明了面向对象的PLC编程方法. 业务需求为: 每个工位配置1条拉绳. 当拉绳拉下时,

图片系统架构思考之一:删除图片--不容忽视

对于一个网站系统,图片的处理往往是一个不可或缺的事情,不管是淘宝还是京东,每天都有大量的产品上架.下架,其中就涉及到了大量图片的管理.比如很简单的一个产品表,里面有:产品ID.产品名称.产品图片 字段,此时应该怎么保存产品图片呢? 一种方式是将图片保存到数据库里面,采用blob类型的字段,此时该字段的内容就是图片的二进制表示:另外一种方式是将图片保存到普通的文件系统上,比如windows或者linux的分区上,在数据库的相应字段中保存的是该图片文件的路径信息,该模式的一个简单示意图如下:当客户端