自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一文彻底搞懂I/O多路复用及其技术

前言​ 高性能是每个程序员的追求,无论写一行代码还是做一个系统,都希望能够达到高性能的效果。高性能架构设计主要集中在两方面:尽量提升单服务器的性能,将单服务器的性能发挥到极致 如果单服务器无法支撑性能,设计服务器集群方案​ 单服务器高性能的关键之一就是服务器采取的网络编程模型。服务器如何管理连接,如何处理请求等。这两个设计点最终都和操作系统的I/O模型及进程模型相关。I/O模型:阻塞、非阻塞、同步、异步 进程模型:单进程、多进程、多线程。​ 我们所说的I/O模型是指网络I/O模型,就是服

2021-08-31 16:37:12 863

原创 Nginx 多进程连接请求/事件分发流程分析及惊群分析

Nginx使用多进程的方法进行任务处理,每个worker进程只有一个线程,单线程循环处理全部监听的事件。本文重点分析一下多进程间的负载均衡问题以及Nginx多进程事件处理流程,方便大家自己写程序的时候借鉴。一、监听建立流程整个建立监听socket到accept的过程如下图:说明:1.main里面调用ngx_init_cycle(src/core/ngx_cycle.c),ngx_init_cycle里面完成很多基本的配置,如文件,共享内存,socket等。2.上图左上角是ngx_

2021-08-30 17:57:46 374

原创 如何实现高性能的IO及IO原理?

程序运行在内存以及IO的体现  首先普及一下常识,如图所示:  1、在整个内存空间中,跑着各种各样的程序,有Java程序、C程序,他们共用一块内存空间。  2、对于Java程序,JVM会申请一块堆空间,通过Xmx可以设置,其余空间是堆外空间,其中每个线程有自己的线程栈,保证线程内存隔离,堆空间使用完以后,会触发Full FC,堆外空间所有进程可共享使用,无限制。  3、所有系统运行的程序都必须通过操作系统内核进行IO操作,操作系统也是程序,也需要一定的内存空间。一、使用Buffe

2021-08-28 14:29:34 410

原创 网络编程—Linux多线程与多进程

进程同步与互斥的区别? 进程的同步方式有哪些? 进程的通信方式有哪些? 进程同步与通信的区别是什么? 线程的同步/通信与进程的同步/通信有区别吗?二、多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)  1、同步与互斥的概念  2、互斥锁(同步)  3、条件变量(同步)  4、读写锁(同步)  5、自旋锁(同步)  6、信号量(同步与互斥)C/C++Linux后台服务器开发高级架构师免费学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师

2021-08-26 16:46:08 286

原创 Linux内核内存管理:地址转换和MMU

地址转换和MMU虚拟内存是一个概念,是给进程的一种错觉,因此它认为自己拥有巨大的、几乎无限的内存,有时甚至比系统实际拥有的内存还要多。每次访问内存位置时,由CPU将虚拟地址转换为物理地址。这种机制称为地址转换,由内存管理单元(MMU)完成,是CPU的一部分。MMU保护内存免受未经授权的访问。给定一个进程,需要访问的任何页面必须存在于进程VMAs中,因此必须存在于进程页表中(每个进程都有自己的页表)。内存由固定大小的命名页(用于虚拟内存)和帧(用于物理内存)组织,在我们的示例中大小为4 KB。无

2021-08-25 15:47:18 737

原创 Linux内核源码分析之内存管理

本文站的角度更底层,基本都是从Linux内核出发,会更深入。所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉。1、页内核把物理页作为内存管理的基本单元。尽管处理器的最小处理单位是字(或者字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理。所以从虚拟内存看,页也是最小单元。体系不同,支持的页大小不同。大多数32位体系结构支持4KB的页,而64位体系结构一般会支持8KB的页。内核用struct page结构体表示

2021-08-24 16:14:31 584

原创 Linux内核源码分析方法—程序员进阶必备

一、内核源码之我见Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码。通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短期内无法了

2021-08-23 16:08:34 364

原创 一文详解Mysql锁&事务隔离级别

一、锁的定义  锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共 享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。二、锁的分类  从性能上分为乐观锁(用版本号对比来实现)和悲观锁update ticket set count=count-1,version=v

2021-08-21 16:38:04 261

原创 聊聊对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)

一、关于I/O模型的问题  最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题。  1. 为什么redis能以单工作线程处理高达几万的并发请求?  2. 什么是I/O多路复用?为什么redis、nginx、nodeJS以及netty等以高性能著称的服务器其底层都利用了I/O多路复用技术?  3. 非阻塞I/O为什么会流行起来,在许多场景下取代了传统的阻塞I/O?  4. 非阻塞I/O真的是银弹吗?为什么

2021-08-20 17:11:15 573

原创 你真的懂Redis与MySQL双写一致性如何保证吗?

一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终..

2021-08-19 16:21:47 241

原创 IM(即时通讯)服务端(上)

前言首先讲讲IM(即时通讯)技术可以用来做什么:聊天:qq、微信 直播:斗鱼直播、抖音 实时位置共享、游戏多人互动等等可以说几乎所有高实时性的应用场景都需要用到IM技术。关于即时通讯架构的相关视频讲解:qq微信背后的即时通讯技术细节,方案选择即时通讯架构设计C/C++Linux后台服务器开发免费学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师本篇将带大家从零开始搭建一个轻量级的IM服务端,麻雀虽小,五脏俱全,我们搭建的IM服务端实现以下功能:一对

2021-08-18 16:30:54 1423

原创 数据库底层设计(MYSQL索引的数据结构)

前言说到数据库这个词,我只能用爱恨交加这个词来形容它。自己之前还单纯懵懂的时候进了数据库的课堂,听完数据库的课,觉得这是一门再简单不过的课程,任何一门编程语言都比SQL要晦涩难懂,任何一门理论课程都比数据库关系要复杂得多。直到从被面试官按在地上摩擦,到工作中那一条条令人发指的慢查询SQL,这就已经完全颠覆了我对数据库的看法。在有各种数据库工具的今天,我们是看不到那简单到不能再简单的一张表的背后,隐藏着多少数据结构的支撑,也看不到我们随手敲的一条SELECT,背后会有多少算法和数据结构在给我们做优

2021-08-17 15:55:59 507

原创 网络编程—IO多路复用详解

假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及硬件、操作系统、应用程序三个层面,了解这些知识是很有帮助的。假如已经了解,可直接跳过Linux系统中断中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度.

2021-08-16 17:29:31 1375

原创 腾讯跟阿里两位王者之间的对比

前言  程序员朋友圈有一篇比较火的文章《当下(2018 年)腾讯的技术建设是否处于落后同体量公司的状态?》,虽然网上不乏介绍腾讯与阿里不同之处(包括文化、薪资待遇、公司氛围和技术建设等方面)的文章,今天就来跟大家分析一下,不免具有一定的片面性,不喜勿喷。关于腾讯  腾讯整体上是一家公司,但很多时候各个部门之间各自为政。部门之间的合作更像一个公司与另一个公司之间的合作,在沟通的时候如果不是负责人不能向对方透露任何跟工作有关的细节、进度等。在腾讯某部门的时候由于此还吃过几次亏,以至于来到阿里之后跨部

2021-08-14 15:11:29 495 1

原创 linux服务器网络编程之线程模型

前言  本文将主要介绍传统的和目前流行的进程/线程模型,在讲进程/线程模型之前需要先介绍一种设计模式: Reactor 模式。Reactor 模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。如果用图表示的如下:关于 Reactor 模式不了解的朋友大家可以看看以下几个视频的详细讲解:手操React

2021-08-13 15:46:56 200

原创 C++高性能服务器框架——日志系统详解

1|0日志文件系统对文件系统进行修改时,需要进行很多操作。这些操作可能中途被打断,也就是说,这些操作不是“不可中断”(atomic)的。如果操作被打断,就可能造成文件系统出现不一致的状态。例如:删除文件时,先要从目录树中移除文件的标示,然后收回文件占用的空间。如果在这两步之间操作被打断,文件占用的空间就无法收回。文件系统认为它是被占用的,但实际上目录树中已经找不到使用它的文件了。在非日志文件系统中,要检查并修复类似的错误必须对整个文件系统的数据结构进行检查。这个操作可能会花费很长的时间。为了

2021-08-12 15:41:58 2083 2

原创 一文带你了解大厂亿级并发下高性能服务器是如何实现的!

多进程历史上最早出现也是最简单的一种并行处理多个请求的方法就是利用多进程。比如在Linux世界中,我们可以使用fork、exec等系统调用创建多个进程,我们可以在父进程中接收用户的连接请求,然后创建子进程去处理用户请求,就像这样:关于事件驱动还不是很了解的朋友可以点击 事件驱动试编程 视频讲解C/C++Linux后台服务器开发免费学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频这种方法的优点就在于:编程简单,非常容易理解 由于各个进程的地址

2021-08-11 16:14:22 222

原创 基于后端开发Redisson实现分布式锁源码分析解读

一、分布式锁的概念和使用场景分布式锁是控制分布式系统之间同步访问共享资源的一种方式。  在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,这个时候,便需要使用到分布式锁。C/C++Linux后端开发技术点讲解内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/I

2021-08-10 15:52:53 207

原创 什么是DPDK?DPDK的原理及学习学习路线总结

一、什么是DPDK  对于用户来说,它可能是一个性能出色的包数据处 理加速软件库;对于开发者来说,它可能是一个实践包处理新想法的创 新工场;对于性能调优者来说,它可能又是一个绝佳的成果分享平台。   DPDK用软件的方式在通用多核处理器上演绎着数据包处理的新篇 章,而对于数据包处理,多核处理器显然不是唯一的平台。支撑包处理 的主流硬件平台大致可分为三个方向。   ·硬件加速器   ·网络处理器   ·多核处理器  在类似 IA(Intel Architecture)多核处理器为目标的平台上,网络

2021-08-09 15:45:22 4463

原创 从Linux源码看Socket(TCP)的listen及连接队列

前言一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 今天就来从Linux源码的角度看下Server端的Socket在进行listen的时候到底做了哪些事情(基于Linux 3.10内核),当然由于listen的backlog参数和半连接hash表以及全连接队列都相关,在这一篇文章里也一块讲了。Server端Socket需要Listen众所周知,一个Server端Socket的建立,需要socket、bind、listen、accept四个步骤。今天笔者就

2021-08-07 16:57:31 563

原创 Linux内核分析学习路线总结(内核人员必看)

1、Linux体系架构(文末附上学习思维导图)如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态。  内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。  用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。用户态的应用程序可以通过三种方式来访问内核态的资源:1)系统调用2)库函数3)Shell脚本这三种方式也在上图中有所体现。二、Linux内核的启动过

2021-08-06 15:56:41 4957 1

原创 应届生怎么走Linux下C++后台服务器开发路线,工作3-5年的知识体系

1. 前言  给最近正在准备秋招的同学或者是想转行,目标岗位是C++后端开发工程师,这个岗位对开发者的要求也比较高,需要的基础知识非常多,刚刚开始准备的时候,感觉也是不知从何入手,现在经过了一段时间的学习,感觉比刚开始的时候好了一些,但是在很多方面还有欠缺,所以写下这篇文章,给你们进行一个总结,也希望能帮助到你们在这条路上不断前行的人。2. 服务器开发与后台开发的联系和区别  服务器是一种高性能的计算机,相对于普通的个人电脑,它的性能往往更强,但是功能也更加单一。服务器开发,就是在服务器上面开发

2021-08-05 16:04:30 666 3

原创 C++线程池 基于C的实现

简介线程池是什么?打饭的阿姨们 前去吃饭的人们,任务 管理组件线程池由三部分组成执行队列,线程s 任务队列,任务s 管理组件类似于银行营业厅 食堂打饭 每个打饭的人都是一个线程 管理制度参考链接C/C++Linux后台服务器开发高级架构师免费学习链接:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频150行代码,手写线程池(B站点赞数观看较多)线程池解决什么问题解决任务处理。 阻塞IO。 解决线程创建于销毁的成本问题。 管

2021-08-04 16:08:35 197 1

原创 从开源框架细节的来分析网络模块的封装丨网络模块|Redis|skynet|多线程|单线程|reactor多核实现|IO多路复用

从开源框架细节的来分析网络模块的封装视频讲解如下:从开源框架细节的来分析网络模块的封装丨网络模块|Redis|skynet|多线程|单线程|reactor多核实现|IO多路复用丨c/c++linux服务器开发C/C++Linux服务器开发高级架构师知识点精彩内容包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,音视频开发,Linux内核,Docker,TCP/IP,协程,DPDK多个高级知识点分享。点击链接进入订阅不迷路随

2021-08-03 15:22:56 103

原创 红黑树在linux内核中的应用场景(红黑树,进程管理CFS,内存管理)丨epoll丨c/c++linux服务器开发丨linux后台开发

红黑树在linux内核中的应用场景(红黑树,进程管理CFS,内存管理)视频讲解如下:红黑树在linux内核中的应用场景(红黑树,进程管理CFS,内存管理)丨epoll丨c/c++linux服务器开发丨linux后台开发丨网络编程C/C++Linux服务器开发高级架构师知识点精彩内容包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,音视频开发,Linux内核,Docker,TCP/IP,协程,DPDK多个高级知识点分享。点击

2021-08-03 15:20:32 363

原创 揭开后端开发-中间组件、内存数据库Redis的迷雾,听完瞬间豁然开朗丨C/C++Linux服务器开发丨中间件

揭开后端开发-中间组件、内存数据库Redis的迷雾,听完瞬间豁然开朗视频讲解如下:揭开后端开发-中间组件、内存数据库Redis的迷雾,听完瞬间豁然开朗丨C/C++Linux服务器开发丨中间件丨组件丨linux后台开发C/C++Linux服务器开发高级架构师知识点精彩内容包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,音视频开发,Linux内核,Docker,TCP/IP,协程,DPDK多个高级知识点分享。点击链接进入订阅

2021-08-03 15:18:09 200

原创 全面了解C++后端开发技能树,C++后端开发面试技术点丨C/C++linux服务器开发丨linux后台开发

C++后端开发技能树,C++后端开发面试技术点视频讲解如下:全面了解C++后端开发技能树,C++后端开发面试技术点丨C/C++linux服务器开发丨linux后台开发丨网络编程丨面试经验C/C++Linux服务器开发高级架构师知识点精彩内容包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,音视频开发,Linux内核,Docker,TCP/IP,协程,DPDK多个高级知识点分享。点击链接进入订阅不迷路随时观看:C/C++Li

2021-08-03 15:15:43 254

原创 Linux进程调度-CFS调度器原理分析及实现,懂了

1. 概述(1) Completely Fair Scheduler,完全公平调度器,用于Linux系统中普通进程的调度。(2) CFS采用了红黑树算法来管理所有的调度实体 sched_entity,算法效率为O(log(n))。CFS跟踪调度实体sched_entity的虚拟运行时间vruntime,平等对待运行队列中的调度实体sched_entity,将执行时间少的调度实体sched_entity排列到红黑树的左边。(3) 调度实体sched_entity通过 enqueue_entity()和

2021-08-03 15:09:06 1361

原创 Nginx 内存池似懂非懂?一文带你看清高性能服务器内存池

nginx 内存池 ngx_pool_tnginx 是自己实现了内存池的,所以在nginx ngx_pool_t 这个结构也随处可见,这里主要分析一下内存池的分配逻辑。内存池实现了包括小块内存、大块内存和清理资源几种资源的处理,应该来说覆盖了绝大数的使用场景了。文章相关视频讲解:C/C++Linux后台服务器开发高级架构师免费学习链接:C/C++Linux服务器开发高级架构师/Linux后台架构师-学习视频高性能服务器为什么需要内存池?内存如何分配? 如何设计内存 ?Nginx源码分

2021-08-02 15:59:19 201

空空如也

空空如也

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

TA关注的人

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