自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 Linux 音频系统

复制来凝结fhttps://blog.csdn.net/weixin_41028621/category_9941913.html

2024-01-13 17:51:46 436

转载 Linux内核很吊之 module_init解析 (下)

Linux内核很吊之 module_init解析

2023-02-20 10:59:11 277

转载 linux驱动 之 module_init解析 (上)

linux驱动 之 module_init解析

2023-02-20 10:57:20 782

原创 Android 音频系统:从 AudioTrack 到 AudioFlinger

Android 音频系统:从 AudioTrack 到 AudioFlinger

2022-11-11 17:58:22 698

原创 vim 的基本操作-复制粘贴

一、最基本的复制粘贴1. 将光标移动到要复制的文本开始的地方,按 v进入可视模式。2. 将光标移动到要复制的文本的结束的地方,按 y 复制。此时 vim 会自动将光标定位到选中文本的开始的地方,并退出可视模式。3. 移动光标到文本结束的地方,按p粘贴。...

2022-05-06 09:03:38 42915 1

原创 linux 中 device tree 中常用的 of 函数

一、从 device_node 中获取信息1.1 第一组(指明读取的个数)intof_property_read_u8_array(conststructdevice_node *np, const char *propname,u8 *out_values, size_t sz);intof_property_read_u16_array(const struct device_node *np, const char *propname,u16 *out_values, size...

2022-03-23 10:04:03 196

原创 iperf2 与 iperf3 的区别,及使用与介绍

一 iperf2 介绍 Iperf2 是一个网络性能测试工具。Iperf2 可以测试 TCP和 UDP 带宽质量。Iperf2 可以测量最大 TCP 带宽,具有多种参数和 UDP 特性。Iperf2 可以报告带宽,延迟抖动和数据包丢失。1.1 简单实用iPerf - iPerf3 and iPerf2 user documentation第一部分:iperf与iperf3比较1)iperf3较iperf测试UDP丢包率和带宽,相同硬件条件下,iperf3测试带宽...

2022-03-18 11:42:56 8333

原创 ubuntu 使用 ftrace 指南

一、基本用法sudo su cd /sys/kernel/debug/tracing/ echo function > current_tracer 备注: 其中 function 是系统支持的一种类型,查看所有的类型 cat available_tracers echo 1 > tracing_on // 等待一小会 echo 0 > tracing_on cat trace | head -20 以上是基本用法,接下来是进阶用法:二、进阶

2022-03-02 14:38:47 789

原创 github 为第三方库提交代码

fork 代码,具体操作网上还挺多的。git clonecd [路径]git remote add origin **********.gitgit fetch origingit remote add ##### ********.gitgit fetch #####cd [路径]git branch --track topic-1 ######/mastergit checkout topic-1git cherry-pick commit-idg

2022-02-22 16:39:02 234

原创 bin、hex、elf、axf文件的区别

1、bin Bin 文件是最纯粹的二进制机器代码, 或者说是"顺序格式"。按照assembly code顺序翻译成binary machine code,内部没有地址标记。Bin是直接的内存映象表示,二进制文件大小即为文件所包含的数据的实际大小。 BIN文件就是直接的二进制文件,一般用编程器烧写时从00开始,而如果下载运行,则下载到编译时的地址即可。可以直接在裸机上运行。2.hexIntel hex 文件常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程

2022-02-22 11:23:36 1537

原创 DBus 介绍

一、什么是 DBus?D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信。1.1 三层架构1、函数库libdbus ------>>>>> 用于两个应用程序互相联系和交互消息。2、基于 libdbus 构造的消息总线守护进程,可同时与多个应用程序相连,并能把来自一个应用程序的消息路由到0或者多个其他程序。3、基于特定应用程序框架的封装库或捆绑(wrapper libraries or bindings )。1.2 高层功能结构化..

2022-02-22 11:20:32 10643

原创 nng 概述

一、前言1.1 基本介绍NNG/nanomsg 是最近项目上使用到的一个通信库,用来实现进程间过程调用和线程间通信,很是方便。NNG 是 nanomsg 的继任版本,而 nanomsg 则是流行的 ZMQ (一个简单好用的传输层,像框架一样的一个 socket library)的 C 重写版。NNG 将通信使用的协议和传输分离,同一个协议可以工作在不同的传输层上,类似与 TCP/IP 的应用层和传输层的分层,同时接口上屏蔽了底层细节,统一用字符串 URL 来描述传输模式。这样当使用场景修改时

2022-02-21 12:01:51 12956

原创 逻辑地址、线性地址和物理地址的转换

一、逻辑地址 逻辑地址是指在计算机体系结构中是指应用程序角度看到的内存单元、存储单元、网络主机的地址。 逻辑地址往往不同于物理地址,通过地址翻译器或映射函数可以把逻辑地址转化为物理地址。 一个逻辑地址由两部份组成,段标识符和段内偏移量。 段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。引号,可以理解为数组的下标——而它将会对应一个数组,它又是什么的索引呢?这就是“段描述符(segment descriptor)”,段描述符具体...

2022-01-06 14:50:05 4591

原创 政权更迭最频繁的魏晋南北朝

一、三国时期(220年-280年) 主要有曹魏、蜀汉及孙吴三个政权,汉末三国战争不断,使得中国人口急剧下降,经济严重受到损害,因此三国皆重视经济发展,加上战争带来的需求,各种技术都有许多进步。 184 年汉灵帝时期爆发黄巾之乱,为了安定地方,州牧拥有地方控制权。而后朝廷因内乱被军阀董卓控制,各地势力派州牧举兵反抗董卓。190年董卓挟持朝廷迁都,地方州牧纷纷划地一方,群雄割据。董卓最后被吕布和王允设计刺杀,长安最后被李傕占领。汉献帝趁机东逃,于 196 年被曹操迎到许昌,改元建...

2021-12-26 16:09:34 1154

原创 linux 最常用的指令- [readelf][objdump] 读取elf 文件系列

一、readelf 一般用于查看ELF格式的文件信息,常见的文件如在 linux 可执行文件,动态库(*.so)或者静态库(*.a)等包含ELF格式的文件。以下命令的使用是基于 gcc 编译出来的o文件上面去运行。二、objdump objdump 命令是 Linux 下的反汇编目标文件或者可执行文件的命令,它还有其他作用,下面以 ELF 格式可执行文件 main 为例详细介绍。...

2021-12-21 22:06:42 3240

原创 linux 最常用的指令-串口终端操作系列

一、 minicomsudo minicom -s#打开minicom基本操作如下:1)需使用Ctrl+a 进入设置状态2)按z进入设置菜单O键:打开配置选项; W键:自动卷屏。C键:清除屏幕的显示内容; B键:浏览minicom的历史显示;X键:退出minicom,会提示确认退出二、vim 使用vim +n 文档名 打开文档后,定位第n行vim ,进入vim界面之后使用命令 :e 文档名 打开文档:q :q! :wq :w:qa 或 qa! 在打

2021-12-20 11:39:39 971

原创 linux 最常用的指令-查找删除文件系列

find 使用grep 使用

2021-12-20 11:29:29 9250 2

原创 在 ubuntu 系统上生成SSH密钥,并把对应的公开密钥添加到GitHub账户

以下所有操作验证于 ubuntu~20.04在 ubuntu 系统上生成SSH密钥,并把对应的公开密钥添加到GitHub账户一、检查SSH密钥打开终端,并键入命令:ls -a ~/.ssh# 列出.ssh 目录中存在的文件检查这个目录列表,看看是否已经有了公共SSH密钥,如果显示没有这个目录也是正常的。默认的公共密钥文件名字类似如下:id_rsa id_rsa.pub如果怕损坏原有的密钥,请作好备份。键入如下命令:mkdir key_backupcp .

2021-12-18 13:39:24 7162 1

原创 Linux 中字符设备和块设备的区别

一、块设备 系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱动器、CD-ROM驱动器和闪存等等许多其他块设备。注意,它们都是以安装文件系统的方式使用的——这也是块设备的一般访问方式。二、字符设备 字符设备按照字符流的方式被有序访问,像串口和键盘就都属于字符设备。提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据...

2021-12-16 20:50:51 872

原创 clang 与 GCC 的区别

一、clang 介绍1.1 概述 Clang 是一个 C 语言、C++、Objective-C 语言的轻量级编译器。源代码发布于 BSD 协议下。Clang 将支持其普通 lambda 表达式、返回类型的简化处理以及更好的处理 constexpr 关键字。 Clang 是一个由 Apple 主导编写,基于 LLVM 的 C/C++/Objective-C 编译器 2013 年 4 月,Clang 已经全面支持 C++11 标准,并开始实现 C++...

2021-11-18 12:31:38 16536

原创 RPC 开发系列----------开篇

一、概述 本人最近在开发一款 RPC, 前期看了 binder 机制,并且在极客时间学习了 RPC 的原理,所以整理了其中的内容,后期还会学习一下微软开发的 com 接口,也欢迎一起学习讨论。 如果想学习 binder 的内容,也欢迎学习留言。 RPC 的全称是 Remote Procedure Call,即远程过程调用。功能主要有两个:屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;隐藏底层网络通信的复杂性,让我们更专注于业务逻辑...

2021-07-14 11:21:08 486

原创 RPC 开发系列十:熔断限流(自我保护)

一、概述 RPC 是解决分布式系统通信问题的一大利器,而分布式系统的一大特点就是高并发,所以说 RPC 也会面临高并发的场景。在这样的情况下,提供服务的每个服务节点就都可能由于访问量过大而引起一系列的问题,比如业务处理耗时过长、CPU 飘高、频繁 Full GC 以及服务进程直接宕机等等。但是在生产环境中,要保证服务的稳定性和高可用性,这时就需要业务进行自我保护,从而保证在高访问量、高并发的场景下,应用系统依然稳定,服务依然高可用。二、自我保护方式 最常见的方式就是限...

2021-07-13 22:54:12 906

原创 RPC开发系列九:优雅启动

我们日常生活中,在行驶之前都会让发动机空跑一会,可以让汽车的各个部件都“热”起来,减小磨损。换到应用上来看,原理也是一样的。运行了一段时间后的应用,执行速度会比刚启动的应用更快。 在 Java 里面,在运行过程中,JVM 虚拟机会把高频的代码编译成机器码,被加载过的类也会被缓存到 JVM 缓存中,再次使用的时候不会触发临时加载,这样就使得“热点”代码的执行不用每次都通过解释,从而提升执行速度。 但是这些“临时数据”,都在我们应用重启后就消失了。重启后的这些...

2021-07-13 22:18:41 310

原创 RPC 开发系列八:优雅关闭

一、关闭问题 在“单体应用”复杂到一定程度后,一般会进行系统拆分,也就是时下流行的微服务架构。服务拆分之后,自然就需要协同,于是 RPC 框架就出来了,它用来解决各个子系统之间的通信问题。 拆分之后可以更方便、更快速地迭代业务。那么问题来了,更快速地迭代业务,就是经常更新应用系统,时不时还老要重启服务器。 上线的大概流程:当服务提供方要上线的时候,一般是通过部署系统完成实例重启。在这个过程中,服务提供方的团队并不会事先告诉调用方需要操作哪些机器,从而让调...

2021-07-13 21:54:08 597

原创 RPC 开发系列七:异常重试

一、为什么需要异常重试?一次 RPC 调用,去调用远程的一个服务,比如用户的登录操作,会先对用户的用户名以及密码进行验证,验证成功之后会获取用户的基本信息。当通过远程的用户服务来获取用户基本信息的时候,恰好网络出现了问题,比如网络突然抖了一下,导致请求失败了,而这个请求希望它能够尽可能地执行成功,那这时要怎么做呢?需要重新发起一次 RPC 调用,那代码中该如何处理呢?是在代码逻辑里 catch 一下,失败了就再发起一次调用吗?这样做显然不够优雅吧。这时就可以考虑使用 RPC 框架的重试机制。二、

2021-07-13 09:19:43 1156

原创 RPC 开发系列六:负载均衡

一、背景首先从讲故事开始有一次碰上流量高峰,突然发现线上服务的可用率降低了,经过排查发现,是因为其中有几台机器比较旧了。当时最早申请的一批容器配置比较低,缩容的时候留下了几台,当流量达到高峰时,这几台容器由于负载太高,就扛不住压力了。解决方案:在治理平台上调低这几台机器的权重,这样的话,访问的流量自然就减少了。但业务接着反馈了,说:当他们发现服务可用率降低的时候,业务请求已经受到影响了,这时再如此解决,需要时间啊,那这段时间里业务可能已经有损失了。紧接着就提出了需求,问:RPC 框架有没

2021-07-13 09:05:26 1884

原创 RPC开发系列五:路由策略

一、为什么选择路由策略?在真实环境中我们的服务提供方是以一个集群的方式提供服务,这对于服务调用方来说,就是一个接口会有多个服务提供方同时提供服务,所以我们的 RPC 在每次发起请求的时候,都需要从多个服务提供方节点里面选择一个用于发请求的节点。既然服务提供方是以集群的方式对外提供服务,那就要考虑一些实际问题。要知道我们每次上线应用的时候都不止一台服务器会运行实例,那上线就涉及到变更,只要变更就可能导致原本正常运行的程序出现异常,尤其是发生重大变动的时候,导致我们应用不稳定的因素就变得很多。为了减

2021-07-12 21:59:31 468

原创 RPC 开发系列四: 健康检测

因为有了集群,所以每次发请求前,RPC 框架会根据路由和负载均衡算法选择一个具体的 IP 地址。为了保证请求成功,我们就需要确保每次选择出来的 IP 对应的连接是健康的。调用方跟服务集群节点之间的网络状况是瞬息万变的,两者之间可能会出现闪断或者网络设备损坏等情况。解决方案是让调用方实时感知到节点的状态变化,这样他们才能做出正确的选择。这个道理像我们开车一样,车有各种各样的零件,我们不可能在开车之前先去挨个检查下他们的健康情况,转而是应该有一套反馈机制,比如今天我的大灯坏了,那中控台就可以给我提示;明

2021-07-12 21:39:17 475

原创 RPC 开发系列三:服务发现

一、PRC 框架的服务发现机制。1.1 服务注册在服务提供方启动的时候,将对外暴露的接口注册到注册中心之中,注册中心将这个服务节点的 IP 和接口保存下来。1.2 服务订阅在服务调用方启动的时候,去注册中心查找并订阅服务提供方的 IP,然后缓存到本地,并用于后续的远程调用。二、为什么不使用 DNS?既然服务发现这么“厉害”,那是不是很难实现啊?其实类似机制一直在我们身边,我们回想下服务发现的本质,就是完成了接口跟服务提供者 IP 的映射。那我们能不能把服务提供者 IP 统一换成一

2021-07-12 20:32:51 1010

原创 RPC 开发系列二:标准的 RPC 架构

1.1 协议模块1.1.1 传输模块RPC 本质上就是一个远程调用,那肯定就需要通过网络来传输数据。虽然传输协议可以有多种选择,但考虑到可靠性的话,我们一般默认采用 TCP 协议。为了屏蔽网络传输的复杂性,我们需要封装一个单独的数据传输模块用来收发二进制数据。1.1.2 协议封装用户请求的时候是基于方法调用,方法出入参数都是对象数据,对象是肯定没法直接在网络中传输的,我们需要提前把它转成可传输的二进制,这就是我们说的序列化过程。但只是把方法调用参数的二进制数据传输到服务提供方是不够的,我们需

2021-07-12 11:08:54 604

原创 Android Binder 系列三:使用案例

学习一个应用,首先从怎么使用开始,下面主要从 server 和 cilent 两方向开始。一、服务端怎么使用?#include "ITest.h"int main(){ // 获取一个 ProcessState 实例 // 每一个进程 只有 ProcessState 独一无二 // 三个过程 // 1. 单例模式 // 2. 构造 // 3. 打开 binder,mmap 分配一段内存接收数据 sp<Proces...

2021-06-23 13:43:49 364

原创 RPC 开发系列一:RPC 基本介绍

什么是 RPC?我知道你肯定不喜欢听概念,我也是这样,看书的时候一看到概念就直接略过。不过,到后来,我才发现,“定义”是一件多么伟大的事情。当我们能够用一句话把一个东西给定义出来的时候,侧面也说明你已经彻底理解这事了,不仅知道它要解决什么问题,还要知道它的边界。所以,你可以先停下来想想,什么是 RPC。RPC 的全称是 Remote Procedure Call,即远程过程调用。简单解读字面上的意思,远程肯定是指要跨机器而非本机,所以需要用到网络编程才能实现,但是不是只要通过网络通信访问到另一台机器的应

2021-06-20 17:15:23 4223

原创 设计模式一:怎么评价代码

最常用的评价标准有哪几个?仔细看前面罗列的所有代码质量评价标准,你会发现,有些词语过于笼统、抽象,比较偏向对于整体的描述,比如优雅、好、坏、整洁、清晰等;有些过于细节、偏重方法论,比如模块化、高内聚低耦合、文档详尽、分层清晰等;有些可能并不仅仅局限于编码,跟架构设计等也有关系,比如可伸缩性、可用性、稳定性等。为了做到有的放矢、有重点地学习,我挑选了其中几个最常用的、最重要的评价标准,来详细讲解,其中就包括:可维护性、可读性、可扩展性、灵活性、简洁性(简单、复杂)、可复用性、可测试性。接下来,...

2021-06-19 14:31:16 625

原创 项目开发:怎么多人开发同一个 github 项目

突然想和同事们在业余时间在 github 上一起开发项目玩一玩,就在网上查了怎么多人开发同一个 github 项目,结果很失望,答案遍地是,但是截图都是之前的,和现在的界面有点不同。所以我把自己的建立...

2021-06-19 14:16:43 785

原创 Android Binder 系列二 :通讯类图

Binder 类的结构图 在C++层次,就能看到各种关于Binder博客中经常反复肯定会被提到的BpBinder类和BBinder了,这两个类都继承于IBinder。当然还有IInterface,BpInterface,BnInterface,BpRefBase,ProcessState ,IPCThreadState 。...

2021-06-19 12:42:09 571

原创 Android Binder 系列一 :基本概要

一、 linux 进程间通讯概述管道:在创建时分配一个page大小的内存,缓存区大小比较有限; 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信; 共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决; 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信; 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的

2021-06-18 20:59:43 462 1

原创 关于迪士尼盈利的感悟

一个标准的程序员,应该多开花多结果。迪士尼作为一个将近半百的公司,并且在乔布斯没出生就有的公司,他的思想和盈亏模式值得学习。为什么

2021-06-18 16:33:59 255

原创 Binder 与 socket 的对比,一图了解整个 binder 的过程

怎么成为服务端?怎么成为客户端

2021-06-17 21:26:32 905

原创 一图了解 OPUS encoder 的过程

OPUS encoder不支持在 Docs 外粘贴 blockSILK 通常一帧是 20 ms, 时间域, 基于 lpc 线性预测CELT 基于 MDCT 频率域 全带宽

2021-06-17 16:04:08 241

原创 GCC 编译命令和基本使用

gcc编译一个c文件的过程,会经过几个步骤:预编译,编译,汇编,链接。下面是每一步用到的参数和命令:-E:预编译, 讲带#的语句重新展开到制定文件中,比如#define, #include "*.h"gcc -E main.c -o main.i-S:编译,将.o文件编译成编译成汇编文件(.s文件)gcc -S main.c -o mian.s-c:汇编,相比-S命令,多了assemble,生成目标文件(.o文件)gcc -c main.c -o mian.o...

2021-06-17 15:56:29 2087

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除