自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SRS代码目录

正如其类名中的“Adapter”所示,这些类是适配类,核心类型是其中真正的server,如SrsServerAdapter中的SrsServer成员、RtcServerAdapter中的SrsRtcServer成员。当程序中调用for()创建子进程时,gdb默认只会继续调试父进程,而会“分离”或忽略子进程。srs_global_initialize: 初始化各种server。run_directly_or_daemon: 开始运行。n:next,调到下一个函数(不进入函数内部)s:step,进入函数内部。

2025-02-03 19:32:17 386

原创 WebRTC的接口宏

peer_connection_client.cc 中使用到的接口宏:以PeerConnection为例:2. 如何定义一个WebRTC的外部接口类:外部接口类的定义:WebRTC自定义接口:

2025-01-02 09:54:35 350

原创 WebRTC的线程切换

其中,Post和PostTask方法是【异步】的,即发送线程发送后无需等待接收线程完成处理;Send和Invode方法是【同步】的(发送线程会一直等待接收线程通知处理完成)。

2025-01-01 14:25:25 393

原创 WebRTC的线程事件处理

信令线程—>触发事件—>公共对象(NullSocketServer或PhysicalSocketServer)(唤醒睡眠线程)—>等待事件(睡眠状态)—>工作线程/网络线程。如果队列不为空,则取出事件后调用Dispatch处理;如果队列为空,则调用Wait等待事件发生。Get(&msg, …// 如果没有时间,在Get()函数中睡眠等待事件。Linux系统下,epoll或者select。

2025-01-01 13:55:27 462

原创 Singleton: WebRTC中ThreadManager中的单例模式

旨在确保一个类只有一个实例,并提供全局访问点。应用场景:需要一个全局唯一的实例,避免资源浪费。

2025-01-01 13:49:21 735

原创 TLS: WebRTC中ThreadManager的线程局部存储

key_”可以理解为是一个“存储区”,而不是一个“键”,key_中存储所有的线程与线程私有数据间的映射。线程局部存储(TLS)只适用于每个线程有独立数据的场景,可以避免线程间的冲突,但不适用于共享数据的情况;所以二者解决的是不同的问题, 适用于不同的场景,线程局部存储不能完全替代加锁。创建一个线程局部存储键,并绑定到一个特定的数据释放函数(可选)加锁用于共享资源的情况,保证共享数据的访问是互斥的。

2025-01-01 13:46:06 711

原创 WebRTC线程的启动与运行

在执行函数内部,就是一个while死循环,只做两件事,从队列里Get取出消息,然后调用Dispatch处理消息。在Dispatch函数中会调用入参*pmsg消息的handler的OnMessage处理消息,具体如何处理消息,每一个pmsg内部有不同的逻辑,就是把控制权交给的发送线程,发送线程在执行时它是知道需要做什么事的,但是这个事情需要交给其他的线程来做,

2025-01-01 13:36:48 610

原创 WebRTC的三大线程

webrtc中的其他线程都是通过这三个线程创建出来的!!

2025-01-01 13:29:58 407

原创 WebRTC的线程模型

Thread类:(1)Thread类中的数据:(2)Thread类中的重要方法:关于Thread的几个要点:线程的创建:ThreadManager类:(1)ThreadManager类中的重要数据成员:

2025-01-01 13:18:08 570

原创 ffmpeg使用入门

FFmpeg是一款音视频编解码工具,也是一组音视频编解码开发套件,为开发者提供了丰富的音视频处理调用接口。FFmpeg源代码编译后会生成三个可执行程序,分别是:ffmpeg、ffplay、ffprobe,这三个也成为FFmpeg三剑客,各有各的作用。

2023-12-23 19:05:55 826

原创 WebRTC引用计数和线程

引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、内存、或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。使用引用计数技术可以实现自动资源管理的目的。同时引用计数还可以指使用引用计数技术回收未使用资源的垃圾回收算法。WebRTC中实现了跨平台(Windows、MacOS、Linux、iOS、Android)的线程类: rtc::Thread,代码位于 rtc_base/ 目录下的 thread.h 和 thread.cc 中。WebRTC线程模型:对Web

2023-05-07 23:41:59 695

原创 WebRTC源码目录结构

接口层、业务处理层、音视频处理层、基础支持层。

2023-05-07 18:06:41 1021

原创 Makefile入门

Makefile入门

2022-12-24 21:59:44 1042

原创 vim入门

vimz入门

2022-12-23 23:01:52 439

原创 常用的Linux命令介绍

常用的Linux命令简介

2022-12-23 17:41:13 1140

原创 CMake入门

cmake使用入门介绍

2022-12-23 01:01:34 737

原创 WebRTC简介

1. 音视频直播的两条技术路线:自古以来人类就需要音视频技术。压缩技术解决了(音频、视频压缩编解码器)、高速公路建成了(带宽提升,光纤、4/5G),接下来就是如何利用这些技术进行产品化了。“音频品直播” 就是众多音视频应用中最亮眼,也是大家最需要的应用。对于不同的行业和领域,在使用音视频直播时,人们往往给直播不同的称谓,例如:在教育领域中的直播称为 “在线教育直播”,在远程办公领域的直播称为 “网络音视频会议”,在娱乐领域的直播称为 “娱乐直播”,等等。虽然所有的 直播 底层都是使用 音视频技术

2021-12-27 00:13:04 2302 1

原创 《程序员的自我修养》第4章---静态链接

第4章 静态链接4.1 空间和地址分配:a.c :extern int shared;int main() { int a = 100; swap(&a, &shared);}b.c :int shared = 1;void swap(int* a, int* b){ *a ^= *b ^= *a ^= *b;}对于链接器来说,整个链接过程,它的工作就是将几个输入的目标文件加工、合并成一个输出的可执行文件。例如将输入的 a.o 和 b.o 文件合并

2021-11-13 23:25:25 4760

原创 《程序员的自我修养》第3章---目标文件里有什么

第3章 目标文件里有什么3.1 目标文件的格式:编译器编译源代码后生成的文件叫做 “目标文件”。目标文件从结构上讲,它是已经编译后的可执行文件格式,只是还没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。其实它本身就是按照可执行文件格式存储的,只是跟真正的可执行文件在结构上稍有不同。现在PC平台流行的 “可执行文件格式”(Executable)主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format)

2021-11-13 19:34:34 5673

原创 《程序员的自我修养》第2章---编译和链接

第2章 编译和链接2.1 被隐藏了的过程:一个“编译”过程可以分为4个步骤:预处理(Prepressing)编译(Compilation)汇编(Assembly)链接(Linking)实际上gcc这个命令只是一些后台程序的包装,它会根据不同的参数要求去调用:预编译编译程序 cc1、编译器 cc1、汇编器 as、链接器 ld。2.1.1 预编译命令:gcc -E hello.c -o hello.i或者:cpp hello.c > hello.i使用 “预编译器

2021-11-06 23:08:11 377

原创 《程序员的自我修养》第1章---温故而知新,背景知识(硬件、操作系统、线程)

1.3 站得高,望得远:计算机系统软件体系结构采用一种层的结构,有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”“Any problem in computer science can be solved by another layer of indirection.”这句话几乎概括了计算机系统软件体系结构的设计要点,整个体系结构从上到下都是按照严格的层次结构设计的。1.4 操作系统做什么:操作系统的一个功能是 提供抽象的接口,另一个主要功能是 管理硬件资源

2021-11-06 22:57:57 4832

原创 SGI STL迭代器概念与traits编程技法

《Design Patterns》一书提供有23个设计模式的完整描述,其中 iterator模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而有无需暴露该聚合物的内部表达方式。===> (迭代器可用于遍历访问容器中的元素,而又无需关注容器中的元素的类型。)1. 迭代器设计思维 ---- STL 关键所在:STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在一起。===>

2021-11-05 00:55:00 315

原创 C++类模板的对象模型

1. Template的“具现”行为:(Template Instantiation)考虑下面的 template Point class:template <class Type>class Point {public: enum Status { unallocated, normalized }; Point(Type x = 0.0, Type y = 0.0, Type z = 0.0); ~Point(); void* operator new(size_t);

2021-11-03 20:44:13 589

转载 epoll的底层实现原理

一、内核从网卡接收网络数据的处理过程:计算机由CPU、内存、网卡等设备硬件设备组成。计算机接收网络数据的处理过程是:网卡收到网线传来的数据,经过DMA传输、IO通路选择等处理后,将收到的数据写入内存;网卡将接收到的网络数据写入内存后,网卡向CPU发出一个中断信号,CPU能够捕获这个信号,然后执行相应的中断处理程序(对应IRQ请求的处理程序);此时的中断程序主要有两项功能:① 先将网络数据写入到对应socket的接收缓冲区中;② 唤醒此socket阻塞队列上的进程,将其重新放入到工作队列中;

2021-10-27 23:55:13 10801

原创 MySQL的SQL预编译及防SQL注入

1. SQL语句的执行处理:SQL的执行可大致分为下面两种模式:“Immediate Statements” VS “Prepared Staements” :1.1 即时SQL:动态的根据传入的参数拼接SQL语句并执行,一条语句经过MySQL server层分析器、优化器、执行器组件,分别进行词法、语义解析、优化SQL语句、选择索引、制定执行计划、执行并返回结果。对SQL语句进行词法语义分析、优化SQL语句、选择索引、制定执行计划等一系列操作,称为 “对SQL语句的编译”。如上,一条SQL

2021-10-21 00:10:37 3112

原创 MySQL面试题总结

数据库设计的初衷是处理并发问题。1. MVCC是什么,怎么实现的?MVCC是多版本并发控制,是InnoDB存储引擎为了实现对“事务”的支持而实现的一种机制,可以将其看作是行级锁的一个变种,但是可以在很多情况下避免加锁操作,开销更低。MVCC的具体实现:每个事务都有一个由系统分配的id:transaction_id;单调递增,系统内唯一;每一行数据都有一个隐藏的列:row_trx_id,用于记录操作这行数据的事务的id,每一行数据都都有多个版本,它们组成一个“链表”式的结构,称为“undo log

2021-10-21 00:10:03 205

原创 Redis面试题总结

Redis单机并发量能达到 万级,MySQL的并发量一般是 千级,它们支持的并发量可能相差十倍,所以要尽量把流量拦截在缓存层。1. 缓存击穿:key过期场景,Redis中的key过期,但MySQL中还有Redis中的某个key在某个时间过期,导致缓存的作用失效,所有的外界请求直接打在MySQL上。缓存击穿的后果是 增大MySQL数据库的负载:应用层(数据库代理层)往往采用的是“线程池+连接池”的处理模式,当缓存中的某个key失效,多个线程、多个连接在同一时刻都无法在缓存中查找到这一key值,就会

2021-10-21 00:09:37 215

原创 C++右值引用与移动语义和完美转发

右值引用只不过是一种新的C++语法,真正理解起来有难度的是基于右值引用引申出的2种C++编程技巧,分别为移动语义和完美转发。1. 左值、右值、将亡值:1.1 左值、右值、将亡值的概念:从以下几个概念逐步深入:表达式:要说清“三值”,首先要要说明表达式。表达式的定义:由运算符和运算对象构造的计算式,称为表达式。举例:字面值和变量是最简单的表达式,“a+b”也是表达式,函数的返回值也被认为是表达式。值类别:表达式是可求值的,对表达式求值将得到一个结果。这个结果有两个属性:“类型”和“值

2021-10-17 23:33:20 1323 1

原创 C++线上系统内存泄漏问题如何解决

1. 如何判断系统是否出现了内存泄漏:如何判断系统是否出现了内存泄漏:出现内存泄漏问题,一种是泄漏严重,内存耗尽,此时的现象一定是服务器上的某些服务异常中断,开启打印后会看到类似于“内存申请失败”之类的log;另一种情况可能是泄漏的速度较慢,这是需要定期的去检查一下系统上的内存情况,如果服务占用的内存超过了程序实际所需的内存大小,或者虚拟内存的占用一直在不断增长,则可以判定出现了内存泄漏。当确认已出现内存泄漏的情况后,需要继续进行判断:是自己写的业务代码 造成的内存泄漏;还是第三方库的内存

2021-10-17 17:37:06 909

原创 C++智能指针的底层实现原理

C++智能指针的头文件:#include <memory>1. shared_ptr:智能指针从本质上来说是一个模板类,用类实现对指针对象的管理。template <typename T> class shared_ptr;template <typename Y, class Deleter>shared_ptr(Y* ptr, Deleter d);template <typename Y, class Deleter, class All

2021-10-17 10:46:16 3289

原创 C++函数模板与类模板的使用方法

0. 概述:模板是泛型编程的基础,泛型编程即以一种 独立于任何特定类型 的方式编写代码。模板是创建泛型或函数的蓝图或公式。容器、迭代器、算法等,都是泛型编程的例子。在C++中,模板分为函数模板和类模板两种。1. 函数模板:函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对参数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。编译器由模板自动生成函数时,会用具体的类型名对模板中所有的类型参数进行替换,其他部分则原封不动的保留。同一个类型参数只能替换

2021-10-16 00:28:11 1234

原创 MySQL的分库分表

1. 为什么要分库分表:提升性能,增加可用性。2. 何时需要进行分库:当一个库的查询QPS过高,数据库的读写性能已经成为了整个服务器性能瓶颈,此时就需要考虑拆库,通过多个库来分担单个数据库的连接压力。2.1 分多少个库合适?标注怎么选择?例如整个服务器对数据库的查询QPS 是 3500(每秒3500个请求),假设单库可以支撑 1000个连接数的话,那么就需要拆分成4个库。另外,没有分库时,如果单个数据库发生意外,发生故障的影响就是100%,分成4歌库,单个 库发生故障的影响就是25%,还有75

2021-10-13 00:09:16 358

原创 实践中如何优化MySQl

1. 先来搞清楚何为“MySQL优化”:实践项目中,我们使用MySQL的目的就是用来存储数据、查询数据,这个数据库的作用,而“优化”数据库,就是让它性能更高,我们用的更爽,即是:提升数据库的 插入、删除、更新数据的响应速度,提升数据库的查询速度。2. 优化手段:四条,从影响效果上逐次下降:2.1 SQL语句及索引的优化:索引优化:什么时候应该建立索引,建什么样的索引,如何避免索引失效。2.2 数据库表结构的优化:使用可以存下你的数据的最小数据类型(如tinyint);尽量避免NULL;使用

2021-10-13 00:05:46 300

原创 MySQL的存储引擎InnoDB与MyISAM对比

1. 区别:1.1 事务:InnoDB支持事务,MyISAM不支持事务;对于InnoDB,每一条SQL语句都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语句放在begin和commit之间,组成一个事务;1.2 外键:InnoDB支持外键(两个表之间,外键一是一棵索引B+树,键和索引表示同一个意思),MyISAM不支持外键;对一个包含外键的InnoDB表转为MyISAM会失败;1.3 索引与数据文件:InnoDB和MyISAM的索引都是使用B+树结构,但是:InnoDB使用的是

2021-10-12 23:53:45 329

转载 Linux用户态与内核态、系统调用与库函数

一、Unix/Linux的体系架构:  如上图所示,从宏观上来看,Linux操作系统的体系架构f分为用户态和内核态(或者称“用户空间”和“内核空间”)。内核从本质上说是一种软件 : 控制计算机的 硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括:CPU资源、存储资源、I/O资源等。为了使上层应用能够访问这些资源,内核必须为上层应用提供访问的接口:系统调用。  系统调用是操作系统的最小功能单位,这些系统调用根据不同的应用场景可以进

2021-10-09 00:45:38 906

原创 Linux系统命令与CPU、硬盘、内存、网络状态监控

1. Linux常用工具命令:Linux系统中需要关注的指标包括CPU、硬盘、内存、网络状态这四个模块。常用于“监控”的Linux系统命令包括:常用于“性能测试”的Linux系统命令包括:常用于“优化”的Linux系统命令包括:2. 基础命令和工具:2.1 uptime:机器启动时间+负载root@virtual-machine:/# uptime 16:19:47 up 4 days, 5:30, 2 users, load average: 1.30, 1.34, 1.34

2021-10-07 22:30:00 8385 7

原创 消息中间件选型的比较因素

8.1 副本剖析:副本(Replica)是 分布式系统中常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式。在常见的分布式系统中,为了对外提供可用的服务,我们往往会对数据和服务进行副本处理。数据副本 是指在不同的节点上持久化同一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取该数据,这是解决分布式系统数据丢失问题最有效的手段。另一类副本是 服务副本,指多个节点提供同样的服务,每个节点有能力接收来自外部的请求并进行相应的处理。8.1.1 失效副本:broker端 用来判定失效

2021-10-06 12:11:07 436

原创 使用librdkafka的C++接口实现Kafka生产者和消费者客户端

main_producer.cpp#include "producer_kafka.h"using namespace std;int main() { KafkaProducer producer(); sleep(5); for(int i = 0; i < 10; i++) { char msg[64] = {0}; sprintf(msg, "%s%4d", "Hello Kafka ", i); //msg = "

2021-10-06 00:48:48 8685 2

原创 Kafka中的日志管理与磁盘高效存储

5. 日志存储:5.2.3 消息压缩:常见的压缩算法是数据量越大压缩效果越好,一条消息通常不会太大,这就导致压缩效果并不是太好。而kafka实现的压缩方式是将多条消息一起压缩,这样可以保证较好的压缩效果。在一般情况下,生产者发送的压缩数据在broker中也是保持压缩状态进行存储的,消费者从服务端获取的也是压缩的消息,消费者在处理消息之前才会解压消息,这样保持了端到端的压缩。(生产者复杂压缩,将压缩后的消息发到broker上;消费者负责解压,从broker上获得压缩消息本地解压)Kafka日志中使

2021-10-06 00:47:24 601

原创 Kafka消息队列中消费者的实现

3.1 消费者与消费组:消费者(Consumer)负责订阅Kafka中的主题(Topic),并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在Kafka的 消费理念 中还有一层 消费组(Consumer Group)的概念,每个消费者都有一个对应的消费组。当消息发布到主题后,只会 投递给订阅它的每个消费组中的一个消费者。几个概念:(1)一个分区只能属于一个主题,一个主题可以有多个分区;(一个主题所含有的分区数量,是在配置Topic时指定的)(2)基于默认的分区策略,同一个消费组(即订阅

2021-10-06 00:16:59 1416

空空如也

空空如也

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

TA关注的人

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