自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux TCP网络套接字

对比 UDP 服务器,TCP 服务器多了获取新链接和监听的操作,而因为 TCP 是面向字节流的,所以接收和发送数据都是 IO 操作,也就是文件操作。

2025-04-01 10:37:49 1038

原创 Linux 云服务器开放端口

这里先点手动添加,再看自己是UDP还是TCP协议,找到对应的协议,目的就填你想开放的端口,源填所有IP/4 0.0.0.0 添加备注点击保存就开放好了。首先找到你买服务器的官网,我这里是阿里云。

2025-03-26 21:53:36 222

原创 Linux UDP网络编程套接字sockets

在学校我们用学号,相比于身份证更简便,假如我的学号是2211211023,这样就能看到我是22级的,方便阅读信息。但是,这两个结构体都不用,我们用 sockaddr。网络通信的本质是进程间通信,有了 IP 就可以标识公网内唯一的一台主机,想要完成网络通信我们还需要一个东西来标识一台主机上的某个进程,这个标识就是端口号(port)。三种应用场景:网络套接字主要运用于跨主机之间的通信,也能支持本地通信,而域间套接字只能在本地通信,而原始套接字可以跨过传输层(TCP/IP 协议)访问底层的数据。

2025-03-25 20:27:17 762

原创 Linux 网络预备知识

在计算机网络通信中,报头(Header)是一部分数据包的固定结构,它包含了关于该数据包的元信息和控制信息。报头位于数据包的前部,用于标识和管理数据包的传输。报头通常由多个字段组成,每个字段用于存储特定类型的信息。下面是一些常见的报头字段及其功能:目标地址字段:指示接收数据包的目标设备或主机的地址。这个地址可以是物理地址(如:MAC 地址)或逻辑地址(如:IP 地址)。源地址字段:标识发送数据包的源设备或主机的地址。

2025-03-23 17:40:42 954

原创 Linux 多线程-生产消费者模型&线程池&线程单例模式&其他

目录一、生产消费者模型1、模型概念2、基于 BlockingQueue 的生产者消费者模型3、C++ queue 模拟阻塞队列的生产消费模型【代码】(1)单纯生产数据1.0版本(2)加入任务结构体2.0版本 (3)wait误唤醒(4)多生产多消费3.0版本4、POSIX信号量(1)初始化信号量(2)销毁信号量(3)等待信号量(4)发布信号量 5、基于环形队列的生产消费模型并入信号量(1)架构(2)单生产单消费代码1.0(3)多生产多消费代码2.0(4)结论二、线程池1、概念2、线程池的应用场景3、代码三、线

2025-03-22 14:07:06 1225

原创 Linux 锁、线程同步

我们把tickets--自减操作细分为三步。

2025-03-19 19:44:27 1075

原创 Linux 线程控制

而这些都是线程库在做的事情,也就是线程的概念是库给我们维护的,我们用的原生线程库,也要加载到内存中,因为都是基于内存的。我们的线程库只需要维护线程的概念即可,不用维护线程的执行流,不过线程库注定了要维护多个线程属性集合,线程也要管理这些线程,先描述在组织。这是因为新线程内部执行进程替换函数,这看起来像是把新线程中的代码替换了,但实际会把主线程中的代码也替换了,因为主线程和新线程共享地址空间,所以新线程内部进程替换后,所有的线程包括主线程都会被影响。参数是void*,和这个函数的返回值的含义是一样的。

2025-03-16 23:31:59 1271 1

原创 Linux 线程概念

如上是是一个用户级页表,在我们学习进程的时候,我们知道进程=PCB+mm_struct+页表,进程通过用户级页表映射物理内存的方式来找到磁盘或内存中的数据。如果我们再创建一个进程,那么这个进程也有属于自己的PCB、地址空间、页表。

2025-03-15 09:35:41 674

原创 Linux 进程信号的捕捉&&信号补充内容

从内核态返回到用户态之前,OS 会做一系列的检测捕捉工作,它会检测当前进程是否有信号需要处理,如果没有就会返回系统调用,如果有,那就先处理(具体它会遍历识别位图: 假如信号 pending 了,且没有被 block,那就会执行 handler 方法,比如说终止进程,那就会释放这个进程,如果是暂停,那就不用返回系统调用,然后再把进程 pcb 放在暂停队列中,如果是忽略那就把 pending 中对应的比特位由 1 变为 0,然后返回系统调用)。用户态和内核态的权限级别不同,那么自然能看到的资源是不一样的。

2025-03-12 18:21:29 878

原创 Linux 进程信号

提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数)我们在上面写的Ctrl+c实际是给该进程发2号信号。我们接下来写个代码测试一下。我们先认识一个接口。

2025-03-11 19:39:33 1161 1

原创 Linux 消息队列&&信号量

我们讲进程通信,本质是让不同的进程看到同一份资源。我们已经给大家介绍了管道,共享内存,接下来我们给大家简单的介绍一下消息队列。

2025-03-04 11:27:35 1052

原创 Linux 共享内存

我们之前提到过,进程通信是让两个不同的进程看到同一份资源,所以我们给大家讲解了匿名管道和命名管道。今天我们还有一种方式两个不同的进程看到同一份资源。那就是共享内存!二、共享内存原理我们先来看这张图,我们在物理内存创建一个共享区,我们再让两个不同的进程通过页表分别映射到对应的共享区里,然后返回虚拟地址的起始地址。这就是共享内存,我们总结分为三步申请内存。将该内存挂接到进程地址空间的共享区。返回虚拟地址首地址。以上我们就创建好共享内存了,那我们该如何释放共享内存呢?

2025-03-01 14:20:30 1093

原创 Linux 日志系统·

当我们写一个函数,例如打开文件open,当我们打开失败的时候,会调用perror看到错误信息。接下来我们将带大家了解日志,并自主实现一个日志系统。这个就是我们定义的日志类的对象。

2025-02-26 17:41:31 1073

原创 Linux 命名管道

我们之前讲的管道只能有血缘关系的进程进行通信。这个管道是匿名管道。这节博客,我们将为大家讲解命名管道。

2025-02-25 19:07:31 742

原创 Linux 管道的应用场景

我们之前写过一段指令,这是我们之前用的管道。当我们用管道级联起这些命令的时候,每一个命令最终都会被变为一个进程。这些进程的父进程都是同一个,我们可以去看一下这个父进程是什么东西这些sleep进程,他们的父进程是bash进程。有血缘关系,能够进行通信。那我们也可以通过这样的例子,写一个简易版的进程池。

2025-02-25 13:16:52 986

原创 Linux 进程通信——管道

进程通信是两个或多个进程实现数据层面的交互。因为进程具有独立性,导致进程通信的成本比较高,因为要打破进程的独立性。

2025-02-22 15:01:32 1485

原创 Linux 进程地址空间第二讲&&动态库地址

当我们创建一个进程的时候,进程里有一个进程地址空间,也会创建一个页表,页表里储存虚拟地址和物理地址的映射。那什么是虚拟地址,什么是物理地址呢?文件加载到内存时,CPU的作用是什么呢?

2025-02-20 16:44:50 1082

原创 Linux 动静态库

动态库:libc.so libc++.so。静态库: libc.a libc++.a。在命名的前缀lib和后缀so/a去掉就是库名,所以这是C/C++的动静态库。C/C++ 体系中如何使用别人的功能?生成可执行的方式有静态链接和动态链接,对应的是静态库和动态库。比如,张三是一名大一新生,他在写作业时突然有了一个上网的需求,但因为周边环境不熟悉,所以找了学长询问附近网吧的地点,随后就跑去玩了几个小时,然后回来后接着继续写作业,这就叫作动态链接。

2025-02-19 19:29:03 1258

原创 Linux 内存管理与文件页缓冲区

总之上面的过程其实就是下面的这张图也就是说,操作系统里面也有一个文件缓冲区,最后它会被刷新到磁盘上去上面的过程,我们就把打开文件和文件系统的文件 产生关联了!我们也可以发现,这里一共要经历三次拷贝,第一次将数据写入到C语言缓冲区中,第二次将数据从C语言缓冲区写入到文件缓冲区中,第三次是写在磁盘当中去。

2025-02-17 20:03:34 971

原创 Linux 文件系统&&inode&&软硬链接

在我们电脑文件里,分为打开的文件和未打开的文件,我们在上几篇文章给大家介绍了打开的文件,现在我们重点介绍。我们知道打开的文件是通过操作系统被进程打开,一旦打开,操作系统就要维护多个文件,所以它是需要被操作系统管理的。也就是说这种方式,磁盘上和内存上都有这个文件,它们不是完全一样的,;而普通的未打开的文件在磁盘上,未被加载到内存中,它当然也要被管理;其中管理打开的文件和管理未打开的文件在操作系统中有一个功能模块叫做。

2025-02-17 13:28:59 802

原创 Linux 基础IO——重定向和缓冲区

很明显依靠函数原型,我们就能认为 dup2(1, fd),因为 1 是先打开的,而 fd 是后打开的.可实际上并不是这样的,文档中说 newfd 是 oldfd 的一份拷贝,这里拷贝的是文件描述符对应数组下标的内容,所以数组内容最终应该和 oldfd 一致。可这段代码中,执行到close(1)时,还没有调用write讲数据写入到1号文件描述符,就把对应的显示器文件描述符关闭了,此时的数据还在用户级缓冲区,刷新时显示不出来。,所以当你父进程准备刷新的时候,子进程也就有了同样的一份数据,随即产生两份数据。

2025-02-14 21:02:27 885

原创 Linux 文件、文件描述符

从广义上理解,键盘、显示器、网卡、声卡、显卡、磁盘等几乎所有的外设都可以称之为文件,因为 “Linux 下,一切皆文件”。从狭义上的理解,文件在磁盘(硬件)上放着,只有操作系统才能真正的去访问磁盘。磁盘是一种永久存储介质,不会受断电的影响,磁盘也是外设之一,所以对文件的所有操作都是对外设的输入输出,简称 IO(Input、Output)。

2025-02-10 20:53:19 991

原创 Linux 进程控制

通过 exec* 函数,把磁盘中的其它程序(代码+数据)加载到内存中,替换当前进程的代码和数据,让页表重新构建映射关系,这期间不会创建新的进程。

2025-02-01 19:21:37 1266

原创 力扣017_最小覆盖字串题解----C++

ht:ABA,cnt=2 因为我们要找的是最小覆盖字串,且包含了A有效字符,所有这个时候我们的左窗口右移,并且减去一个A。当我们的cnt 有效字符等于t.size()的时候,也就是这个窗口包含了t字符串的所有。,并且对应的个数都大于或等于t 的哈希表中各个字符的个数,那么当前的窗口是「可行」的。如果hs[s[l]]>ht[s[l]],说明hs里面已经存在两个相同的有效值了,如下图。我们定义两个指针,作为遍历s的窗口,再定义一个cnt作为窗口内的有效字符。如何判断当前的窗口包含所有 t 所需的字符呢?

2025-01-31 15:18:54 547

原创 Linux 进程地址空间

对大文件的分批加载,先把所有对应的虚拟地址填上,在页表里有一个标志位(标志对应的代码和数据是否已经被加载到内存),再根据标志位的"0"(未加载到内存),页表对应的物理内存暂时先空着,"1"则在页表填入物理地址。因为地址空间和页表是 OS 创建并维护的,也就意味着凡是想使用地址空间和页表进行映射,也就一定要在 OS 的监督之下来进行访问,也保护了物理内存中的所有合法数据,包括各个进程,以及内核的相关有效数据。划分成了一个个的区域,通过设置结构体内的 start 和 end 的值来表示区域的起始和结束。

2025-01-27 23:03:45 671

原创 Linux 环境变量

目录一、环境变量的基本概念 1.常见环境变量 2.查看环境变量方法​3.几个环境变量环境变量:PATH 环境变量:HOME环境变量:SHELL二、和环境变量相关的命令 三、库函数getenv,setenv四、环境变量和本地变量 五、命令行参数1.main 函数可以带参数吗?能带几个参数呢?2.命令行参数的意义 六、环境变量的组织方式 1、通过 main 的第三个参数获取环境变量2、通过全局变量 environ 获取环境变量在我们学习JAVA,Python我们都要在windows上配置环境变量。环境变量的概

2025-01-25 20:57:33 2059

原创 Linux进程 -fork(初识),进程状态和进程优先级

平时创建进程一般是通过 ./myproc 运行某个存储在磁盘上的可执行程序来创建。而我们还可以通过系统调用接口来创建进程。pid_t是无符号整型。我们先看一段代码。

2025-01-25 13:52:31 786

原创 Linux 进程概念

在Linux中,每个执行的程序叫做进程,每一个进程都有一个id号。在window系统中,我们打开任务管理器就能看到,下面都属于一个个进程。那操作系统该如何管理进程呢?在我们上篇博客已经写到先描述,后组织。由操作系统先把进程的结构体描述出来,这个结构体对象叫做进程控制块(PCB,Processing Control Block),里面几乎包含了所有的进程属性信息,并在内部有一个指针指向该进程的代码及数据。

2025-01-24 13:31:15 1254

原创 Linux 进程前篇(冯诺依曼体系结构和操作系统)

复习

2025-01-16 21:28:14 1422

原创 Linux项目自动化构建工具-make/Makefile

上一期我们讲了vim编辑器,gcc/g++编译器。我们每次写完代码的时候都要输入指令,会很麻烦。尤其在大型项目中,有很多源代码,编译就十分复杂,本篇文章将介绍Linux环境下的项目自动化构建工具——make/makefile。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。makefile。

2025-01-15 17:47:01 1124

原创 Linux开发工具--vim编辑器-gcc/g++编译器-gdb调试器

最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。

2025-01-11 19:57:05 1446

原创 Linux 基本指令

在 more 的时候,我们并没有办法向前面翻, 只能往后面看但若使用了 less 时,就可以使用 [pageup][pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!-a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。

2024-12-27 16:44:57 1303

原创 C++ 智能指针

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

2024-11-06 13:14:45 916

原创 C++11

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2024-10-29 15:16:05 956 1

原创 C++ 位图和布隆过滤器

位图结构:无符号整数的范围是:0~2^32-1,所有无符号整数的范围(种类)为42亿9千万(2^32)左右,我们使用位图,位图的每一位对应与一个无符号整数的种类,一共需要2^32bit=0.5GB。将每个比特位扩展为一个小的计数器,当插入元素时,该哈希地址对应的计数器加1,删除的时候减1。假如我们把上面的IP1删除,因为IP2对应的比特位和IP4对应的比特位有相同的,所以当IP1被删除后,IP2也会被认为“删除”。位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。

2024-10-20 14:12:18 893

原创 C++ 哈希桶和封装unordered_map和unordered_set

编译器根本不认识_pht前面的代码前置声明。

2024-10-16 11:29:48 1076

原创 C++ 哈希表

这是因为在链地址法中,待比较的关键字都是具有相同哈希地址的元素,而在开放地址法中,待比较的关键字不仅包含具有相同哈希地址的元素,而且还包含哈希地址不相同的元素。这样在插入关键字的时候,我们只需要通过哈希函数 Hash(key) 计算出对应的哈希地址 i,然后将其以链表节点的形式插入到以 T[i] 为头节点的单链表中。使用伪随机数序列:假设伪随机数为 9,则得到下一个地址 H(1) = (9 + 5) % 11 = 3,3 对应的地址为空,处理冲突过程结束,记录填入哈希表中序号为 3 的位置。

2024-10-16 00:04:22 1051

原创 C++ 红黑树封装map和set

map 和 set 的底层本质上还是复用,。在改造红黑树的时候,我们将会面对几个问题。

2024-09-26 18:20:47 1157

原创 C++ 红黑树

目录1.红黑树的概念2. 红黑树的特性 3.红黑树的效率4.红黑树节点的定义5.红黑树的插入操作6.红黑树的验证7.红黑树和AVL树的对比 在讲解红黑树性质之前,先简单了解一下几个概念:首先,红黑树是一个二叉搜索树,它在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK;通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的二倍,因而近似平衡(最短路径就是全黑节点,最长路径就是一个红节点一个黑节点,当从根节点到叶子节点的路径上黑色节点相同时,最长路径刚好是最短路

2024-09-24 16:01:18 902 1

原创 C++ AVL树

{}// 该节点的左孩子// 该节点的右孩子// 该节点的双亲T _data;int _bf;// 该节点的平衡因子。

2024-09-15 16:35:22 1328

空空如也

空空如也

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

TA关注的人

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