自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

liuty0125的博客

是什么?为什么?怎么用?

  • 博客(58)
  • 收藏
  • 关注

原创 【Linux操作系统/网络】I/O多路转接之select

elect是系统提供 select 函数来实现多路复用输入/输出模型,是一种 IO 多路复用技术,允许程序同时监控多个文件描述符(fd)的读写事件,从而在单线程中处理多个客户端连接(避免为每个连接创建线程的开销)。

2025-10-30 11:39:38 1130

原创 【Linux操作系统/网络】I/O多路转接之poll

Linux中的poll系统调用实现了I/O多路复用功能,允许程序同时监控多个文件描述符的就绪状态。其核心是pollfd结构体数组,通过events设置监听事件,revents返回实际发生事件。相比select,poll没有文件描述符数量限制且事件管理更直观,但仍需遍历检查就绪状态。示例代码展示了如何使用poll监控标准输入,并提供了将select服务器改为poll服务器的实现方案,关键步骤包括初始化监听套接字、处理新连接和读写事件,体现了poll在服务端编程中的实际应用。

2025-10-30 11:38:51 858

原创 【Linux/C++】定时器(时间轮)实现

摘要 本文介绍了Linux服务器中处理超时连接的技术方案。首先讲解了timerfd_create和timerfd_settime定时器接口的使用方法,通过设置itimerspec结构体实现周期性超时检测,并给出了定时器示例代码。针对大规模连接场景,提出基于时间轮的优化方案:将连接按超时时间哈希到时间轮对应槽位,通过指针周期性移动触发超时处理。采用多级时间轮(秒/分/时)支持更长超时周期,并利用智能指针的引用计数机制实现连接活跃时的任务取消/重置功能。最后展示了时间轮实现的类结构,包含TimerTask任务封

2025-10-21 16:06:52 1095

原创 【Linux操作系统/网络】五种 IO 模型与阻塞 IO

五种IO模型及其效率比较。通信本质是IO,即等待和拷贝的过程。高效IO指单位时间内等待占比越低效率越高。五种模型包括:阻塞IO(默认方式)、非阻塞IO(轮询方式)、信号驱动IO、IO多路复用(同时等待多个文件描述符)和异步IO。其中多路复用效率最高。文章还区分了同步/异步通信、阻塞/非阻塞的概念

2025-10-21 16:06:41 1272

原创 【网络套接字编程】基于UDP协议的公共聊天室项目

本文实现了一个基于UDP的公共聊天室系统,主要包含服务器端和通信模块。服务器端使用UDP协议接收客户端消息,通过通信模块将消息转发给所有在线用户。通信模块采用线程池技术高效处理消息转发任务,实现了在线用户管理和消息广播功能。系统支持用户动态加入/退出,通过互斥锁保证线程安全,使用函数包装器和回调机制实现任务分发。整体设计实现了高效、实时的群组消息通信功能。

2025-09-25 11:46:29 620

原创 【C++】常见特殊类设计方式(单例模式、只在堆或栈创建、禁止拷贝)

本文介绍了C++中几种特殊对象创建方式的实现方法: 禁止拷贝:通过将拷贝构造函数和赋值运算符设为私有(C++98)或使用=delete(C++11)来禁止对象拷贝。 堆上对象:将构造函数设为私有,通过静态成员函数在堆上创建对象。 栈上对象:类似堆上对象实现,并禁用operator new以防止new调用。 禁止继承:C++98通过私有构造函数实现,C++11可使用final关键字。 单例模式:分为饿汉模式(程序启动时创建)和懒汉模式(首次使用时创建),后者需考虑线程安全,使用双重检查锁定机制。 这些技术可用

2025-09-25 11:44:14 466

原创 【MySQL数据库】表的增删查改

本文介绍了MySQL数据库操作中的增删改查(CRUD)基本语法。在增加数据部分,详细讲解了单行/全列插入、多行/指定列插入、冲突更新和替换更新四种插入方式。查询部分涵盖全列查询、指定列查询、表达式查询、去重操作,以及WHERE条件筛选和结果排序。修改数据部分演示了UPDATE语句的基本用法,包括单列和多列更新。全文通过学生成绩表的具体示例,展示了各种SQL语句的实际应用场景和注意事项,为初学者提供了清晰的操作指南。

2025-09-19 21:17:25 711

原创 【MySQL】使用C/C++链接mysql数据库

本文介绍了MySQL C API的基本使用方法,主要包括数据库安装配置和接口调用流程。在安装方面,提供了手动导入安装包和系统指令安装两种方式,并说明了编译时链接库文件的方法。接口使用部分详细讲解了五个关键步骤:初始化数据库连接(mysql_init)、建立连接(mysql_real_connect)、执行SQL命令(mysql_query)、处理查询结果(mysql_store_result及相关API)以及最后释放资源(mysql_free_result和mysql_close)。文中还包含了设置字

2025-09-19 21:16:25 928 3

原创 【MySQL数据库】表的约束

MySQL约束机制用于保证数据的完整性和一致性。主要包括:空属性约束(NOT NULL)确保字段不为空;默认值(DEFAULT)为字段设置默认填充值;主键(PRIMARY KEY)保证字段唯一且非空,支持单字段和复合主键;唯一键(UNIQUE)确保字段值唯一但允许为空;自增长(AUTO_INCREMENT)自动生成递增值,常与主键配合使用;外键(FOREIGN KEY)建立表间关联,确保从表数据引用主表有效数据。这些约束共同作用,使数据库能有效防止非法数据插入,维护数据关联性。

2025-07-16 11:09:01 1025

原创 【MySQL数据库】表的修改

本文介绍了MySQL数据库表的基本操作,包括创建表、查看表结构、修改表和删除表。创建表时需要指定表名、字段名、数据类型及字符集等属性;修改表操作包括改表名、改列名、添加/删除列、修改字段类型和调整字段位置等;最后介绍了删除表的语法。这些基础操作对数据库管理和维护至关重要,能帮助开发者有效管理数据表结构。

2025-07-16 11:08:02 577

原创 【网络套接字编程】基于UDP协议的聊天服务项目

UdpClient.cc代码主要功能是创建一个UDP客户端,连接服务器并发送消息,然后接收服务器的回应。UDP服务器接收消息的核心代码行,使用 recvfrom() 系统调用从socket接收数据,云服务器的port默认都是禁止访问的。云服务器放开端口8080 ~ 8085。UDP服务器处理接收到的消息并返回响应的核心代码段。

2025-04-15 09:49:23 1211 1

原创 【计算机网络】网络套接字(Socket)基础

否则就忽略, 直接发送即可。IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16。我们知道IP地址可以标识唯一的一台主机,而端口号port可以标识该主机上唯一的一个进程,两者结合起来就可以标识互联网中的唯一一个进程(虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in;因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.

2025-04-15 09:48:05 809

原创 【计算机网络】网络基础(协议,网络传输流程、Mac/IP地址 、端口号)

核心问题就是计算机之间的距离变远了,数据传输变得不再那么方便了,所以有了网络,而距离变远必然会引发新的问题(可靠性、主机定位等 ),所以我们的网络协议就是为了解决这些问题,所以协议就是一种解决方案。而在去北京的过程我们会经过许多站,比如我现在在长沙,我的源mac地址就是长沙,我的下一站是武汉,我们的目标mac地址就是武汉,mac地址会随我们站的改变而改变。如何让这些不同厂商之间生产的计算机能够相互顺畅的通信?在我们的世界,是先有局域网再有互联网的,各种各样的局域网组合通信构成了我们的互联网。

2025-04-14 17:44:26 1338

原创 【MySQL数据库】数据类型详解

其实数据类型就是MySQL中的一种天然的约束,满足就可以插入。

2025-04-14 17:42:30 1028

原创 【Linux操作系统】多线程控制(创建,等待,终止、分离)

将轻量级进程的系统调用进行封装,转成线程相关的接口语义提供给用户,让用户感觉自己使用的是线程,但实际上底层是轻量级进程 ,所以我们平时在Linux中使用线程必须带上这个库, 不过要注意的是这个库并不属于LInux内核,只要是库它就是在用户级实现的,因此有许多人将Linux的线程称作“用户级线程”,所有线程的实现都是在 用户级实现的。线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的 同步和调度开销,而可用的资源不变。从线程函数return。

2024-12-03 10:04:21 1939 1

原创 【Linxu操作系统】多线程id及线程库对线程的管理

我们知道线程共享进程资源,但也有自己的一部分数据,但大部分数据还是共享的,比如我们定义一个全局变量,每个线程都共享这个变量,但如果我想让这个全局变量被每个进程都私有呢?其实跟我们平时写单进程代码很像,每个线程都会有一个相同的东西,我又不想在每个线程中都定义一下,我就可以将这个变量加上。我们知道,在运行多线程代码时,要连接线程的动态库,否则就会失败,那么这个动态库在我们的代码中起到了什么作用呢。首先将我们的线程库加载到内存(物理内存)中,通过页表可以映射到进程的地址空间中,从而维护我们的线程。

2024-12-03 10:02:56 389

原创 【Linux操作系统】多线程的概念与原理

我们的代码在内存中是可以被划分的,那么各个函数自然也是划分开来的,我们的程序最后形成的是一个可执行程序,所有的函数都要按照地址空间统一编址,函数编译完成后会形成若干代码块,函数名就是该代码块的入口地址,即每个函数都有自己的虚拟地址我们的各个轻量级进程(线程)可以通过访问这些各个函数的地址,执行不同的函数,从而达到多线程的目的

2024-12-02 19:48:48 858

原创 【Linux操作系统】进程间通信之匿名管道与命名管道

管道是操作系统中最古老的进程间通信的方式我们把一个进程连接到另一个进程的一个数据流称为一个“管道”

2024-10-30 20:51:45 1342 3

原创 【Linux操作系统】进程等待

"进程等待"是指一个进程因为某些原因暂时无法继续执行,而必须等待某个条件满足或某个事件发生后才能继续执行的状态,是操作系统进行资源管理、任务调度和同步协调的重要机制之一。通俗来讲就是我需要得到我想要的结果,我才能执行下一步本文主要讲解父子进程之间的等待关系。

2024-10-16 21:11:49 1040

原创 【Linux操作系统】进程终止

errno是一个在头文件中定义的整型变量,当函数发生错误时,会设置errno为特定的错误码。main函数return返回的时候表示进程退出,return 的结果为退出码,我们还可以设置退出码的字符串含义。main、exit等函数的返回值,叫做进程的退出码,一般0表示进程执行成功,非零表示执行失败。函数的执行情况指的是函数在执行过程中是否遇到了错误或异常情况,以及这些错误或异常的类型和性质。我们可以通过退出码了解进程的执行结果,那么我们怎样知道函数的具体执行结果呢。

2024-10-16 21:09:32 741

原创 【Linux操作系统】进程的创建与替换

学习了Linux操作系统我们可以知道,进程是系统分配资源的基本单位,也是CPU调度的一个实体,它是程序执行的一个实例,Linux中提供了多种机制来创建进程,一般常用的是通过fork0()、clone()等系统调用,以及更高级的封装exec()系列函数()。在linux中fork函数时非常重要的函数,也是是最常用的创建新进程的系统调用返回值:自进程中返回0,父进程返回子进程id,出错返回-1当一个进程调用fork()时,系统会创建一个与当前进程几乎完全相同的子进程。

2024-10-01 17:13:49 1041

原创 从底层理解为什么常量区中的代码不能被修改?

平时我们在编写代码时都会用到或遇到所谓的常量区或者不可修改的代码,比如说用双引号包起来字符串(“Hello World”)、C++中的 const、Java中的final等,平时我们在用或者见到时只知道这时语法规定的,但你有没有想过这到底 是为什么呢?本文将从操作系统底层分析常量区不可修改的原理。

2024-10-01 17:12:52 900

原创 【Linux操作系统】进程优先级

因此出现了优先级,我们的进程如果要访问某种资源,进程就要通过优先级以一定的方式进行排队,也就是享受资源的先后顺序。代表这个进程可被执行的优先级,通俗点说就是程序被CPU执行的先后顺序,其值越小越早被执行。优先级较高的进程会优先得到资源,后序还会有源源不断的进程产生,常规进程难以享受到资源。如果不加限制,将自己进程的优先级调整的非常高,别人的优先级调整的非常低。代表这个进程的nice值,其表示进程可被执行的优先级的修正数值。在优先级的修改中会介绍两者的用处。也体现出了进程的竞争性。,我们的进程之间需要。

2024-09-25 22:09:18 615

原创 有关main函数参数的理解与使用

在平时编写代码的过程中,我们会经常写main函数,这是一个程序必不可少的,main 函数是一个特殊的函数,它是程序执行的入口点,但我们往往都没有在意或使用main函数的参数,但main函数其实是有自己自带的参数类型的,只是我们一般没有用到。

2024-09-25 21:34:58 2268 3

原创 【Linux操作系统】系统进程状态与类型详解

于是为了保证某些正在干重要事情的进程不被杀掉,给这些进程加了一块“免死金牌” D状态,操作系统在杀进程时,如果进程只是一个普通的‘S’,操作系统可以杀,但如果是‘D’,那么因为有免死金牌,操作系统不能杀。进程一般退出的时候,它的代码和相关数据会被释放,但是,它的task_struct对象依然还在内存中,仍然占用内存,占用进程表,这些僵尸进程会累积起来,占用大量的进程表项。这可就麻烦了,信息丢失可是个大问题。一般系统中D状态的进程是很少见的,如果你看到了D状态的进程,那就说明你的系统里挂不远了,洗洗睡吧。

2024-08-07 12:14:46 1969 2

原创 有关Linux操作系统中僵尸进程与孤儿进程的理解

然而,在某些情况下,如果系统中产生了大量的孤儿进程,并且这些进程长时间运行而不结束,那么它们可能会占用系统资源,影响系统性能。进程一般退出的时候,它的代码和相关数据会被释放,但是,它的task_struct对象依然还在内存中,仍然占用内存,占用进程表,这些僵尸进程会累积起来,占用大量的进程表项。简单说就是父进程既然创建了子进程后,定然会给子进程布置了任务,子进程完成任务后需要将任务的完成情况报备给父进程,否则父进程怎么知道你有没有好好完成任务呢?前面我们知道,僵尸进程是能够恢复的,只要被父进程回收就行。

2024-08-07 12:14:37 694

原创 【Linux操作系统】进程的基本概念(PCB对象)详解

比如在学校在录取时,需要学生进行排队录取,会根据成绩的高低,也就是优先级来排队,在这里排队的肯定不是你本人过来排队,而是你的被学校导入的属性信息在排队,操作系统也是这样,也是要通过这种方式来进行进程的管理,比如我们以后会学到进程也要排队,这里排队的就是进程的PCB对象,而不是进程可执行程序的代码和数据。在一个学生被录取到学校时,先到学校的一定不是学生,而是这个学生所有的属性信息(也就是上面的结构体),学校会将这个学生的属性信息导入到学校的系统中,通过这些学生的属性信息通过这些属性信息来对学生进行管理。

2024-08-06 21:38:59 1089 1

原创 【Linux操作系统】关于深度睡眠与浅度睡眠进程的理解

S(sleeping)在本质上也是阻塞状态的一种,可以说是阻塞的一种分支S状态是Linux中可中断的睡眠状态,表示进程正在等待某个事件或资源S状态下的进程可以被信号或中断唤醒并继续执行。在这种状态下,进程无法继续执行,因为它需要等待的资源或事件尚未发生。此时进程不会占用CPU资源,操作系统会调度其他可执行的进程等待某个事件或资源的完成后或者接收到信号,又会自动回到运行状态例如我们平时的命令行等待我们输入命令时就是一个浅度睡眠状态。

2024-08-06 21:37:09 556

原创 【Linux操作系统】makefile文件操作详解

在Linux中,Makefile是一种用于自动化构建和编译软件项目的工具。它通常用于管理大型项目中的源代码文件,以及定义项目的编译、链接和其他构建过程Makefile是一种文本文件,其中包含了一系列的规则,这些规则定义了如何从源代码文件生成目标文件(如可执行文件或库文件),它用于自动化编译过程,提高开发效率,减少手动编译的繁琐和出错率。

2024-08-01 19:50:52 2284

原创 【Linux操作系统】进程与内存文件的关系及文件描述符fd、重定向的理解

我们如果想访问文件,第一步都是要打开它,想要修改文件,都要通过执行代码以进程的方式完成修改3.我们的CPU只能访问内存,因此文件必须被加载到内存中才能访问4.一个进程可以打开多个文件,在一定时间内,系统会存在多个进程,但可能同时会存在更多被打开的文件,我们的系统是如何对这些文件进行管理的呢?5.系统中是不是所有的文件都被进程打开了(内存文件)?并不是,没有被打开的文件在磁盘中(磁盘文件)

2024-08-01 19:01:35 1223 1

原创 【Linux】有关Linux中进程地址空间及页表原理的理解

虚拟地址映射到物理地址的地址可能是这个区域一块,那个区域一块 ,物理内存里的存储可能是混乱无序的,但如果我们有了页表这个中间转化的结构,哪怕物理内存中的储存再无序,但虚拟地址是有序的,物理内存的有序或无序与进程没有任何关系,因此页表映射使得物理内存从无序变成有序,让进程以统一的视角看待内存。但是这个虚拟内存并不存在内存或外存(但可以一部分在外存中,通过一些算法等)中,它是由操作系统和硬件管理的,是每个进程的一个独立地址空间,虚拟地址空间的布局内容在进程的地址空间中定义。

2024-07-30 09:51:23 1507 1

原创 【Linux】vim编辑器使用详解

Vim(ViIMproved)是一种高度可配置的文本编辑器,用于有效地创建和更改任何类型的文本。Vim的设计目标是提供一种高效的文本编辑方式,通过键盘快捷键和命令来执行大部分编辑任务,从而减少对鼠标的依赖。Vim 的设计哲学是键盘优先,所以尽量使用键盘快捷键来完成操作,而不是鼠标。随着你对 Vim 的熟悉,你会发现使用 Vim 的效率远远超过其他编辑器愿我们都能玩转Vim。

2024-07-20 21:29:36 2859 1

原创 【C++11】initializer_list、可变参数模板详解

在C++98及这前的版本中类模版和函数模版中只能含固定数量的模版参数C++11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板模板参数包是一个特殊的模板参数,它表示零个或多个模板参数。在函数模板或类模板的定义中,可以使用省略号(…)来声明一个模板参数包。// Args是一个模板参数包,args是一个函数形参参数包// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。// 这里可以使用递归或循环来展开参数包。

2024-07-20 21:29:11 1361

原创 操作系统之shell命令(外壳)及其运行原理详解

但我们一般用户,不能直接使用kernel,而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。通过shell对我们的指令进行解析,解析指令给Linux内核。shell(外壳)只是一个统称,一切有类似功能都乐意被称为shell外壳,这里的bash就是shell外壳。我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作。(比如进入D盘的操作,我们通常是双击D盘盘符),因此图形接口就是shell外壳。为什么不能直接使用kernel呢?

2024-07-18 20:17:48 609

原创 Linux操作系统有关权限的理解

第一个字符决定了Linux的文件类型,例如上面的d,除了d还有一些文件类型字符。但凡是都有例外,上述规则对root不管用,root具有超级权限,几乎无视权限。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”超级用户可以再linux系统下做任何事情,不受限制。我们创建一个新文件是,文件会有自带的默认权限。而普通用户只能做有限的事情。

2024-07-18 20:13:32 1550 1

原创 【C++11】 lambda表达式和包装器(function、bind)

lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type { statement }[capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。必写)(parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。

2024-07-15 21:37:14 984

原创 【数据结构】布隆过滤器的原理讲解及其底层实现和海量数据问题

1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关2. 哈希函数相互之间没有关系,方便硬件并行运算3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能6. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算。

2024-07-13 11:33:50 1478

原创 位图(Bitset)的应用及其原理数据结构介绍

【代码】位图(Bitset)的应用及其原理结构介绍。

2024-07-12 09:44:43 1617

原创 【数据结构】深入理解哈希及其底层数据结构

桶的个数是一定的,随着元素的不断插入,每个桶中元素的个数不断增多,极端情况下,可 能会导致一个桶中链表节点非常多,会影响的哈希表的性能,因此在一定条件下需要对哈希表进行增容,那该条件怎么确认呢?开散列最好的情况是:每个哈希桶中刚好挂一个节点, 再继续插入元素时,每一次都会发生哈希冲突,因此,在元素个数刚好等于桶的个数时,可以给哈希表增容。闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有 空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。

2024-07-11 16:45:27 1247

原创 【高阶数据结构】红黑树详解

在前面我们学习了平衡二叉树,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现,除了AVL树,下面我们要学习的红黑树也是处理二叉树自身缺陷的一种方式RED,BLACK,_kv(kv),_col(RED){}

2024-06-12 21:47:26 1379

空空如也

空空如也

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

TA关注的人

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