- 博客(61)
- 收藏
- 关注
原创 Linux——Json
json是一种轻量级,基于文本的,可读的数据交换格式,能够让数据在不同系统(比如前端—后端,服务器—客户端)间方便传递/存储。在编程语言中都内置了处理json数据的方法。
2025-06-21 20:31:02
792
原创 C++——基础知识
和变量名结合类型&引用变量名称=变量名称定义引用时必须要初始化,没有空引用。没有引用的引用&和类型结合称为引用符号,不是取地址符,代表别名的意思:声明一个const整型引用c并绑定到aconst修饰引用意味着不能通过c修改a的值 ,// c+=100;// error;被注释掉是因为尝试通过c修改a会导致编译错误。引用是已经存在变量的别名,不占用额外内存空间。本质上和所引用的变量共享同一块内存。可以直接使用对象的名字来访问所引用的对象,无需解引用操作。
2025-06-17 20:22:04
661
1
原创 scanf scand_s fgets
缓冲区问题:读取字符串时不检查边界,可能导致缓冲区溢出,如输入超长字符串scanf直接写入str,可能覆盖相邻内存,引发程序奔溃或安全漏洞。它要求字符串为指定缓冲区大小,防止溢出。自动限制读取长度避免溢出。如输入超长,会截断并丢弃多余字符。读取直到遇到换行符或达到缓冲区大小上限。自动限制读取长度size-1,防止溢出。2. scanf_s:安全版格式化输入MSVC。从指定输入流读取一行文本,存到字符串中。1. scanf:标准格式化输入。
2025-06-17 14:49:59
209
原创 linux——TCP问题
TCP连接是全双工的,这意味者数据可以在俩个方向上同时传输,(所以关闭连接时需要分别处理俩个方向的数据传输)当一方想要关闭连接时,它可能仍然希望接收来自另一方的数据。第三步客户端发送ACK的作用:服务器接收ACK可以确认客户端能正常接收服务器发送的ACK+SYN。若服务器返回的ACK+SYN因网络故障丢失,客户端会认为连接未建立,而服务器认为连接建立。若ACK在传输中丢失,服务器会重传第三次挥手的FIN报文,确保服务器可以正常关闭。若客户端故障前正在向服务器发送数据,服务器收到部分数据后,客户端突然中断。
2025-05-28 13:02:54
499
原创 linux——网络
1. 物理层传输原始比特流0/1,将数字信号转化为适合在物理介质上传输的模拟信号。或者将收到的物理信号转化为数字信号。主要负责处理物理介质上的信号传输。确保数据能够在物理介质上正确的传输和接收2. 数据链路层负责将物理层收到的信号比特流转化为数据帧,并进行差错检测和修改。确保数据在相邻节点之间的可靠传输。通过MAC地址来标识网络中的设备在数据帧中添加源MAC地址和目的MAC地址以便在局域网中进行数据帧的传输和接收3. 网络层负责在不同网络之间进行路由选择和寻址。将数据从源端传输到目的端。
2025-05-28 07:47:47
1041
原创 数据库——redis
缓存,数据库,消息队列c/s结构 服务器端口6379是一个用 C 语言编写的开源、高性能非关系型(NoSQL)键值对数据库,遵循 BSD 许可协议redis五种基本数据类型:字符串,列表,集合,有序集合,哈希。
2025-05-21 16:15:16
1326
原创 二叉树递归解释
本文介绍了二叉树前序遍历的递归实现及其调用栈的工作原理。前序遍历的顺序是:访问当前节点、递归遍历左子树、递归遍历右子树。递归调用时,每次调用都会创建一个新的栈帧,保存局部变量和执行位置。当函数返回时,控制流会回到上一层栈帧,遵循后进先出的原则。递归的返回路径是逐层向上回溯的,return语句会终止当前函数调用,将控制流交回给调用者,并继续执行调用点之后的代码。通过示例,文章详细说明了递归调用的执行顺序和返回逻辑,帮助理解递归在二叉树遍历中的应用。
2025-05-19 11:48:49
266
原创 二叉树详细介绍
本文详细介绍了树和二叉树的基本概念、性质、存储结构及其相关操作。首先,文章阐述了树的基本概念,如根节点、节点的度、叶节点等,并解释了树的层次、高度和深度的区别。接着,文章重点介绍了二叉树的概念、性质及其特殊类型,如完全二叉树和满二叉树。在存储结构方面,文章讨论了顺序存储和链式存储的优缺点,并提供了相应的代码实现。此外,文章还详细讲解了二叉树的构建方法,包括通过先序、中序、后序遍历序列构建二叉树,并提供了递归和非递归的遍历算法,如先序、中序、后序、层序、蛇形遍历等。最后,文章介绍了二叉树的销毁操作,并提供了主
2025-05-18 08:20:28
838
原创 Linux——守护进程
守护进程(Daemon Process)是一种在后台运行、不与用户直接交互的进程,通常用于执行系统服务、监控任务和批处理作业。其特点包括脱离终端控制、生命周期长、无控制终端、权限特殊以及命名规范(通常以“d”结尾)。守护进程的典型应用场景包括网络服务、定时任务和日志服务等。实现守护进程的编程流程包括:通过fork()创建子进程并退出父进程、使用setsid()创建新会话、再次fork()以确保脱离控制终端、更改工作目录到根目录、设置文件掩码为0、关闭所有文件描述符。一个典型的守护进程实现示例是定时记录系统时
2025-05-13 13:46:14
1293
原创 进程与线程详细介绍
进程是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位。一个程序至少有一个进程,一个进程至少有一个线程。每个进程有独立的内存空间和系统资源,一个进程的错误不会影响其他进程。
2025-05-07 18:08:58
1053
原创 libevent详解
libevent 是一个轻量级网络i/o库,i/o框架库,封装了select,poll,epoll ,跨平台支持,支持linux,window,unix。统一事件源,libevent对i/o事件,信号和定时事件提供统一的处理。线程安全,使用libevent_pthreads库来提供线程安全支持。基于reactor模式实现多种 I/O 模型和事件处理提供统一接口,助力开发者编写高效、可扩展的网络服务器和客户端程序,尤其适用于大量并发连接场景
2025-04-30 19:27:50
2115
原创 select,poll,epoll区别联系
selsect,poll,epoll区别联系selectpoll和epoll都是在 Linux 系统中用于实现 I/O 多路复用的机制,它们的主要目的是让程序能够同时监控多个文件描述符,以判断是否有事件发生,从而提高 I/O 操作的效率。
2025-04-30 15:28:44
461
原创 稳定性 复杂度
在一个待排序的序列中,如果存在多个具有相同关键字(值)的元素,那么在使用某种排序算法对该序列进行排序后,这些相同关键字元素的相对顺序与排序前保持一致,就称该排序算法是稳定的。反之,如果相同关键字元素的相对顺序发生了改变,则该排序算法是不稳定的。
2025-04-29 13:07:39
711
原创 八大排序——直接插入排序/希尔排序
趟从待排序序列中取第一个值,将其插入到已排序好的序列中,对已排序好的序列,从右到左依次和待插入值比较,如果大于则向后挪,如果发现一个小于等于插入值的值,或者触底,则插入到其后
2025-04-28 19:18:48
463
原创 八大排序——快速排序/快排优化
分治的思想。每一趟将待排序的第一个值看作基准值,通过一趟排序,可以将排序数据分成俩半,左边这一半都小于等于基准值,右边这一半都大于基准值,然后对左右俩半分别递归进行排序,直接数据全部有序(基准值俩边划分好之后,自身是有序的,他就在最终排序好所在的位置上)
2025-04-28 16:05:00
1111
原创 i/o复用函数的使用——epoll
epoll是linux特有的。epoll(Event Poll)是Linux内核提供的I/O多路复用接口,它用于监视多个文件描述符(FD),以确定它们是否处于就绪状态(即可以进行非阻塞的读或写操作)。epoll是select和poll系统调用的替代品,提供了更高的效率和可扩展性,特别是在处理大量文件描述符时。
2025-04-28 14:18:23
838
原创 八大排序——选择排序/堆排序
每一趟从待排序序列中找到其最小值,然后和待排序序列的第一个值进行交换,则此时这个值变有序,待排序序列个数-1,继续下一趟,直到待排序序列个数为1时结束
2025-04-23 19:05:54
576
原创 I/O复用函数的使用——select
之前为了让服务器能够服务多个客户端,我们使用多线程或多进程进行服务器的并发,意味着有多少个客户端就要产生很多进程。会浪费,开销很大。所以我们引入i/o复用i/o复用方法select,poll,epoll可以帮助应用程序找到就绪描述符eg:老师检查作业,谁写完了谁举手,老师过去检查,不用一个一个等待去检查
2025-04-21 16:48:29
834
原创 HTTP协议与web服务器
浏览器与web服务器在应用层通信使用的是HTTP协议80号端口(超文本传输协议)(https443端口),HTTP协议在传输层使用的是TCP协议,那么浏览器需要和web服务器三次握手建立连接后,才可以发送HTTP请求报文,服务器收到请求报文后,向浏览器回复HTTP应答报文
2025-04-17 20:57:45
943
原创 计算机网络基础概论
1.1. 网络 网络是由若干结点和连接这些结点的链路组成,网络中的结点可以是计算机,交换机,路由器等设备网络设备有:交换机,路由器,集线器传输介质:双绞线,同轴电缆,光纤
2025-04-17 17:04:32
2383
原创 tcp和udp的数据传输过程以及区别
应用层:通过 `sendto()` 函数来发起数据发送操作。`sendto()` 是 UDP 编程中用于发送数据报的函数,它可以指定目标地址(IP 地址和端口号 )以及要发送的数据内容。在应用层,可能会有多个不同的操作或请求需要通过 UDP 发送数据,所以会多次调用 `sendto()` 函数 。传输层:将应用层传递过来的数据封装成 UDP 数据报。UDP 数据报由 UDP 报头和数据部分组成,报头包含源端口号、目的端口号、长度和校验和等信息,完成封装后的数据报会被发送到网络中。
2025-04-16 16:48:52
1158
原创 三次握手/四次挥手+多进程,线程并发处理
1.TCP服务器端编程流程:socket创建套接字->bind绑定IP和端口->listen创建监听队列->accept接受连接->receive接收数据->send发送数据->close关闭连接。2.TCP客户端编程流程:socket创建套接字->connect发起连接->send发送数据->receive接收数据->close关闭连接。
2025-04-14 15:04:08
1105
原创 tcp特点+TCP的状态转换图+time_wait详解
在进行数据传输之前,TCP 需要通过 “三次握手” 来建立连接。具体过程为:客户端向服务器发送一个 SYN 包,请求建立连接;服务器收到 SYN 包后,向客户端发送一个 SYN + ACK 包,表示同意建立连接;客户端收到 SYN + ACK 包后,再向服务器发送一个 ACK 包,连接建立完成。这种方式确保了双方都有发送和接收数据的能力,并且双方对连接的初始序列号达成一致。
2025-04-13 19:37:25
1029
原创 数据结构——哈希详解
顺序表/链表有一个共同特征,数据值本身和其存储位置之间是没有关系的,所以我们要查找/搜索一个值,只能一个一个的去比较,时间复杂度是O(n),我们想把时间复杂度降下来,提供一种技术让我们数据值本身和存储关系之前有映射关系,这时我们查找值是否存在则直接根据这种映射关系计算得出其存储位置,这时只去要去计算得出的存储位置查看即可——这种技术就是散列技术也就是哈希,映射关系就是哈希函数f
2025-04-13 18:11:59
2809
原创 一致性哈希+虚拟节点 布隆过滤器
我们有三台缓存服务器,用于缓存图片我们为这三台缓存服务器编号为 0号、1号、2号,现在有3万张图片需要缓存,我们希望这些图片被均匀的缓存到这3台服务器上,以便它们能够分摊缓存的压力。也就是说,我们希望每台服务器能够缓存1万张左右的图片,那么我们应该怎样做呢?常见的做法是对缓存项的键进行哈希,将hash后的结果对缓存服务器的数量进行取模操作,通过取模后的结果,决定缓存项将会缓存在哪一台服务器上
2025-04-12 22:52:30
956
原创 系统调用——复制 fork结合
打开一个名为 file.txt 的文件,然后使用 fork() 函数创建一个子进程。fork() 函数在父进程中返回子进程的PID,在子进程中返回0。由于父进程和子进程共享同一个文件描述符 fd,它们都可以从同一个位置读取文件内容。sleep(1) 调用在父进程和子进程中都存在,这可能会导致它们在读取文件时产生一定的时间间隔,但这个时间间隔并不能保证它们的执行顺序。
2025-04-02 14:19:51
468
原创 系统调用和库文件
系统调用是操作系统提供给用户程序的一种接口,允许用户程序请求操作系统的服务。是用户空间程序与操作系统内核交互的一种方式。它们允许程序请求操作系统提供的服务,如文件操作、进程控制、网络通信等。库函数是编程中预先定义好的函数,它们封装了通用的操作,使得开发者无需从头编写代码即可实现特定的功能。库函数通常包含在库中,库是一组相关的函数和数据的集合。
2025-04-02 11:37:52
961
原创 Tcp概念+编程流程
TCP客户端和服务器通过建立连接、进行数据交换和关闭连接的过程进行通信。TCP协议确保了数据的可靠传输,包括数据完整性、顺序性、流量控制和拥塞控制。通过使用套接字编程,可以实现TCP客户端和服务器之间的通信。
2025-04-01 22:24:48
1225
原创 进程间通信——信号量
信号量本质上是一个计数器,用于记录可用资源的数量。它有两种类型的操作:P 操作(也称为 wait 操作)和 V 操作(也称为 signal 操作)。P 操作会将信号量的值减 1,表示请求一个资源;V 操作会将信号量的值加 1,表示释放一个资源。
2025-03-28 21:52:31
1107
原创 线程同步——读写锁
线程同步中的读写锁(Read-Write Lock),也常被称为共享-独占锁(Shared-Exclusive Lock),是一种用于控制对共享资源的并发访问的同步机制。它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。读写锁的设计目的是在多线程环境中提高并发性能,特别是在读操作远多于写操作的场景中。读写锁与互斥锁区别就是读锁和写锁是分开的
2025-03-28 21:39:26
504
原创 线程同步——互斥锁
互斥锁是一种用于控制对共享资源访问的同步机制。它确保在同一时间内,只有一个线程可以访问被保护的资源。互斥锁有两个基本操作:锁定(Lock):当一个线程需要访问共享资源时,它会尝试获取互斥锁。如果锁是可用的(即未被其他线程持有),则该线程成功获取锁并进入临界区(Critical Section),执行对共享资源的操作。如果锁已经被其他线程持有,则该线程会被阻塞,直到锁被释放。
2025-03-28 20:26:28
715
原创 线程同步——条件变量
如果说互斥锁是用于同步线程对共享数据的访问的话,那么条件变量就是用于在线程之间同步共享数据的值。条件变量提供了一种线程间的通知机制,当共享数据达到某个值的时候,唤醒等待这个共享数据的线程。实现条件变量必须使用互斥锁,因为互斥锁只能用于保护临界资源,而条件变量可以用来通知线程某个条件已经满足。
2025-03-28 16:04:58
746
原创 Linux——线程安全
线程安全(Thread Safety)是指在多线程环境中,程序的行为和结果是可预测的、一致的,并且不会由于多个线程同时访问和修改共享数据而导致数据损坏或产生不可预料的副作用。使用 strtok 函数来分割 buff。strtok 函数的第一个参数是要分割的字符串,第二个参数是分隔符。strtok 函数会继续从上次停止的地方开始分割字符串,直到没有更多的分隔符。
2025-03-27 20:51:02
1117
原创 数据结构——链式队列
链式队列,通常也被称为链表队列或者简单链表,是一种使用链表实现的队列数据结构。队列是一种先进先出(FIFO)的数据结构,即最先添加到队列中的元素将是最先被移除的元素。链式队列通过链接一系列节点来实现队列的功能,每个节点包含数据部分和指向下一个节点的指针。
2025-03-24 22:34:05
735
原创 线程同步——信号量
信号量(Semaphore)是一种在多线程(或多进程)编程中用于控制对共享资源访问的同步机制。信号量主要用于解决并发访问和资源共享的问题,确保在任一时刻最多只有一个线程可以访问特定的资源。
2025-03-24 16:17:45
989
原创 Linux——线程
创建了5个线程,每个线程都打印了一个索引值。然而,输出的顺序并不是按照线程创建的顺序(0到4),而是出现了一些乱序的情况。这种情况发生的原因主要与线程调度有关。每次运行程序时,由于线程调度的不确定性,输出的顺序可能会有所不同线程调度是由操作系统负责的,它决定哪个线程在什么时候运行。在多线程程序中,线程的执行顺序可能会因为操作系统的调度策略而变得不确定。
2025-03-22 20:25:23
1108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅