自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【网络】IO多路转接 ---select、poll、epoll

当成一个数组的起始地址。

2026-03-27 16:54:15 397

原创 【网络】五种IO模型

IO全称为(input/output)输入输出,所谓得IO本质是应用程序与外部设备之间得数据交互过程。只要是程序性需要“读取外部数据(input /I)”,或者向外部写入数据(output/O)都属于IO操作。比如:我们用程序读取本地文件、通过网络请求从网卡获取数据、等操作都是需要IO操作。应用程序发起IO请求后,一直阻塞等待,直到外部数据就绪并完成数据拷贝,才执行后续代码。应用程序调用recvfrom()系统调用接口,发起IO请求,此时内核中并没有数据准备好。程序阻塞。内核也阻塞。

2026-03-26 12:24:18 510

原创 LeetCode238: 除了自身以外数组的乘积

这里需要注意的是,开头和结尾元素积,不能在初始化为0,必须要初始化为1,因为当元素在最开始或最后的一个位置时,后边所有元素相乘,如果乘0,则整个结果就为0了。既然要除该位置所有元素的乘积,那么我们可以把他想象成求该位置左边元素的乘积*右边元素的乘积。这样不就和前缀和和后缀和类似了吗。所以我们需要做的就是初始化两个数组,一个存放前缀积,一个存放后缀积。要求某个位置只需要让两个数组对应位置相乘即可。之中任意元素的全部前缀元素和后缀的乘积都在。之外其余各元素的乘积。时间复杂度内完成此题。

2026-03-26 08:58:50 27

原创 LeetCode724.:寻找数组的中心下标

题目要求求指定下标位置之前的元素和和之后的元素和相等,那么我们就可以构造两个数组,一个存放前缀和另一个存放后缀和。左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0。是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

2026-03-26 08:47:20 50

原创 【网络】传输层--UDP/TCP协议

UDP协议又叫用户数据报协议,属于传输层协议,它是一种无连接、不可靠、面向数据包的一种协议。核心作用是实现两台设备上应用程序的端到端数据传输。知道对方IP+port就直接进行通信,不需要进行连接。没有确认/重传机制,入果传输的数据报在网络中丢失,将没有任何错误返回。数据被打包成一个个独立的“数据包”,每个数据包都是独立的、完整的,互不关联。

2026-03-16 14:29:49 389

原创 【网络】应用层-HTTP协议

对于客户端传来的请求,作为服务器端要对请求进行分析,然后给出对应的回应,这里我们简单模拟一下,自定义给客户端发送一个应答报文。服务器代码增加大致就是自定义一些应答属性,然后设置默认打开的文件PAGE(index.html)简单的一个回答。//读取index.html文件in.close();//构建HTTP响应//状态行//响应报头//空行//响应正文//响应报文//响应HTTP请求效果展示HTTP版本问题。

2026-03-13 14:04:55 401

原创 LeetCode34:在数组排列中查找第一个和最后一个数字

规定两个区间,一个区间全部小于target,另一个区间大于等于target。我们在利用二分时,如果计算中间值我们称之为x, x>=target时我们更行right但需要注意的时,right最多更新到mid位置,因为这个位置的值可能等于target。如果x落在了小于target的区间,那么我们更新left的时候可以放心更新,更新到mid的下一个位置。按照朴素的二分查找模板已经不能解决这个问题,但该题目还是具有二段性,依旧可以使用二分查找。请你找出给定目标值在数组中的开始位置和结束位置。

2026-03-13 10:31:52 177

原创 LeetCode30: 串联所有单词的字串

它是 words 中以 ["the","foo","bar"] 顺序排列的连接。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。因为 words.length == 3 并且 words[i].length == 3,所以串联子串的长度必须为 9。它是 words 中以 ["bar","foo"] 顺序排列的连接。它是 words 中以 ["foo","bar"] 顺序排列的连接。

2026-03-12 10:27:42 311

原创 LeetCode438: 字符串中所有字母异位词

我们根据p字符串的长度,在s数组中依次找p.size()长度数组,与p数组进行对比,如果相等就返沪数组最嘴左边下标。起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

2026-03-11 11:27:39 236

原创 【网络】认识网络“协议”

说明:规定一些协议,对发送请求和应答设置一套约定好的形式。对请求和应答分别进行序列和反序列化。// 该类实现一些协议// Request --->client发消息给服务 端public:// 序列化--->发消息时,结构化数据转为字符串return s;// 反序列化-->接收消息时需要进行反序列化// 把字符串读取到Root中return OK;int _y;char _oper;

2026-03-11 10:33:22 460

原创 LeetCode904:水果成篮

我们定义双指针,left、right,right指针向右端遍历入窗口,把遍历到的数值以哈希表的方式存到hash中,更新最大值即可,并判断hash表的大小。如果hash.size()大于2那么就让left端出窗口,直接出到hash.size()==2,也就是把hash表中的种类删除一种,直到right=n停止判断。一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。可以采摘 [1,2,1,1,2] 这五棵树。棵树上的水果 种类。

2026-03-10 23:20:08 183

原创 【网络】Socket网络编程

本文摘要:文章介绍了Socket编程的基本概念,重点阐述了网络通信本质是进程间通信,通过IP+端口号唯一标识网络进程。详细讲解了端口号划分、TCP/UDP协议特性差异、网络字节序转换等基础知识,并列举了socket编程常用API接口。文章还展示了UDP和TCP的多个实践版本,包括回声服务器、词典服务和聊天室等,从单线程逐步扩展到多线程和线程池实现。最后介绍了IP地址转换函数的使用注意事项,为网络编程提供了实用指导。

2026-01-25 17:53:13 639

原创 【网络】网络基础

所谓协议其实就是通信双方都认识的一种结构化的数据类型。

2026-01-24 22:33:09 555

原创 【Linux】线程同步和线程互斥

我们知道线程之间是共享地址空间的,也就是共享资源,这很容易造成数据不一致问题,所以引入线程的互斥来解决数据不一致问题。

2026-01-10 14:25:44 883

原创 【Linux】线程基础:控制逻辑与封装指南

进程内部的一个控制序列称为线程。

2026-01-01 13:42:28 727

原创 【Linux】进程信号深度解析

所有的信号产生最后都要经过os调用管理,实际上信号的产生只需要修改一张表的位图(pending表)即可,后续在信号的保存会讲。

2025-12-28 17:20:44 931

原创 【Linux】进程间通信(IPC):从管道到共享内存

进程通信(IPC)是指不同进程之间传递数据、交换信息或协同工作的一种机制。在OS中,进程是资源分配的基本单位,且彼此拥有独立的地址空间(内存隔离),无法直接访问对方的数据,因此需要专门的通信方式来实现进程间的协作。我们把从一个进程连接到另一个进程的一个数据流成为一个“管道”。图解:我们知道所有的通信本质就是让不同的进程看到同一份资源。基于消息队列的通信本质也就是os在内核中维护的一个基于队列实现的共享资源。细节理解:1.队列的创建会创建秒速队列的节点+队列结构。

2025-12-21 20:32:49 855

原创 动静态库制作与原理

本文介绍了C/C++库的概念与制作方法。库是封装好的可复用代码,分为静态库(.a/.lib)和动态库(.so/.dll)。静态库在编译时链接到可执行文件,而动态库在运行时加载。制作静态库需将.o文件打包,动态库需生成位置无关码(-fPIC)并共享链接(-shared)。使用时需指定头文件路径(-I)和库路径(-L),动态库还需配置系统查找路径。ELF文件结构包括头、程序头表、节头表和节,加载时会将相同属性的节合并为段。动态链接通过全局偏移表(GOT)实现地址无关代码(PIC),使库能被多个进程共享。

2025-12-12 18:52:14 716

原创 文件系统(磁盘级文件)

我们把其中一个组管理好,就能管理好整个块,把整个块管理好就能把整个磁盘管理好。(以下就以分组来探究)

2025-11-26 17:07:43 970

原创 文件系统(内核级文件)

虽然每个设备有不同的读写方法但是在使用时os创建的struct_file是一样的,进程只需要通过文件描述符表就能找到对应的struct_file对象,根据struct_file中的方法实现对应底层功能即可,所以在linux用户层面不需要关心底层设备是什么,只需要访问对应设备对应的文件描述符,找到struct_file,通过里边的实现方法就可直接访问硬件设备。对于以下代码,利用系统函数open创建文件,成功创建后该文件的fd直接就是3,那么0,1,2,代表的是那个文件呢?

2025-11-24 15:45:37 626

原创 OS自定义shell模拟实现(简易版)

我们使用fgets输入“ls -a -l" 是一个字符串,进行程序替换时要知道我们想要执行的是什么命令,所以要对字符串进行拆分”ls", "-a", "-l"。判断内建命令确实可以切换当前工作路劲,但是命令行参数的值并没有改变,那是因为该进程的环境变量没有改变。该程序无法使用cd来切换当前路径,是因为cd为内建命令,不需要通过创建子进程来进行执行,而是直接父进程执行。str:要切割的字符串,第一次切割直接传字符串,第二次要是还想切割该字符串,直接设置为nullptr。stream:输入流,stdin。

2025-11-19 17:18:26 441

原创 OS进程控制

进程终止的本质就是释放系统资源,释放相关的内核数据结构(pcb)和代码数据。。//-l 列表的意思//-p 环境变量,默认找路径// v(vector) 数组存储命令行参数(结合上边,不足举例)//e 环境变量 要求调用的程序使用全新的环境变量(系统层面)上边五个所有接口底层都是调用这个函数进行的。

2025-11-15 17:34:16 649

原创 环境变量与程序地址空间

main函数举例功能:是实现程序不同子功能的方法。(类似 ls -a/-l/-b)由上图代码和运行结果我们可以看出argv指的时命令行参数的个数,argv指的是存储命令行参数的数组。由此我们也不难理解我们经常使用的常见命令,(ls ps top)这些命令是如何实现的了。

2025-11-10 14:17:04 693

原创 进程优先级+进程切换+调度算法

所谓的进程优先级就是进程得到cpu资源的先后顺序(也就是cpu分配资源的先后顺序),因为。

2025-05-07 09:05:26 1056

原创 操作系统(进程+进程的状态)

所谓的进程就是类似一个可执行程序,加载自己的代码从磁盘到内存,在此之前会先加载操作系统这个大的进程,然后操作系统根据磁盘加载文件,在操作系统内部创建一个pcb(进程控制块(类似于节点存放进程的属性 指向该代码(能指向改代码的原因是因为pcb中存在一个指向代码数据的指针))),类似情况操作系统想对进程进行增删查改,其实就是对其内部节点进行增删查改。

2025-05-06 10:35:14 810

原创 操作系统引入

由上图可以看出整个的冯诺依曼体系结构包括外设(输入/输出)以及内设(存储器/中央处理器组成)。

2025-04-15 11:44:45 400

原创 Linux开发工具

以上为linux开发常用工具,这些工具的深度仅仅只是适用目前开发水平,如有疑惑请私信小编。!!

2025-03-16 18:19:56 1011

原创 C++ 继承,多态

现实中尽量不要使用或则设计菱形继承,因为很复杂。

2025-02-23 21:01:02 1229

原创 c++ string类 +底层模拟实现

两则底层逻辑相同,但是对于迭代器来讲可以在迭代器中修改变量值(因为底层类似指针可以直接修改对应地址的·1值),而对于范围for来讲,(auto ch: s2)相当于是一个拷贝,修改ch的值并不能修改实参的值,所以需要用引用(auto& ch: s2)才能修改变量的值。对于拷贝构造,对自定义类型完成神拷贝,浅拷贝(一个字节一个字节拷贝)并不能满足,原因如下。对于写时拷贝只试用满足原因1,并不能满足条件2(自己进行扩容规深拷贝)相当于一个字符一个字符读取字符串,遇到,‘\0’会终止读取。

2025-02-02 16:45:32 416

原创 C++内存分布

总结:只要是局部变量都存在栈上,因为出了函数2作用域变量都要销毁。

2025-01-17 22:40:32 452

原创 C++复习

如果该自定义变量有对应的默认构造(原本类里边),那么可以不在初始化列表对它进行初始化,如果没有该变量的默认构造,则需要在初始化列表进行初始化,若存在默认构造且在初始化列表对该变量也有进行初始化,则优先使用初始化列表的初始化。

2025-01-14 23:38:03 1027

原创 MYSQL 库,表 基本操作

1.对将要存储的数据进行编码2.对将要执行的操作(增删查改)数据是对数据编码的校验,本质也是一种读取数据库中数据库采用的一种编码格式。

2024-11-13 22:12:46 693

原创 SQL pta习题

select sdept as 系别,ssex as 性别, count(*) as 人数。select cno as 课程号,cname as 课程名,credit as 学分。select sno as 学号,sname as 姓名,pnum as 身份证号码。select cno as 课程号,count(*) as 选课人数。select dept as 院部 ,count(*) as 总人数。where dept='音乐学院' or dept='体育学院';where sex='女';

2024-11-08 00:16:14 859

原创 DNS服务器配置

DNS主/辅服务器配置

2024-11-04 19:56:27 1287

原创 MYSQL安装(ubuntu系统)

rpm -qa 查询安装软件包ps axj 查询服务。

2024-11-01 22:51:35 634 1

原创 Linux常见基本指令大全

cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录中。“=”表示套接字(sockets)。head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的 开头至标准输出中,而 tail 想当然尔就是看档案的结尾。2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它 将所给的源文件或目录重命名为给定的目标文件名。

2024-10-26 15:10:18 1076 2

原创 堆(数据结构)

堆的底层逻辑是一个完全二叉树(或满二叉树)。

2024-08-14 22:44:36 426

原创 二叉树(入门)

理解二叉树之前先理解一下树的的概念。

2024-08-14 11:57:38 848

原创 栈和队列的模拟实现(C语言版)

【代码】栈和队列的模拟实现(C语言版)

2024-08-14 09:56:30 356

原创 C++(类和对象.下)

这是因为实例化对象2进行了一个隐式类型转换。在数值2赋值给B b2对象时,会默认生成一个临时的拷贝构造(拷贝函数为类的构造函数)。然后在把拷贝构造后的类型给对象b2,进行调用。由以上运行结果可知,我们晓得实例化对象1很正常调用构造函数,但实例化对象2觉得比较奇怪。如果不想进行类似隐式类型转换,那么就在构造函数前加explicit关键字即可。

2024-08-08 18:04:08 319

空空如也

空空如也

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

TA关注的人

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