
系统架构/设计模式
文章平均质量分 83
Smith先生
全栈多媒体软件系统技术负责人与资深架构师,目前任职于国际大型半导体公司,拥有超过8年以上的音视频软件设计,产品开发与平台化交付经验。工作以来,带领了多个大型全新多媒体项目攻关开发,精进和优化了多个大型软件系统,成功完成平台化建设和运维,为多个技术公司构建了可持续迭代的软件生态,业务面设计GPU系统、人工智能、视频监控系统、会议系统、采集系统、数字电视、多媒体框架、播放器、流式计算及编解码加速等,拥有从上层到底层的全栈软件开发经验和技术团队建设和管理经验。学海无涯,山外有山,天外有天。同大部分技术人一样,希望每天保持进步,最终实现财富自由和人生理想。:)
展开
-
LINUX多线程pipeline架构的创建分析
POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为“管道”)方式,“数据元素”流串行地被一组线程按顺序执行。它的使用架构可参考下图: 以面向对象的思想去理解,整个流水线,可以理解为一个数据传输的管道;该管道中的每一个工作线程,可以理解为一个整个流原创 2013-02-04 13:12:32 · 4682 阅读 · 0 评论 -
Django 1.6.8实战,构建你的第一个App
1.创建你的第一个project:原创 2014-10-30 22:14:41 · 6594 阅读 · 1 评论 -
Ubuntu Linux平台下Django1.6.8开发环境搭建
操作系统环境为Ubuntu Linux原创 2014-10-30 21:58:33 · 1509 阅读 · 0 评论 -
责任链设计模式之我见
责任链模式是构建面向对象软件体系架构的一个重要组成成分之一,它的光环不仅把软件系统从接受者和发送源这对冤家中解脱出来,更重要的是提高了代码的可读性和灵活性。 在GOF的经典设计模式书籍中,责任链设计模式被分在行为模式大类。行为类模式主要主要关注算法和软件系统中对象之间的责任分工。可以说,行为类模式不仅描述了类或对象的构建模式,而且描述了他们之间的通信模式。 责任链模式的原创 2012-06-27 11:28:16 · 1132 阅读 · 0 评论 -
彻底理解I/O架构
一个系统要能正确工作,必须要有数据通道(data paths)的机制,软件和硬件系统都概莫能外。对于计算机系统而言,必须要有data paths的机制来确保CPU, RAM和I/O设备之间的信息数据能正确的流动。这些data paths,通常被称为总线,是计算机内部主要的通信通道。 计算机内部一般有系统总线来连接内部所有的硬件设备。一个典型的系统总线是PCI((Peripheral原创 2015-01-21 13:34:43 · 11663 阅读 · 1 评论 -
通过C++和python场景实例理解装饰器设计模式。
参考文章:(1)http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html (2)http://en.wikipedia.org/wiki/Decorator_pattern 装饰器是一个很著名的设计模式,充分利用了继承和聚合的优势,它以“装饰”的含义生动形象地描绘了“灵活、动态地为已经存在的对象添加额外的功能“的意图。原创 2015-01-08 09:57:15 · 1826 阅读 · 1 评论 -
设计模式思想摘要
模式是人们根据以往的经验总结出来的,可以重复使用的设计方案。也就是说,模式是一种记录在案的、经过实践检验过的设计经验,可以为在特定设计背景下的类似的问题提供一种通用解决方案。在软件工程领域,根据开发过程的不同阶段和不同层次,主要有以下两种模式:(1) 架构模式: 它描述了软件系统的基本结构组织蓝图,囊括了一些预定义的、职责明确的子系统,并制定了子系统之间合作沟通的规则和指南。使用它,可以原创 2015-01-06 16:29:05 · 2799 阅读 · 0 评论 -
从总体上把握Linux内存管理
1.建立内存碎片的概念 内存碎片分为:内部碎片和外部碎片 1.1 内部碎片 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间; 内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个块。而在进程占有这块存储存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。原创 2013-04-07 15:00:24 · 1849 阅读 · 0 评论 -
线程阻塞的一种情况
阻塞状态是正在运行的线程遇到某个特殊情况。例如,延迟、挂起、等待I/O操作完成等。 进入阻塞状态的线程让出CPU,并暂时停止自己的执行。线程进入阻塞状态后,就一直等待,直到引起阻塞的原因被消除,线程又转入就绪状态,重新进入就绪队列排队。 例如:线程A等待线程B的数据,线程B等待线程A的数据,互相等待,就会陷入阻塞,这也是一种线程阻塞。下面的例子:假设线程A获得了mutex锁,这时另外原创 2013-06-05 17:22:11 · 3085 阅读 · 0 评论 -
Linux进程调度原理
原文链接:http://www.cnblogs.com/zhaoyl/archive/2012/09/04/2671156.htmlLinux进程调度的目标 1.高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效; 2.加强交互性能:在系统相当的负载下,也要保证系统的响应时间; 3.保证公平和避免饥渴;原创 2015-01-19 14:00:25 · 2315 阅读 · 0 评论 -
深入理解内联inline函数的优缺点,性能及使用指南
Inline function is the optimization technique used by the compilers. One can simply prepend inline keyword to function prototype to make a function inline. Inline function instruct compiler to insert转载 2015-01-12 21:19:32 · 10162 阅读 · 0 评论 -
AMD ROCm 平台简介
最近,AMD 发布 MIOpen。至此,AMD 始于15年的打造 GPU 计算生态的 Boltzmann Initiative,有了阶段性的成果。下面本文从深度学习计算的视角来审视一下 AMD 推出的 ROCm 生态。当然, ROCm 是一个完整的 GPGPU 生态,这里的讨论大体也适用于其他应用领域。 1. OverviewROCm 的目标是建立可替代 CUDA 的生态(图1),并在源码级别...转载 2018-02-26 20:00:49 · 10885 阅读 · 1 评论 -
深入浅出Linux内核内存管理基础
1 背景知识1.1 用户空间与内核空间内存的划分 从Linux操作系统层次上,内存可划分为用户空间内存和内核空间内存。 32位的CPU,最大寻址范围为2^32 - 1也就是4G的线性地址空间。Linux简化了分段机制,使得虚拟地址与线性地址总是一致的。Linux一般把这个4G的地址空间划分为两个部分:其中 0~3G为用户程序地址空间,虚地址0x00000000到转载 2015-01-18 16:45:49 · 7547 阅读 · 3 评论 -
理解公钥、秘钥和数字签名
公钥密码体制的核心思想是:加密和解密采用不同的密钥。这是公钥密码体制和传统的对称密码体制最大的区别。对于传统对称密码而言,密文的安全性完全依赖于密钥的保密性,一旦密钥泄漏,将毫无保密性可言。但是公钥密码体制彻底改变了这一状况。在公钥密码体制中,公钥是公开的,只有私钥是需要保密的。知道公钥和密码算法要推测出私钥在计算上是不可行的。这样,只要私钥是安全的,那么加密就是可信的。 显然,原创 2015-06-24 16:42:15 · 6092 阅读 · 0 评论 -
深入浅出的讲解傅里叶变换
来源:知乎 作者:Heinrich http://www.elecfans.com/engineer/blog/20140527344277.html 我保证这篇文章和你以前看过的所有文章都不同,这是12年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。转载 2015-03-09 22:14:29 · 1430 阅读 · 0 评论 -
深入浅出的讲解傅里叶变换(2)
上一篇文章发出来之后,为了掐死我,大家真是很下工夫啊,有拿给姐姐看的,有拿给妹妹看的,还有拿给女朋友看的,就是为了听到一句“完全看不懂啊”。幸亏我留了个心眼,不然就真的像标题配图那样了。我的文章题目是,如果看了这篇文章你“还”不懂就过来掐死我,潜台词就是在你学了,但是没学明白的情况下看了还是不懂,才过来掐死我。 另外,想跟很多人抱歉,因为评论太多了,时间有限,不能给每个人回复,还望大家谅解。转载 2015-03-09 22:48:00 · 1538 阅读 · 0 评论 -
分享一个测试引擎工具的设计概念
本文是我为公司设计和开发一个针对一些C++模块或共享库自动化测试工具而提出的一些设计概念,特此分享:OverViewThe Testing Engine is trying to provide fully automaticVEAPIunit testing for all the plugins/shared libraries. Allthe values in原创 2015-02-03 14:11:17 · 1221 阅读 · 0 评论 -
视频编码(H264概述)
一视频编码介绍1.1视频压缩编码的目标1)保证压缩比例2)保证恢复的质量3)易实现,低成本,可靠性 1.2压缩的出发点(可行性)1)时间相关性在一组视频序列中,相邻相邻两帧只有极少的不同之处,这便是时间相关性。2)空间相关性在同一帧中,相邻象素之间有很大的相关性,两象素越近,侧相关性越强。 根据采用的信源的模型分类:1)基于波形的编码转载 2015-03-16 22:50:29 · 1393 阅读 · 0 评论 -
Hadoop第一天---初识Hadoop
原文出自: http://www.cnblogs.com/Bestsonic/p/4199779.htmlHadoop能解决的问题: 1.海量数据需要及时分析和处理。 2.海量数据需要深入分析和挖掘。 3.数据需要长期保存。问题: 1.磁盘IO成为一种瓶颈,而不是CPU资源。 2.网络带宽是一种稀缺资源。 3.硬件故障成为影响稳定的一大因素。转载 2015-01-04 22:18:47 · 870 阅读 · 0 评论 -
netlink socket理解
由于开发和维护内核的复杂性,只用最为关键同时对性能要求最高的代码才会放在内核中。其他的诸如GUI,管理和控制代码,通常放在用户空间运行。这种将实现分离在内核和用户空间的思想在Linux中非常常见。现在的问题是内核代码和用户代码如果彼此通信。答案是内核空间和用户空间存在的各种IPC方法,例如系统调用,ioctl,proc文件系统和netlink socket。这篇文章讨论netlink sock转载 2015-01-27 15:54:52 · 9508 阅读 · 0 评论 -
伙伴算法
如上图所示,首先先来了解下linux内存管理的架构,用于了解伙伴算法所在的位置。 伙伴算法在内存管理中用来消除外部碎片,用Wolfgang Mauerer(《深入linux内核架构》的作者)的话说“伙伴系统基于一种相对简单然而令人吃惊的强大算法,已经伴随我们几乎40年。它结合了优秀内存分配器的两个关键特征:速度和效率。” 这张图能较直观的反映伙伴系统在内存管转载 2013-06-14 17:12:13 · 1263 阅读 · 0 评论 -
网络编程socket之bind、Listen 及 accept
1.bindbind函数用于将套接字与指定端口相连.本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。 头文件函数形原创 2013-07-15 22:10:47 · 34028 阅读 · 0 评论 -
C++嵌套类与局部类
一、嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。 虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类转载 2013-07-13 21:00:30 · 1070 阅读 · 0 评论 -
fcntl设置FD_CLOEXEC
这是fcntl的一个Flag标志。fcntl(fd, F_SETFD, FD_CLOEXEC); // 这里设置为FD_CLOEXEC表示当程序执行exec函数时本fd将被系统自动关闭,表示不传递给exec创建的新进程, 如果设置为fcntl(fd, F_SETFD, 0);那么本fd将保持打开状态复制到exec创建的新进程中FD_CLOEXEC用来设置文件的close-on-exec转载 2013-07-12 21:58:16 · 5259 阅读 · 0 评论 -
深入探索linux系统的启动流程
一、 BIOS自检 当电脑开机的时候,电脑会去读取存储在BIOS CMOS RAM(随机访问存储器)中 的BIOS设置,并进行开机自检(Power On Self Test:POST)。BIOS是烧录于主板上的EEPROM或flash存储设备中的程序,主要用来记忆外设及系统的相关设定,并提供一个图形界面来方便我们修改设定值。而你在BIOS中所做的设定,会被存放在CMOS RAM中,且这原创 2013-07-08 15:13:32 · 1463 阅读 · 0 评论 -
monit简介
一、简介 Monit是一个在类unix平台下用于监视进程、文件、目录和设备的软件,运行于应用层,可以修复停止运作或运作异常的程序,适合处理那些由于多种原因导致的软件错误。二、安装 假定下面的安装和配置均在root身份下进行。 安装很简单,下载monit的源代码(现在最新版本是4.10.1)monit-4.10.1.tar.gz,将其放到适合转载 2013-07-09 18:52:31 · 2004 阅读 · 0 评论 -
Fusion实例1:如何通过竞技场使用共享内存来发布一个指针?
DirectFB采用了主从模型(Master/Slave)。Fusion即融合,多个应用程序在不同的进程空间,通过这个内核模块通信,在这里,一切都溶为一体了。Master应用程序负责初始化一个称为竞技场的东西,其它Slave应用程序可以加入或者退出竞技场。当Master退出时,则其它所有Slave都必须退出。 我们先实现fusion master,文件名为fusionee_maste原创 2012-09-10 11:09:46 · 1609 阅读 · 0 评论 -
设计模式 reactor和proactor
原文地址:http://xmuzyq.javaeye.com/blog/783218=====================================================在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作。转载 2012-07-26 20:21:18 · 1330 阅读 · 0 评论 -
学习笔记:用于事件多路分离和分派的reactor体系结构模式
如上图所示,应答者(或称反应器)框架通过在OS事件多路分离接口上进行监听,检测事件的发生。当检测到事件的发生后,回调预登记时间处理器(event handler)对象中的方法。该方法是一个回调函数,包含有应用处理事件的具体代码,由应用程序开发者实现。 于是,应用开发者必须做好以下工作: (1)创建事件处理器对象,以便将来能处理它所感兴趣的事件; (2)向原创 2012-08-01 14:41:28 · 2505 阅读 · 0 评论 -
Linux系统服务基础
一、系统服务的基本概念服务,其实就是运行在操作系统后台的一个或者多个应用程序,为计算机系统或用户提供某项特定的服务。在我们的windows操作系统中,其在后台也运行了许许多多的服务。例如我们装的杀毒软件,其在后台运行了许多我们看不见的服务程序,通过这些服务来为用户或者计算机系统来提高特定的功能。服务通常是不中断运行的,随时准备接受请求,从而提供某项服务。例如我们日常使用的网页服务,其就转载 2013-07-03 22:07:04 · 5039 阅读 · 0 评论 -
gsoap 开发:基于wsdl文件和C++语言开发客户端程序
开发环境:ubuntu linux 3861.下载gsoap-2.8.15 2.解压缩到指定目录.(可以再安装gsoap到系统,但非必须)。 3.获取wsdl文件。这里假设我们要获取QQ 在线状态的 wsdl 文件.。在http://webservice.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl可以获取到.原创 2013-07-24 12:42:37 · 5704 阅读 · 0 评论 -
Django MTV模式详解
出自:http://blog.youkuaiyun.com/dbanote/article/details/11338953转载 2014-10-31 11:09:54 · 25784 阅读 · 2 评论 -
Linux pipe详解
1、 管道概述及相关API应用1.1 管道相关的关键概念管道是Linux 支持的最初Unix IPC形式之一,具有以下特点:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单转载 2014-05-29 11:22:50 · 9738 阅读 · 0 评论 -
Linux系统C++中多线程Singleton的实现
我想关于Singleton模式的实现和资料很多很多,这里为什么专门拿出来写一写,还是因为个人觉得要想把单例模式写好还真不是一件容易的事情。其中涉及到不少编译和底层的知识。这里以Linux平台为例,这是因为本人对windows下的编程实在不太熟悉。本文所有代码均上传至github仓库:https://github.com/kevin-shanghai/Programming_Practi转载 2014-06-04 16:26:29 · 1733 阅读 · 0 评论 -
软件架构的定义及其理解
一、定义 所谓软件架构,指的是软件系统的整体结构,包括软件子元素,这些元素的外部属性以及元素元素之间的关系。这个定义包含了以下三层意思: (1)软件架构是对系统的抽象。它不仅规定了系统有哪些主要软件元素或模块,还定义了这些元素之间是如何交互的。它并不暴露每个元素的内部属性(也叫局部信息),也就是说每个子模块的私有信息是不划归到软件架构的范畴的。需要注意的原创 2014-05-14 14:43:18 · 11321 阅读 · 0 评论 -
The 7 Habits of Highly Overrated People
I remember having a discussion with a more tenured coworker, with the subject being the impending departure of another coworker. I said, “man, it’s going to be rough when he leaves, considering how m转载 2014-05-19 19:52:39 · 1153 阅读 · 0 评论 -
内存/边界对齐(boundary alignment)简介
一、什么是内存对齐原创 2014-05-05 13:21:08 · 17404 阅读 · 10 评论 -
通过printf在控制台终端输出带颜色的打印或日志信息
考虑以下应用场景或需求:用户希望看到的显示在终端的打印信息能够按颜色输出。比如,错误信息用红色输出,正确信息用绿色输出,普通信息则是常规输出。 如何做到呢?printf函数可以帮助做到这一点。 使用格式为: printf("\033[字背景颜色;字体颜色m字符串\033[0m" ); 例如:printf("\033[47;31mhello world\033[转载 2014-03-31 17:41:53 · 11826 阅读 · 0 评论 -
valgrind安装和使用
1.Valgrind下载和安装(1)下载valgrind-3.9.0.tar.bz2(2) 解压缩bzip2 -d valgrind-3.9.0.tar.bz2;(3)tar -xvf valgrind-3.9.0.tar(4)/configure --prefix=/usr/local/(5)make && make install2.使用简单示例 v原创 2014-01-13 08:38:02 · 2384 阅读 · 0 评论 -
Gstreamer被ffmpeg或其他媒体框架淘汰了吗?
目前,很大部分音视频编解码应用开发都是基于ffmpeg框架。ffmpeg API简单 上手快,也迅速成为了国内视频相关开发者的首选开源库。而gstreamer由于其复杂难懂,学习成本高,似乎在国内使用的人越来越少. 于是乎, 有人认为 熟悉ffmpeg API就可以在音视频流媒体开发畅通无阻了。 个人认为,不是这样。如果你只想写一个简单的音视频应用,那么也许ff...原创 2019-06-10 23:01:01 · 21033 阅读 · 6 评论