- 博客(68)
- 收藏
- 关注
原创 MySQL 数据库基础
数据库是一种专门用于存储、管理和操作数据的系统,相较于普通文件,数据库在数据管理、安全性、查询效率和海量数据处理方面具有显著优势。文件存储存在安全性低、查询不便、管理困难等问题,而数据库通过结构化存储和高效查询机制解决了这些问题。常见的数据库包括MySQL、Oracle、SQL Server等,其中MySQL因其并发性好、易用性强而广泛应用于电商、社交等领域。数据库的核心功能包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)。MySQL采用客户端-服务器架构,支持多种存储引擎
2025-05-14 14:27:53
930
原创 C语言模糊不清的知识
\为一个转义字符算1个字节,123456算6个字节,\123是一个八进制的转移字符算1一个字节,剩下的456\t算4个字节,总共是12个字节。用于创建类型别名的关键字,仅定义类型别名,不分配内存。这是编译器的行为,有类型的检查,作用域受限。malloc底层实现:是调用系统的接口,小内存块利用堆扩展高效管理,大内存用mmap,减少碎片。static修饰的全局变量的链接属性为内部链接,仅限当前文件可见,禁止跨文件访问。数组名是以单个元素为单位,&数组名是以整个数组为单位,他们的数组首地址相同。
2025-05-10 16:27:54
1030
原创 滑动窗口算法(一)
这里我们要移除一个数并且将这个数组完整相当困难,我们可以转变一下思想,这道题想让我们移除的数相加等于这个X,那我们可不可以先算一下这个数组每个元素相加的总数是多少,再把这个总数减去X,所以就转化成数组内相加的数等于sum-X的,并使这个窗口包含的数字够多。right不断遍历,并把right指向的字符记录在hash中,当遇到图上的情况,此时hash中的‘a'字符存在2次,说明这个窗口内有重复的字符,此时的left右移一位,并且更新这个窗口内的字符串的数量。这个算法思想是不是很熟悉,没错,就是滑动窗口。
2025-04-23 20:16:35
756
原创 Linux 网络基础(三) TCP/IP协议
遍历路由表。目的 IP & 子网掩码,找到要去的目标网络,没找到就走默认网关。通过 Iface 发送。注意:IP 没有解决设备转发的具体功能,IP 提供的是转发的策略,核心不是转发,而是路径选择。
2025-04-21 12:44:49
442
原创 Linux 网络基础(二) (传输协议层:UDP、TCP)
因为 TCP 是面向字节流的,所以需要应用层来分开这些报文,如果处理的不好就会出现多读了或者少读了影响到了后续报文,这种问题就叫做粘包。首先要明确,粘包问题中的 “包” 是指的应用层的数据包。在 TCP 的协议头中,没有如同 UDP 一样的 “报文长度” 这样的字段,但是有一个序号这样的字段。站在传输层的角度,TCP 是一个个报文过来的,按照序号排好序放在缓冲区中。站在应用层的角度,看到的只是一串连续的字节数据。
2025-04-20 18:31:46
1796
原创 双指针算法(二)
题目如下:这里我们先认识如何判断是个三角形,a+b>c,a+c>b,b+c>a即为三角形这里我们假设a<=b<=c,这里我们c是最大的,c加任何一个正数都比a或b大,所以我们只需要判断a+b是否>c就可以了。所以我们这里算法思想是固定7后,再固定第二大的数,继续上面的算法逻辑就行。
2025-04-17 15:51:20
958
转载 Linux HTTPS协议完整流程和握手细节
概述HTTPS(Hypertext Transfer Protocol Secure)即超文本传输安全协议,是在HTTP协议基础上加入SSL/TLS(Secure Sockets Layer/Transport Layer Security)协议层,用于在网络传输中保障数据的安全性和隐私性,确保信息在客户端与服务器之间传输时不会被窃取、篡改等。握手目的HTTPS握手过程的核心目的是在客户端和服务器之间建立起一个安全的通信通道,这个通道基于加密算法实现,使得后续双方传输的数据都是加密的。
2025-04-14 12:50:25
25
原创 Linux 网络基础二 ——应用层HTTP\HTTPS协议
网络版计算器例如,我们需要实现一个服务器版的加法器。我们需要客户端把要计算的两个加数发过去,然后由服务器进行计算,最后再把结果返回给客户端。(1)约定方案A. 约定方案一客户端发送一个形如 "1+1" 的字符串。这个字符串中有两个操作数,都是整形。两个数字之间会有一个字符是运算符,运算符只能是 +。数字和运算符之间没有空格。... ...B. 约定方案二定义结构体来表示我们需要交互的信息。
2025-04-14 12:43:34
423
原创 高并发内存池
在说内存池之前,我们得先了解一下“池化技术”。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己进行管理,以备不时之需。之所以要申请过量的资源,是因为申请和释放资源都有较大的开销,不如提前申请一些资源放入“池”中,当需要资源时直接从“池”中获取,不需要时就将该资源重新放回“池”中即可。这样使用时就会变得非常快捷,可以大大提高程序的运行效率。在计算机中,有很多使用“池”这种技术的地方,除了内存池之外,还有连接池、线程池、对象池等。
2025-04-10 18:02:29
936
原创 Linux TCP网络套接字
对比 UDP 服务器,TCP 服务器多了获取新链接和监听的操作,而因为 TCP 是面向字节流的,所以接收和发送数据都是 IO 操作,也就是文件操作。
2025-04-01 10:37:49
1077
原创 Linux 云服务器开放端口
这里先点手动添加,再看自己是UDP还是TCP协议,找到对应的协议,目的就填你想开放的端口,源填所有IP/4 0.0.0.0 添加备注点击保存就开放好了。首先找到你买服务器的官网,我这里是阿里云。
2025-03-26 21:53:36
245
原创 Linux UDP网络编程套接字sockets
在学校我们用学号,相比于身份证更简便,假如我的学号是2211211023,这样就能看到我是22级的,方便阅读信息。但是,这两个结构体都不用,我们用 sockaddr。网络通信的本质是进程间通信,有了 IP 就可以标识公网内唯一的一台主机,想要完成网络通信我们还需要一个东西来标识一台主机上的某个进程,这个标识就是端口号(port)。三种应用场景:网络套接字主要运用于跨主机之间的通信,也能支持本地通信,而域间套接字只能在本地通信,而原始套接字可以跨过传输层(TCP/IP 协议)访问底层的数据。
2025-03-25 20:27:17
812
原创 Linux 网络预备知识
在计算机网络通信中,报头(Header)是一部分数据包的固定结构,它包含了关于该数据包的元信息和控制信息。报头位于数据包的前部,用于标识和管理数据包的传输。报头通常由多个字段组成,每个字段用于存储特定类型的信息。下面是一些常见的报头字段及其功能:目标地址字段:指示接收数据包的目标设备或主机的地址。这个地址可以是物理地址(如:MAC 地址)或逻辑地址(如:IP 地址)。源地址字段:标识发送数据包的源设备或主机的地址。
2025-03-23 17:40:42
966
原创 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
1288
原创 Linux 线程控制
而这些都是线程库在做的事情,也就是线程的概念是库给我们维护的,我们用的原生线程库,也要加载到内存中,因为都是基于内存的。我们的线程库只需要维护线程的概念即可,不用维护线程的执行流,不过线程库注定了要维护多个线程属性集合,线程也要管理这些线程,先描述在组织。这是因为新线程内部执行进程替换函数,这看起来像是把新线程中的代码替换了,但实际会把主线程中的代码也替换了,因为主线程和新线程共享地址空间,所以新线程内部进程替换后,所有的线程包括主线程都会被影响。参数是void*,和这个函数的返回值的含义是一样的。
2025-03-16 23:31:59
1280
1
原创 Linux 线程概念
如上是是一个用户级页表,在我们学习进程的时候,我们知道进程=PCB+mm_struct+页表,进程通过用户级页表映射物理内存的方式来找到磁盘或内存中的数据。如果我们再创建一个进程,那么这个进程也有属于自己的PCB、地址空间、页表。
2025-03-15 09:35:41
686
原创 Linux 进程信号的捕捉&&信号补充内容
从内核态返回到用户态之前,OS 会做一系列的检测捕捉工作,它会检测当前进程是否有信号需要处理,如果没有就会返回系统调用,如果有,那就先处理(具体它会遍历识别位图: 假如信号 pending 了,且没有被 block,那就会执行 handler 方法,比如说终止进程,那就会释放这个进程,如果是暂停,那就不用返回系统调用,然后再把进程 pcb 放在暂停队列中,如果是忽略那就把 pending 中对应的比特位由 1 变为 0,然后返回系统调用)。用户态和内核态的权限级别不同,那么自然能看到的资源是不一样的。
2025-03-12 18:21:29
882
原创 Linux 进程信号
提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数)我们在上面写的Ctrl+c实际是给该进程发2号信号。我们接下来写个代码测试一下。我们先认识一个接口。
2025-03-11 19:39:33
1171
1
原创 Linux 消息队列&&信号量
我们讲进程通信,本质是让不同的进程看到同一份资源。我们已经给大家介绍了管道,共享内存,接下来我们给大家简单的介绍一下消息队列。
2025-03-04 11:27:35
1077
原创 Linux 共享内存
我们之前提到过,进程通信是让两个不同的进程看到同一份资源,所以我们给大家讲解了匿名管道和命名管道。今天我们还有一种方式两个不同的进程看到同一份资源。那就是共享内存!二、共享内存原理我们先来看这张图,我们在物理内存创建一个共享区,我们再让两个不同的进程通过页表分别映射到对应的共享区里,然后返回虚拟地址的起始地址。这就是共享内存,我们总结分为三步申请内存。将该内存挂接到进程地址空间的共享区。返回虚拟地址首地址。以上我们就创建好共享内存了,那我们该如何释放共享内存呢?
2025-03-01 14:20:30
1159
原创 Linux 日志系统·
当我们写一个函数,例如打开文件open,当我们打开失败的时候,会调用perror看到错误信息。接下来我们将带大家了解日志,并自主实现一个日志系统。这个就是我们定义的日志类的对象。
2025-02-26 17:41:31
1096
原创 Linux 管道的应用场景
我们之前写过一段指令,这是我们之前用的管道。当我们用管道级联起这些命令的时候,每一个命令最终都会被变为一个进程。这些进程的父进程都是同一个,我们可以去看一下这个父进程是什么东西这些sleep进程,他们的父进程是bash进程。有血缘关系,能够进行通信。那我们也可以通过这样的例子,写一个简易版的进程池。
2025-02-25 13:16:52
997
原创 Linux 进程通信——管道
进程通信是两个或多个进程实现数据层面的交互。因为进程具有独立性,导致进程通信的成本比较高,因为要打破进程的独立性。
2025-02-22 15:01:32
1513
原创 Linux 进程地址空间第二讲&&动态库地址
当我们创建一个进程的时候,进程里有一个进程地址空间,也会创建一个页表,页表里储存虚拟地址和物理地址的映射。那什么是虚拟地址,什么是物理地址呢?文件加载到内存时,CPU的作用是什么呢?
2025-02-20 16:44:50
1092
原创 Linux 动静态库
动态库:libc.so libc++.so。静态库: libc.a libc++.a。在命名的前缀lib和后缀so/a去掉就是库名,所以这是C/C++的动静态库。C/C++ 体系中如何使用别人的功能?生成可执行的方式有静态链接和动态链接,对应的是静态库和动态库。比如,张三是一名大一新生,他在写作业时突然有了一个上网的需求,但因为周边环境不熟悉,所以找了学长询问附近网吧的地点,随后就跑去玩了几个小时,然后回来后接着继续写作业,这就叫作动态链接。
2025-02-19 19:29:03
1271
原创 Linux 内存管理与文件页缓冲区
总之上面的过程其实就是下面的这张图也就是说,操作系统里面也有一个文件缓冲区,最后它会被刷新到磁盘上去上面的过程,我们就把打开文件和文件系统的文件 产生关联了!我们也可以发现,这里一共要经历三次拷贝,第一次将数据写入到C语言缓冲区中,第二次将数据从C语言缓冲区写入到文件缓冲区中,第三次是写在磁盘当中去。
2025-02-17 20:03:34
990
原创 Linux 文件系统&&inode&&软硬链接
在我们电脑文件里,分为打开的文件和未打开的文件,我们在上几篇文章给大家介绍了打开的文件,现在我们重点介绍。我们知道打开的文件是通过操作系统被进程打开,一旦打开,操作系统就要维护多个文件,所以它是需要被操作系统管理的。也就是说这种方式,磁盘上和内存上都有这个文件,它们不是完全一样的,;而普通的未打开的文件在磁盘上,未被加载到内存中,它当然也要被管理;其中管理打开的文件和管理未打开的文件在操作系统中有一个功能模块叫做。
2025-02-17 13:28:59
818
原创 Linux 基础IO——重定向和缓冲区
很明显依靠函数原型,我们就能认为 dup2(1, fd),因为 1 是先打开的,而 fd 是后打开的.可实际上并不是这样的,文档中说 newfd 是 oldfd 的一份拷贝,这里拷贝的是文件描述符对应数组下标的内容,所以数组内容最终应该和 oldfd 一致。可这段代码中,执行到close(1)时,还没有调用write讲数据写入到1号文件描述符,就把对应的显示器文件描述符关闭了,此时的数据还在用户级缓冲区,刷新时显示不出来。,所以当你父进程准备刷新的时候,子进程也就有了同样的一份数据,随即产生两份数据。
2025-02-14 21:02:27
903
原创 Linux 文件、文件描述符
从广义上理解,键盘、显示器、网卡、声卡、显卡、磁盘等几乎所有的外设都可以称之为文件,因为 “Linux 下,一切皆文件”。从狭义上的理解,文件在磁盘(硬件)上放着,只有操作系统才能真正的去访问磁盘。磁盘是一种永久存储介质,不会受断电的影响,磁盘也是外设之一,所以对文件的所有操作都是对外设的输入输出,简称 IO(Input、Output)。
2025-02-10 20:53:19
1015
原创 Linux 进程控制
通过 exec* 函数,把磁盘中的其它程序(代码+数据)加载到内存中,替换当前进程的代码和数据,让页表重新构建映射关系,这期间不会创建新的进程。
2025-02-01 19:21:37
1284
原创 力扣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
561
原创 Linux 进程地址空间
对大文件的分批加载,先把所有对应的虚拟地址填上,在页表里有一个标志位(标志对应的代码和数据是否已经被加载到内存),再根据标志位的"0"(未加载到内存),页表对应的物理内存暂时先空着,"1"则在页表填入物理地址。因为地址空间和页表是 OS 创建并维护的,也就意味着凡是想使用地址空间和页表进行映射,也就一定要在 OS 的监督之下来进行访问,也保护了物理内存中的所有合法数据,包括各个进程,以及内核的相关有效数据。划分成了一个个的区域,通过设置结构体内的 start 和 end 的值来表示区域的起始和结束。
2025-01-27 23:03:45
689
原创 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
2082
原创 Linux进程 -fork(初识),进程状态和进程优先级
平时创建进程一般是通过 ./myproc 运行某个存储在磁盘上的可执行程序来创建。而我们还可以通过系统调用接口来创建进程。pid_t是无符号整型。我们先看一段代码。
2025-01-25 13:52:31
850
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人