自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mysql中explain的重要性

概述当我们写一条sql执行语句的时候,我们对它的执行计划以及所用到的索引都是自己进行判断的, 大多数时候我们的判断可能是正确的,但偶尔也会有出入,所以我们就要用到explain去查看mysql到底是怎么执行这条sql的。举个例子下图是两种表结构:表一 classes,表二 students的数据我们执行一条联结查询语句:select name from students join classes on students.class_id=classes.id;首先我们来自己分析一下这条语

2022-03-20 15:58:13 1852 1

原创 maven执行:Could not find artifact jdk.tools:jdk.tools:jar:1.7 解决

mvn compile 报错信息Could not resolve dependencies for projecttop.tomqian:recommender-system:jar:0.0.1-SNAPSHOT: Could not findartifact jdk.tools:jdk.tools:jar:1.7 at specified path/usr/local/java/jdk-17.0.2/…/lib/tools.jar -> [Help 1]原因由于tools.jar包

2022-03-16 14:33:47 6148

原创 高性能mysql——sql查询性能优化

sql查

2021-11-13 13:56:14 759

原创 当一个用户访问服务器延迟很高如何优化系统

对问题进行思考定位分析:当一个用户访问服务器延迟很高,可能的原因有哪些?服务器系统能力不足: 当用户量上升时导致服务器提供服务能力下降,数据处理时间冗余,导致用户延迟。网络问题:是否因为用户距离服务器部署地的网络延迟很高,导致在链路上产生了延迟。解决问题:1. 服务器的系统能力不足:(1): 需要分析系统的瓶颈在哪?一般系统的瓶颈都在于IO问题上和并发处理请求上。最大的问题可能都是在于IO阻塞。这里就需要去分析和解决IO阻塞的问题,像现在常用的模型都是用协程去处理耗时的IO操作提高并发处理I

2021-08-23 17:37:33 1273

原创 Go string []byte总结

Go语言的string和C++的string有比较大的区别。go中的string是一个字符串常量,不能直接修改其中的元素,而c++中string可以直接修改其内部元素的值。C++std::string s = "123";s[0] = 2;std::cout << s << "\n";//输出结果 223 GOs := "123";s[0] = '2';//则会直接报错Go中string []byte的底层结构# stringtype StringH.

2021-08-19 16:19:06 730

原创 C++实现无锁队列

CAS等原子操作在介绍无锁队列之前,我们需要知道一个重要的技术就是CAS操作,**现在几乎所有的CPU指令都支持CAS等原子操作。**有了这个原子操作,我们就可以用其来实现各种无锁的数据结构了。本文用到的是GCC的CASGCC4.1+版本中支持CAS的原子操作bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)type __sync_val_compare_and_swap (type *ptr,

2020-09-14 17:40:26 3002 7

原创 Mysql为什么需要一个主键

主键主键每一行都应该有能够唯一标识自己的一列。主键(primary key),其值能够唯一区分表中的每一行数据。如果没有主键的话,更新或者删除表中的特定行就会很困难,因为没有安全的方法能够唯一标识这一行数据。虽然并不是总需要主键,但是我们都应该保证每个表都有主键,以便于以后数据操纵和管理。主键的条件表中的任一一列都能够作为主键,但是作为主键有以下几个条件:1、 主键值不能重复2、主键值不能为NULL其上两个条件是mysql主键的强制要求,但我们最好养成下面几个好习惯:不更新主键的值不重

2020-07-22 08:27:17 1147

原创 C++模板编译

传统的编译模型使用C/C++进行编程时,一般会使用头文件以使定义和声明分离,并使得程序以模块方式组织。将函数声明、类的定义放在头文件中,而将函数实现以及类成员函数的定义放在独立的文件中。但是对于模板来说,这种方式是行不通的,具体的例子如下:test.h包含了模板的声明//test.h#ifndef TEST_H#define TEST_Htemplate<typename T> bool compare(const T &a, const T &b);

2020-05-13 11:54:23 1170

原创 Redis源码分析——字典(dict)

Redis版本:5.0.5文件:dict.h dict.c字典概念字典,又称为符号表,关联数组或映射,是一种用于保存键值对的抽象数据结构。在字典中,一个键可以和一个值进行关联(或者说为映射),这些关联的键和值就称为键值对。字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对等。字典的结构哈希表typede...

2020-04-27 12:02:48 240

原创 Redis源码分析——跳跃表

Redis版本:5.0.5文件: t_zset.c server.h张老师讲解redis中跳跃表的概念跳跃表的实现C++本篇文章则针对源码来进行分析跳跃表(zskiplist zsiplistnode)概念跳跃表是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问的目的。跳跃表平均支持O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操...

2020-04-26 21:09:28 287

原创 Redis源码分析——intset 整数集合

Redis源码:5.0.5文件:intset.h intset.c整数集合(intset)概念整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。intset保存的元素类型有三种:int16_t, int32_t, int64_t。元素不能重复、有序intset结构体type...

2020-04-26 18:20:51 466

原创 记epoll_data_t中ptr使用的坑

先看一下epoll_data_t的结构typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64;} epoll_data_t;struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* Us...

2020-04-09 18:22:29 1095

原创 函数名前加static的作用

static先思考一个问题,static修饰一个变量的作用是什么?它的名字叫做局部静态变量或者全局静态变量,那这个变量到底可以干什么?它有一个作用就是为了让该变量只在自己的编译单元中可见。对于外部文件不可见。编译单元是什么?举个例子吧:现在有一个1.h 文件 内部定义了全局静态变量 static int a = 1;然后有一个1.c文件包含了1.h, 那这个1.c就可以使用这个a...

2020-04-07 10:14:22 1792

原创 Leetcode 460 LFU缓存(C++实现)

题目描述请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。它应该支持以下操作:get 和 put。get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。put(key, value) - 如果键不存在,请设置或插入值。当缓存达到其容量时,则应该在插入新项之前,使最不经常使用的项无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除 ...

2020-04-06 19:33:00 299

原创 Linux下如何使用gettid函数且和pthread_self()的区别

gettid它被定义在<sys./types.h>头文件中,但在程序中使用时发现没有gettid函数。我们可以自己封装一下#include<sys/syscall.h>syscall(SYS_gettid); //该函数和gettid等价。在编写程序时可以使用上述函数。也可以将其封装一下。pid_t gettid(){ return syscall...

2020-03-31 23:31:13 7964

原创 c++11::shared_from_this()使用方法

shared_from_this()shared_from_this的使用方法:#include<iostream>#include<memory>class my_practice;void func1(std::shared_ptr<my_practice> a){ std::cout << a.use_count() &...

2020-03-30 15:20:15 1862 4

原创 Muduo学习笔记—Eventloop Channel EPollPoller类

本篇文章在学习完Muduo之后来记录自己对这几个类的理解。如有理解不当的地方还请各位朋友指出,感激不尽!我们先将这三个类的关系理清楚,然后我们再讲解源码的具体实现。Eventloop类Muduo是one loop per thread 模型,所以我们可以把每一个Eventloop大体看做为一个单线程的程序。Eventloop类可以看作为一个指挥家,它不负责具体的事物实现,只负责将这个程序...

2020-03-25 11:27:59 230

原创 C语言中的强符号与弱符号问题

弱符号与强符号对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。我们也可以通过GCC的__attribute__((weak))将一个强符号变为弱符号。强符号和弱符号都是针对定义来说的,不是针对符号的引用。extern int ext;int weak; //弱符号int strong = 1; //强符号__attribute__((we...

2020-03-23 17:52:35 493

原创 函数的传值传址——指针篇

#include<iostream>struct Treenode{ Treenode(int a) : x(a) {} int x; Treenode *next;};void func(Treenode *head){ printf("%p\n", &head); Treenode *temp = new Treen...

2020-02-24 17:35:11 420

原创 Leetcode : 162题解析(C++)

题目链接题目解析本题意在一个数组中找出一个峰值,这个题目用暴力求解也可以去做,方法就是将数组遍历一遍,然后找出其中一个峰值即可,但是其时间复杂度就会是O(n),而不是题目要求的O(logN)。那我们就从另一个角度去分析该题,题目是让我们找到峰值,峰值的概念就是其左右元素都比它小。 然后我们在来分析峰值左右元素的规律,峰值的左侧元素一定是局部递增序列,峰值的右侧一定是局部递减序列,我们知道了这...

2020-02-15 13:24:47 172

原创 Leetcode : 105 C++题解

题目链接题解链接 通俗易懂#include<iostream>#include<vector>#include<algorithm>#include<memory>using namespace std;struct TreeNode { int val; TreeNode *left; TreeNode *...

2020-02-14 13:53:47 243

原创 epoll et模式下的web服务器用webbench压测导致epoll_wait阻塞不返回

半个月前动手写了web服务器用webbench进行压测导致epoll_wait阻塞不返回,一直查bug历经很长时间才查出,总结一下踩到的坑点…web服务器框架简述采用reactor模型,主线程调用epoll进行监听,分发给线程池进行解析,IO事件由主线程进行发送。采用epoll ET工作模式。分析bugET工作模式注意的事项点我,这是之前总结的在写代码需要注意的事项,并且和LT模式在...

2020-01-12 12:33:01 656

原创 Linux 多进程/多线程同时write()一个文件及O_APPEND参数实验验证

基于该博客的结论进行实验验证首先需要各位前去看链接中的博客,了解里面的结论和知识点再来看我的实验验证。write调用能保证的是,不管它实际写入了多少数据,比如写入了n字节数据,在写入这n字节数据的时候,在所有共享文件描述符的线程或者进程之间,每一个write调用是原子的,不可打断的。举一个例子,比如线程1写入了3个字符’a’,线程2写入了3个字符’b’,结果一定是‘aaabbb’或者是‘bb...

2019-12-29 17:51:30 3180 5

原创 effectiv c++条款1-11

条款2: 尽量以const, enum, inline 替换#define#define port 8888define可以定常量值,但是它没有作用域,并且它是直接被替换,如果是大型项目,报错显示的是8888而不是port,导致无法追踪该错误。这个问题也会出现在记号表调试中,define的常量没有进入记号表中。具体原因可以看ELF文件解析。define不能被封装,而const可以被封装在...

2019-12-28 21:49:20 227

原创 listen函数及其backlog参数的含义及实验验证

listen函数仅由TCP服务器调用,它做两件事情(1)当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字。listen函数把一个未连接的套接字转换成一个被动套接字,指示内核应接受指向该套接字的连接请求。调用listen导致套接字从CLOSED状态转换到LISTEN状态。(2)本函数的第二个参数规定了内核应该为响应套接字排队...

2019-12-28 17:03:41 644

原创 从Linux内核谈僵尸进程

僵尸进程摘自百度百科:僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进...

2019-12-24 21:19:43 252

转载 Linux线程实现机制

一.基础知识:线程和进程按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。无论按照怎样的分法,一个进程至少需要一个线程作为它的指令执行体,进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。一个进程当然可以拥有多个线程,此时,如果进程运行在S...

2019-12-18 10:48:32 681

原创 利用shared_ptr和互斥锁来模拟读写锁

读写锁读写锁有三种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。当占有读写锁的读锁时,任何线程希望以写模式对此锁进行加锁时都会阻塞,但是这种情况下,读写锁通常会阻塞随后的读锁请求,这样可以避免读模式锁长期占用,而等待的写模式锁一直得不到满足。当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线...

2019-12-17 20:49:31 469

原创 浅谈Linux内核与线程的关系及线程调度

首先,文章的开篇我们先看几个概念用户级线程用户级线程顾名思义就是用户态下的线程,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的。内核线程内核级线程,是指由内核管理的线程多线程模型多对一这种模型下创建的许多用户线程就会如下图所示。优点就是创建的代价非常小缺点也很明显,当一个线程阻塞住,该内核上的其它用户线程也会阻塞。...

2019-12-17 15:31:37 1329

原创 c++中线程传递函数为什么是全局或者静态函数

首先,线程也是一种资源,受系统调度。在计算机中,运行程序都是通过地址来运行,所以,我们必须告知计算机该线程的起始地址,也就是传入函数的地址,所以函数应为全局函数或者静态函数。在c++中,传入线程的函数可能是类中的函数,如果类中的函数不加static进行修饰,可以吗?答案是不可以的。因为在类中,参数列表中都会有一个this指针,例如函数foo(int),在编译之后就会变成foo(int, cla...

2019-12-15 19:56:54 1404

原创 c++11多线程 std::async的使用总结

std::async#include<future>template<class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&...args);该函数包含...

2019-12-09 17:02:48 796 1

原创 c++11线程的使用坑点总结

坑点总结1、启动了线程,你需要明确是要等待线程结束(调用join),还是让其自主运行(调用detach)。如果std::thread对象销毁之前还没有做出决定,程序就会终止(std::thread的析构函数会调用std::terminate())。因此,即便是有异常存在,也需要确保线程能够正确的加入(joined)或分离(detached)。。需要注意的是,必须在std::thread对象销毁之...

2019-12-03 21:24:11 1309

原创 浅谈ELF文件

首先我们知道程序经过编译器例如gcc,在打下gcc 1.c的时候经历了什么,分为如下四步预处理主要处理那些以’#‘开始的指令1、将所有#define展开2、处理所有预编译条件指令。#ifdef等3、处理’#include’预编译指令,将被包含的文件插入到该预编译指令的位置。这个过程是递归的,可能会包含重复的头文件。(所有需要#ifndef #define)4、删除所有注释。保留所有#p...

2019-12-02 11:26:33 329

原创 非阻塞connect详解

我们先来讲connect函数(本文针对的是TCP)#include<sys/socket.h>int connect(int sockfd, const struct sockaddr* servaddr, socklen_t addrlen);参数大家应该都知道,我在这里提一下,为什么第二个参数要用 struct sockaddr*?这是因为ANSI C标准为我们定义了一...

2019-10-28 16:05:24 1134

原创 进程池详解(linux)

进程池进程池是我们创建一组进程,进程数目可以自己的规定,目的是为了让我们可以并发的去处理任务,此文处理的是网络请求的进程池。采用的是半同步/半反应堆模式的进程池。主进程epoll监听listenfd,如有客户连接根据特定算法将客户连接套接字利用管道发送给进程池中的某个进程,让其进行监听。该算法主要是为了平衡进程池中每个进程epoll监听的套接字数量。防止某个进程监听过多性能降低。然后每个进...

2019-10-14 19:21:08 917 16

原创 linux创建进程do_fork()详解

do_fork()下面是do_fork()精简后的源码long do_fork(unsigned long clone_flags, unsigned long stack_start, unsigned long stack_size, int __user *parent_tidptr, int __user *child_tidpt...

2019-10-13 15:20:57 808

原创 clone()函数及其与Linux线程实现的关系

#include<sched.h>int clone(int (*func)(void*), void *child_stack, int flags, void* fimc_arg ...);/* pid_t *ptid, struct user_desc* tls, pid_t* ctid*/还有三个参数在Linux2.6版本中提出,主要是为了线程的实现。return pr...

2019-10-13 15:15:53 1136 1

原创 进程间通信

进程是Linux操作系统环境的基础,它控制着系统上几乎所有的活动。进程基础概念复制进程映像的fork系统调用和替换进程映像的exec系列系统调用僵尸进程以及如何避免僵尸进程进程间通信 最简单的方式: 管道3种system V进程间通信方式: 信号量、消息队列和共享内存。在进程间传递文件描述符的通用方法:通过unix本地域socket传递特殊的辅助数据。...

2019-10-11 12:23:22 120

原创 二分查找(Binary search)

二分查找#include<iostream>#include<array>#include<memory>class search{public: int s1(int arr[], int len, int ser); //二分查找查找一个数 int s2(int arr[], int len, int ser); //二分查找 ...

2019-10-08 20:34:37 469

原创 线程同步机制——POSIX信号量、互斥量、条件变量

信号量#include<semaphore.h>int sem_init(sem_t* sem, int pshared, unsigned int value);int sem_destory(sem_t* sem);int sem_wait(sem_t* sem);int sem_trywait(sem_t* sem);int sem_post(sem_t* sem);...

2019-09-26 19:13:55 352

空空如也

空空如也

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

TA关注的人

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