自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhu_pi_xx的博客

猪皮和大家一起进步!!

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

原创 【ProtoBuf】解决使用Any类型protoc编译时因gcc版本而发生的链接错误

解决使用Any类型protoc编译时因gcc版本而发生的链接错误

2023-06-03 18:04:33 358 1

原创 【项目设计】 负载均衡在线OJ系统

我们选择在线oj系统项目的原因是因为它可以帮助我们提高编程能力和解决问题的能力,同时也可以帮助我们更好地适应工作和学习中的编程需求。在线oj系统具有丰富的题库和实时反馈功能,可以帮助我们更好地进行编程练习和测试。 此外,负载均衡在线oj系统还可以进行项目的扩展,具有方便的使用和活跃的社区互动等优势,可以提高我们的学习效果和团队协作能力。

2023-05-16 18:37:37 2439 1

原创 【C++项目设计】tcmalloc高并发内存池

本项目是实现一个高并发的内存池,是把google的一个开源项目tcmalloc的核心给实现了下来,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,它是用于替代系统的内存分配相关的函数(如malloc、free)。1. tcmalloc知名度是非常高的,Go语言就直接用它做了自己的内存分配器。2. 该项目是对tcmalloc中最核心的框架的一个简化,模拟实现出mini版的高并发内存池。。。。

2023-05-15 09:03:17 728

原创 【MySQL】解决ERROR 1819 (HY000): ...satisfy..policy requirements 和赋权问题..running..--skip-grant-tables...

主要解决ERROR 1819 (HY000): Your password does not satisfy the current policy requirements密码难度而导致设置密码失败的问题和ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement因为免密登录而造成的各种问题

2023-05-11 16:47:21 252

原创 Linux线程同步

比如去买手机,连续三十天,我每天都去问有货吗,售货员说没有,第三十天我去的时候才有,这虽然没有错,但是不合理,十分的浪费资源和降低效率。而且如果票卖完了,线程需要等待放票,那么只有互斥的话就一直去申请锁,一直做无用功,没错但不合理

2023-02-06 17:02:06 491

原创 Linux线程互斥

临界资源:多线程执行流共享的资源就叫做临界资源,在一个资源被多个执行流共享的情况下,我们通过一定的方式,任何时候只允许一个执行流访问的资源称为临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时候,互斥保证只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用(对临界资源保护)原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么不做必须通过代码层面来进行对临界资源的保护,有一种保护手段就叫做互斥,我们可以通过加锁

2023-02-05 22:37:35 338

原创 Linux线程控制

对于线程分离,主线程可以不用等这个新线程了,那是不是可以主线程直接走了呢?①主线程退出就意味着进程退出,那么所有执行流都会终止,有可能这个分离的线程还有事要干②无论在多进程还是多线程场景下,都应该主进程或者主线程最后退出,因为它不仅仅要担任创建,还有资源回收的职责③对于服务器来说,主线程或者主进程都是不退出的,所以怎么用还得取决于场景④不要乱用

2023-02-05 16:40:15 383

原创 Linux线程理解

在Windows当中,就有真正的线程系统中存在大量进程,就意味着存在大量的线程如果创建特定的数据结构,这个结构中的代码,逻辑等等,其中有相当一部分是非常类似的,所以如果想Windows这样单独设计,那么很多工作是重复的所以Linux决定,没必要在内核层面区分进程和线程,所有进程和线程都通过task_struct来统一表示,只不过进程有独立的地址空间,线程共享地址空间

2023-02-04 18:07:07 509

原创 IPC进程间通信-system V 共享内存

先回顾一下动态库,动态库是运行时库,在运行时才进行加载,而在使用动态库的地方保存的是偏移量,动态库加载后,各个使用动态库的程序都会根据加载的起始地址计算出使用到的函数和变量的地址。这些都在地址空间的共享区建立了映射,一个动态库可以被多个程序使用,所以也叫共享库。那操作系统自己申请了一部分空间,将这一部分空间,通过页表,映射到申请的空间,然后页表返回这一部分空间的起始地址,那上层就拿到了这样一个虚拟地址,同样的,可以映射给另一个进程,这样就可以同时访问到这部分空间

2023-01-10 16:57:52 425

原创 IPC进程间通信-管道

进程的运行具有独立性,带来的直接结果就是进程间想要通信的话,提高了难度,进程间通信的本值就是让不同的进程==看到==同一份资源(内存空间),并且这一份资源不能属于任何一个进程(就算是写入缓冲区,另一个进程再去读,也是读不到的,因为写时拷贝)所谓的独立性,不是绝对的独立,而是大部分情况下,是独立的,该进程运行终止后,不会去引用其他进程

2023-01-10 10:21:38 292 1

原创 动态规划经典题:编辑距离(hard) 详解,看了还不会你来砍我

一般的,我们在做序列DP问题的时候,遇到两个字符串都会用一个二维数组来进行DP,最长公共子序列简称LCS(longest common subsequence)对于本题状态定义:DP[i][j]表示具有word1[0:i]的字符串和word2[0:j]的字符串中的LCS比如"abcde" [0:2]也就是abc

2023-01-01 15:34:21 2331

原创 红黑树的迭代器&&红黑树与AVL树的比较

红黑树和AVL树都是高效的平衡搜索二叉树,增删查改的时间复杂度都是O(logN),因为最坏查找高度次,红黑树不追求绝对平衡,其次只需要保证最长路径不超过最短路径的二倍(通过颜色的互斥来达到这一点),这就决定了红黑树会有更少的旋转,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以红黑树的运用比AVL树更多

2022-12-28 17:56:47 273

原创 手撕红黑树、三种情况就可玩转红黑

红黑树只需要掌握三种情况便可玩转1.叔叔为红,变色到头即可2.叔叔存在且为黑,旋转+变色 第一种是旋转的时候不会影响左右子树黑色结点总数,单旋 第二种是旋转时会影响左右子树的黑色结点总数,双旋叔叔存不存在都差不多,直接旋转即可,不影响一直循环到parent不为红或者到根

2022-12-25 21:20:00 831

原创 map与set详解

关联式容器:也是用来存储数据的,与序列式容器不同的是,其里面村的是这样结构的键值对,在数据检索时效率更高

2022-12-24 17:38:41 463

原创 set,map相关题目,更好地了解set与map

第一种思路:用一个map来进行计数,然后用priority_queue优先级队列来进行大堆排序,其中需要自己写仿函数,并且按照字典序的方式进行排序;

2022-12-20 19:26:44 82

原创 手撕AVL树之平衡因子完成四种旋转

如果是有序的或者接近有序,那么查找的效率就退化的很厉害,效率无法保证,那么就要开始尝试控制平衡

2022-12-20 15:14:35 402

原创 二叉树的非递归与相关oj

思路:我们可以想象它已经是遍历好的结果,我们只是对它的左右指针进行一点调节,利用递归来进行整棵树进行递归(可以认为是已经构建好了的双向链表,但是指向出了点问题,我们要通过对树的中序遍历这种方式来顺序访问到双向链表中的各个结点来修改指向)

2022-12-18 16:32:04 433

原创 搜索二叉树详解

搜索二叉树:搜索二叉树增删查的时间复杂度是O(h) h是树的高度最坏的单支情况下是O(N),所以说搜索二叉树还是有缺陷的,最坏情况下增删查太慢了,想达到O(logN必须是满二叉树或者完全二叉树),所以就有了AVL树,红黑树等等,这些平衡树和搜索树的却别仅仅在效率上,功能上并没有区别

2022-12-17 15:35:40 381

原创 解决VSCode远程主机安装扩展太慢的问题,远程上传+vsix安装

解决VSCode远程主机安装扩展太慢的问题,远程上传+vsix安装

2022-12-15 20:39:10 554

原创 Linux软硬链接与动静态库

我们此时把testLink1.txt删掉,我们看到,hard.link仍然还在(inode还在,说明文件还在),那么此时说明只是把目录data blocks中testLink1.txt和inode的映射关系删掉了。(文件系统与inode中讲到)我们可以看到,有一个数字从2变成了1,这个数字就是硬链接数,硬链接数在inode中就是一个计数器,来记录有多少个文件名和这个inode有映射关系(引用计数),当我们删掉一个文件的时候,只是把硬链接数-1,(也就是删掉了一个映射),当硬链接数变为0的时候

2022-12-14 21:23:09 329

原创 Linux 磁盘结构,文件系统与inode

磁盘是一个外设(外设即冯诺依曼中承担输入输出角色的设备),而且,磁盘还是计算机中唯一一个机械设备,因为磁盘是外设,同时又是机械设备,就意味着磁盘会非常的慢(相对而言),所以OS一定会有提速的方式

2022-12-08 17:42:53 1068

原创 Linux重定向原理与系统调用dup2

因为文件类的接口都会去调用系统调用,因为对文件操作属于是文件管理,这部分内容是需要操作系统去完成的,因此在系统中,他是只认识fd这个数字的,并不知道FILE*这些,这些是上层封装出来的

2022-12-05 22:52:55 667

原创 Linux文件系统调用接口&&文件描述符的理解

①.系统调用对于我们来说是比较难的,因为我们需要系统要去干什么,需要传哪些参数,所以学习成本太高,所以语言层次,对系统调用接口进行了封装,导致了不同的语言,有不同的语言级别的文件访问接口封装出来的接口是有多个的,但是文件类的系统调用接口,在Linux上,只有一套②跨平台如果语言不提供对文件的系统封装接口,那么所有的访问文件操作,必须使用操作系统提供的系统调用接口,一旦这样,那编写的代码在其他平台就运行不了了,而我如果进行封装,不同的平台进行不同的封装,但是提供给用户的接口都是一样的,这样,就实现了

2022-12-03 21:45:19 247

原创 C++异常及异常优缺点

1.终止程序比如assert去断言(assert只在Debug模式生效)缺陷:用户难以接受,比如发生内存错误,除零错误时就会终止程序2.返回错误码缺陷:需要程序员自己去查对应的错误信息,比如系统的很多库接口函数都是把错误码放在error中,表示错误。

2022-12-01 21:50:12 7091 1

原创 C++11(三)可变模板参数、lambda表达式、包装器

push_back(make_pair(...))是一次构造+一次拷贝构造/移动构造(左值/右值)而传参数包的话,我只需要传参数过去构造里面的pair(因为里面有列表初始化,可以生成pair)所以emplace确实在某些地方更高效

2022-11-29 15:25:51 1280

原创 C++11(二)右值引用&&移动语义

如果没有实现移动构造函数,且没有自己实现析构函数,拷贝构造,拷贝赋值重载的任意一个(三个都不写才会生成,但是这三个只要有一个写了,基本都要写),那么编译器才会自动生成,并且,默认移动构造对于内置类型对象进行值拷贝,自定义类型对象,则看这个对象是否实现移动构造,如果实现就调用它的移动构造,没有实现就调用拷贝构造。

2022-11-28 14:39:44 910

原创 C++11(一)

之前呢{}就是对于结构体和数组进行统一地列表初始值设定C++11扩大了用大括号括起来地列表初始化的使用范围,使其可对所有的内置类型和用户自定义类型,使用列表初始化时,可添加等号,也可以不加

2022-11-28 12:33:56 737

原创 面试宝典之C++多态灵魂拷问

析构函数需要定义成虚函数,这是因为避免内存泄漏。如果不定义成虚函数,那么A*a = new B/A&a = b;(b是new出来的),他们就只能析构父类的部分,而子类新开辟的空间就没有被释放掉,导致内存泄漏,编译器为了能让析构函数完成重写,函数名会同一处理成destructor,然后调用的时候,只需调用子类的析构就可以了(父类的析构会在子类的析构之后自动调用。

2022-11-27 09:37:39 378

原创 C++中的多态(下)

1.修饰类,表示最终类,不能被继承2.修饰虚函数,表示该虚函数不能被重写这个场景是很少见的,因为虚函数写出来就是为了重写去构成多态

2022-11-26 12:37:57 460

原创 C++中的多态(上)

通俗来说,多态就是多种形态,具体点就是在完成某个行为,当不同的对象去完成时会产生不同的状态比如买票,普通人正常买票,学生半价买票,军人优先买票

2022-11-26 08:00:00 416

原创 C++中的继承(下)

继承允许根据基类的实现来定义派生类的实现,这种通过生成派生类的复用称为白箱复用(white-box reuse),在继承方式中,基类的内部细节对子类可见,继承一定程度上破坏了基类的封装。基类的改变,对派生类有很大的影响,派生类和基类间的依赖关系很强,耦合度高。

2022-11-25 10:53:06 432

原创 C++中的继承(上)

继承(inheritance)机制是面向对象程序设计使代码可以复用==的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认识过程,以前我们接触的复用都是函数复用,继承是类设计层次的复用继承说白了就是类的复用

2022-11-24 21:13:36 356

原创 模板进阶&&模板分离编译的问题与解决

模板参数分为类型形参与非类型形参类型形参:出现在模板参数中,跟在class或者typename之后的参数类型名称非类型形参:就是一个常量作为类模板/函数模板的一个参数,在类模板/函数模板中可将该参数当成常量来使用

2022-11-23 23:04:07 384

原创 Linux实现一个简单的shell-进程控制

首先,不知道命令的位置,所以需要去PATH环境变量找,其次,g_argv已经有了命令分割出来的指针数组,所以综合看来选择execvpp表示环境变量,v可以看做需要传一个数组

2022-10-16 11:19:27 831 6

原创 Linux进程控制详解.

进程=内核数据结构+进程数据和代码1. 分配新的内存块和数据结构给子进程2. 将父进程部分数据和内容进行拷贝3. 添加子进程到系统进程列表4. fork()返回,开始调度器调度

2022-10-15 15:03:36 1195 3

原创 Linux进程地址空间.

我们发现,同一个地址,同时读取的时候出现了不同的值,这就告诉了我们,这里的地址绝对不是物理内存的地址,而是虚拟地址,所以,我们所说的地址,其实是虚拟地址

2022-10-14 08:00:00 403

原创 stack,queue,deque,priority_queue与仿函数

适配器是一种设计模式(设计模式是一套被反复使用的,被多数人知晓的、经过分类编目的,代码设计经验的总结),该种模式是将一个类的接口转换成客户端希望的另一个接口。

2022-10-13 11:00:00 492 1

原创 list详解&&list模拟

算法库中的sort是使用的是QuickSort,针对的是连续空间,所以list需要自己写一个独立的出来,链表的sort底层就是 MergeSort。但是,链表的sort价值不大,不如使用vector+算法库的sort。

2022-10-12 20:24:37 456

原创 Linux进程优先级与环境变量初识

如果上下文数据丢弃,进程也就无法运行了(因为CPU内的寄存器只有一份(多个),当时间片到了,或者被抢占(暂时切换下来),进程A就要带着自己的上下文数据走,带走暂时保存的目的就是为了下次回来的时候能恢复上去,就能按照之前的逻辑继续向后推进,就如同没有中断过一样)

2022-09-29 09:00:00 1184 7

原创 Linux操作系统进程的状态详解.

并不意味着进程一定在运行中,表明在运行中或者在运行队列当中可以看到上图的状态一直在变化,因为CPU一直在做事情而且它太快了,printf需要访问外设,因为printf被执行了所以一定有运行状态,当进程向显示器打印的时候,需要做一定程度的等待,这时进程的PCB在阻塞队列当中,就绪时才又拿给CPU,这个过程特别快,所以,很多时候看到的都是S状态。

2022-09-28 09:00:00 529 3

空空如也

空空如也

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

TA关注的人

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