自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux——JSON

2.数字(Number):整数或浮点数(不支持八进制或者十六进制),例如 42,3.14。(1)反序列化:将 JSON 字符串转换为服务器语言的数据结构(如对象、字典)。(2)键必须是字符串,值可以是字符串、数字、布尔值、数组、对象或 null。(3)请求封装:将 JSON 字符串放入 HTTP 请求体,并设置请求头。(1)进行数据的构造(创键JSON对象):根据具体的要求创建数据结构。(1)接收响应:客户端获取 HTTP 响应中的 JSON 字符串。(3)响应序列化:将响应数据转换为 JSON 字符串。

2025-07-12 05:48:19 1144

原创 Linux——Redis

Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,通常用作数据库、缓存或消息代理。它支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,并提供丰富的操作命令。是一组命令的集合,不保证原子性。将内存中的数据保存到磁盘中。

2025-07-12 04:38:53 1100

原创 Linux——Git

与传统集中式版本控制(如 SVN)不同,Git 的每个用户都拥有完整的仓库副本(包括完整历史记录),无需依赖中央服务器即可工作。分为本地仓库(用户计算机)和远程仓库(如 GitHub、GitLab)。提交是 Git 的基本操作单元,代表一次文件变更的快照。Git 是一个分布式版本控制系统(DVCS),用于跟踪文件变更、协作开发和管理项目历史记录。将本地仓库的变更同步到远程仓库(如GitHub、GitLab)。将暂存区的变更永久保存到本地仓库。暂存区是准备提交的变更的中间状态,允许用户选择性提交部分修改。

2025-07-12 03:50:47 974

原创 Linux——守护进程

守护进程(Daemon)是在后台运行的特殊进程,通常独立于控制终端,用于执行特定的系统任务或服务。这类进程通常在系统启动时启动,持续运行以响应请求或处理事件(运行周期长),不用和用户交互。

2025-07-12 03:36:59 947

原创 Linux——libevent库

libevent是一个开源的事件通知库,用于编写高效的事件驱动网络应用程序。它提供了一种机制,允许开发者响应多种事件类型,如网络I/O、定时器和信号事件。libevent的核心目标是简化事件处理,同时保持高性能和跨平台兼容性。

2025-07-12 03:22:45 368

原创 Linux——I/O复用

I/O复用(Input/Output Multiplexing)是一种高效处理多个I/O操作的机制,允许单个进程或线程同时监控多个文件描述符(如套接字、管道等),并在这些描述符中的任意一个准备好进行读写操作时通知程序。其核心目标是减少系统资源消耗,避免为每个I/O操作创建独立的线程或进程,从而提升并发性能。

2025-07-09 23:25:07 1176

原创 Linux——mysql数据库

在Linux系统中,事务(Transaction)通常指一组操作作为一个不可分割的单元执行,要么全部成功完成,要么全部失败回滚。事务的核心特性是满足ACID原则(原子性、一致性、隔离性、持久性),主要用于确保数据完整性。索引是一种数据结构,用于快速查找和访问数据库表或数据集中的特定数据。它类似于书籍的目录,通过预先建立关键字段的映射关系,减少查询时需要扫描的数据量,从而提升检索效率。视图(View)是数据库中的一个虚拟表,其内容由查询定义。视图不存储实际数据,而是基于一个或多个基表的查询结果动态生成。

2025-07-09 22:26:59 781

原创 HTTP协议与web服务器

浏览器与web服务器在应用层通信使用的是HTTP协议80号端口(超文本传输协议)(https443端口),HTTP协议在传输层使用的是TCP协议,那么浏览器需要和web服务器三次握手建立连接后,才可以发送HTTP请求报文,服务器收到请求报文后,向浏览器回复HTTP应答报文。IP 地址是由数字组成的,例如,难以记忆。而域名如baidu.com更便于人们记忆和使用。用户在浏览器地址栏输入域名,就能访问对应的网站或服务器,无需记住复杂的 IP 地址。

2025-06-18 22:51:25 1150

原创 TCP和UDP的数据传输+区别

由于 TCP 发送时可能对数据进行了组合封装,接收端应用层调用 `recv()` 读取数据时,不一定能按发送端应用层的原始边界和顺序获取数据,可能会一次性读取多个发送端组合封装的数据,也可能分多次读取。不可以,每个协议都有自己的一组预留端口号。总体而言,该图展示了 TCP 字节流服务中,数据在发送端和接收端的处理过程,突出 TCP 并不保证应用层数据的边界,而是以字节流形式进行传输和处理。TCP:面向连接的协议,在数据传输之前,需要先建立连接,通过三次握手来确保连接的可靠性,数据传输完成后,需要释放连接。

2025-04-30 22:03:58 1155

原创 TIME_WAIT状态+UDP概念及模拟实现服务器和客户端收发数据

确保数据传输的完整性:在发送端完成数据传输后,主动关闭连接的一方会进入TIME_WAIT状态,此时会等待一段时间,以确保对方接收到了所有数据,并且成功响应了关闭连接的请求。这样可以保证数据的完整性,避免数据丢失或损坏。防止出现混乱的连接状态:TIME_WAIT状态可以确保在一段时间内不会重用相同的本地端口和远程端口的连接,防止新的连接与之前的连接混淆,导致数据混乱或连接失败。简而言之,TIME_WAIT状态的存在可以确保数据传输的可靠性和完整性,同时避免网络连接的混乱和冲突,提高网络通信的稳定性和可靠性。

2025-04-30 21:35:36 1372

原创 TCP三次握手、四次挥手+多线程并发处理

TCP粘包是指发送方连续发送的多个数据包,在传输过程中可能会被TCP协议合并成一个大的数据包,在接收方收到时无法正确区分这些数据包的边界,导致粘在一起,从而引起粘包现象。这样就会影响接收方对数据的解析和处理。简而言之,就是多次send发送数据,被对方一次recv收到了。5.2 TCP粘包会有什么问题?数据解析错误:如果接收方无法正确区分数据包的边界,可能导致数据解析错误,无法按照预期的方式处理数据。数据错误:如果多个数据包粘在一起,可能导致数据包数据内容混杂,造成数据错误或丢失。

2025-04-30 16:20:22 1483

原创 TCP概念+模拟tcp服务器及客户端

如果接收到的数据长度小于等于0,表示客户端关闭连接,则跳出处理数据的循环,关闭客户端的套接字描述符c。导入头文件:程序中导入了一些标准的头文件,包括stdio.h、stdlib.h、unistd.h、string.h、sys/socket.h、netinet/in.h、arpa/inet.h。导入头文件:程序中导入了一些标准的头文件,包括stdio.h、stdlib.h、unistd.h、string.h、sys/socket.h、netinet/in.h、arpa/inet.h。

2025-04-29 23:21:50 1782

原创 计算机网络基础

应用程序A将数据hello传给网络上另一台主机上的程序B,数据从应用层发送给传输层,传输层在数据前加上tcp协议或者udp协议的报头,将整条报文发送给网络层,网络层添加自己的ip报头,再将整条数据发送给数据链路层,数据链路层将数据分装成能在网络中独立传输的数据单元,即数据帧。例如,在一个局域网中,计算机 A 要向计算机 B 发送数据,首先根据计算机 B 的 IP 地址,通过路由器等设备找到计算机 B 所在的局域网,然后在局域网内通过计算机 B 的 MAC 地址将数据帧准确发送到计算机 B。

2025-04-29 19:39:46 1346

原创 线程同步——条件变量

条件变量允许一个或多个线程在满足特定条件之前等待,当条件不满足时,线程会被阻塞,直到其他线程通知该条件已满足。当条件满足时,其他线程可以通过发出信号通知条件变量,从而唤醒等待的线程。当一个线程需要等待某个条件成立时,它可以调用条件变量的等待函数将自己挂起,然后在另一个线程修改条件并发送信号时被唤醒。在Linux系统中,条件变量通常与互斥锁一起使用,来实现线程的等待和唤醒操作。通过条件变量,线程可以更有效地进行同步和协作,避免了忙等待的情况,提高了程序的性能和效率。

2025-04-29 16:20:42 332

原创 线程同步——线程安全

线程安全是指在多线程环境下,某个函数、类、方法或数据结构能够正确地处理并响应各个线程的并发访问,而不会造成数据的混乱或破坏。一个线程安全的程序在并发情况下能够保持数据的一致性和稳定性。实现线程安全通常需要采用同步机制,如互斥锁、信号量、读写锁等来保护共享数据的访问。简而言之,无论程序的调度顺序如何,都能得到正确的结果,这时就叫做线程安全。

2025-04-22 19:48:16 932

原创 线程同步——读写锁

读写锁(Read-Write Lock)是一种多线程同步机制,用于控制对共享资源的访问。读写锁允许多个线程同时读取共享资源,但是在有线程正在写入资源时,不允许其他线程进行读取或写入操作。读写锁通常包含两种状态:读取锁和写入锁。多个线程可以同时持有读取锁,这样它们可以并发地读取共享资源。但是当有线程持有写入锁时,其他线程无法获取读取锁或写入锁,从而确保了对共享资源的独占访问。读写锁的优势在于提高了并发读取的效率,因为多个线程可以同时读取,而写入时则需要独占资源。

2025-04-22 18:46:54 650

原创 Linux——生产者消费者问题

生产者消费者问题,也被称作有限缓冲问题。可以描述为:两个或者更多的线程共享同一个缓冲区,其中一个或多个线程作为生产者会不断地向缓冲区中添加数据,另一个或者多个线程作为消费者”从缓冲区中取走数据。生产者/消费者模型关注的是以下几点:生产者和消费者必须互斥的使用缓冲区缓冲区空时,消费者不能读取数据缓冲区满时,生产者不能添加数据二、

2025-04-18 21:46:38 333

原创 线程同步——互斥锁

互斥锁(Mutex)是一种用于保护临界区(Critical Section)的同步机制,用于在多线程环境下防止多个线程同时访问共享资源。互斥锁能够确保在同一时间只有一个线程能够进入临界区,其他线程必须等待这个线程退出临界区后才能进入。当一个线程希望进入临界区时,它会尝试获取互斥锁。如果锁已经被其他线程持有,则这个线程会被阻塞,直到锁被释放。一旦线程进入临界区后,它会执行完需要保护的操作,然后释放互斥锁,让其他线程能够进入。

2025-04-17 21:22:29 749

原创 线程同步——信号量

在线程同步中,信号量是一种同步原语,用于控制多线程对共享资源的访问。信号量通常用于解决生产者-消费者问题、避免资源竞争等多线程编程中的同步与互斥问题。信号量可以分为两种类型:二进制信号量和计数信号量。二进制信号量(Binary Semaphore):也称为互斥信号量,只有两个值,通常是0和1,用于实现线程之间的互斥访问共享资源,保证在同一时刻只有一个线程可以访问共享资源。

2025-04-17 20:04:56 728

原创 Linux——线程

线程是计算机科学中的基本概念,是程序执行的最小单元。线程是进程内的一个独立执行序列,每个线程都有自己的执行堆栈和局部变量。线程可以共享进程的资源,如内存、文件和其他系统资源。多个线程可以在同一个进程中并发执行,这样可以提高程序的效率和性能。每个线程可以执行不同的任务,但是它们共享相同的内存空间,因此需要通过同步机制来避免资源竞争和冲突。简而言之,线程是进程内部的一条执行路径;而进程是一个正在运行的程序。进程相当于工厂车间,线程就是车间里的许多工人。

2025-04-17 17:16:01 613

原创 Linux——消息队列

消息队列是一种用于在应用程序之间传递和存储数据的通信机制。它允许应用程序将消息发送到队列中,然后由另一个应用程序从队列中接收和处理这些消息。消息队列可以有效地实现异步通信、解耦应用程序之间的依赖关系,以及实现消息的持久化和顺序处理。常见的消息队列系统包括RabbitMQ、Kafka、ActiveMQ等。消息队列在现代分布式系统和微服务架构中被广泛应用。

2025-04-16 18:46:16 1207

原创 算法——希尔排序

希尔排序是一种基于插入排序的排序算法,也被称为缩小增量排序。它通过将待排序的数组分割成若干个子序列,对子序列进行排序,然后逐步合并这些子序列,最终得到一个有序的数组。希尔排序的特点是可以通过设置不同的增量序列来改变算法的效率,通常选择的增量序列是经过优化的递减数列。希尔排序的时间复杂度取决于增量序列的选择,通常为O(n log n)到O(n^2)之间。这种排序算法由Donald Shell于1959年提出并命名。

2025-04-16 15:19:50 1328

原创 算法——直接插入排序

直接插入排序是一种简单直观的排序算法,其基本思想是将一个元素插入到已经排好序的部分数组中,使得插入后的数组仍然保持有序。具体实现时,从第二个元素开始依次将元素插入到已排序部分的合适位置,直到所有元素都被插入完成,从而达到排序的目的。简而言之,每一趟从待排序序列中取第一个值,将其插入到已排序好的序列,对已排序好的序列,从右向左依次和待插入值比较,如果大于则向后挪动,如果发现了一个小于等于插入值的值,或者触底,则插入到其后。

2025-04-16 15:04:26 1228

原创 数据结构——布隆过滤器

布隆过滤器是一种空间效率高、适合快速检索的数据结构,用于判断一个元素是否可能存在于一个集合中。它通过使用多个哈希函数和一个位数组来表示集合中的元素。当一个元素被加入到布隆过滤器中时,会通过多个哈希函数计算出多个哈希值,并在对应的位上标记为1;当判断一个元素是否在集合中时,同样会通过多个哈希函数计算出多个哈希值,并检查对应位的值,只有当所有哈希值对应的位都为1时,才会判断可能存在于集合中。布隆过滤器具有较高的空间效率和查询速度,但也存在一定的误判率,即可能将不在集合中的元素误判为存在于集合中。

2025-04-15 22:08:57 1052

原创 Linux——共享内存

这样的内存区域被所有共享它的进程所拥有,进程可以将数据写入共享内存区域,也可以从中读取数据。3. shmflg: 用于指定创建共享内存段的访问权限和其他标志,比如权限位和内存段的创建方式等。1. key: 用于标识共享内存段的键值,不同的进程使用相同的 key 值可以获取到同一个共享内存。用于将共享内存段附加到调用进程的地址空间,并返回一个指向共享内存段起始地址的指针。结构体的指针,用于存储或传递共享内存段的状态信息或权限设置。函数的返回值是一个指针,指向共享内存段的起始地址。

2025-04-15 21:51:26 1316

原创 Linux——信号量

信号量是一种用于同步多线程或进程之间的机制,用于控制对共享资源的访问。信号量可以用来保护临界区,防止多个线程同时访问某个共享资源导致数据不一致或竞争条件的发生。

2025-04-15 19:18:36 1041

原创 Linux——管道

管道通信是指在计算机系统中,通过创建一个在两个进程之间传递数据的管道来进行进程间通信的方式。其中一个进程将数据到管道中,另一个进程则从管道中数据。管道通信可以实现进程之间的数据传输,常用于进行通信。管道通信通常实现在Unix和类Unix系统中。

2025-04-15 16:00:27 745

原创 哈希扩展——一致性哈希

一致性哈希是一种哈希算法,用于将数据分布到不同的节点或存储区域,而保持数据的一致性和均衡性。在分布式系统中,一致性哈希通常用于解决负载均衡和数据分布的问题。一致性哈希的基本原理是将数据的键通过哈希函数映射到一个固定的哈希空间中。然后,将这个哈希空间分布到环形的哈希环上。每个节点或存储区域在哈希环上占据一个位置,称为虚拟节点或者物理节点。当需要存储或查找数据时,通过哈希函数计算数据的哈希值,并沿着哈希环顺时针寻找距离最近的节点。

2025-04-14 21:55:02 1329

原创 算法——基于C语言的基数排序

基数排序是一种非比较排序算法,它将整数按照个位、十位、百位等位数进行排序。基数排序的主要思想是先按照最低位进行排序,然后依次按照高位进行排序,直到最高位,从而得到最终有序的序列。基数排序的时间复杂度为O(d*(n+r)),其中d为最大位数,n为元素个数,r为基数(0-9为10进制时r为10)。基数排序适用于位数较小、取值范围较小的整数排序,但对于位数较大的数字或负数排序则不太适用。

2025-04-12 15:04:51 392

原创 Linux——信号

例如,当用户按下Ctrl+C键发送中断信号给一个运行中的进程时,该进程会收到SIGINT信号,通常会导致进程终止。kill函数的两个参数中,第一个参数pid代表的是给哪个进程发送,这个进程的pid号;和上次不同的是调用fun函数后会执行默认的代码,然后接收到默认的信号,按Ctrl+C会打印出信号的编号,在下一次执行的时候按Ctrl+C就会结束程序。信号处理函数是一个用户自定义的函数,当进程接收到信号时,会调用该函数。时,程序不会终止,而是会捕获SIGINT信号,并调用fun函数打印出信号的编号。

2025-04-10 21:34:43 842

原创 Linux——进程替换(exec)

进程替换是指在操作系统中,一个正在运行的进程被另一个进程所替代的过程。:为了实现多道程序设计,一个进程在执行时可能需要被挂起,让其他进程获得执行机会。进程替换可以实现这种切换,确保系统中有多个进程在运行。:在内存资源有限的情况下,为了最大程度地利用内存,操作系统可能需要对进程进行替换,将某些进程从内存中移除,以便为其他进程腾出空间。:有时候,某个进程可能因为某种原因而无法继续执行,此时可以通过替换该进程来维持系统的正常运行,并且提高整体系统的性能。:一些应用程序需要在运行过程中动态地加载新的代码或数据。

2025-04-10 12:37:43 924

原创 数据结构——哈希技术及链地址法

哈希(Hash)是一种将任意长度的输入数据通过哈希算法转换成固定长度(通常是固定长度的字符串)输出的过程。哈希算法通常会将输入数据映射为一个固定长度的字符串,这个字符串通常称为哈希值或摘要。也就是说,我们只需要通过某个函数f ,使得存储位置=f(关键字),那么我们可以通过查找关键字不需要比较就可以获得需要记录的存储位置。输入数据相同,输出的哈希值必定相同。不同的输入数据,哈希值是独立的,即不会有冲突。哈希值的长度是固定的,不会随输入数据的长度变化而变化。

2025-04-10 12:07:51 920

原创 Linux——僵死进程及地址空间

当fork一个新进程的时候,子进程一般会和父进程同时运行。当子进程结束的时候,它与父进程的关联还会保持,直到父进程也正常终止或者wait,子进程才结束。因此,进程中代表子进程的表项不会立即释放。虽然子进程已经不能正常运行,但是它仍然存在于系统之中,因为它的退出码还要保存起来,以备父进程今后的wait调用使用。这种情况我们称已经结束了但是还不能释放的子进程为僵尸进程。简而言之,就是子进程先于父进程结束,父进程没有获取子进程的退出码,那么子进程就变成僵死进程。

2025-04-01 13:11:13 925

原创 数据结构——循环队列

循环队列是一种基于数组的队列实现方式,它通过在数组中固定的位置上循环使用空间来实现队列的功能。循环队列有一个固定的容量,当队列满时,新元素可以覆盖掉队列头部的元素,从而实现循环利用空间。循环队列有两个指针,一个指向队列头部,一个指向队列尾部,通过这两个指针的移动,实现队列的入队和出队操作。循环队列解决了普通队列在出队操作时需要移动大量元素的问题,使得入队和出队的时间复杂度都为O(1)。

2025-03-25 22:15:05 942

原创 数据结构——链栈

链栈是一种使用链表实现的栈。链栈不同于数组实现的栈,链栈的元素没有固定的位置,它们通过指针连接在一起。链栈通常由一个头节点和若干个数据节点组成,每个数据节点包含一个数据元素和一个指向下一个节点的指针。在链栈中,栈顶元素始终位于链表的头部,入栈和出栈操作都是在链表头部进行的。动态扩展:由于链栈使用链表实现,可以根据需要动态地增加或减少存储空间。灵活性:链栈的元素没有固定位置,可以随时插入或删除元素,不会浪费空间。容量受限于内存:链栈的容量受限于内存大小,可以根据需要存储大量元素。

2025-03-25 17:22:58 981

原创 Linux——进程的基本概念及fork

在调用fork函数之前,只有一个进程(父进程),当这个进程调用fork函数之后,fork函数会复制一个进程(子进程),区别是PID不同,它们的关系是父子关系。fork函数会返回两次值:给父进程返回子进程的pid。给子进程返回0。失败时,在父进程中返回-1,不创建子进程,并且errno被适当地设置。代码实现如下:通过vi/vim命令创建一个文件main.c57 {8 int n=0;20 }

2025-03-21 19:59:19 871

原创 物理内存和虚拟内存

虚拟内存是计算机操作系统中的一种技术,它允许程序能够访问比实际物理内存更大的地址空间。通过虚拟内存,操作系统可以将磁盘上的一部分空间作为虚拟内存空间来扩展实际的物理内存。当程序运行时,它只能看到和操作虚拟内存空间,而不需要了解实际的物理内存情况。虚拟内存技术的一个重要功能是将物理内存中暂时不需要的数据移动到磁盘上,从而释放物理内存以供其他程序使用。这种技术有效地提高了系统的整体性能和稳定性。

2025-03-21 17:23:00 1380

原创 Linux——cat命令

cat是一个在Unix和类Unix操作系统中用于连接文件、创建文件以及输出文件内容的命令行工具。cat命令的主要功能包括:查看文件内容:使用cat命令可以查看文件的内容,只需输入cat 文件名即可在终端输出文件的全部内容。cat命令还可以将多个文件的内容连接起来,形成一个新的文件。例如,会将文件1和文件2的内容连接起来保存为新文件。(“>”代表重定向)创建文件:可以使用cat命令来创建新文件并输入内容,例如cat > 文件名,然后输入内容并按Ctrl+D保存退出。附加文件内容:使用cat。

2025-03-20 20:18:37 558

原创 Linux——vi命令

vi 用来进入,vi 编辑器是所有 Unix 及 Linux 系统下标准的,它的强大不逊色于任何最新的文本编辑器。vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用vi / vim 文本编译工具 ,比较像Windows里面的记事本。

2025-03-20 11:44:30 1884

原创 Linux——基础命令

sudo su 切换管理员模式exit 退出管理员模式cd 切换路径ls 显示当前位置有哪些文件pwd 显示当前位置touch 创建普通文件mkdir 创建目录文件clear 清屏rm 删除rm -r*删除所有文件rm -r删除目录文件或文件夹cp 拷贝 cp -r dir1 dir2 拷贝dir1到dir2中(目录文件)如果dir2中本来就有dir1就会覆盖掉文件不想要覆盖cp a.py dir/b.py 改名为b.pymv。

2025-03-19 06:45:32 631

空空如也

空空如也

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

TA关注的人

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