自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小侯宝的博客

长风破浪会有时

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

原创 『 Linux 』 进程间通信 - 匿名管道 (万字)

管道(Pipe)是一种基本的进程间通信(IPC)机制,允许一个进程与另一个进程之间进行数据传输;管道工作方式类似于生活中的水管因此命名为管道,数据从一端流入另一段流出,数据流为单向;Linux中可以使用查看当前登入系统的用户数;who命令用与显示当前登入系统的用户信息,其中一条会话代表一个用户;wc -l命令统计当前行数;两条命令通过管道符进行连接,即将显示的信息通过管道符传输给wc命令再进行统计行数;符号即为一种管道;匿名管道(Anonymous Pipes)不存在命名的管道,用于。

2024-06-21 16:57:08 989

原创 『 Linux 』 进程间通信概述

进程间通信(IPC)指的是在操作系统重,允许两个或者多个进程之间传递信息或者数据的机制;进程是操作系统重独立运行的实体,即进程间具有独立性,存在自己的地址空间;因此进程间默认无法直接访问彼此的内存空间,其通信成本会较高;IPC提供一种方式使得互相独立的进程能够交换数据并进行通信和数据共享;

2024-06-20 16:45:52 720

原创 『 Linux 』 进程地址空间与动态库地址

当可执行程序被加载进内存成为进程时,操作系统将会给这个寄存器中存放这个进程代码的初始位置(虚拟地址 ),例如程序的入口点;为了使不同的进程能够同时使用同一份物理内存的库副本,库中的代码必须能够运行在任何地址上即它们必须是与位置无关的;这是通过确保代码执行时不依赖它的绝对地址来实现的,即代码对于数据的禁用是基于它当前的运行地址来计算的;目标文件最终被生成的动态库其中的地址将可以加载到物理内存中的任意位置,并随机为其分配进程地址空间;如,它可以避免为每个使用特定库的进程单独加载库的副本从而节省内存资源;

2024-06-14 13:26:37 950 1

原创 『 Linux 』动态库的加载

动态库和静态库是软件开发中两种主要的代码库链接方式;其中动态库在程序运行时被加载并允许代码在物理内存中只有一份拷贝而被多个进程共享从而减少系统资源的消耗;相比之下,静态库在程序编译时被整合进可执行文件;导致每个程序都包含了一份库的副本,增加了程序的大小和内存占用;动态库的管理依赖于操作系统中的结构体,如link_map;它记录了库的加载地址,名称等信息,确保动态链接和库间依赖关系的正确处理;通过高效地管理和加载动态库,系统能够提高内存使用效率,简化库的更新过程,并支持跨进程的库共享;

2024-06-13 17:39:18 785

原创 『 Linux 』动静态库的创建与使用 ( 万字纯干货 )

在某些情况下,如果用户只提供了静态库而没有提供对应的动态库,链接器将不得不使用静态链接.但这也取决于编译时的具体指令和可用的库;同样类似于标准库的库文件也已经在系统中被安装,若是没有指定目录则会去默认路径(当前路径或是系统安装库文件的目录)中查找;静态库在编译时已经被链接到可执行文件中,故运行时不需要动态加载库文件,因此启动速度较快,运行时性能较好;静态库在编译时被嵌入到应用程序中,因此生成的可执行文件不依赖于外部的库文件;目标用于删除所有编译生成的文件,包括静态库,动态库,目标文件以及发布后的。

2024-06-13 00:34:38 728

原创 『 Linux 』内存管理与文件系统

页是虚拟内存中的一个固定大小的块,时进程地址空间中的最小单位;

2024-06-06 17:23:52 934

原创 『 Linux 』目录与软硬链接 (万字详解)

根目录也是一个目录,也是一个文件,在文件系统中有自己的Inode编号和属性,通常在创建一个文件系统时会创建对应的根目录,并在其InodeTable表中维护根目录的Inode信息;如果在Dentry缓存中找到目录项,文件系统可以直接使用缓存中的Inode编号找到对应的Inode信息从而无需从磁盘中重新依次读取目录项;在目标目录中创建一个新的目录项(dentry),将新文件的名称与分配的inode关联起来;目录是文件,其Inode中的指针数组中数组中指针指向的数据块中存放的数据为目录项;

2024-06-04 15:33:45 917 2

原创 『 Linux 』文件系统

文件元数据主要保存在Inode中。Inode,也被称为索引节点,是Unix和类Unix操作系统中的一种数据结构,它用于存储有关文件系统上的文件的元数据,但不包含文件名或数据内容。每个文件都有一个与之关联的Inode,包含了文件的大小、文件的所有者和权限信息、文件的创建、访问和修改时间等信息。

2024-06-01 19:21:39 1071 1

原创 『 Linux 』缓冲区(万字)

缓冲区(Buffer),顾名思义就是一块可以用于缓存的空间;也可以说实际上缓冲区是一种临时存储区域,一般用于在数据传输过程中对数据的缓存;缓冲区的主要目的是协调数据产生者和消费者之间的速度差异以提高系统的效率和性能;那么具体什么是缓冲区?存在几个例子:下文中所出现的例子都将使用两种方式(直接运行 ,重定向至文件当中)以便于区分两种情况的不同之处;[例1]// C标准库接口// 系统调用接口return 0;在这段代码当中分别用了C标准库接口与系统调用接口分别对不同的massage。

2024-05-31 17:10:04 753

原创 『 Linux 』“ 一切皆文件 “

同时,通过设备文件和文件操作表的抽象,使得不同的硬件设备能以一致的接口暴露给用户空间的程序,大大提高了程序的可移植性;驱动程序是系统内核的一部分,是一种较为特殊的软件,负责管理和控制特定的硬件设备,当用户空间的程序通过设备文件发起请求时,相应的驱动程序会接收到这个请求并执行必要的操作以与硬件设备进行交互;目录当中的特殊文件,代表系统中的硬件设备,这些文件为用户空间的程序提供了一个接口,用户可以通过这些接口程序给驱动程序发送请求,从而间接的调用硬件;操作系统会打开请求的设备文件;

2024-05-16 16:56:11 1002

原创 『 Linux 』重定向 Redirect(万字)

重定向是计算机编程和操作系统重的一个概念;一般指的是改变数据流的方向或将程序的输出从一个位置转移到另一个方式;一般在shell当中的重定向有标准输出重定向标准错误重定向标准输入重定向在博客『 Linux 』进程替换( Process replacement ) 及 简单Shell的实现(万字)当中实现了一个简易的Shell;但总体来说,这个简易的Shell写的并不好;无论是从代码结构,可读性,拓展性等等;1024// 命令行缓冲区大小3233// 获取环境变量为标识符/**/

2024-05-14 15:41:08 437 1

原创 『 Linux 』基础IO/文件IO (万字)

在计算机当中,I/O即为输入和输出的英文缩写版,;而在计算机当中,任何与输入输出有关的操作都可以被称作为IO,例如简单的对于设备上的将信息以打印的方式在显示屏(终端)中进入显示或者是在文件的读写操作都可以被看成是一种IO行为;一般在计算机系统当中,IO基于硬件层面的IO基于软件层面的IO网络IO设备IO内存IO标准输入/输出数据库IO进程间通信本篇博客以CentOS7.6为例。

2024-05-07 13:32:43 816 1

原创 『 C++11 』右值引用(万字)

在C++早期当中,位于赋值符号左侧的变量被称为左值;而在C++11左值(Left Value)左值的定义不再仅仅与赋值符号有关,左值实际上是指具有标识符的对象,且可以取地址并且可以进行引用,通常左值具有确定的内存位置;a1 = b1;//在C++11之前该种情况下a1为左值b1为右值//但在C++11后的概念当中 a1与 b1都为左值//--------// 以下的p b c *p皆为左值int b = 1;//对上面的左值进行引用return 0;在早期的C++

2024-04-17 16:05:04 560

原创 『 Linux 』进程替换( Process replacement ) 及 简单Shell的实现(万字)

而在进程替换当中可以完美的对上面的理论进行一个反驳,即并不是每个程序加载到内存当中都会新生成一个对应的进程;以该图为例,该图中一个正在执行的进程经过了进程替换,将磁盘中的程序的代码和数据加载到了被替换的进程对应的。表示要执行的可执行文件的名称,该参数可以是一个简单的文件名而不需要包含完整的路径;该函数的功能为执行指定的路径下的可执行文件,并用传递给它的参数替换原有的程序;表示要执行的可执行文件的名称,它可以是一个简单的文件名而不需要包含完整的路径;

2024-03-14 20:30:20 1113 3

原创 『 Linux 』Process Control进程控制(万字)

进程控制是一种在操作系统上对进程进行管理和调度的一个过程;这包括创建进程,终止进程,等待进程,暂停和恢复进程,进程间的通信和调度进程等待;在之前关于Linux的内容中谈论了大量的关于进程的内容;本文将重点对于基础进程控制进行一定的讲解;

2024-03-07 23:40:51 989

原创 『 C++ 』海量数据处理

故数据中必然存在大量的重复数值,而位图当中可以精确计算数据对应的是否存在问题,其最大数据为。再次遍历另外一个文件,当遇到相同值时保存该值(该数据为交集),并将该数据对应的映射置为。但是若是将文件进行平均切分,在遍历时只能采用暴力枚举的方式,对于检查的效率将会低至。位图可进行映射与去重的操作,可将两个文件遍历并映射至位图当中进行去重;当出现抛该异常时说明在遍历小文件的过程中某个文件中的数据量过大;当出现抛该异常时说明在遍历小文件的过程中某个文件中的数据量过大;

2024-02-18 18:37:24 1098 1

原创 『 C++ - STL 』位图(BitMap)与布隆过滤器(Bloom Filter)

腾讯曾经有一道面试题是这样的:存在40亿个不重复的无符号整数,其中这些数据并未排过序;给定一个无符号整数,如何快速判断这个数是否存在于这40亿个数中;很显然,这个面试题问的是一个数据在不在的问题;那么如何能够对数据进行判断在不在的问题?遍历数据逐个判断遍历数据逐个判断可以理解为一种暴力的解法,这种暴力的解法通过枚举的思路对数据逐个查询;但实际上该方法的时间复杂度为O(N)[由于需要遍历整组数据]......;

2024-02-15 20:10:24 1185 1

原创 『 C++ - STL 』unordered_xxx系列关联式容器及其封装(万字)

unordered系列关联式容器在C++11标准中被首次引入,与有序容器不同,unordered系列的关联式容器并不会去维护数据中各个元素的顺序,由于该系列容器为哈希表实现,所以整体的存储顺序是由哈希函数决定的,可以在一些不需要对数据进行排序的场景下提供更快的性能;

2024-02-06 17:45:04 1530 3

原创 『 C++ - Hash 』闭散列与开散列哈希表详解及其实现 ( 万字 )

哈希表是一种常用的数据结构,该数据结构往往能存储大量的数据,在C++当中,底层为哈希表的容器最常见的为unordered_xxx系列,例如unordered_map与unordered_set,这两个容器是在C++当中以哈希表为底层的关联式容器,具体的关联式容器的特点参照上篇;哈希表通过一个叫做哈希函数(Hash Function)的算法,将存储的每个数据项与一个唯一的键值(key)进行绑定;这个函数会将每个键值映射到哈希表中的一个位置,以便对数据进行快速访问;

2024-02-04 23:50:53 1123 3

原创 『 C++ - STL』map与set的封装 ( 万字 )

map与set分别是STL中的两种序列式容器;它们是一种树形数据结构的容器,且其的底层构造为一棵红黑树;而在上一篇文章中提到,其实红黑树本身就是一棵二叉搜索树,是基于二叉搜索树的性质对其增加了平衡的属性来提高其综合性能(包括增删查改);当然也提到了红黑树与AVL树的区别:AVL树AVL树是一棵高度平衡搜索二叉树,其特点即为在搜索二叉树的基础上根据控制结构达到了最终的属性;即为,每一个节点的左右子树的高度差不超过1;红黑树红黑树是一棵近似平衡的二叉树,其特点为根据树的颜色(红色或是黑色)

2024-01-20 18:37:00 1027

原创 『 C++ 』红黑树RBTree详解 ( 万字 )

AVL树AVL树采用的是利用平衡因子来控制;红黑树红黑树采用的是以颜色来判断树的结构;由上文概念中几个规则可能引出一个问题:红黑树中的新节点应该是什么颜色?黑色?红色?如果一个节点为红色,其两个孩子节点必定为黑色;对于每一个节点,从该节点到所有后代叶节点的简单路径上,都包含相同数目的黑色节点;根据这两个规则进行引入,权衡利弊可以发现新节点无论是黑色还是红色都有可能违反两条规则中的其中一条规则;但是对于两条规则的违反代价来说,新节点为黑色的代价要高于新节点为红色的代价;

2024-01-17 17:32:44 1349 1

原创 『 C++ 』AVL树详解 ( 万字 )

从上文可知,AVL树可以看作是一棵搜索二叉树,其为基于搜索二叉树在此基础上对树做了平衡的操作使其在结构上变得平衡不至于在极端情况下出现"歪脖子树"的情况;AVL树的定义与平衡搜索二叉树的结构上呈现类似;//将节点进行typedefpublic:protected:private://节点指针该篇文章中重点实现AVL树中的插入操作;

2024-01-15 23:00:27 790 1

原创 『 C++ 』二叉树进阶OJ题

中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(该题的解题思路与上一题二叉树的中序遍历如出一辙,即也是通过将树分为左路节点与左路节点的右子树的方式;由于也是按照左路节点与左路节点的右子树的左路节点将问题化为子问题进行迭代的思路,所以。的特性将数据进行存储,并且反向拿出,即以该树的左路节点为例,将左路节点全部入栈,的方式判断左右两个子树,当节点访问至两个节点的其中一个节点时返回该节点;

2023-12-21 12:33:08 896 12

原创 『 Linux 』重新理解挂起状态

​挂起状态相比于其他状态来说,挂起状态与CPU并没有太直接的关系;在计算机的磁盘当中,存在着一个swap分区,这个分区就是为了当内存不足时使进程状态转化为挂起状态而准备的;​在队列当中的进程不仅仅是PCB结构体,由于各个进程要通过使用资源来操作自身的代码及数据可以得知一个进程中除了PCB结构体以外还包含着对应的代码以及数据;

2023-12-14 21:26:51 518 16

原创 『 Linux 』进程地址空间存在的意义

在文章『 Linux 』进程地址空间概念中提到了进程地址空间的部分概念;这部分概念主要围绕进程地址空间到底是什么;在实际中,进程地址空间是一个进程的数据结构,这个数据结构的作用是模拟出虚拟地址;当一个进程需要访问物理内存时必须经过进程地址空间获取其虚拟地址通过页表找到页表中所映射的物理地址,才能对需要的物理地址中的数据进行操作;这样的操作流程一定程度上保证了进程间与物理内存的安全性;

2023-12-13 17:05:40 222 7

原创 『 Linux 』进程地址空间概念

在c/C++中存在一种内存的概念;一般来说一个内存的空间分布包括栈区堆区代码段等等;且内存是自底向上(由0x00000000至0xFFFFFFFF以该图为例:该图即为常见的内存分布图;正文代码段正文代码段所存放的数据一般为函数体的二进制代码;已初始化数据区已初始化数据区所存放的数据是在程序中声明的,并且具有初始值的变量,这些变量需要占用存储器的空间;未初始化数据区未初始化数据区所存放的数据是没有进行初始化或者初始值为0的数据,这些数据在存储时不需要额外占用存储器的空间;堆堆空间一般为动态空间。

2023-12-12 10:16:42 389 26

原创 『 C++ 』BinarySearchTree搜索二叉树

二叉树顾名思义即为一个树中节点的度不大于2的有序树,是树中结构中较为简单的一种;其特点为一个节点中分为两个子树;通常可以以二叉树进行分治的思路对问题进行解决(递归或非递归);但在实际中普通二叉树由于在数据存储方面中并没有明显的特性,所以在实际中普通二叉树的应用场景并不多;BinarySearchTree二叉搜索树,顾名思义这种类型的二叉树对搜索有着比较大的优势;

2023-12-08 01:01:28 398 11

原创 『 MySQL数据库 』聚合统计

在MySQL中存在一种查询方式叫做聚合查询;聚合查询顾名思义就是将一组数据的同种类型进行聚合,那么既然是一组同类型的数据那么即必须要对该数据进行分组同时再对这组数据进行聚合;将数据进行分组;将数据进行聚合统计;需要配合SELECT语句进行使用;

2023-12-06 13:56:45 721 19

原创 『 Linux 』环境变量

在c/C++当中,根据不同程序的需要,我们需要为该程序定义某些变量int _data;这些变量本质上就是一段内存空间,用来存储程序需要的值或数据;而在OS中,OS本身在运行当中也需要一些必要的值或者数据,所以在OS当中也会存在一些变量用来存储这些所谓必要的值或者数据参数;本质上来说环境变量(environment variables)一般是指操作系统中指定操作系统运行环境的一些参数;PATH指定命令的搜索路径;HOME指定用户的主工作目录(即用户登陆到Linux系统当中时的默认路径);

2023-12-02 00:18:20 511 18

原创 『 MySQL数据库 』插入查询结果

在MySQL数据库中不仅可以直接根据字段类型等对数据进行插入以外还可以插入以类似语句筛选查询出的字段;通过该手段可以配合表的RENAME操作可以对表进行一个拷贝或者是去重等操作;

2023-11-29 16:30:10 284 4

原创 『 MySQL数据库 』CRUD之UD,表的数据更新(修改)及删除

对于对表内数据的操作来说,无论是UPDATE还是DELETE与TRUNCATE对整表进行操作都应该注意;尽量在对表内数据修改或删除前对需要修改\删除的数据使用SELETC进行查看,避免误操作;

2023-11-29 13:27:53 125

原创 『 Linux 』进程优先级

优先级,顾名思义,即在同一环境下不同单位对同一个资源的享有顺序;一般优先级高的单位将优先占有该资源;在进程当中进程与进程之间也同样具有优先级,以占用CPU资源为例,其优先级高的进程将优先享有使用CPU资源的权力;在计算机当中,由于CPU是有限的资源,当同时存在较多进程时将会需要以某种特定的方式竞争以使得能够优先对该资源进行使用,不仅是CPU,例如磁盘资源等都是有限的;本质上进程中的优先级只是其进程的PCB结构体中的某个属性调度器通过进程的优先级属性判断这个进程是否能优先占用某些资源;

2023-11-28 23:34:59 219 4

原创 『 Linux 』僵尸进程与孤儿进程

僵尸进程在维持僵尸状态的同时将会一直维护其PCB结构体,若是系统中存在大量的僵尸进程将会严重的占用内存资源;将一个子进程在运行时,其父进程若是在子进程结束之前先结束,这个子进程将会成为孤儿进程;,可以将这个进程理解为操作系统,统称一个进程的父进程死亡后其将变成孤儿进程,而它的。读取到了它的僵尸状态,将会进行一定的操作对其进行回收,此时这个进程将。在该子进程的父进程结束后子进程将继续运行,并继续进行打印;从上面的代码段可知,当父进程被结束后,其子进程的。而僵尸进程的概念即为,当进程退出时其并。

2023-11-28 16:49:15 227 3

原创 『 MySQL数据库 』表的增删查改(CRUD)之表的数据插入及基本查询

查询为结果的字段进行改名时,这个操作一般是靠后的,即将数据处理完后将其打印时才能将其进行改名,所以不能先进行改名再将其进行其他操作;当插入数据时发生主键冲突或者唯一键冲突时使用这个语法时将会将原本的数据删除并以新的数据进行插入并替换该数据;指定了需要插入数据的字段,在插入数据时根据所指定字段的顺序以及对应的要求对表进行数据的插入;以该表为例,若是需要为该表插入数据,插入数据的方式分为全列插入与指定列插入;单行数据插入即在解释全列插入与指定列插入所使用的数据插入;

2023-11-25 15:04:07 399 6

原创 『 C++类与对象 』多态之单继承与多继承的虚函数表

多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种:单继承多继承棱形继承棱形虚拟继承不同的继承方式其虚表的形式也不同;以下操作均为在CentOS7_x64机器上的操作。

2023-11-23 20:26:54 163 9

原创 『 Linux 』使用fork函数创建进程与进程状态的查看

在『 Linux 』进程概念中了解到了操作系统对于进程的管理也是使用了"先描述后组织的方式ps只能查看当前渠道内的进程,若是需要查看所有进程应该加上修饰,即使用来查看进程;top命令更像是Windows下的任务管理器,一般用来观察内存当中占用较大的那个进程;ls /proc使用ls命令以目录的形式来查看进程;

2023-11-22 00:19:35 272 15

原创 『 C++类与对象 』虚函数与多态

多态对通俗的概念来说就是一个事件被多种类型的角色触发从而产生的不同结果称之为多态;就以学校为例;老师进学校是为了教课;学生进学校是为了上课;不同的角色对同一个事件的触发从而产生出不同的结果;多态是在不同继承关系的类对象去调用同一成员函数所产生的不同行为;在虚函数中有一种特殊的虚函数为纯虚函数,纯虚函数即为只有一个虚函数的声明但是虚函数未定义且函数名后跟=0即为纯虚函数;语法 –而包含纯虚函数的类被称为抽象类,也叫做接口类;抽象类不能被实例化出对象。

2023-11-20 17:17:54 112 8

原创 『 MySQL数据库 』数据库之表的约束

数据库是一个用来管理、组织、存储数据的一个工具,一个数据库可以存放大量的数据,而为了存放这些数据并将这些数据进行组织,那么为了便于组织和管理,所存储的数据必然要使用分区以特定的格式进行存储;而对于各个用户来说用户不一定会将所存储的数据以特定的形式表标准准的进行存放,为了能使用户以更加正确的方式进行存放,数据库中有了一个为表的约束的概念;表的约束实际上约束的是用户,使用户必须以规定的格式或者类型才能将数据存放进数据库;

2023-11-18 20:16:39 446 9

原创 『 Linux 』进程概念

而若是在计算机当中添加存储器后,可以使得外设中的数据通过操作系统率先load(加载)至存储器中,而又由于存储器与CPU的读写速度相差跨度并不是特别大,所以当数据加载至存储器当中CPU可以直接访问存储器从而加快计算机整体的速度;当然这句话说的并不全面,对于"当一个程序被运行时,必须将改程序先加载到内存当中",事实是如此,但这仅仅只是以硬件的角度进行观察,真正意义上来说,当一个程序被运行起来之后,它将被加载进内存成为进程的一部分,而操作系统通过进程管理可以完成对这个进程的资源管理;

2023-11-10 18:30:14 383 4

原创 『 C++类与对象 』多继承与虚继承

如果从上个例子不能很好的观察到所谓的数据冗余和二义性的问题,接下来我将再举一个例子,并以GDB调试的形式观察其中的问题;,假设一个基类拥有多个派生类,并在多次继承之后又将其若干个派生类(或者其子类)多继承了一个派生类即为棱形继承;之间的内存中其中一处所存储的为一个指针,而该指针指向的位置也存储了一个指针,而这个指针正是存储偏移量。当需要对虚继承中共有的成员数据进行操作时将以特定的形式对这个共有的数据进行访问;的版本中,就提出了多继承的概念,多继承允许一个派生类是由多个基类继承而来;

2023-11-09 17:34:56 107 3

oracle9i经典测试用表

该表用于MySQL中的增删查改练习等;

2023-12-06

oracle9i经典测试用表

该测试用表为Oracle9i的一个经典测试用表,雇员表; 该表可以用来进行对数据库的增删查改的联系操作; 请在MySQL中使用"SOURCE /路径"的方式进行使用

2023-12-06

空空如也

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

TA关注的人

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