自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 序列化协议浅解——json、xml、protocol

json{ "name":"wasi", "age":"22"}优点可读性高缺点编码长度大xml<?xml version="1.0" encoding="UTF-8"?><name>wasi</name><age>22</age>优点可读性高缺点编码长度大protocol...

2021-12-02 17:31:00 131

原创 C语言实现多态

#include "malloc.h"#include <stdio.h>struct Base { struct VFunc* vF;};struct VFunc { void (*print)(Base* b);};void print(Base* b) { printf("%s\n", "我是Base!");}struct Derived { ...

2021-08-21 23:11:00 111

原创 MySQL事务隔离级别为串行化的锁问题(不是表锁!!!)

测试环境ubuntu18.04mysql Ver 14.14 Distrib 5.7.35, for Linux (x86_64) using EditLine wrapper准备工作安装启动MySQLsudo apt-get install mysql-serversudo mysql_secure_installation // 配置,密码设置123456st...

2021-08-19 20:07:00 135

原创 C++实现简易线程池

#include <iostream>#include <vector>#include <thread>#include <mutex>#include <condition_variable>#include <queue>#include <functional>using namespace...

2021-03-29 19:04:00 75

原创 C++实现生产者消费者模型

#include <iostream>#include <mutex>#include <queue>#include <thread>using namespace std;//缓冲区大小#define BufferSize 10//使用缓冲区需要加锁mutex mtxBuffer;//条件变量,生产者等待缓冲区不为满,消费...

2021-03-29 18:59:00 24

原创 socket编程API

目录字节序socket地址socketbindlistenacceptconnectcloseshutdownsend、recv(TCP专用)sendto、recvfrom(UDP专用)sendmsg、recvmsg(通用数据读写)获取地址socket读写socket选项设置gethostbyname和gethostbyaddr零拷贝sendfilemmapsplicetee字节序主机大多为...

2021-03-25 23:32:00 20

原创 线程处理模型/事件处理模式

目录传统多线程阻塞Reactor(反应堆)实现流程单Reactor单线程单Reactor多线程多Reactor多线程Proactor(前摄器)异步IO实现流程同步IO实现流程传统多线程阻塞阻塞方式多线程独立完成数据输入、业务处理、数据返回问题:高并发时,需要创建大量线程,会受系统线程数限制,也有创建开销线程大量阻塞时,也浪费资源Reactor(反应堆)基于同步IO模型主线程负...

2021-03-17 17:00:00 31

原创 IO复用

目录为什么要IO复用IO模型阻塞IO非阻塞IOIO复用信号驱动IO异步IO各种IO模型的区别三种IO复用的基础,POLL机制select源码流程使用流程特点应用场景poll源码流程使用流程特点应用场景epoll源码流程epoll_createepoll_ctl(看了两天了,有点看不懂源码,其实select,poll太底层的地方也没看懂)epoll_wait使用流程特点应用场景各个方法的比较LT和...

2021-03-17 10:58:00 34

原创 strcpy、strcat、memcpy、memset、strlen简易实现和注意问题

目录strcpy代码注意问题memcpy代码strcat代码注意问题strlen代码memset代码strcpy代码char* mystrcpy(char* dst, const char* src) { if((dst == nullptr)||(src == nullptr)) return nullptr; char* ret = dst; while ((*dst++ = *...

2021-03-16 23:37:00 20

原创 单例模式C++实现

目录特点最简单的懒汉式线程安全的懒汉式双检锁懒汉式最简洁的写法,懒汉式饥汉式应用场景及优缺点面向对象原则应用为什么要面向对象特点保证类只有一个实例对象,且提供一个访问方法,自行生成实例个人认为不需要析构函数,这个对象生成后虽然在堆,但指向它的指针是静态的,静态就是对象是属于类的,生成到程序结束就可以一直存在,不会内存泄漏所有实现方式都要注意的点私有构造函数不允许用户创建对象不允许复...

2021-03-15 00:53:00 23

原创 MySQL读书笔记

目录第一章:mysql数据库体系结构第二章:InnoDB存储引擎InnoDB体系架构基于多线程模型内存管理checkpoint技术InnoDB的关键特性第三章:文件参数文件日志文件错误日志慢查询日志(默认不启动)查询日志二进制日志套接字文件表结构定义文件pid文件InnoDB存储引擎文件表空间文件重做日志文件redologredolog和二进制日志的区别第四章:表索引组织表InnoDB逻辑存储结...

2021-03-14 20:14:00 29

原创 红黑树C++代码实现

总结特性每个节点只能是黑色的或者是红色的根节点是黑色的叶子节点是nil结点,黑色的(个人认为只是为了操作更方便,因为经常需要判断uncle、brother的颜色,就不需要判空了)红色节点的子节点不能为红色节点一个结点到每个子孙叶子节点路径上的黑色节点个数都相同插入插入的节点都为红色没有根节点,连到root其他情况插入后,重平衡插入重平衡重平衡的工作就是保持特性4...

2021-02-24 22:42:00 24

原创 IO调度

目录IO调度程序请求队列Linus电梯(2.4内核,操作系统概念)最后期限IO调度程序预测IO调度程序完全公正的排队IO调度程序空操作的IO调度程序块设备是系统中能够随机(不需要按顺序)访问固定大小数据片的硬件设备,像硬盘字符设备是按照字符流的方式被有序访问,像键盘IO调度程序为什么需要IO调度程序:简单的以内核产生请求的次序直接请求的话,磁盘寻址的速度会很慢,性能会很低。IO调度程序...

2021-02-17 23:13:00 30

原创 页高速缓存

目录页高速缓存address_spaceflusher线程脏页写回磁盘时机页高速缓存页高速缓存是Linux实现磁盘缓存,由内存中的物理页面组成,内容对应磁盘上的物理块作用:减少对磁盘的IO操作实现:通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问读操作:比如read。检查数据是否在页高速缓存,有则直接拷贝到进程地址空间;无则调度块IO操作从磁盘中读取数据再放入页,...

2021-02-16 20:49:00 23

原创 虚拟文件系统

目录超级块对象super_block索引节点对象inode目录项对象dentry链接目录项状态目录项高速缓存文件对象file和进程相关的数据结构file_structfs_struct路径名查找VFS使得用户可以直接使用open,read,write这样的系统调用而无需考虑具体的文件系统和实际物理介质四个主要的对象类型超级块对象:代表一个具体的已安装的文件系统索引节点inode对象:代表...

2021-02-16 17:35:00 23

原创 进程地址空间

目录进程地址空间线性区(虚存区VMA)mmap内存映射缺页异常处理程序进程地址空间进程地址空间就是允许进程使用的全部线性地址,用mm_struct内存描述符表示内核线程使用前一个进程的内存描述符,mm字段为NULL,active_mm为前一个进程的active_mm;普通进程的mm和active_mm相同几个重要字段:pgd:指向页目录堆的起始和最后地址用户态堆栈起始地址代码段...

2021-02-15 19:36:00 31

原创 Linux内存管理

目录页区(指物理内存,只和内核空间有关)伙伴系统算法slab机制slab实现页框回收算法:最近最少使用LRU(双链策略)内核空间页内核用page结构体表示系统的每个物理页(页框),描述当前时刻在相关物理页存放的东西flag:表示状态,包括是不是脏的、是否锁定在内存中_count:页的引用计数区(指物理内存,只和内核空间有关)Linux根据页的特性进行分组,划分为区,每个区使用自己的...

2021-02-14 17:41:00 15

原创 内存寻址

目录内存地址硬件中的分段段选择符和段寄存器段描述符分段单元Liunx中的分段四个重要的Linux段GDTLDT硬件中的分页常规分页扩展分页TLB内存地址逻辑地址:段+偏移量线性地址:也称为虚拟地址,32位物理地址:对真正存在的内存条进行寻址的地址内存管理单元MMU:分段单元:将逻辑地址转换成线性地址分页单元:将线性地址转换成物理地址硬件中的分段段选择符和段寄存器段选...

2021-02-13 19:52:00 20

原创 同步原语

目录每CPU变量原子操作优化和内存屏障优化屏障内存屏障自旋锁读写自旋锁顺序锁读——拷贝——更新(RCU)信号量读写信号量每CPU变量每CPU变量主要是数据结构的数组。系统的每个CPU对应数组的一个元素一个CPU不应该访问其他CPU对应的数组元素一个CPU可以随意读和修改自己的元素而不用担心出现竞争条件原子操作保证指令以原子方式执行——执行过程不被打断若干汇编语言指令都具有“读-...

2021-02-12 14:48:00 21

原创 中断和异常

目录承接已有博客中断描述符表IDT门描述符上半部中断处理程序下半部实现机制软中断tasklet工作队列do_softirq函数ksoftirqd内核线程有关内核栈承接已有博客中断:异步中断,由其他硬件设备依照CPU时钟信号随机产生,比如间隔定时器和IO设备异常:同步中断,当指令执行时由CPU控制单元产生的,即程序的错误产生的中断描述符表IDT和异常或中断向量相关联,映射向量对应的异常或中断...

2021-02-09 23:18:00 20

原创 系统调用

目录API和系统调用的区别int指令API和系统调用的区别都是函数API提供用户态服务或者内核态服务系统调用通过软中断进入内核态API可能调用几个系统调用系统调用也是一种APIint指令用户态进程发出int $0x80指令(老版本Linux中,从用户态切换到内核态的唯一方法)系统调用号放入eax寄存器根据idtr寄存器找到IDT表,根据0x80找到对应门描述符段级检查:...

2021-02-08 22:18:00 15

原创 进程补充概念和Linux部分实现

目录承接已有博客task_struct内核栈进程组织运行队列等待队列进程运行状态进程生存流程进程创建fork实现写时拷贝vfork实现clone实现do_fork实现copy_process实现进程终结exit实现do_exit实现进程删除wait实现孤儿进程僵尸进程进程调度抢占进程类型进程优先级SCHED_NORMAL:完全公平调度算法CFSSCHED_FIFO:先进先出的实时进程SCHED_...

2021-02-05 17:47:00 19

原创 《Effective C++》学习笔记

目录开篇总结条款4:确定对象被使用前已先被初始化条款5:了解C++默默编写并调用哪些函数条款6:若不想使用编译器自动生成的函数,就该明确拒绝条款7:为多态基类声明virtual析构函数条款8:别让异常逃离析构函数条款9:绝不在构造和析构过程中调用virtual函数条款10:令operator=返回一个reference to *this条款11:在operator=中处理“自我赋值”条款12 复...

2021-01-29 14:49:00 44

原创 shared_ptr和unique_ptr的简单实现

目录shared_ptrunique_ptr注意shared_ptrtemplate <typename T>class Sptr {public: //默认构造函数 Sptr() :ptr(nullptr), counter(new int(0)) {} //构造函数 Sptr(T* pIn) :ptr(pIn), counter(new int(1...

2021-01-16 01:04:00 29

原创 new、delete、[]new、[]delete

目录参考B站侯捷new的分解动作delete的分解动作malloc分配的内存并不只是你申请的大小[]new一定要用[]delete,否则可能会发生内存泄漏参考B站侯捷new的分解动作new关键字调用operator newoperator new调用malloc强制转换调用构造函数(这也是为什么malloc不能申请包含指针的类内存的原因)PS:new关键字是表达式,固定形式;op...

2021-01-15 00:24:00 17

原创 20.1.5 830. 较大分组的位置

题目在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。例如,在字符串 s = "abbxxxxzyy"中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,...

2021-01-05 07:44:00 9

原创 21.1.4 31. 下一个排列

题目实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须 原地 修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]示例 2:输入:nums = [3,2,1]输出:[1,2,3]示例 3:输入:nums...

2021-01-04 00:10:00 18

原创 20.1.3 86. 分隔链表

题目给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入:head = 1->4->3->2->5->2, x = 3输出:1->2->2->4->3->5思路思路很简单,双指针,两个伪头...

2021-01-03 17:23:00 20

原创 21.1.1 114. 二叉树展开为链表

题目给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树1/ 2 5/ \ 3 4 6将其展开为:123456思路用个prev记录就行了代码class Solution {public: void flatten(TreeNode* root) { if(!root) return; stac...

2021-01-01 22:10:00 22

原创 20.12.31 1114. 按序打印 多线程

题目我们提供了一个类:public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"); }}三个不同的线程将会共用一个 Foo 实例。线程 A 将会调用 firs...

2020-12-31 16:22:00 20

原创 20.12.31 435. 无重叠区间

题目给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。示例 1:输入: [ [1,2], [2,3], [3,4], [1,3] ]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。示例 2:输入: [ [1,2], [1,...

2020-12-31 07:17:00 14

原创 VisualStudio C++内存泄漏的检测方法

代码#define _CRTDBG_MAP_ALLOC#include <iostream>#include <crtdbg.h>using namespace std;void test1() { int* p = new int[10]; //int* p = (int*)malloc(sizeof(int) * 10);}void t...

2020-12-30 20:54:00 23

原创 20.12.30 152. 乘积最大子数组

题目给你一个整数数组 nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释:子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释:结果不能为 2, 因为 [-2,-1] 不是子数组。思路求这种极值基本上不是dp就是...

2020-12-30 19:29:00 17

原创 20.12.30 1046. 最后一块石头的重量

有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为x 和y,且x <= y。那么粉碎的可能结果如下:如果x == y,那么两块石头都会被完全粉碎;如果x != y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头...

2020-12-30 00:10:00 14

原创 20.12.29 461. 汉明距离

题目两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。注意:0 ≤ x, y < 231.示例:输入: x = 1, y = 4输出: 2解释:1 (0 0 0 1)4 (0 1 0 0)↑ ↑上面的箭头指出了对应二进制位不同的位置。思路位运算计算每...

2020-12-29 10:49:00 14

原创 20.12.29 448. 找到所有数组中消失的数字

题目给定一个范围在 1 ≤ a[i] ≤ n (n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]思路...

2020-12-29 10:28:00 15

原创 20.12.28 543. 二叉树的直径

题目给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例 :给定二叉树1 / \ 2 3 / \ 4 5返回3, 它的长度是路径 [4,2,1,3] 或者[5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。思路...

2020-12-28 23:04:00 12

原创 20.12.27 205. 同构字符串

题目给定两个字符串s和t,判断它们是否是同构的。如果s中的字符可以被替换得到t,那么这两个字符串是同构的。所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。示例 1:输入: s = "egg", t = "add"输出: true示例 2:输入: s = "foo", t = "bar...

2020-12-27 00:47:00 20

原创 20.12.26 85. 最大矩形

题目给定一个仅包含0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。示例 1:输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]输出:6解释:最大矩形如上图所示。...

2020-12-26 13:58:00 22

原创 20.12.25 455. 分发饼干

题目假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j]>= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。示例1:...

2020-12-25 09:33:00 17

空空如也

空空如也

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

TA关注的人

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