自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不才的专栏

不积跬步无以至千里

  • 博客(251)
  • 收藏
  • 关注

原创 静态链接&动态链接 优缺点

在选择静态链接或动态链接时,需要根据应用程序的需求、部署环境、性能要求和维护策略等因素进行权衡。比如,某个服务要求发布部署速度要快、独立的容器环境、内存&存储资源充足,那么这类就很适合静态链接。静态链接和动态链接各自适用的场景受到多种因素的影响,包括应用程序的需求、部署环境、性能要求、维护和更新的便利性等因素。

2024-04-21 11:37:25 250

原创 什么是认知负荷?

这种类型的外在负荷会分散开发者的注意力,使他们难以专注于实际的开发任务,如编写新代码或改进现有代码。**当然这是在理想状态下,如果刚入职一家新公司或者新接手一个新项目(功能模块),首先要做的就是减少外在负荷,如果这个项目迭代频率比较高,往往看文档是跟不上的,要么死磕代码,要么问下“熟练工”,否则很容易陷入历史陈旧代码的陷阱中。如果代码库过时且没有得到很好的维护,或者相关文档不再反映当前的代码状态,这将迫使开发者需要投入额外的时间和精力去解读不一致的信息,理解代码的历史背景,以及推测代码的当前功能和用途。

2024-04-21 11:16:20 236

原创 长链接、短链接与连接池

在计算机网络中,“长连接”、"短连接"和"连接池"是常用的概念,尤其在客户端与服务器之间进行通信时。

2024-04-21 10:29:02 370

原创 什么是深度学习?

在深度学习中,"深度"一词指的是神经网络中的层级数量。人工智能:人工智能是一个广泛的领域,它涉及到使计算机能够执行通常需要人类智能才能完成的任务。随着计算能力的增强和大量数据的可用性,深度学习已经成为AI技术中最先进和最强大的工具之一。深度学习:深度学习是机器学习的一个子集,它使用称为神经网络的结构,特别是深层神经网络,来学习数据的复杂模式。总结起来,人工智能是最广泛的概念,机器学习是达成人工智能的一种方式,而深度学习是机器学习中一种特别有效的方法。是机器学习的一个子领域,它基于人工神经网络的学习算法。

2024-04-21 08:26:38 298

原创 搜索引擎中的倒排索引是什么

在搜索引擎领域,倒排索引是一种核心数据结构,它让搜索引擎能够以极高的效率找到包含用户查询关键词的所有网页。为了理解倒排索引的工作原理,我们可以将其与一种更直观、生活化的例子相比较:书店里的索引卡片系统。假设你是一位图书管理员,你的任务是帮助顾客快速找到他们想要的书籍。如果你按每本书来组织信息,每当有人来找特定主题的书时,你可能需要查看每一本书来确定它是否是顾客想要的。这种方式显然效率很低,特别是在你管理的书籍数量非常庞大时。

2024-04-21 07:00:00 824

原创 什么是持续集成系统?

持续集成的实现通常依赖于持续集成服务或者工具,如Jenkins、Travis CI、GitLab CI/CD、CircleCI等,这些工具可以帮助自动化执行构建、测试等一系列工作流程。:由Atlassian开发的商业持续集成和部署工具,与Jira、Bitbucket等Atlassian的其他工具集成良好,支持自动化构建、测试和发布。:一个开源的持续集成工具,具有高度的可配置性和可扩展性,支持各种插件,能够实现自动化构建、测试和部署。持续集成的主要目的是使软件的开发、测试和发布过程更加快速、高效。

2024-04-21 06:00:00 387

原创 使用C++模板实现工厂模式

public:这里我们使用一个函数指针映射(也可以使用std::function)来注册和创建对象。// 工厂类,不再是模板类private:public:if (it!

2024-04-21 01:10:30 355

原创 什么是蓝绿发布?

蓝绿发布(Blue-Green Deployment)是一种软件发布策略,旨在减少或消除部署过程中的服务停机时间和风险。这种策略通过同时运行两个完全相同的生产环境——一个蓝色环境和一个绿色环境——来实现。在两个环境中,只有一个对外提供服务,另一个则用于新版本的部署和测试。

2024-04-20 23:55:51 211

原创 什么是存算分离?

存算分离(Storage-Compute Separation 或 Storage-Compute Decoupling)是一种数据架构设计理念,旨在将(Storage)和(Compute)功能分离开来。这种设计允许存储资源和计算资源独立扩展和优化,根据实际需求灵活配置,从而提高系统的效率和成本效果。

2024-04-20 22:51:00 203

原创 什么是RAG?

RAG是“Retrieval-Augmented Generation”的缩写,这是一种自然语言处理(NLP)技术,用于增强生成式模型的性能,尤其是在问答、文本摘要、对话系统等任务中。RAG结合了检索(Retrieval)和生成(Generation)两个阶段,以提高模型对信息的处理和回应的质量。在RAG系统中,首先使用检索组件在一个大型的文档集合中寻找与输入查询相关的信息或文档。RAG技术的一个典型应用是在问答系统中,它能够提供比传统生成式模型更准确的答案,因为它结合了大量的外部知识。

2024-04-20 22:38:03 179

原创 不要在栈上分配大数组

但是,这个值是可以配置的。在C++中,如果你在函数中创建一个非常大的数组,它可能会导致栈溢出。这是因为,对于大多数系统,栈的大小是有限的,通常比堆小得多。请注意,尽管可以增加栈的大小,但是栈的空间总是有限的。堆的大小只受到系统可用内存的限制,而栈的大小受到更多的限制。在C++中,栈的大小是由编译器和操作系统决定的,并不是由C++语言本身规定的。所以,尽管可以增加栈的大小,但是最好尽量避免在栈上分配大量的内存。如果你试图在栈上分配一个超出其容量的大数组,可能会导致栈溢出错误,这通常会导致程序崩溃。

2023-09-20 09:13:11 176

原创 STL VIEW

stl view,gdb调试 pvector pmap 等工具

2022-11-19 22:02:46 339 1

原创 2 sre视角 note

Google Sre 视角

2022-06-04 11:33:58 209

原创 《Sre google运维解密》笔记

Sre是什么

2022-06-03 16:11:10 1004

原创 Nginx简介

1. Nginx概述Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。它可以提供正向代理、反向代理、负载均衡、动静分离等功能。nginx通过配置文件来配置功能,路径一般是/usr/local/nginx/conf/nginx.conf配置文件的内容分为三部.

2021-08-08 11:02:08 434

原创 nginx在ubuntu系统上的安装

纯操作手册性的入门文章,按照步骤一步一步走就好了1. 下载安装包wget http://nginx.org/download/nginx-1.21.1.tar.gz依赖包wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gzsudo apt-get install build-essentialsudo apt-get install openssh-serversudo apt.

2021-08-07 21:06:34 405

原创 数据高可用之双机架构

在https://blog.csdn.net/niu91/article/details/112330339 中所提及的mysql双机热备份,本文算是此篇文章的一个延申。1. 什么是高可用高可用或者说容灾,就是说当系统遇到突发情况或者故障的时候,能够保重业务不中断。一般的实现方案都是将数据(可以文件、数据库甚至是操作系统)冗余备份到多个存储设备上,出现故障时,备胎转正。下面介绍几种常见的双机方案。2. 主备这可能是最简单最容易让人想到的方案,备机备份主机数据,当发生故障时备机改为主机,...

2021-06-23 00:15:30 317

原创 MySQL连接池

当程序中频繁访问数据库时,我们可以采用向内存池、线程池那样的池化技术,引入数据库连接池,减少申请和释放数据库连接的操作,从而提高性能。在很多C++库中都集成了连接池,下面以Poco的mysql连接池为例进行简要的介绍,下面是代码示例,其他数据库连接池的使用也是类似。需要指定数据库连接的参数、最大最小连接数还有空闲时间。...

2021-06-20 23:13:27 449 1

原创 redis简介 (六)整数集合、压缩列表

1. 整数集合1.1 基本用法[root@localhost redis]# redis-cli 127.0.0.1:6379> sadd numbers 10000 10086 10010(integer) 3127.0.0.1:6379> OBJECT encoding numbers"intset"127.0.0.1:6379> 如果我们创建一个纯数字的集合,那么它的内部编码方式将是intset,整数集合。1.2 数据结构typedef st

2021-05-21 20:39:26 175

原创 Linux中的IO体系结构

Linux内核一个的主要作用就是管理硬件,而像键盘、鼠标、显示器、网卡、硬盘、打印机、CD/DVD等等这么多设备,形状、用法、处理速度、功能都不一样,该怎么统一管理起来呢?1. 一切皆文件在linux中一切皆文件,设备也不例外,设备文件放在dev目录下。应用程序可以像访问普通文件一样访问设备,内核vfs下面的驱动程序层和硬件实现具体的功能。ubuntu@VM-0-16-ubuntu:~$ ls -l /dev/total 0crw-r--r-- 1 root root

2021-05-20 01:05:17 459

原创 redis简介 (五)动态字符串、链表

1. 动态字符串redis中使用动态字符串(sds)的对象类型,作为默认的字符串类型。1.1 基本用法127.0.0.1:6379> set mykey "hello world"OK127.0.0.1:6379> rpush animal "fish" "dog" "cat"(integer) 3127.0.0.1:6379> get mykey"hello world"127.0.0.1:6379> lrange animal 0 101) "fis

2021-05-19 22:16:15 121 1

原创 表设计中的陷阱与建议

1. 数字类型1.1 整型类型数量字段用 unsigned 还是signed? 一般来讲,数量不可能为负值,用unsigned是理所应当的事情。但是如下情况,做此类减法的统计,那么报错就来了。大意是计算值为负,超出了unsigned的范围。这个可以通过SET sql_mode='NO_UNSIGNED_SUBTRACTION';解决。但是如果有符号整型可以满足需求,那么就不要使用无符号整型,否则就会有类似不必要的麻烦。MariaDB [mysql]> CREATE TABLE Item

2021-05-14 22:05:58 254

原创 redis简介(四)哈希算法和rehash

1. hash算法添加一个键值对到redis时,首先要根据key算出hash值和索引,然后根据索引将新键值对的hash表节点关联索引。计算hash和索引,假设hash值为456(‭000111001000), 掩码为255‬(‭11111111‬)则得到的索引为200(11001000)#define dictHashKey(d, key) (d)->type->hashFunction(key)unsigned int h;dictEntry *he;h = dictH

2021-05-13 20:09:58 1101

原创 redis简介(三) redis中的存储数据结构

redis是一种基于key-value的内存数据库。所谓kv存储或者说kv数据库,就是说里面数据都是一对一对的存储的,其中key是唯一的一个索引。这种结构一般是基于哈希表,效率极高,查找复杂度为O(1)。不过hashmap也不是万能的,随着数据量的增多,造成的hash冲突也就越严重,复杂度增加,redis需要进行rehash,对hashmap进行扩容。如图所示,redis还支持丰富的数据结构类型,那么这些是怎么做到的呢?它们在内存中是怎么存储的呢?1. redis中的对象在redis中每

2021-05-13 08:32:56 1510

原创 redis简介(二) 位操作 订阅发布 事务 备份等

1. 字符串中位操作的应用场景1.1 字符串设置比特位场景一: 标识文章是否已经阅读。假设标识文章“协议”的内容如下 1bit 1bit 1bit 1bit 1bit 1bit 1bit 1bit 其他内容 是否阅读 是否收藏 是否点赞

2021-05-11 22:40:08 160

原创 redis简介(一)

0. redis是什么redis是一个高性能的缓存数据库,支持不限于key-value结构的数据缓存和持久化。直白的讲,可用于进程间通信或者说共享资源,比unix socket、共享内存、消息队列等更方便便捷,而且支持跨语言,凭借着简单实用性能高,被非常广泛应用。Hiredis是Redis数据库的一个简单的C客户端库。它的接口只有简单的几个,但足够大多数场景使用。1. 安装1.1 运行环境和 C语言客户端库这里直接用yum源安装了,这是最简单的方式、yum instal..

2021-05-08 22:22:37 266

原创 Linux 巨型页(HugePages)

1. 什么是巨型页页面是Linux管理内存的基本单位,一般为4KB。如果程序运行时,需要大量的内存,就会产生非常多的TLB未命中和缺页异常,4KB的尺寸显然称为程序的瓶颈。如果直接修改系统默认页面大小,那么系统中其他程序运行时,很可能又会造成内存浪费。所以,Linux引入了巨型页,这种巨型页允许管理远大于4k的大页面,默认是2M,相当于512个普通页面。简而言之,通过启用大页面,系统可以处理更少的页面表,因此访问/维护它们的开销也更少!巨型页的应用集中在对内存需求大的领域,比如数据库、虚拟机等系统中

2021-05-05 19:59:54 2607

原创 物理内存组织结构

内存管理在内核中占据着举足轻重的地位,毕竟它是用来处理处理器和内存之间的协作的,而后两者都是计算机中最为重要的资源。内存管理的目标就是高效合理的使用物理内存,不造成浪费。1. 体系结构在计算机发展初期,如上图,CPU通过总线访问整个地址空间,这是一种简单经济的方式,可以尽可能使用内存。但是这个系统本身也存在伸缩性的问题,因为总线的宽度是有限的,这也限制了处理器的数量。如果添加CPU,会引起以下两个问题CPU增加,每个节点的可用带宽会减少 CPU增加,总线长度会增加,进而增加了延迟于.

2021-05-04 15:44:13 1416 2

原创 反碎片技术和虚拟可移动区域

Linux在内存管理上,存在一个问题,那就是在系统运行很长一段时间后,物理内存中的碎片会越来越多。1. 内存碎片整理1.1 什么是内存碎片呢?内存碎片分为两种,一种是内存页中的碎片,被称为内部碎片;另一种是空闲分散的内存页,凑不齐一个组物理地址连续的空闲内存页,就没办法分配了,这些散落的内存页被称为外部碎片。1.2 内核引入的反碎片技术2.6.23 引入成块回收,3.5版本后废除,被碎片整理程序取而代之 2.6.33 引入虚拟可移动区域其中,不管是成块回收还是碎片整理,它们.

2021-05-03 23:35:00 1159 8

原创 进程

1. 什么是进程在 《面对多任务处理、程序员是怎样榨干计算机资源的》提到,不管是进程、线程、协程都是用来处理用户任务的。从内核角度来看,进程就是用来分配CPU、内存等资源的。后来觉得进程分配CPU时间片太重了,于是轻量级进程、线程就出现了,成了CPU调度的基本单位,但是资源分配的基本单位还是进程。通俗的讲,进程被定义为程序运行的一个实例。为了管理进程,内核引入了一个进程描述符的数据结构。2. 进程的生命周期(状态)进程描述符中的state字段描述了进程所处的状态。粗略的看,进程要...

2021-05-03 21:07:09 145

原创 页表

1. 虚拟和物理地址空间每个进程的内存地址空间在大多数情况下要比系统中可用的物理内存要大。内核要考虑将实际内存划分给进程需要的地址空间,最可取的一个方法就是加一个页表。页表来为物理地址分配虚拟地址,进程的地址空间则用虚拟地址表示。如下图所示,不同进程的同一个虚拟地址可能会映射到同一个物理内存页(通常称为页帧)上,它们的含义是不同的。2. 页表页表的作用就是将虚拟地址空间映射到物理地址空间。那么最容易让人想到的办法就是使用一个数组,但在实际应用中最普遍的是多级分页。2.1 数组页表.

2021-05-03 11:12:08 1984

原创 指令重排和优化屏障

1. 优化带来的烦恼用过GCC编译的同学应该知道GCC有O0、O1、O2、O3等优化选项,启用这些选项往往可以提高程序的运行效率,但它并不是万无一失的,尤其是在多线程场景下。而这些优化背后的技术正是指令重排。因为编译器或处理器也很难确定代码逻辑的原本意图。锁能够保持原子性,但是经过编译器优化之后的代码,并不是绝对时序正确的,况且处理器还有可能进一步优化。这里面最经典的一个例子就是单例模式,Double-Checked Locking is Fixed In C++11 。2. 内核提供的解决方案

2021-04-30 19:14:44 701 3

原创 RCU

1. 什么是RCURCU(Read-Copy-Update),是一种同步机制,它虽然对内存有一定的开销,但是它的性能非常好。在Linux内核中随处可见它的身影。2. RCU的工作机制RCU下,会记录指向共享结构体指针的所用使用者。这个结构体将要被修改时,首相将会创建一个副本,然后把改动写入副本当中。当所有的读操作使用者访问结束之后,指针指向新的修改后副本的指针,副本就这么上位了,修改也就是最新的了。基本原理是很简单的,一个备胎而已,空闲时上位而已。要是支持多任务读写并发,就复杂些了。3. 适

2021-04-30 19:09:09 965 1

原创 eventfd

1. 简介eventfd - create a file descriptor for event notificationeventfd是通过事件通知机制。int eventfd(unsigned int initval, int flags);eventfd创建一个“eventfd对象”,可以用作事件等待/通知机制由用户空间应用程序和通知用户空间应用程序事件的内核。这个对象包含由内核维护的无符号64位整数计数器。此计数器已初始化使用参数initval中指定的值。eventfd()返回一

2021-04-27 19:49:06 1700

翻译 epoll IO事件通知机制

下面是官方的手册,直译的话,太拗口,我就按照自己的理解翻译了。DESCRIPTION The epoll API performs a similar task to poll(2): monitoring multiple file descriptors to see if I/O is possible on any of them. The epoll API can be used either as an edge-trig...

2021-04-22 23:15:05 508

原创 线程局部存储的三种方式

在某些情况下,我们需要使用线程独有的变量,其他线程不干扰。实现的方式主要有以下三种,一是gcc提供的_thread, 二是pthread提供的pthread_key_t ,三则是c++11提供的thread_local。无论那种方式,它们都能保证变量只对当前线程可见。1. gcc中的_thread_thread 修饰线程周期的变量,主要用法有 __thread int i; extern __thread struct state s; static __t.

2021-04-22 21:45:12 616

原创 select和epoll的实现机制

1. TCP三次握手和监听套接字的两个队列1. 未完成队列(SYN_RCVD状态)当第一次握手之后,在未完成队列上建立条目2. 已完成队列(ESTABLISHED状态)三次握手成功之后,该条目转移到已完成队列,accept能够返回。int listen(int sockfd, int backlog);其中backlog这个参数大概为这两个队列总和的最大值,最大值可能是1.5*backlog,这是一个模糊因子。每次握手之间的时间RTT通常为187ms左右。accept由.

2021-04-18 23:10:31 636

原创 网络IO模型

1. 什么是网络IO网络IO和磁盘IO一样,也是IO的一种。磁盘IO是磁盘-->内核-->应用程序,同样网络IO是网卡-->内核-->应用程序。简单理解,就是操作系统收到网卡的数据,然后缓存到一个缓冲区buffer中,然后应用程序调用系统函数,从buffer中取数据。访问IO的方式,也就是通常所说的IO模型,大致有五种,分别是阻塞IO、非阻塞IO、多路复用IO(selecet\poll\epoll等)、信号驱动IO以及异步IO。《Unix网络编程》一书中都有提及,本.

2021-04-18 07:05:05 135

原创 io多路复用 select/poll/epoll 简介

一个服务器,有多个客户端访问。可以每个请求都开启一个线程处理。缺点:多线程的弊端,CPU需要不停的切换上下文,过程繁琐,消耗资源多单线程IO多路复用在linux中每一个网络连接都可以看成是一个文件描述符,一切皆文件。1.selectfdset是一个bitmap,每一位标志了对应fd是否有数据变化。select监听fdset,当有数据变化时,返回fdset。四个常用宏:FD_ZERO(&set);//将套接字集合清空FD_SET(s, &set);//将给定的套接字添加到

2021-04-15 09:34:12 92

原创 如何避免和检查C++中的内存错误

内存问题一直是C/C++程序员的心头大患,因为没有GC机制,所以需要我们自己管理内存。在 从“new和malloc的不同”出发看CC++的内存分配 一文中,讲述了几种内存错误的例子,那么避免这些陷阱呢?1. new/delete 、malloc/free、new[]/delete[] 不匹配,导致的内存污染或者内存泄漏2. 野指针,delete/free之后,没有置NULL,再次使用3. delete/free之后,再次释放,double free3. 申请内存之后,没有判断是否成功,直接

2021-04-14 20:10:09 873

空空如也

空空如也

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

TA关注的人

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