自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

C/C++Linux、音视频、DPDK

C/C++Linux、音视频、DPDK

  • 博客(34)
  • 资源 (2)
  • 收藏
  • 关注

原创 C++后台开发实习生技能要求

应届生除了要良好地掌握算法和数据结构以外,以下一些技能点列表希望对大家有帮助,有兴趣的朋友可以参考这个针对性地补缺补差。文章列出的技能点有的要求熟悉,有的了解即可,注意技能点前面的修饰词。如果没有明确给出“熟悉”“了解”等字眼,要求均为熟悉。操作系统方面多线程相关与线程之间同步技术熟练使用(但不局限于)以下linux APIlinux下的线程创建、等待、获取线程idint pthread_create(pthread_t *thread, const pthread_attr_t *attr,.

2020-12-31 21:50:25 485

原创 彻底搞懂TCP 三次握手四次挥手说

有时越简单的问题,一般就是隐藏着比较大的坑,一般都是需要将问题扩展的。上面求职者的回答不对吗?当然对,但距离面试官的期望可能还有点距离。希望大家能带着如下问题进行阅读,收获会更大。为什么连接的时候是三次握手?什么是半连接队列?ISN(Initial Sequence Number)是固定的吗?三次握手过程中可以携带数据吗?如果第三次握手丢失了,客户端服务端会如何处理?SYN攻击是什么?挥手为什么需要四次?四次挥手释放连接时,等待2MSL的意义?三次握手三次握手 (Three-way H

2020-12-31 16:44:12 287 1

原创 深入Linux内核——进程调度的算法和数据结构

进程优先级和分类进程优先级代表进程需要运行的紧急程度和需要更多的运行时间片,Linux的优先级的范围是[0, 139],数值越小,优先级越高。用户态通过nice值设置优先级,nice值的范围是[-20,19],其映射到范围100—139。setpriority系统调用能修改进程的优先级0—139。按照优先级又可以分为两类进程:实时进程:要求最快速被响应,比如视频、工业机器控制程序等。非实时进程:即普通进程,我们大部分程序使用的。其还可以细分为两类:1)交互式进程,需要响应前台请求。2)后台批处理进

2020-12-30 17:42:13 762 1

原创 Linux内核模块模型面向对象分析

引言:Linux操作系统架构在合适的硬件之上,诸如 cpu、外存、内存、PCI等设备之上。在Linux这个国家里,任何的硬件设备都作为一个资源,而操作系统就像一个国家机器对他的资源进行管理,国家的公民是运行与操作系统内部的进程,当然这个国家也有公务员(内核线程:注,在内核中没有进程只有线程。关于什么是线程什么是进程,很多书上其实都描述的不在要点。详见附录问题1)。内核线程把持着所有的硬件资源,进程使用需要发起80软中断(INT 0x80)请求内核响应。资源主要分为:内存/虚存、文件(设备)两大类。深透剖

2020-12-29 18:05:39 402 1

原创 还不懂Linux内核吗?手把手教你分析Linux 内核结构

本文主要会带你介绍 Linux 操作系统,包括 Linux 本身、Linux 如何使用、以及系统调用和 Linux 是如何工作的。相关视频还不懂内核吗?5个方面分析内核架构,让你对内核不再陌生深透剖析Linux内核字符与块设备驱动程序Linux 简介UNIX 是一个交互式系统,用于同时处理多进程和多用户同时在线。为什么要说 UNIX,那是因为 Linux 是由 UNIX 发展而来的,UNIX 是由程序员设计,它的主要服务对象也是程序员。Linux 继承了 UNIX 的设计目标。从智能手机到汽车

2020-12-28 18:04:07 478 1

原创 浅析Linux下IO的阻塞/非阻塞、同步/异步

Linux下,一个应用程序调用操作系统提供的服务,主要的调用接口有如下三种:直接调用Linux 内核(Kernel) 提供的系统调用(Sys call)接口调用glibc封装的api,glibc内部会调用kernel调用其它第三方library的api,这些library 内部会调用kernelLinux kernel 的代码,cpu以Ring0级别运行,运行空间叫做内核态(Kernel Mode);用户及library的代码,cpu以Ring3级别运行,运行空间叫做用户态(Use

2020-12-26 21:45:07 507

原创 高性能服务器开发——定时器

常见的定时器实现三种,分别是:排序链表,最小堆,时间轮。 之前用的定时器是基于最小堆的,在定时器数量不多时可以使用, 目前公司用的框架中的定时器是基于简单时间轮的,但是为了支持大范围的时间,每个齿轮的所维护的链表为有序链表,每次插入时先mod出spoke,再从头遍历链表以便将定时器插入到合适位置, 所以本质上还是基于有序链表的。时间复杂度并未减少。应用场景分析: 下面就一个实际例子来说定时器的使用。场景: 客户端发起的网络请求,需要对每个请求做超时检查。方案1:一个定时器,一个mulimap<

2020-12-26 17:28:04 280 1

原创 多线程之信号量(By C++)

信号量在多线程中,主要是用于线程的同步或者限制线程运行的数量。所谓同步,当流程1运行在线程1中,流程2运行在线程2中,流程2必须在流程1结束之后才能开始执行。你会怎么做,所有就需要给出一个流程1结束的信号。在信号来之前,让线程2先在某个位置等待,这个使用方式和互斥锁有点类似,互斥从某种意义上也是一种同步,只是互斥锁更倾向于保护共同资源。信号量大于0的时候就代表有信号,不需要等待,但不仅仅是1。下面的这个例子设置了3个线程,设置最大同时只运行2个进程。#include<Windows.h&gt

2020-12-25 20:36:24 534 1

原创 skynet源码分析之网络层—Lua层

本篇主要介绍在Lua服务里调用skynet网络层底层接口的流程,Lua层的api主要在lualib/skynet/socket.lua,可参考官方wiki https://github.com/cloudwu/skynet/wiki/Socket。通过一个简单的例子说明Lua服务是如何最终调用到网络层底层接口的:local socket = require “socket” local skynet = require "skynet" local function loop(fd)

2020-12-25 20:00:06 574 1

原创 Nginx日志你了解多少

日志在系​​统中监视应用程序的活动非常重要,因为日志为您提供了有用的调试信息,并使您能够分析Web服务器的各个方面。与其他软件应用程序一样,Nginx还维护事件,例如网站访问者,遇到的问题以及更多日志文件。有用的记录信息用于采取先发制人的措施,以处理日志事件中的重大严重差异。在本文中,我们将详细介绍如何在Ubuntu 20.04系统中配置和查看Nginx日志以监视应用程序活动。Nginx中记录事件的日志有两种类型,一种是访问日志,另一种是错误日志。如果您已经在Nginx核心配置文件中启用了这些日志,那么

2020-12-24 17:02:10 409 4

原创 Nginx常见典型故障|Linux干货

为什么nginx里面有的是浏览器渲染出的页面,有的时候就变成下载文件?这个一个取决于服务端nginx,一个取决于你浏览器。在Nginx服务端的配置文件目录下,有一个mime.types文件,内容如下types { text/html html htm shtml; text/css css; text/xml

2020-12-23 20:09:19 1309 1

原创 网络协议TCP和UDP的基本原理

引入TCP/IP协议族的传输层协议主要包括TCP和UDPTCP是面向连接的可靠的传输层协议。它支持在并不可靠的网络上实现面向连接的可靠的数据传输UDP是无连接的传输协议,主要用于支持在较可靠的链路上的数据传输,或用于对延迟较敏感的应用TCP/IP传输层的作用提供面向连接或者无连接的服务维护连接状态对应用层数据进行分段和封装实现多路复用可靠的传输数据执行流量控制TCP的基本原理特点三次握手->建立可靠连接确认机制->应答接收端口号->多路复用序列号-

2020-12-22 17:10:21 2896 2

原创 Linux时间的获取与使用

Linux系统时间有两种。日历时间。该值是自协调世界时(UTC)1970年1月1日00:00:00这个特定时间以来所经过的秒数累计值。基本数据类型用time_t保存。最后通过转换才能得到我们平时所看到的24小时制或者12小时间制的时间。进程时间。也被称为CPU时间,用以度量进程使用的中央处理器资源。进程时间以时钟滴答计算。 日历时间time()获取时间戳time函数用来获取日历时间的时间戳,该时间戳是从1970年1月1日0点(00:00:00 UTC, January 1, 1970)到现在经历

2020-12-21 20:11:31 482

原创 C++性能之惊群问题

何谓惊群问题?场景1:6只小鸟停在电线上休息,都在等待食物。场景2:我们向鸟群投放一条小虫,作为它们的食物。场景3:6只小鸟看到有食物到来,都停止休息,一起飞起来去抢夺食物。场景4:最终只有一只小鸟(bird4)能够吃到食物,其他小鸟无奈而又伤心的回到电线上继续休息。上面我们的小场景实际就是一个现实中的惊群问题,明明只有一条小虫子子到来,6只小鸟却都要停止休息去抢夺食物,除了抢到食物的小鸟,其他抢不到食物的小鸟又需要重新飞回去休息,对于这部分小鸟来说,无谓浪费了很多体力。那么计算机中惊

2020-12-21 16:49:43 3590 4

原创 操作系统IO模式知识整理

1.关键概念理解同步:发起一个调用,得到结果才返回。异步:调用发起后,调用直接返回;调用方主动询问被调用方获取结果,或被调用方通过回调函数。阻塞:调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞:调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。同步才有阻塞和非阻塞之分;阻塞与非阻塞关乎如何对待事情产生的结果(阻塞:不等到想要的结果我就不走了)2.明确进程状态理解进程的状态转换就绪状态 -> 运行状态:处于就绪状态的进

2020-12-19 19:15:55 2073 3

原创 详解C/C++协程实现原理及使用

协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。注意,在一个子程序中中断,去执行其他子

2020-12-18 18:43:28 1723 3

原创 Redis原理、IO多路复用、集群模式、雪崩、击穿、穿透解析

Redis 是一个包含多种数据结构、基于内存、可选持久性 key-value 存储系统,并提供多种语言的 API 的非关系型数据库。应用场景热点数据的缓存分布式 session计数器、标记相关问题排行榜相关问题分布式锁其他业务不可变或者变动几率小的数据数据类型String 字符串Hash 哈希List 列表Set 集合Zset/Sorted set:有序集合高阶:HyperLogLog、Geo、Pub/Sub、BloomFilter,RedisSearch,Redis-ML

2020-12-17 17:56:40 468

原创 这才是你需要的C/C++Linux服务器后台开发学习路线!

C语言和C++属于“造轮子”语言,几乎什么都能做。不过一般来说,C语言和C++主要还是做后台(服务端)开发比较多,包括:通信公司后台开发互联网公司后台开发游戏公司后台开发……当然这个后台开发具体职责又有很多细分,比如:有做数据处理和分析的有做基础协议和通信的有做服务端底层应用优化的甚至还有做后台系统驱动和内核的……从技术学习和实际运用的角度来看,C/C++和Java到底区别在哪?C/C++,它和Java确实不太一样。C语言和C++,尤其C++,语言粒度细、机制多,性能虽然高,但语言本

2020-12-16 17:45:52 1441 4

原创 深入Linux内核架构——进程管理和调度(二)

五、调度器的实现调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉。该任务可分为调度策略和上下文切换两个不同部分。1、概观暂时不考虑实时进程,只考虑CFS调度器。经典的调度器对系统中的进程分别计算时间片,使进程运行直至时间片用尽,所有进程的所有时间片用完时,需要重新计算。相比之下,CFS只考虑进程等待时间,即进程在就绪队列(run_queue)中已等待的时间,对CPU时间需求最严格的进程被调度执行。每次调度器会挑选具有最高等待时间的进程提供CPU,如此进程的不公平等待不会被积累,而会均匀分布到

2020-12-12 16:36:10 1665 2

原创 深入Linux内核架构——进程管理和调度(一)

如果系统只有一个处理器,那么给定时刻只有一个程序可以运行。在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目。内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停切换做到的。由此,以下两个问题必须由内核解决:除非明确要求,否则应用程序不能彼此干扰;CPU时间必须在各种应用程序之间尽可能公平共享(一些程序可能比其他程序更重要)。本文主要涉及内核共享CPU时间的方法以及如何在进程之间切换(内核为各进程分配时间,保证切换之后从上次撤销其资源时执行环境完全相同)。一、进程优先

2020-12-11 18:01:19 2023 3

原创 深入Linux内核架构——进程虚拟内存

一、简介用户虚拟地址空间的管理比内核地址空间的管理复杂:每个应用程序都有自身的地址空间,与所有其他应用程序分隔开;通常在巨大的线性地址空间中,只有很少的段可用于各个用户空间进程,这些段彼此有一定的距离,内核需要一些数据结构,来有效地管理这些(随机)分布的段;地址空间只有极小的一部分与物理内存页直接关联,不经常使用的部分,则仅当必要时与页帧关联;内核信任自身,但无法信任用户进程,因此,各个操作用户地址空间的操作都伴随有各种检查,以确保程序的权限不会超出应有的限制,进而危及系统的稳定性和安全性;fo

2020-12-10 18:32:40 440 2

原创 深入Linux内核架构——锁与进程间通信

Linux作为多任务系统,当一个进程生成的数据传输到另一个进程时,或数据由多个进程共享时,或进程必须彼此等待时,或需要协调资源的使用时,应用程序必须彼此通信。一、控制机制1、竞态条件几个进程在访问资源时彼此干扰的情况通常称之为竞态条件(race condition)。在对分布式应用编程时,这种情况是一个主要的问题,因为竞态条件无法通过系统的试错法检测。只有彻底研究源代码(深入了解各种可能发生的代码路径)并通过敏锐的直觉,才能找到并消除竞态条件。2、临界区对于竞态条件,其问题的本质是进程的执行在不应

2020-12-09 17:43:56 1386 5

原创 slab机制的原理

slab获取 - 效率最高的获取方法分配和释放数据结构是所有内核中最普遍的操作之一。为了便于数据的频繁分配和回收,常常会用到一个空间链表。它就相当于对象高速缓存以便快速存储频繁使用的对象类型。在内核中,空闲链表面临的主要问题之一是不能全局控制。当可用内存变得紧张的时候,内核无法通知每个空闲链表,让其收缩缓存的大小以便释放一些内存来。实际上,内核根本不知道有这样的空闲离岸边。为了弥补这一缺陷,也为了是代码更加稳固,linux内核提供了slab层(也就是所谓的slab分类器),slab分类器扮演了通用数据结构

2020-12-08 16:23:24 2116 1

原创 linux下c/c++语法知识点归纳和总结(1)

C++申请动态内存在c++中,申请动态内存是使用new和delete,这两个关键字实际上是运算符,并不是函数。而在c中,申请动态内存则是使用malloc和free,这两个函数是c的标准库函数,使用它们必须包含stdlib.h,才能编译通过。new/delete和malloc/free的相同之处在于,new和malloc都是手动申请动态内存,释放时new则需要delete释放内存,而malloc则需要free释放内存。它们的不同之处在于,new和delete会自动调用对象的构造和析构函数,而mal..

2020-12-07 20:25:53 751 2

原创 Reactor线程模型浅析

Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(区别在于多路复用器是边沿触发还是水平触发),多路复用器返回并将相应I/O事件分发到对应的处理器中。Reactor是一种事件驱动机制,和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果

2020-12-07 17:11:52 1153 2

原创 FFMPEG初识与安装(Linux)

1. FFmpeg简介FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。FFmpeg提供了强大的命令行工具,非常方便用户使用以及二次开发。官方网站:http://www.ffmpeg.org/。ffmpeg的Github项目地址是:https://g.

2020-12-05 20:04:59 1278 1

原创 5分钟弄懂程序员的如何升级到架构师。

对我们程序员来说,发展的途径要么是走管理岗,从开发升级到项目经理甚至是部门经理;要么走技术升级路线。不过在技术路线方面,无法升级到架构师的程序员不在少数。一方面,在不少公司的高级开发岗位上,无法让程序员实践甚至接触到架构师的技能,另一方面,有不少程序员甚至不清楚架构师所需要掌握的技能和升级途径。所以从结果上来看,至少有5成的程序员止步于“高级开发”的程度,这是非常令人可惜的。我这几年一直努力地从高级开发升级到架构师,目前虽然职位上没达到,但好歹多少也能干些架构师方面的活了。在本文里,将结合我自身和其它一些

2020-12-04 19:06:36 994 2

原创 2020年C/C++精选面试题及答案(三)

堆排序的思路堆是一个完全二叉树完全二叉树即是:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。堆满足两个性质: 堆的每一个父节点数值都大于(或小于)其子节点,堆的每个左子树和右子树也是一个堆。堆分为最小堆和最大堆。最大堆就是每个父节点的数值要大于孩子节点,最小堆就是每个父节点的数值要小于孩子节点。排序要求从小到大的话,我们需要建立最大堆,反之建立最小堆。堆的存储一般用数组来实现。假如父节点的数组下标为

2020-12-04 17:11:53 1326 2

原创 2020年C/C++精选面试题及答案(二)

什么是并行计算?并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程,是 提高计算机系统计算速度和处理能力的一种有效手段。它的基本思想是用多个处理器来 协同求解同一问题,即将被求解的问题分解成若干个部分,各部分均由一个独立的处理 机来并行计算。并行计算系统既可以是专门设计的、含有多个处理器的超级计算机,也 可以是以某种方式互连的若干台的独立计算机构成的集群。通过并行计算集群完成数据 的处理,再将处理的结果返回给用户。并行计算可分为时间上的并行和空间上的并行。时间上

2020-12-03 20:38:55 2493 6

原创 什么是KMP算法(详解)

什么是KMP算法:KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。首先,对于这个问题有一个很单纯的想法:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串

2020-12-03 20:21:54 158676 38

原创 程序员的自我修养,nginx源码学习----内存池

之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete、malloc/free这么简单。随着代码量的递增,程序结构复杂度的提高。各种内存方面的问题悄然滋生。而且作为平台,后期的插件扩展在所难免。长时间运行的采集平台的特性更是提出了对稳定性的高要求。不是c#、java,没有虚拟机为你管理内存,一切都要靠自己。于是想看看nginx、python、lua这些C的经典之作在内存管理这块“要地”又是如何处理的。先来看看nginx吧,因为网上都说nginx的内存池设计的非常精巧:1、基本结构

2020-12-02 18:28:23 215 2

原创 C/C++指针参数赋值问题

在C/C++中,关于在函数里对指针赋值的问题。首先可以看到如下现象:void test(int *p){ p = NULL;} int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); int *t , y = 10; t = &y; test(t); return a.exec();}这个结果令我有点吃惊,我一直以为传递指针,赋值完这个指针也会变的,

2020-12-01 21:48:32 1261

原创 C/C++多线程操作

一、C/C++多线程操作说明C/C++多线程基本操作如下:线程的建立结束线程的互斥和同步使用信号量控制线程线程的基本属性配置在C/C++代码编写时,使用多线程机制,首先需要做的事情就是声明引用,具体如下:#include "pthread.h"二、线程基本操作方法基本线程操作:pthread_create():创建线程开始运行相关线程函数,运行结束则线程退出pthread_eixt():因为exit()是用来结束进程的,所以则需要使用特定结束线程的函数pthread

2020-12-01 20:59:15 1373

原创 2020年精选面试题及答案(一)

1. 在ACM竞赛中,一支队伍由三名队员组成,现在有N+M名学生,其中有N名学生擅长算法,剩下M名学生擅长编程,这些学生要参加ACM竞赛,他们的教练要求每支队伍至少有一名擅长算法和一名擅长编程的学生,那么这些学生最多可以组成多少支队伍?输入: 输入两个整数M,N,其中1<N,M<10000000输出: 最多可以组成的队伍数#include <iostream>using namespace std; int main(){ int cnt = 0,n,m;

2020-12-01 17:21:11 325

死锁的检测方案教程(LinuxC/C++)

死锁的检测方案教程(LinuxC/C++)

2022-09-15

C++11 (智能指针、关键字、类型推导、新特性)

c++11 面试题总结 1. 左值引用与右值引用的区别?右值引用的意义? 2. c++11 的智能指针种类以及使用场景? 3. c++11 override,final关键字的作用? 4. c++11 类型推导 5. c++11 用过哪些新特性? (C++后台开发教程)

2022-08-20

Linux内核驱动与应用开发全套学习资料.rar

Linux内核驱动与应用开发全套学习资料

2021-07-02

C/C++Linux设计模式.mp4

C/C++Linux设计模式.mp4

2021-01-30

空空如也

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

TA关注的人

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