自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不才的专栏

不积跬步无以至千里

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

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

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

2023-09-20 09:13:11 171

原创 STL VIEW

stl view,gdb调试 pvector pmap 等工具

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

原创 2 sre视角 note

Google Sre 视角

2022-06-04 11:33:58 209

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

Sre是什么

2022-06-03 16:11:10 1002

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

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

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

原创 物理内存组织结构

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

2021-05-04 15:44:13 1413 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 144

原创 页表

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

2021-05-03 11:12:08 1975

原创 指令重排和优化屏障

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

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

原创 RCU

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

2021-04-30 19:09:09 963 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 505

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

在某些情况下,我们需要使用线程独有的变量,其他线程不干扰。实现的方式主要有以下三种,一是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 610

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

原创 网络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 870

原创 C++是怎么实现多态的?

C++是一门面向对象的程序设计语言,其实这句话不严谨。严格来讲C++不仅支持面向对象的编程风格,还支持基于对象、泛型、模板还有函数式的编程风格。通常来讲面向对象是C++中比较常用的一面。1. 什么是多态?面向对象的三大基本特征,封装、继承、多态。多态(polymorphism)指为不同数据类型的实体提供统一的接口,这样做的好处就是我们可以在不修改原有程序的前提下删除或者增加一个新的派生类。有人把多态进行广义的解释,认为多态分两种,一种是静态多态,另一种则是我们要讲的动态多态。静态多态:在编.

2021-04-13 20:38:34 2317 1

原创 面对多任务处理、程序员是怎样榨干计算机资源的

你是否经常遇到这样的问题?“进程和线程有什么区别?请简述下对协程的认识?”等等。当然这些问题可谓是老生常谈。但是我想,如果我们从计算机发展史的角度,回答这些问题,会不会更容易让人理解呢?1. 批处理操作系统故名思意,这个时期的操作系统非常简单,同一时间只能处理一个任务/作业。把作业载入到内存中,这个处理完了,再处理下一个,一批一批的串行执行。这个时候,就没有什么进程、线程的概念了。因为IO设备比CPU慢太多了,所以它的缺点也很明显,CPU使用率不高,很多时候都是处于空闲状态。比如有两...

2021-04-12 20:46:51 324 1

原创 从“new和malloc的不同”出发看CC++的内存分配

1. 问题的引入new和malloc有什么不同?这是一个很经典的问题。他们共同点是,都是用进行动态内存分配的,但实现的方式不同。其中最根本的不同是,new是一个C++的操作符/关键字,而malloc是C/C++中一个函数。基于这个原因,它们又有以下的不同1. 参数,malloc需要指定申请内存的大小,new不需要,它会自己计算类中成员变量所占内存的大小2. 返回值,new返回类对象类型的指针,malloc返回void*3. 如果内存分配失败,new抛出std::bad_all...

2021-04-11 22:43:08 284

原创 服务器出现大量TIME_WAIT状态怎么解决

1. TIME_WAIT产生的原因1.1 四次挥手假设主动关闭连接的一方为A,被动关闭连接的一方为BA调用close();协议层发送FIN包B收到FIN包后,回复ACK,进入CLOSE_WAIT状态,A等待对方关闭,进入FIN_WAIT_2状态,此时,A会等待B的应用程序调用close操作B在完成所有数据发送后,调用close()操作;此时,协议层会发送FIN包给A,然后等待对方的ACK,进入LAST_ACK状态;A收到FIN包,回复ACK,进入TIME_WAIT状态;B收到ACK后,进入

2021-04-10 18:51:03 4552

原创 缓存置换算法

在缓存设计中,一个非常重要的问题就是,当缓存空间满了的时候,新的条目要加进来,要置换出哪个的旧条目呢, 这就是缓存置换算法。缓存置换算法的目标是,每次都将将来使用频率最低的数据置换出去。最朴素的置换算法,随机置换。即当有新条目要写入时,随机置换出一个就条目。另外一种策略是先进后出(First In Last Out),这种看似要比随机强,实际都差不多,只是不是随机而是把最久的条目置换掉了。一般会使用栈这种数据结构来实现。 最近未使用(Not Recently Used),这也是一种简单有效的算法。它所

2021-04-01 23:11:06 561

原创 操作系统中线程的调度

1. 先到先服务FCFS和去银行办业务一样,大家站队或者取号,先来的先办业务。这是我们能够理解的很朴素的公平主义。对应到代码实现,可以使用有先进先出特性的队列来实现。但对于操作系统而言,有一种情况下这种实现就很差劲。比如,有一个任务A需要执行一个小时,另外N个任务B执行几十秒就能完成。如果任务A先执行,那么N个任务B必须等到A执行完毕之后,才能依次执行。这对于用户来讲,体验显然是非常差的。于是就有了下面的方案。2. 短作业优先SJF短作业优先,可以是平均等待时间最短。用户体验一般和等待时间成正比,越久

2021-03-30 22:24:38 1039

原创 https

1. 概述HTTPS还是由HTTP进行通信,不过使用了SSL/TLS 来加密数据。所以它可以提供对网站服务器的身份认证,保护交换数据的隐私与完整性。HTTP默认端口是80端口,HTTPS默认工作的端口是443。工作流程:TCP三次握手建立连接客户端验证服务端数字证书协商对称加密算法,hash算法SSL安全加密隧道协商完成数据使用加密方式参数,用协商好的加密算法和密钥加密,保证数据安全;用hash算法保证数据一致,不被篡改2. HTTP的优缺点:明文传输,安全性差。HTTP响应速度

2021-03-25 18:47:23 166

原创 RPC

RPC(Remote Procedure Call),远程过程调用。通俗的讲,就是本地的应用调用远程服务的方法。从这个广义的角度讲restful也属于一种rpc,但通俗的来它们是不同的实现。我们在选择技术方案的时候,可以根据不同的场景做出选择。1. Restful .Pk. RPCRestful的优势:可读性,一般时json格式。基于http,可以获得防火墙的支持,比如屏蔽某些访问。这两点保证了它能供轻松的支持跨语言的通信。Restful的劣势:成也HTTP,败也HTTP。REST中有效信息占比少

2021-03-20 15:03:34 115

原创 ubuntu18下grpc编译与安装

grpc装起来很麻烦,会有很多坑。按照官方文档或者其他博客的步骤,不注意依赖库的版本页会导致各种问题。0. 环境在 https://grpc.io/docs/ grpc的环境依赖如下LanguageOSCompilers / SDKC/C++Linux, MacGCC 4.9+, Clang 3.4+0.1 操作系统Ubuntu 18.04.4 LTS (腾讯云的虚拟机)坑1:为了支持cpp11,gcc版本要4.9+,所以一些比较老的系统比如centos7.6,gcc

2021-03-19 08:08:24 2592 5

原创 MySql中的锁

锁的分类根据锁的粒度,锁可以分为以下三大类:行级锁(InnoDB存储引擎)表级锁(MyISAM存储引擎)页级锁(BDB存储引擎)行级锁行级锁是粒度最小的锁,它能锁定到具体某一行,加锁开销大,相应的支持并发也最高的。但可能会出现死锁的现象。它分为共享锁、排他锁等。表级锁表级锁锁定的是这个表,一个用户对表进行写操作(插入、更新、删除等)要先获得写锁,进行读操作要先获取读锁。它的粒度相对行级锁而言是很大的。加锁消耗资源少,MyISAM和InnoDB都支持。它分为表共享(读)锁、表排他(独占写

2021-03-14 11:19:56 83

空空如也

空空如也

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

TA关注的人

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