自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LangChain与LangGraph介绍

在上一篇博客中我们就已经明白了LLM是一个超级大脑,,LangChain 基于 LLM 做能力扩展。

2026-05-30 20:31:01 322

原创 大模型认识

模型是⼀个从数据中学习规律的“数学函数”或“程序”。旨在处理和⽣成信息的算法,通常模仿⼈类的认知功能。通过从⼤型数据集中学习模式和洞察,这些模型可以进⾏预测、⽣成⽂本、图像或其 他输出,从⽽增强各个⾏业的各种应⽤。我们目前的认知可以简单理解为模型是⼀个"超级加⼯⼚",这个⼯⼚是经过特殊训练的,训练师给它看了海量的例⼦ (数据),并告诉它该怎么做。通过看这些例⼦,它⾃⼰摸索出了⼀套规则,学会了完成某个"特定任 务"。模型就是⼀套学到的"规则"或者"模式",它能根据你给的东西,产⽣你想要的东西。

2026-05-29 20:57:07 258

原创 动态规划问题(两个数组的dp问题)

把复杂问题分解成一个一个的小步骤。:用一个“小本本”(通常是数组)记下每步的答案。:当后面步骤需要用到前面步骤的结果时,直接查本子,不用重新算一遍。一个经典的入门例子是问题:一次可以爬1或2阶,爬到第10阶有多少种方法?:要想到第10阶,最后一步一定是从第9阶或第8阶上来的。。:算dp[9]时又会用到dp[8]和dp[7],如果每次都从1开始重算就太慢了。动态规划会直接记住dp[8],算一次就好。

2026-05-12 13:19:13 364

原创 多路复用 --- poll系统调用

IO=等待+拷贝,和select一样,poll同样只负责等待。poll 是一种多路转接 I/O 模型。它的核心作用和 select 一样,只负责等待。它能让我们在一次系统调用中,同时监控多个文件描述符(比如网络连接 socket、标准输入等),等待其中任意一个或多个变得“就绪”(比如有数据可读、可写,或者发生错误)。使用 poll 需要包含一个头文件: #include <poll.h>。poll返回值poll 函数调用完成后,会返回一个整数,我们称之为 n。

2026-03-29 16:23:48 373

原创 多路复用 --- select系统调用

IO 等于等待加拷贝,而 select 只干“等待”这一件事,而且能一次等很多个文件描述符,不用你一个个死等。select头文件 <sys/select.h>它一共有 5 个参数,后面 4 个都是输入输出型参数,输入输出函数表示输入是设置的值,结果函数调用后,操作系统会返回一个新的值。第一个参数:你要等很多文件描述符,比如 3、5、7 这几个,那你就把最大的那个文件描述符 + 1 传进去。比如最大是 7,就传 8。内核只需要检查到这个数字就行。

2026-03-28 16:34:34 375

原创 Linux 五种IO模型

我们之前说的IO,说白了就是输入和输出,可以理解成要么读数据,要么写数据。以前的认知中IO就是文件读写、网络收发消息,其实本质都一样:把数据从一个地方搬到另一个地方。比如读文件,是从硬盘读到程序里;写网络,是把程序里的数据发到网卡上。对应的系统调用就是 read 和 write,读用read,写用write。以前我们简单理解成,read 就是把数据从操作系统拷贝到用户层,write 是把用户层的数据拷贝到操作系统。但这只说对了一半,真正的IO没这么简单。

2026-03-24 20:05:33 427 1

原创 网络其他重要协议或技术

TCP/IP中使用IP地址和端口号来确定网络上的一台主机上的一个程序(服务),但是我们知道IP地址是不便于记忆的,但是域名是比较容易记忆的,例如要访问百度,那么域名就是www.baidu.com,要访问qq,那么域名就是www.qq.com。

2026-03-22 14:41:32 333

原创 Linux 数据链路层

简单来说。TCP协议实现的是数据传输的可靠性,IP协议实现的是数据能跨主机送达目标主机的能力,数据链路层保证相邻的两台设备进行数据交互的问题。

2026-03-22 13:14:57 397

原创 IP 协议

IPv4 地址是有限的,IPv4 地址是 32位(4字节) 的二进制数,理论上能表示约 42.9亿 个地址。但这是一个巨大的“全球资源”,必须进行分层管理,否则全世界的网络会乱成一锅粥。我们可以把 IPv4 地址想象成一个全球通用的快递编号池。为了让快递能准确送到,我们必须按国家、地区来划分这个编号池。

2026-03-21 22:47:15 808

原创 TCP协议

三次握手其实就对于四次握手,会把服务端的ACK确认应答和FIN请求连接作为一个捎带应答,客户端发起请求,服务端是必然要接受然后也向客服端去申请的,这个申请是必然的,所以会被压缩为一个捎带应答。

2026-03-21 01:26:10 1669 3

原创 UDP协议

在TCP/IP协议中使用五元组来标识一个通信,五元组:源IP,源端口号,目的IP,目的端口号,协议号。0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端口号都是固定的.24 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

2026-03-18 20:41:14 375 1

原创 HTTPS协议

加密就是把 明⽂ (要传输的信息)进⾏⼀系列变换, ⽣成 密⽂ .解密就是把 密⽂ 再进⾏⼀系列变换, 还原成 明⽂ .在这个加密和解密的过程中, 往往需要⼀个或者多个中间的数据, 辅助进⾏这个过程, 这样的数据称为 密钥 (正确发⾳ yue 四声, 不过⼤家平时都读作 yao 四声) .83 版 <<⽕烧圆明园>> , 有⼈要谋反⼲掉慈禧太后. 恭亲王奕䜣给慈禧递的折⼦. 折⼦内容只是扯⼀扯家常, 套上⼀张挖了洞的纸就能看到真实要表达的意思.

2026-03-18 19:25:58 395

原创 Linux HTTP协议

我们平时在浏览器输入 www.baidu.com 并回车,地址栏会自动变成:https://www.baidu.comwww.baidu.com 是域名,https 是协议,浏览器默认优先使用 HTTPS,少数旧网站仍用 HTTP访问一个网站,本质是访问服务器,而访问服务器必须知道两个信息:1. 服务器IP地址2. 端口号(Port)域名会自动解析成 IP,域名只是方便人记忆,计算机只认IP。会得到类似:这就是百度服务器的真实IP。

2026-03-17 22:35:09 587

原创 Linux HTTP服务器

套接字模块。

2026-03-17 18:56:19 431

原创 Linux 自定义协议完成网络版本计算器

这个模块提供两个类,类包含对请求和响应的处理,两个函数,对于数据的转码和解码来完成对请求和响应党的构建。

2026-03-15 22:37:25 464 1

原创 Linux 基于TCP实现服务端客户端通信(守护进程版)

当用户通过Xshell等工具登录云服务器时,Linux系统会为用户创建一个会话(session)。每个会话会默认创建一个bash命令行解释器进程,它初始是前台进程,负责接收键盘输入、执行命令并返回结果。这个bash进程现在也就是前台进程,前台进程只能有一个,后台进程可以有很多个。

2026-03-15 00:12:11 586 2

原创 Linux 基于TCP实现服务端客户端通信(线程池)

线程池在客户端的连接到来前已经提前创建了一批线程,然后线程池将这些线程管理起来,当客户端的连接服务器之后,线程池就会唤醒一个线程,然后让这个线程直接去和客户端进行通信,当通信完成之后,这个线程又会去条件变量下休眠,所以线程池中的线程执行通信任务在这个过程中省去了创建和释放的成本,而多线程版当连接到来的时候,需要创建线程进行通信,当通信完成之后,需要释放线程,所以多线程相较于线程池仍旧很重,所以我们可以采用线程池版在多线程版的基础。

2026-03-14 16:12:19 451

原创 Linux 基于TCP实现服务端客户端通信(多进程/多线程版)

在单进程/单线程的版本中,一个用户连接上来了之后,与服务端进行通信,其他的客户端是无法与服务端通信的,StartServer() 里调用 accept() 获取新连接后,立刻进入 Service() 循环。Service() 是死循环,会一直阻塞在 read() ,等待当前客户端发数据。只要这个客户端不断开,函数就不会返回, accept() 永远无法再次执行,新连接只能排队,无法处理。主线程原来接听到来的客户端,到有客户端到来时,创建一个子进程来执行对连接上来的客户端的操作。

2026-03-13 21:43:43 367

原创 Linux 基于TCP实现服务端客户端通信(单进程/单线程版)

首先为了方便日志的使用,定义一个全局的日志类,全局变量balog是提供给listen的第二个参数使用的,listen的作用后面会说到,这里先找到这个参数不要设置太大就可以了。定义ip地址为0.0.0.0,表示监听所有网络接口的连接请求,端口号需要设置为开发的。枚举一个类,来表示在启动服务端,socket失败,bind失败,listen失败的返回值,表明什么错误。私有成员包含一个网络文件描述符,ip地址和要绑定的端口。Log lg;

2026-03-12 21:03:48 449

原创 Linux 套接字编程---基于UDP协议实现简易的聊天室

网路文件描述符也就就是socket关键字的返回值,是一个文件描述符。地址ip设置为0.0.0.0,表示监听所有网卡,一台电脑或服务器通常会有多个网络接口(NIC)。比如:回环地址:127.0.0.1,仅本机内部通信使用。以太网:连接局域网的有线IP。无线网卡 :连接Wi-Fi的无线IP。绑定 0.0.0.0 时,程序就会在所有这些网卡上监听端口。这样,外部设备(如同一局域网下的手机)和本机程序都能通过对应的IP地址访问你的服务。

2026-03-12 12:57:47 413

原创 Linux 网络套接字编程

大端:数据的高位字节放在内存的低地址,像“正常读数”一样,从大到小排列。小端:数据的低位字节放在内存的低地址,更接近硬件的“直白存储”方式。记忆方式只记一个就行:小小小(低位 → 低地址) = 小端。剩下的情况,统统是大端。

2026-03-10 22:11:36 373 1

原创 Linux 网络基础(1)

早期计算机的设计初衷,主要服务于军事领域,专门处理弹道轨迹等大规模复杂计算。在最初的设计中,计算机之间相互独立,并没有内置直接传输数据的功能,每台设备只能单独完成计算任务在这样的背景下,如果多个人需要协作处理数据,并且彼此的工作存在依赖关系,就会面临数据传递的难题。例如,一方的计算结果,是另一方继续处理的基础,而早期计算机无法直接传输数据,只能依靠软盘这类存储介质进行人工传递。使用软盘不仅速度慢、容量小,还容易丢失数据,整体效率极低,无法满足高效协作的需求。

2026-03-10 17:27:45 523

原创 Linux 线程池

线程池使用了池化技术,以空间换时间。线程池是线程的一种使用模式。线程过多会带来调度开销,影响整体性能。而线程池维护者多个线程,等待着被派发可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价,还能保证内核被充分利用,防止过度调度应用场景:(1)需要大量线程来完成任务,且完成任务的时间较短。例如:web服务器完成网页请求(2)对性能要求苛刻的应用。例如:要求服务器快速响应用户请求(3)接收突发性的大量请求,但不至于使服务器因此产生大量线程的应用。

2026-03-09 20:02:05 439

原创 Linux 信号量,环形队列模拟生产者消费者模型

信号量本质是一把计数器,PV操作,原子的执行流申请资源,必须先申请信号量资源,得到信号量后,才能访问临界资源信号量值如果是0,1两态的,那么就是二元信号量,就是互斥功能申请信号量的本质就是对临界资源的预定机制那么这个时候就有一个疑问了,信号量凭什么也是进程间通信的一种?进程间通信的定义是可以让两个或多个进程能够互相交换信息,协调动作的机制。进程间通信的前提是要让不同的进程看到同一份资源,信号量通过被多个线程看到,来实现线程间的协调运作。没有它,进程A不知道能不能写,进程B不知道有没有数据。

2026-03-05 18:27:35 441

原创 mysql 基本查询(CURD)+ 进阶操作

表的基本查询分为增删查(CURD)create(创建),update(更新),retrieve(读取),delete(删除)

2026-03-02 14:34:45 760

原创 Linux 生产者消费者模型

生产者消费者模型(consumer producter),也叫做cp问题。在日常生活中,都会有超市的存在,超市上面摆放着非常非常多的货物,这些货物都是由工厂生产出来,之后拉到超市,摆放到货架上面,由顾客来超市时,就可以购买这些货物。那么生产货物的工厂就相当于是生产者,那些购买货物的顾客就相当于是消费者,超市就是一个共享内存缓冲区,用来临时存放数据。

2026-03-01 18:26:03 567

原创 Linux 线程安全与锁

多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,我们称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。1.不保护共享变量的函数2.函数状态随着被调用,状态发生变化的函数3.返回指向静态变量指针的函数4.调用线程不安全函数的函数。

2026-02-28 21:52:05 548

原创 mysql 表的约束

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,

2026-02-28 16:10:56 593

原创 Linux 线程互斥

故事1:假设有一个自习室,这个自习室里面有一把锁,谁先到了就可以从里面把门锁了,等我学习完了之后,别人才可以进来使用,没有抢到的同学只能在门外等着了。对应上面的代码,那些线程就是一个一个的同学,它们谁先来了拿到锁就可以先进去学习,其他人就只能在门口等待,也就是没有拿到锁的线程会阻塞在加锁的那一行,那个自习室就相当于共享资源,锁的存在就很好的让只有一名同学可以访问到共享资源,来使临界区的代码串行运行。但是这样子也会导致其他同学的学习时间就减少了,所以加锁的本质就是一种用时间来换安全的做法。

2026-02-09 23:46:21 1098

原创 Linux 多线程,线程分离

示例代码:使用for循环去创建一个一个的线程,让它们去循环的打印出自己的pid和线程tid,创建完线程之后不要忘记去释放掉线程资源,避免内存泄漏。使用ps-aL来查看监控中的轻量化进程,查看创建情况。运行结果:从左侧代码的运行结果可以看出来这些线程的pid都是一样的,说明都是一个进程创建出来的,右侧可以看出来pid一样但是LWP不一样,说明确实瞬间创建出来了多个线程。

2026-02-05 23:24:23 1210

原创 Linux 线程控制

linux中有pthread动态库,几乎所有的linux平台都自带这个动态库,所以在makefil编译的时候需要链接这个动态库。

2026-01-10 20:06:24 1071

原创 Linux 线程概念

对于进程来讲,之前理解为进程 = 内核数据结构 + 代码和数据,而今天在多线程部分,我们要重新理解一下进程,站在内核角度:进程是承担分配系统资源的基本实体,线程是执行流,是资源,所以线程是进程内部的执行流资源,那么此时根据上面的理解一个进程,进程的PCB(执行流),地址空间,页表,物理内存上的代码和数据等都属于资源,所以下面红色框内的全部才是进程。所以如果计算密集型线程的数量比可用的处理器的数量多,那么可能会有较大的性能损失,这个性能损失是指增加了额外的同步和调度开销,而可用的资源不变。

2026-01-07 16:27:39 634

原创 Linux 信号的处理

对于一个进程,有进程的PCB,进程地址空间,以及页表,以及用户在物理内存中的代码和数据,其实这个页表是用户级页表,如何理解呢?之前小编一直在谈地址空间中0~3GB的用户空间,其实这个0~3GB的虚拟地址是通过用户级页表映射到物理内存中用户自己的代码和数据,我们执行用户的代码是在0~3GB的用户的虚拟地址空间中的正文代码开始执行的。

2025-12-29 18:22:02 1008

原创 Linux 信号发送和保存

实际执行信号的处理动作称为信号递达(Delivery)信号从产生到递达之间的状态,即此时信号被保存起来了,称为信号未决(Pending)进程可以选择阻塞/屏蔽(Block)某个信号,当信号被阻塞/屏蔽之后,不会处理这个信号,即信号不会被递达如果一个信号此时已经被阻塞,那么当进程收到了这个被阻塞的信号之后,不会处理这个信号,但是仍然会保存这个信号,此时这个信号处于信号未决状态,直到进程解除了对这个信号的阻塞之后,此时这个信号才会被处理,即此时信号才会被递达。

2025-12-28 16:17:36 666

原创 Linux 信号的产生

你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”,当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解成“在合适的时候去取”。在收到通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间,你并没有拿到快递,但是你知道有一个快递已经来了。

2025-12-28 12:49:04 1041

原创 Linux system V 共享内存

共享内存是进程间通信IPC的方式,相对于管道而言,需要经历数据从用户态到内存,内存到用户态的两次拷贝,共享内存则是直接对物理内存进行操作,不需要拷贝,一旦这样的内存映射到共享它的进程的地址空间,这些进程间进行数据传递就不再涉及到内核,换句话来说,进程不再通过执行进入内核的系统调用来完成传递彼此的数据,如何理解呢?请看下图进行进程间通信的本质就是要让不同进程看到同一份资源,那么共享内存又是如何做的呢?请看下图。

2025-12-27 01:54:03 688

原创 Linux 简单日志程序

ap: 这是一个 va_list 类型的对象,是指向可变参数的起始位置指针, last 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。用来提取可变参数列表中的参数的函数是va_arg,使用一次提取一个,每次提取的参数是直接返回的并且该函数提取的同时会自动将ap指向下一个参数。format:包含格式说明符的字符串,它定义了后续参数的输出格式,例: %d,%s。format:包含格式说明符的字符串,它定义了后续参数的输出格式,例: %d,%s。ap: 要销毁的变量。arg:可变参数列表。

2025-12-26 17:29:18 317

原创 Linux 进程间通信---命名管道

1,如果是具有血缘关系的进程,想要通信我们可以使用匿名管道,如果我们想在之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。2.在内核中,操作系统会打开一个文件,即在内核中,仅有一个文件的inode结构体,文件的files_operations结构体,一个内核级别的文件缓冲区,那么由于这两个进程可能会有不同的打开文件的方式,并且两个文件的执行流不同,读取写入到文件的位置可能也不同,所以分别会给这两个进程各自分配一个文件打开对象。

2025-12-25 23:21:45 643

原创 Linux 进程池小程序

【代码】Linux 进程池小程序。

2025-12-21 16:11:12 288

原创 Linux进程间通信---匿名管道

父进程创建匿名管道,同时以读、写的方式打开匿名管道,此时会分配两个 fd,fork 创建子进程,子进程拥有自己的进程系统信息,同时会继承原父进程中的文件系统信息,此时子进程和父进程可以看到同一份资源:匿名管道 pipe因为子进程继承了原有关系,因此此时父子进程对于 pipe 都有读写权限,需要确定数据流向,关闭不必要的 fd,比如父进程写、子进程读,或者父进程读、子进程写都可以。例如,如果父进程要写数据到管道而子进程读取数据,父进程应该关闭管道的读端,子进程应该关闭管道的写端。

2025-12-21 01:29:11 668

空空如也

空空如也

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

TA关注的人

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