自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ffmpeg使用入门

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

2023-12-23 19:05:55 637

原创 WebRTC引用计数和线程

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

2023-05-07 23:41:59 500 1

原创 WebRTC源码目录结构

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

2023-05-07 18:06:41 649

原创 Makefile入门

Makefile入门

2022-12-24 21:59:44 974

原创 vim入门

vimz入门

2022-12-23 23:01:52 378

原创 常用的Linux命令介绍

常用的Linux命令简介

2022-12-23 17:41:13 1057

原创 CMake入门

cmake使用入门介绍

2022-12-23 01:01:34 625

原创 WebRTC简介

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

2021-12-27 00:13:04 2063 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 4627

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

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

2021-11-13 19:34:34 5466

原创 《程序员的自我修养》第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 306

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

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

2021-11-06 22:57:57 4733

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

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

2021-11-05 00:55:00 226

原创 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 418

转载 epoll的底层实现原理

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

2021-10-27 23:55:13 9013

原创 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 2321

原创 MySQL面试题总结

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

2021-10-21 00:10:03 147

原创 Redis面试题总结

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

2021-10-21 00:09:37 143

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

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

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

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

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

2021-10-17 17:37:06 699

原创 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 2201

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

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

2021-10-16 00:28:11 1010

原创 MySQL的分库分表

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

2021-10-13 00:09:16 235

原创 实践中如何优化MySQl

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

2021-10-13 00:05:46 244

原创 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 238

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

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

2021-10-09 00:45:38 686

原创 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 7822 7

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

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

2021-10-06 12:11:07 278

原创 使用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 5404 1

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

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

2021-10-06 00:47:24 403

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

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

2021-10-06 00:16:59 1117

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

从编程的角度而言,生产者就是负责向 Kafka 发送消息的应用程序。1. 客户端开发:一个正常的生产逻辑 需要具备以下几个步骤:(1)配置生产者客户端 参数 及 创建相应的生产者实例;(2)构建待发送的消息;(3)发送消息;(4)关闭生产者实例。对于 构建的消息对象 ProducerRecord,它并不是单纯意义上的消息,并且还包含了多个属性,原本要发送的与业务相关的消息体只是其中的一个value属性,比如 “Hello Kafka!” 只是 ProducerRecord对象中的一个属性。P

2021-10-05 14:43:44 484

原创 Kafka消息队列中的基本概念

Kafka的特点:Kafka的特点是 高吞吐、可持久化、可水平扩展、支持流数据处理 等。Kafka可扮演三种角色:(1)消息系统:(消息中间件)与传统的消息中间件一样,Kafka被用作消息中间件时具备 系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性 等功能。与此同时,Kafka还提供了大多数消息中间件难以实现的 消息顺序性保障 及 回溯消费 的功能。(2)存储系统:Kafka把消息持久化到磁盘,相比于其他基于内存存储的系统而言,有效的降低了数据丢失的风险。(3)流式处理平台:

2021-10-04 19:32:39 308

转载 GDB调试程序的常用命令

gdb 调试工具:虽然没有IDE那些图形化调试工具直观,但是要比IDE具有更强大的功能。gdb能做的事:(四个方面的功能):启动你的程序在断点处停住停住时检查程序中发生的事情动态改变程序的执行环境。关于断点:设置断点:break 16 //在程序的某一行停住break func //在某个函数停住查看断点:info break //查看 所有的 断点信息info break [num] //查看 num 指定的断点信息

2021-10-02 14:46:27 3513

转载 C++STL常见面试题总结

2. 迭代器失效:《C++ Primer》9.3.6 容器操作可能使迭代器失效:向容器中 添加元素和从容器中 删除元素的操作 可能 会使指向容器元素的 指针、引用或迭代器 失效。一个失效的指针、引用或迭代器将不再表示任何元素。使用失效的指针、引用或迭代器是一种严重的程序设计错误,很可能引起与使用未初始化的指针一样的问题。2.1 向容器中 添加 元素导致迭代器失效的场景:如果添加操作的容器是vector 或者 string,且 存储空间被重新分配,则指向容器的迭代器、指针和引用都会失效。如果存

2021-09-29 01:16:04 4727 1

原创 LeetCode刷题笔记_20210926

1. 判断计数/偶数写法:相关题目:《剑指 Offer 21. 调整数组顺序使奇数位于偶数前面》https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/常规写法: 取模(对2取模)if( i % 2 != 0 ) //奇数if( i% 2 == 0 ) //偶数优化写法: 位运算(用1与运算)if( i & 1 == 1 )if( i &a

2021-09-27 00:35:20 161

原创 LeetCode刷题笔记_20210925

1. 关于STL中的几个容器的api成员函数:1.1 stack:stack<int> s;s.empty();s.size();s.top();s.push(n);s.pop();1.2 queue:queue<int> q;q.empty();q.size();q.font();q.back();q.push();q.pop();stack 与 queue 的区别在于:stack只能访问 栈顶元素(top),只能在栈顶单头位置

2021-09-26 00:20:48 237

原创 Redis C API的定义及使用方法:

遗留问题:数据库连接池的数量设置为多大合适?总结:凡是池子,都是一个“list”;(不论是线程池还是连接池)凡是Manager,都是一个“map”。“池子”的成员变量也是很固定的:list m_free_list;ThreadNotify m_free_notify;int cur_conn_cnt;int max_conn_cnt;因为池子的作用就是供他人调用,从池子中拿走一个、归还一个,list链表就是互斥区,锁是为了保护互斥区。#Redis数据库连接池

2021-09-12 13:07:13 628

原创 MySQL C API的定义及使用方法

第一部分:init初始化MySQL连接的相关API:(1) mysql_init :MYSQL* mysql_init(MYSQL *mysql);返回一个MYSQL 句柄,对应这个句柄MySQL会在数据库内部分配一个对象并开辟内存,用于存储关联这个连接的处理信息。后续所有的对这条数据库连接的操作都是通过这个句柄,类似于socket()返回的sockfd。如果MySQL内部内存不足,则返回NULL。(2) mysql_options :int mysql_options(MYSQL* mys

2021-09-12 13:05:35 706

原创 C++ STL中常见的算法使用方式

0. < algorithm> 是什么:< algorithm> 头文件定义了一组专门用于操作元素范围的函数(designed to be used on ranges of elements)。所谓“元素范围”指的是可以通过 迭代器 或 指针 进行访问的对象序列,例如数组或某些SLT容器。注意,< algorithm>中的算法通过迭代器直接对值进行操作,不会以任何形式影响任何容器的结构(它永远不会影响容器的大小或存储分配)。一句话概括:   < algor

2021-09-04 23:48:45 373 1

空空如也

空空如也

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

TA关注的人

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