笔记
文章平均质量分 92
蓝乐
这个作者很懒,什么都没留下…
展开
-
【Linux】线程池实现
线程池是一种线程使用模式。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。在线程取任务的接口设计时,我因为这里需要访问任务队列这个临界区给这个过程加上了锁,但是实际上在调用这个接口的时候其实线程就已经申请加了锁,而且两次申请的为同一把锁,就导致出现了线程在已经持有一把锁的情况下又去申请这把锁,从而产生了死锁。我们在初始化线程池的这部分代码,需要创建若干线程来完成其所需要执行的任务,这些线程的例程函数形式为。结果如上,左侧为线程池中的线程每隔一秒取出任务并执行,右侧为线程池的情况。原创 2024-01-14 15:28:42 · 906 阅读 · 0 评论 -
【Linux】网络基础--网络层与数据链路层
粗略介绍网络层与数据链路层相关内容,包含IP协议,ARP协议等多种协议以及DNS及NAT等技术的介绍。原创 2022-08-08 15:35:26 · 2719 阅读 · 1 评论 -
【Linux】网络基础--传输层详解
传输层主要负责将数据从发送端传输到接收端。我们之前已经知道,端口标识的是一个主机上进行的应用程序。在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过查看);netstat是一个用来查看网络状态的重要工具.上面的列表依次为协议类型、接收队列、发送队列、本地网络的IP和端口号、远端网络的IP和端口号。其中关于接收队列,我们之前编写socket编程时监听listen中参数backlog就代表接收等待队列的最大值。原创 2022-06-14 20:01:01 · 1611 阅读 · 14 评论 -
【Linux】网络基础--应用层详解
本文将重点介绍TCP/IP四层结构模型中的应用层。应用层是我们在之前的学习中,接触的最多的一层结构,我们所写的应用程序都是运行在应用层的。我们之前简单的认识过了协议,并说过协议本质是一种“约定”。而在之前关于套接字编程中的接口介绍中,我们都是以字符串为形式来进行传输的,那么如果我们要传输的是结构化的数据呢?下面我们通过一个网络简易计算器的例子来具体介绍一下有关结构化数据传输的协议。如果我们将实现一个简易的加法器服务端,那么就需要客户端将两个操作数及运算符发送到服务端,经由服务器计算再返回给客户端。那么客户端原创 2022-06-03 23:45:39 · 1182 阅读 · 7 评论 -
【Linux】网络套接字编程
网络编程socket💡预备知识▶源IP地址与目的IP地址▶端口号与进程id▶源端口号与目的端口号▶UDP与TCP协议▶网络字节序💡套接字(socket)介绍▶概念▶分类▶工作流程💡socket编程▶socket编程接口▶sockaddr结构体🎄sockaddr结构体🎄sockaddr_in结构体🎄in_addr结构体💡socket编程应用▶基于udp协议的socket编程🎄服务端server_udp🎄客户端client_udp🎄地址转换函数🎄结果展示▶基于tcp协议的socket编程💡预备知识▶源IP地原创 2022-05-12 15:27:21 · 759 阅读 · 8 评论 -
【Linux】网络基础(一)--为socket编程做准备
网络基础(一)▶网络发展背景了解🎄网络发展▶网络协议🎄理解协议🎄OSI七层模型🎄TCP/IP五层(四层)结构模型▶网络中的地址管理🎄IP地址🎄MAC地址▶网络传输基本流程🎄同一网段内两台主机进行文件传输🎄数据包封装和分用▶网络发展背景了解🎄网络发展独立模式:独立模式下,没有网络,各个计算机的数据是互相独立的,此时如果要实现业务,那么需要依次实现各自的业务逻辑。网络互联:在网络互联下,各个相互独立的计算机的数据通过服务器集中管理,业务逻辑可以随时切换。局域网LAN(Local Area N原创 2022-05-07 20:01:42 · 719 阅读 · 10 评论 -
【C++】从零实现一个高并发内存池
从零实现一个高并发内存池🎄项目介绍◎项目的内容介绍◎要求的知识储备◎内存池的介绍🎄项目介绍◎项目的内容介绍◎要求的知识储备◎内存池的介绍原创 2022-04-27 19:26:41 · 4700 阅读 · 21 评论 -
【Linux】进程间通信
进程间通信(IPC)🕐进程间通信简介🕐目的🕐发展🕐分类🕒管道🕒特点🕒分类🕒匿名管道(pipe)🕒感性认识🕒接口介绍🕒代码实现🕒命名管道(FIFO)🕒命名管道的原理🕐进程间通信简介🕐目的进程间通信是为了方便数据传输、资源共享、通知事件(子进程退出时需通知父进程退出信息)、进程控制(调试时Debug进程的控制)等功能而存在的。🕐发展进程间通信分为三个阶段:管道;System V IPC;POSIX IPC其中前两种通信方式为本地设备上的进程通信,而第三种通过网络实现跨设备的进程通信,本文将介绍本地的原创 2022-03-21 22:19:59 · 1063 阅读 · 23 评论 -
【C++】红黑树详解并封装实现map和set
红黑树详解原创 2022-03-18 13:45:16 · 3230 阅读 · 22 评论 -
【Linux】动态库与静态库
动态库与静态库文件系统补完文件的三个时间acm动态库与静态库动态链接与静态链接静态库文件系统补完文件的三个时间acm我们通过stat指令查看文件信息:[lyl@VM-4-3-centos 2022-3-14]$ stat log.txt File: ‘log.txt’ Size: 0 Blocks: 0 IO Block: 4096 regular empty fileDevice: fd01h/64769d Inode: 790871原创 2022-03-14 16:30:37 · 2741 阅读 · 16 评论 -
【Linux】深入理解重定向、inode详解与软硬链接的概念及区别
进一步认识基础IO再识重定向重定向基本命令dup2系统调用接口代码示例小结理解文件系统磁盘(硬盘)背景文件元数据文件系统inode详细介绍inode是一个文件的属性集合目录的inode软硬链接软链接介绍硬链接介绍本文将进一步介绍重定向、文件系统、inode以及软硬链接的相关知识。再识重定向在之前我们已经知道了输出重定向的概念,即本来应该写入标准输出中的内容却被写入了其他文件中。常见的输出重定向有:>, >>其中>为“w”方式(覆盖)写入文件,而>>为"a"方式(追原创 2022-03-11 21:26:51 · 1550 阅读 · 10 评论 -
【C++】AVL树的实现--详细解析旋转细节
我们之前所学习的二叉搜索树由于可能出现单边树的极端情况,导致效率为O(N)。因此,本文将介绍AVL树即平衡搜索二叉树,将可以有效的避免单边树的情况。AVL树的实现AVL树的概念AVL树的定义AVL树结点定义AVL树的概念AVL树是以发现其的两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis的首字母命名的。其实现方法为:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。.原创 2022-03-10 23:18:53 · 2194 阅读 · 17 评论 -
【C++】map和set
本文将衔接二叉搜索树,介绍C++中的两个容器set和map。在进入本文之前,建议先回顾之前关于二叉搜索树的介绍:二叉搜索树详解set 和 mapset介绍概念set的使用set的构造set的迭代器set的容量set的修改set的使用举例map介绍概念set的使用set的迭代器set的容量与元素访问--重点介绍[]的重载下标访问符[]的详细介绍set介绍概念·set就是Key模型的二叉搜索树,对于set而言,其key值是每个结点的唯一标识,也就是说set中的元素不允许重复。·虽然set只存放ke原创 2022-03-08 13:08:46 · 1648 阅读 · 14 评论 -
【Linux】文件与文件描述符的介绍
基础IO(上)前言C语言文件IO相关操作接口回顾本文将介绍Linux系统下的文件操作并从底层了解文件的相关知识。前言在开始介绍之前,我们先带着下面这几个问题去思考:如何理解“Linux下一切皆文件”进程启动同时会默认打开3个文件,这3个文件是什么什么是文件描述符,为什么说有了文件描述符,就可以找到打开文件的所有细节从语言和系统层面分别理解文件描述符fd与FILE的关系那么接下来我们将开始介绍文件及文件描述符C语言文件IO相关操作接口回顾...原创 2022-03-06 14:44:24 · 1464 阅读 · 16 评论 -
【C++】二叉搜索树解析
二叉搜索树概念概念原创 2022-03-02 16:28:14 · 1520 阅读 · 12 评论 -
【C++】多态详解
多态概念定义和实现多态的构成条件虚函数及其重写虚函数重写条件的两个例外C++11关键字override与final重载、重定义(隐藏)、重写(覆盖)的对比抽象类概念接口继承与实现继承原理虚函数表底层原理静态绑定和动态绑定小结单继承和多继承关系中的虚函数表单继承中的虚函数表多继承中的虚函数表概念多态,即多种形态,也就是说,不同的对象在完成某个行为时会产生不同的状态。举个例子,在以前买票时,普通人正常买票,学生半价买票,军人优先买票。定义和实现多态的构成条件多态是在不同继承关系的类对象,去调用同一原创 2022-02-27 00:47:00 · 1305 阅读 · 15 评论 -
【C++】继承详解
继承继承的概念及定义概念定义基类和派生类基类和派生类对象的赋值类型转换继承中的作用域本文将介绍C++面向对象中三大特性之一的继承,并详细介绍多继承引发的菱形继承及其解决方法。继承的概念及定义概念就像现实世界中子辈继承父辈遗产一样,面向对象的语言一样有继承,这是面向对象程序设计使代码可以复用的最重要的手段。举个例子,老师和学生都是人,都有人的属性,有姓名,年龄,性别等等公共属性,而如果设计这些对象时在类中都定义相关变量,就会造成数据冗余。所以我们可以将这些共同属性统一为一个类Person,再让St原创 2022-02-24 22:52:51 · 1508 阅读 · 10 评论 -
【Linux】进程控制--进程的等待与替换
进程的等待与替换进程等待1.进程等待的必要性2.进程等待的方法wait()方法waitpid()方法返回值:参数:pid参数status参数options参数进程等待1.进程等待的必要性·我们之前介绍过了僵尸进程,即子进程退出时父进程没有接收到子进程的退出状态信息,这时的子进程就成为了僵尸进程,从而导致内存泄露。而进程一旦成为僵尸进程,那么任何手段都无法杀死这个进程,因为没有人能杀死一个已经死去的进程。因此,为了防止内存泄露的危害,需要进行进程等待来回收僵尸进程。·其次,进程等待还可以让父进程获取原创 2022-02-22 21:56:48 · 673 阅读 · 14 评论 -
【Linux】进程控制--进程的创建与终止
进程的创建与终止进程的创建fork函数fork函数的返回值写时拷贝写时拷贝的意义fork函数调用失败的情况进程的终止退出码退出码的意义进程常见的退出方法正常终止方法异常终止方法exit函数&_exit函数深入理解进程终止进程控制包括进程的创建、终止、等待与替换。本文将介绍进程的创建与终止。进程的创建进程的创建包括两个方面:一种是使用命令行的启动命令来创建进程;另一个是在程序本身通过fork函数来创建子进程fork函数fork函数我们并不陌生,调用fork接口将会以父进程为模板来创建子进程原创 2022-01-18 19:34:26 · 3009 阅读 · 21 评论 -
【Linux】进程概念--环境变量和进程地址空间
进程概念(二)一、环境变量1、基本概念2、常见环境变量·PATH·HOME·SHELL3、查看环境变量的方法4、和环境变量相关的命令·echo·export·env·unset·set5、环境变量的组织方式6、获取环境变量main函数中的第三个参数通过第三方变量environ获取通过系统调用获取环境变量7、环境变量通常时具有全局属性的一、环境变量1、基本概念·环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数·如:我们在编写C/C++代码的原创 2021-12-07 12:54:52 · 921 阅读 · 5 评论 -
【Linux】进程概念--操作系统与进程
进程概念(一)一、冯诺依曼体系结构二、操作系统(Operator System)1、概念2、设计OS的目的3、定位--负责管理的软件如何理解“管理”小结4、系统调用和库函数概念三、进程1、基本概念一、冯诺依曼体系结构在正式介绍Linux进程之前,我们先了解一下冯诺依曼体系结构。冯诺依曼体系结构是指所有的设备都只能直接和内存打交道,下图中的存储器指的就是内存。具体来说,一方面,不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备);另一方面,外设(输入或输出设备)要输入或原创 2021-12-05 00:43:14 · 1554 阅读 · 5 评论 -
【C++】栈和队列(stack&queue)
栈和队列一.stack的介绍和使用(1)概念·stack是一种后进先出的容器结构,准确来说stack并不是容器,而是一种容器适配器(对特定类封装作为其底层的容器)。...原创 2021-12-01 21:37:33 · 3839 阅读 · 5 评论 -
【Linux】Linux调试器--gdb详解
Linux环境基础开发工具使用(二)一.Linux调试器-gdb使用1.背景2.使用一.Linux调试器-gdb使用1.背景·程序的发布方式有两种,debug模式和release模式·Linux gcc/g++出来的二进制程序,默认是release模式·要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项2.使用...原创 2021-11-16 11:15:59 · 2643 阅读 · 7 评论 -
【Linux】Linux环境基础开发工具使用介绍(一)
Linux环境基础开发工具使用介绍(一)一.Linux 软件包管理器 yum的使用1.什么是软件包2.查看软件包3.如何安装软件4.如何卸载软件5.lrzsz的安装和使用6.yum安装有意思的小程序二.Linux编辑器-vim使用1.vim的基本概念2.vim的基本操作3.vim正常模式命令(1)移动光标(2)删除文字(3)复制(4)替换(5)撤销上一次操作(6)更改(7)跳至指定的行4. vim末行模式命令6.简单vim配置(1)配置文件的位置(2)常用配置选项,用来测试三.Linux编译器-gcc/g+原创 2021-11-15 10:55:55 · 6942 阅读 · 4 评论 -
【C++】list
list一.概念二.list常见接口1.构造与析构2.迭代器iterator一.概念list:可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。底层是双向链表结构。list可以在任意位置进行插入、移除元素,执行效率比array,vector,deque的序列式容器更高。list不支持任意位置的随机访问,这是因为list的底层空间不连续。C++11中引入了forward_list,即单链表,但实际情况下这种结构并不常用。二.list常见接口1.构造与析构原创 2021-11-14 17:41:47 · 1137 阅读 · 4 评论 -
【C++】vector
vector一.概念二.vector的常见接口1.构造与析构2.vector迭代器3.容量与大小4.vector增删查改三.迭代器失效一.概念vector:大小可变数组的序列容器。和数组一样,连续存储空间存储元素。使用动态分配数组存储元素;增容时,并不会每次都重新分配大小,而是分配一些额外的空间以适应可能的增长。vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。与其它动态序列容器相比(deques, lists and forward_lists),原创 2021-11-11 14:46:35 · 1778 阅读 · 8 评论 -
【Linux】Linux权限介绍
本篇文章将介绍Linux的权限,下面用一张图来简要了解一下本篇文章的内容:Linux权限一.shell命令以及运行原理二.Linux权限管理1.Linux权限的概念2.Linux权限管理(1)文件访问者的分类(人)(2)文件类型和访问权限(事物属性)三.文件权限值的表示方法(1)字符表示方法(2)8进制数值表示方法四.文件访问权限的相关设置方法1.chmod2.chown3.chgrp4.umask5.file指令五.目录的权限1.分类2.粘滞位3.小结(重点)一.shell命令以及运行原理Linu原创 2021-11-07 22:43:40 · 944 阅读 · 7 评论 -
【C++】string类
string类一.概念一.概念原创 2021-11-03 23:01:44 · 173 阅读 · 1 评论 -
【C++】初识模板
模板1.泛型编程2.函数模板(1)概念(2)函数模板的格式(3)函数模板的原理(4)函数模板的实例化隐式实例化显式实例化(5)模板参数的匹配原则3.类模板(1)类模板的定义格式(2)类模板的实例化1.泛型编程我们已经知道C++可以支持函数重载,也就是说拿Swap函数举例的话,我们可以实现多种类型的交换函数:void Swap(int& x, int& y){ int tmp = x; x = y; y = tmp;}void Swap(char& x, char&原创 2021-10-27 10:38:58 · 178 阅读 · 4 评论 -
C&C++内存管理
C/C++内存管理一.C/C++内存分配二.C语言动态内存管理方式三.C++内存管理方式1.new/delete处理内置类型2.new/delete处理自定义类型四.operator new与operator delete函数1.概念2.operator new 和operator delete的类专属重载五.new和delete的实现原理1.内置类型2.自定义类型六.定位new表达式(placement-new)总结1.malloc/free与new/delete的区别2.内存泄露一.C/C++内存分配原创 2021-10-23 22:49:01 · 203 阅读 · 6 评论 -
【C++】类和对象补充
类和对象(下)一. 再看构造函数1.函数体内赋初值2.初始化列表几点注意3.explicit关键字二.static成员1.概念2.特性三.友元1.友元函数2.友元类四.内部类一. 再看构造函数我们之前已经了解了构造函数的基本内容,那么这里我们将深入认识构造函数。1.函数体内赋初值class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; //可以进行原创 2021-10-20 21:05:40 · 314 阅读 · 6 评论 -
【C++】进一步认识类与对象
上一篇文章我们已经了解了类的默认成员函数中的三个,包括构造函数,析构函数以及拷贝构造函数,那么本篇文章将介绍剩余的三个默认成员函数,即赋值操作符重载函数,取地址操作符重载函数及const取地址操作符重载函数。类与对象(中)赋值操作符重载函数1.运算符重载2.赋值运算符重载3.默认的赋值操作符重载函数4.赋值重载函数与拷贝构造函数的对比日期类的实现赋值操作符重载函数1.运算符重载C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返原创 2021-10-16 08:51:07 · 221 阅读 · 6 评论 -
【C++】再识类和对象
类和对象(中)类的6个默认成员函数构造函数1.概念类的6个默认成员函数一个类中如果什么成员都没有,那么这个类称为空类。空类中是什么都没有吗?其实不然,任何一个类,再我们不写的情况下,都会自动生成下面6个默认成员函数:本篇文章将对这几个默认成员函数进行简单介绍。构造函数1.概念我们先来看一下下面这个日期类:class Date{public: void SetDate(int year = 0, int month = 1, int day = 1) { _year = year;原创 2021-10-12 15:30:37 · 288 阅读 · 4 评论 -
【C++】初识类和对象
类和对象(上)一.初步认识面向过程和面向对象二.类的引入三.类的定义四.类的访问限定符及封装1.访问限定符2.封装五.类的作用域六.类的实例化七.类对象模型1.计算类对象的大小2.类对象的存储方式八.this指针1.this指针的引出2.this指针的特性一.初步认识面向过程和面向对象面向过程,关注的是怎么去做,比如在外卖系统中,强调点餐,做餐,送餐等一系列动作的方法,反映到语言中是函数方法的实现;而面向对象,更关注的是谁去做,比如在外卖系统中,强调的是商家,买家和送货员之间的交互,反映到语言中则是对象原创 2021-10-09 19:54:11 · 880 阅读 · 5 评论 -
【C++】C++入门
书接上回,在介绍了函数重载后,我们将继续学习包括引用和函数内联等C++入门知识。C++入门一.函数重载的补充extern "C"二.引用1.引用的概念2.引用的特性一.函数重载的补充extern “C”extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。//引入extern "C" 是告诉编译器其修饰下的函数的命名修饰规则按照C语言下的命名规则进行//即此时的函数Add在转化到符号表原创 2021-10-05 18:57:11 · 1207 阅读 · 6 评论 -
【C++】初识C++
初识C++一.C++关键字二.命名空间1.命名空间定义2.命名空间的使用三.C++的输入输出四.缺省参数1.缺省参数的概念2.缺省参数的分类全缺省参数半缺省参数五.函数重载学习完C语言后,便开始认识C++了。C++是在C语言的基础上发展出来的,因此C语言中的所有内容均可在C++上运行。同时C++也进行了许多优化,实现了很多C语言无法实现的功能,下面让我们来慢慢认识C++这一门编程语言。一.C++关键字首先是C++的关键字,C++总计63个关键字,其中包含C语言的32个关键字。对于C++的关键字,我们并原创 2021-09-26 10:31:08 · 366 阅读 · 8 评论 -
【数据结构】排序(二)
排序三.交换排序1.冒泡排序概念及分析算法分析小结2.快速排序概念算法分析与实现1.hoare版本在认识了插入排序和选择排序后,我们再来了解一下剩下的交换排序和归并排序。三.交换排序1.冒泡排序概念及分析冒泡排序,顾名思义,每趟将待排序数组中的最大值冒到序列的最后一个位置,当进行n - 1趟后,序列便成了升序。算法分析冒泡排序总共需要冒n - 1趟,每趟比较n减去已经比较好的数的个数再减1,即n - 1 - i次比较,若相邻两数前者比后者大,则二者交换,因此冒泡排序的代码为:void B原创 2021-09-19 23:36:11 · 138 阅读 · 2 评论 -
【C语言】动态内存分配
目录动态内存分配存在的原因动态内存函数1. malloc 和 free动态内存分配存在的原因首先我们知道内存开辟的方式有:int a = 0;//在栈上开辟4个字节的空间char ch[10] = {0};//在栈上开辟10个字节的连续空间上述的两种方式有两个特点:1)空间开辟的大小是固定的2)数组在声明时需要明确其大小,即数组长度,其内存在编译时分配。但是在实际应用中我们所需要的不止是一个固定大小的数组,而常常需要堆数组的长度进行修改,而数组在编译时开辟空间的方式就不能满足我们的需求了,原创 2021-09-07 11:00:44 · 196 阅读 · 0 评论 -
【C语言】枚举与联合(共用体)
目录枚举枚举类型的定义枚举的优点枚举的使用枚举类型的大小联合(共用体)联合类型的定义联合的特点联合大小的计算总结枚举顾名思义就是一一列举,把可能的取值一一列举。比如现实生活中:一周从星期一到星期日共七天,可以一一列举;性别有男,女,保密,可以一一列举;月份有十二个月,也可以一一列举。枚举类型的定义enum Day{ Mon, Tues, Wes, Thur, Fri, Sat, Sun};enum Sex{ MALE, FEMALE, SECRET};以上定原创 2021-06-20 17:35:43 · 189 阅读 · 1 评论 -
【C语言】结构体
目录结构体枚举联合原创 2021-06-20 16:46:36 · 1106 阅读 · 7 评论