自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络基础知识

协议是一种约定,也是一种标准。例如,著名的IEEE 754标准规定了浮点数如何在内存中存储;再比如投资者往往会与被投资者签订一份对赌协议,确保投资顺利进行。协议制定后,参与者都必须遵守该协议。不同行业中的协议往往由该行业中的翘楚制定,比如在通信标准领域,华为担任了重要角色,并作为5G标准的主导者之一。

2025-08-20 21:52:12 1940 26

原创 Linux多线程——线程池

本文系统介绍了线程池的实现与优化,主要内容包括:1)线程池概念及池化技术原理,2)线程池实现的两种版本(朴素版和封装版),3)单例模式的多种实现方式(饿汉、懒汉及线程安全版),4)STL线程安全、智能指针线程安全等周边问题。文章重点探讨了如何通过单例模式优化线程池设计,确保全局唯一实例,并详细分析了各种锁机制和读者写者问题的解决方案,为构建高效并发系统提供了实用技术方案。

2025-08-20 17:47:49 767 19

原创 Linux多线程——生产者消费者模型

生产者消费者模型是一种经典的多线程同步机制,通过缓冲区解耦生产者和消费者。本文介绍了基于阻塞队列和环形队列的两种实现方式。阻塞队列使用互斥锁和条件变量保证线程安全,当队列满时阻塞生产者,队列空时阻塞消费者。环形队列则利用信号量机制,通过空间下标取模实现循环存取,生产者和消费者可以并发执行。两种方案各有优劣:阻塞队列确保数据顺序性但可能引发死锁,环形队列性能更高但允许数据覆盖。文章通过代码示例展示了单/多生产消费场景的实现,并分析了不同场景下的适用性选择。该模型有效提高了系统并发处理能力,是任务调度和数据共享

2025-08-08 17:59:44 937 35

原创 Linux多线程——线程互斥与同步

摘要:多线程并发访问共享资源时存在数据竞争问题,需通过互斥锁和同步机制解决。 临界资源与竞争问题:多线程同时操作全局变量(如g_val--)时,由于CPU指令的非原子性,可能导致数据不一致。例如,线程切换时未完成的操作会使变量值异常。 互斥锁保护:通过pthread_mutex_t实现加锁(pthread_mutex_lock)和解锁(pthread_mutex_unlock),确保临界区代码的原子性。锁的粒度应尽量细以减少性能损失。 线程同步:条件变量(pthread_cond_t)解决线程间执行顺序问题

2025-08-08 11:48:45 1103 36

原创 Linux多线程——线程控制

线程是进程内的基本执行单位,作为 CPU 执行的基本单位,线程的控制与任务执行效率息息相关。合理地进行线程管理,能大大提升程序的执行效率,掌握线程的基本操作至关重要。

2025-07-31 17:54:13 928 35

原创 Linux多线程——线程的基本概念

摘要 本文深入探讨了操作系统中的进程与线程概念。线程作为轻量级执行单元,相比进程具有更低的创建和切换开销,能够提高程序并发性。在Linux系统中,线程通过复用进程管理机制实现,表现为轻量级进程(LWP),共享相同的虚拟地址空间和资源。文章详细分析了线程与进程的关系、地址空间管理机制,以及多线程编程的优势与挑战,包括性能提升、资源共享带来的同步问题等。通过代码示例,展示了多线程程序的运行特点及线程异常对进程的影响,为深入理解操作系统调度机制提供了理论基础。

2025-07-31 15:26:47 1060 43

原创 快乐的人做东西好像真的比较好吃

小摊和别人的不一样,在夜色中显得特别新,并且显然是精心布置过,周围围了一圈小树叶穿起来的土豆,旁边还挂着两把粉色泡沫做的剪刀装饰,走近一看,摊位上写着“剪刀洋芋”。店主早已仔仔细细包好了,大哥说想多要几个勺子,他也立刻答应,给了大哥6个,而此时我注意到他们的勺子也是精心挑选过的——长柄的,爱心形状,好几个颜色,看着很温馨。于是我又在夜市转了一圈,兜了回去,跑到小摊前,告诉他们土豆很好吃,并询问可不可以拍张照片,说想推荐给自己的朋友。摊主看起来很开心,一面祝我中秋快乐,一面选了只大土豆,又丝滑地将土豆剪开。

2025-07-26 00:28:41 213 7

原创 Linux进程信号信号处理

本文深入探讨了信号处理的关键机制与实现原理。首先分析了信号处理的时机选择,指出信号在内核态返回用户态时进行处理,以避免中断重要任务。文章详细阐述了用户态与内核态的转换机制,以及进程地址空间的管理方式,解释了信号处理过程如何利用CPU状态寄存器实现安全切换。重点介绍了sigaction函数的强大功能,包括信号屏蔽和自定义处理,并通过代码示例展示了其应用。此外,文章还补充了可重入函数、volatile关键字优化问题及SIGCHLD信号的子进程回收机制等关键知识,为理解Linux信号系统提供了全面视角。

2025-07-26 00:25:56 1135 39

原创 Linux进程信号——信号保存

本文深入探讨了信号传递过程中的核心概念与实现机制。文章首先解析了信号的四种产生方式(键盘、系统调用、软件条件、硬件异常)及三种状态(未决、递达、阻塞),并通过网购的比喻形象说明其运作原理。内核通过block、pending、handler三张表管理信号状态,其中前两者采用位图结构记录阻塞和未决状态,后者为函数指针数组处理递达动作。系统提供了sigset_t信号集及相关操作函数(如sigprocmask、sigpending)来管理信号屏蔽和未决状态。通过示例程序演示了信号阻塞、解除及未决状态检测的实现过程,

2025-07-25 21:14:39 1199 17

原创 Linux进程信号——信号产生

本文深入探讨了Linux系统中的进程信号机制。信号作为进程间通信与控制的重要手段,可分为普通信号(1-31)和实时信号(34-64)。文章详细介绍了信号的产生方式:1)键盘键入(如Ctrl+C触发SIGINT);2)系统调用(kill/raise/abort函数);3)软件条件(如alarm定时器);4)硬件异常(除零错误、段错误等)。重点分析了信号处理流程,包括信号注册(signal函数)、核心转储机制及其调试应用。通过示例代码展示了如何修改信号默认行为(除SIGKILL/SIGSTOP外)和利用核心转储

2025-07-25 20:38:23 1024 18

原创 消息队列与信号量:System V 进程间通信的基础

消息队列(Message Queue)是一种进程间通信机制,与管道和共享内存相比,它采用一种队列的方式来传递数据。消息队列通过**先进先出(FIFO)**的方式来管理消息,发送方将消息添加到队列尾部,而接收方则从队列头部读取消息。消息队列的特点:每个消息有类型(mtype),可以按类型区分消息。区分发送方和接受方的不同。发送和接收消息都是异步的,不需要发送方和接收方同时存在。消息队列的生命周期由操作系统管理,进程退出时不会自动删除。信号量(Semaphore)是一种用于实现同步和互斥。

2025-07-19 17:44:55 1209 33

原创 Linux进程通信——共享内存:System V 进程间通信的极速方案

共享内存(Shared Memory)是 System V 标准中的一种进程间通信机制,它允许多个进程共享物理内存的一部分。共享内存的出现解决了多个进程之间如何高效交换数据的问题,它是最适合高速、大量数据传输的 IPC 方式之一。与其他通信方式(如消息队列、信号量等)不同,共享内存的特点在于,它提供了进程直接操作同一块内存的能力。进程无需经过内核的中介,即可直接在内存中读写数据,从而避免了多次内核交互所产生的开销。

2025-07-19 15:33:11 896 53

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

命名管道是一种在文件系统中存在的特殊文件类型,它允许不同进程通过文件名(即“命名”)来访问和进行通信。与匿名管道相比命名管道的最大特点是允许没有共同祖先(即没有血缘关系)的进程之间进行通信。这使得命名管道在分布式系统和多进程应用中具有广泛的应用价值。之所以给管道起名字就是为了不同的进程之间利用管道名,找到管道文件进行进程通信,而不是局限于有亲缘关系的进程。比起匿名管道,命名管道也是内存级文件,在磁盘上都没有Data block块,命名管道多了一个inode结构体.1.time()函数time()

2025-07-11 17:46:21 994 46

原创 Linux进程通信——匿名管道

管道是单向的通信方式,意味着数据只能从一个端流向另一个端。通常情况下,一个进程写数据到管道,而另一个进程从管道中读取数据。这种方式被称为“半双工通信”,如果需要实现双向通信,需要两个管道。基于文件的设计,管道本质上是内存中的文件;管道文件并不是磁盘级别的文件,而是内存级别文件,管道文件没有自己的inode,也没有名字。过内存中的缓冲区进行存储,操作系统会将管道作为文件来处理。管道分为匿名管道和命名管道。匿名管道没有名字,是由操作系统在内存中创建的,仅限于有血缘关系(如父子进程或兄弟进程)的进程间通信。

2025-07-11 15:02:23 1018 34

原创 Linux基础IO--软硬链接与动静态库

其中的。

2025-06-30 09:15:00 1045 42

原创 Linux文件系统:从磁盘存储到inode结构与文件操作

Boot Block是Linux文件系统中一个关键且特殊的区域,它存储了引导加载程序,对于操作系统的启动至关重要。了解Boot Block的功能和作用有助于更好地理解Linux文件系统的整体结构和启动过程。同时,对于特定于嵌入式系统的Bootblock Linux来说,其引导块的设计和优化更是体现了其在资源受限环境下的高效性和稳定性。

2025-06-30 01:00:00 1522 28

原创 爱其实很简单

可雄鸟并不放弃,它继续推着雌鸟,一次又一次,最后雌鸟终于听从了它的劝告。它就那样守着小芙蓉鸟,不吃不喝,时而哀默,时而悲鸣。故而,直到小芙蓉鸟被元元拿走,雌鸟也不知道小芙蓉鸟就在干草下,更不知道干草是雄鸟衔来的。它们一边焦急地鸣叫,一边用粉红色的喙推着小芙蓉鸟,可小芙蓉鸟一动不动。春天过去时,芙蓉鸟就长大了。每天清晨日出之前,雄鸟便开始“啁啾——啁啾”地啼鸣,鸣声清脆婉转,充满喜悦,仿佛在迎接日出,又仿佛在感激日出。当雌鸟回到栖木后,雄鸟就迅速飞到鸟笼上方,叼来一根干草,盖在小芙蓉鸟身上。

2025-06-01 20:38:50 356 12

原创 Linux 简单模拟实现C语言文件流

🌇前言在C语言的文件流中,存在一个FILE结构体类型,其中包含了文件的诸多读写信息以及重要的文件描述符fd,在此类型之上,诞生了C语言文件相关操作,如fopenfclosefwrite等,这些函数本质上都是对系统调用的封装,因此我们可以根据系统调用和缓冲区相关知识,模拟实现出一个简单的C语言文件流。注意:demo。

2025-06-01 20:37:02 544 8

原创 Linux 学习-模拟实现【简易版bash】

返回指向分割出的子字符串的指针(tokens)。子字符串会从原始字符串中分割出来,并且这个分割后的子字符串是原始字符串的一部分,它们将共享内存空间。是 C 语言中的一个字符串处理函数,用于将一个字符串分割成多个子字符串(tokens)。在第一次调用时,传入需要分割的原始字符串,之后的调用则传入。例如,如果分隔符是空格和逗号,这三个字符,如果有,就具体问题具体分析,完成重定向。返回的部分,直到没有更多的子字符串为止(返回。:如果没有更多的子字符串可供提取,:传入待分割的字符串。可执行程序 < 文件。

2025-06-01 18:17:32 1080 4

原创 Linux基础 文件描述符,重定向及缓冲区理解

本文探讨了C语言中文件操作的底层机制,重点分析了文件描述符、重定向和缓冲区的工作原理。首先解释了文件描述符(fd)作为系统级文件标识符的作用,揭示了操作系统通过"先描述、再组织"的设计原则管理文件资源的方式。然后深入剖析了重定向的本质,说明其通过修改文件描述符指向来实现数据流向的变更。最后讨论了缓冲区的概念及其刷新策略,包括用户级和内核级缓冲区的区别,特别强调了缓冲区在进程fork时的特殊表现。这些机制共同构成了操作系统高效管理文件I/O的基础,体现了"一切皆文件"的

2025-06-01 14:51:21 1216 68

原创 Linux基础I/O【文件理解与操作】

本文回顾了C语言中的文件操作接口,重点介绍了文件打开、关闭和写入的相关函数及其使用方式。文件打开通过fopen函数实现,支持多种模式(如只读、只写、追加等),并可通过fclose函数关闭文件。文件写入则通过fputc、fputs、fwrite、fprintf和snprintf等函数实现,其中snprintf提供了更安全的格式化写入方式。文章还探讨了文件操作的本质,指出C语言的文件操作函数实际上是对操作系统系统调用接口的封装,用户程序通过操作系统间接与磁盘等外设进行交互。此外,文章简要介绍了系统级文件操作函数

2025-05-28 00:00:00 1041 24

原创 幸福,是能看见自己的拥有

能够控制自己贪欲的人,不是没有欲望,而是能时时刻刻看见自己的欲望,看见它在膨胀时的非理性,看见它在吞噬很多生命中美好的东西……看见,是控制的开始。贪婪的人,不知足的人,永远不会幸福,因为一个目标实现了,下一个更大的目标就在前头等着。欲望是一只会长大的小兽,你不断喂养,它会不断长大,直到它长成庞然巨兽,吞噬你所有的时间和精力,把你整个人的生命撑爆。而独立的人,如同长向云端的树,从容自处,自己就是幸福的源泉。成熟之后,有些人会发现,其实每个人都是完整的,根本不存在所谓的“另一半”,也不需要所谓的“另一半”。

2025-05-11 20:29:22 424 18

原创 Linux【进程程序替换】

在Linux系统中,程序替换是一种让子进程执行特定任务的技术。子进程在被创建后,共享父进程的代码,但通过程序替换,子进程可以执行其他程序。程序替换的主要目的是让子进程执行特定的指令,如shell中的bash通过创建子进程并替换为对应的指令程序来执行任务。Linux提供了七大替换函数,包括execl、execv、execlp、execvp、execle、execve和execvpe,这些函数都属于exec替换家族。其中,execve是系统级接口,其他函数都是基于它的封装。这些函数在程序替换失败时返回-1,成功

2025-05-11 20:24:24 1118 8

原创 Linux 进程等待

当waitpid函数以 waitpid(-1,NULL,0) 进行传参,效果跟wait是一样的,都是对任意一个进程等待。僵尸进程 是一个比较麻烦的问题,如果不对其做出处理,僵尸进程 就会越来越多,导致 内存泄漏 和 标识符 占用问题。前面我们写的都是阻塞等待的代码,但是都是我们自己手动判断结果,此处还有两个宏,下面使用宏来演示阻塞等待的代码。WIFEXITED(status) 判断进程退出情况,当宏为真时,表示进程正常退出。,OS 无法释放对应的 内核数据结构+代码和数据,出现 僵尸进程。

2025-05-11 18:58:23 1380 36

原创 Linux进程控制

🌇 前言 进程 创建后,需要对其进行合理管理,光靠 OS 是无法满足我们的需求的,此时可以运用 进程 控制相关知识,对 进程 进行手动管理,如创建。

2025-05-06 01:15:00 1016 45

原创 Linux进程学习【进程地址】

举个例子,如果需要将桌子划分为两块该如何划分,假设桌子长度为100厘米。我们可以将桌子划分为左边区域和右边区域,左边区域为[1,50],右边区域为[50,100]。用计算机语言描述则可以通过两个结构体来描述,一个描述区域宽度,一个描述哪个区域。int start;int end;//me//同桌地址空间本质就是内核中的一个结构体对象叫mm_struct。页表是操作系统用来管理虚拟地址和物理地址之间映射的一个数据结构。

2025-05-06 01:00:00 1291 57

原创 永远不要拎着垃圾走路

看到这样一幅漫画:一个愁容满面的男人拎着几袋东西在路上走着,丝毫没有注意到周围人异样的眼光。而他手里的东西,散发出阵阵恶臭,将路人都熏得掩住了口鼻。有人忍不住提醒了他,男人才惊觉,自己一直在拎着垃圾走路。生活中,很多人也有“拎着垃圾走路”的经历,比如遇到了一些破事,就会连着好几天闷闷不乐;经历了一次遗憾,还会时不时暗自伤神,不肯释怀;碰到了不讲理的人,就使劲跟对方争执,非要辩个是非对错……这些坏情绪、小遗憾、烂人烂事,本质上跟垃圾并没有任何区别。

2025-04-27 23:56:26 579 18

原创 Linux进程学习【环境变量】&&进程优先级

环境变量(Environment Variables)是操作系统用来存储系统配置信息的变量,它们决定了操作系统和程序的运行环境。简单来说,环境变量存储了影响系统运行的一些关键信息,例如系统路径、用户信息、程序配置等。它们对程序的运行至关重要,尤其是在编译、运行及配置程序时。一般是指在操作系统中用来指定操作系统运行环境的一些参数。例如在编译程序时,我们是不关心动态库位于什么地方,编译器链接时也只需要通过对应的 环境变量 就能找到动态库进行链接.

2025-04-27 21:06:33 1355 4

原创 动态规划-第七篇

2. 若 i == j 或 i == j - 1 ( [i + 1, j - 1] 不构成合法区间),此时只有 1~ 2 个相同的字符, [i, j] 区间⼀定是回⽂⼦串,成为回⽂⼦串的最少插⼊次数0。这个⽐较好分析, dp[i][j] 表⽰⼀个字符的最⻓回⽂序列,⼀个字符能够⾃⼰组成回⽂串,因此,此时 dp[i][j] =1;因此dp[i][j] = dp[i - 1][j - 1] + 1;时: dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) +1。

2025-04-27 16:28:57 885 2

原创 Linux进程学习【进程状态】

只有被OS管理好了,才能发挥它的全部功效,而系统中存在多个 ,OS无法做到面面俱到,因此为了更好的管理,OS把 分成了几种状态:阻塞、挂起、运行、休眠等等,至于每种状态的应用场景是什么、有什么用?本文将会带着大家认识的各种 状态 。运行状态是进程最基本的状态之一,表示进程正被操作系统的CPU调度并正在执行。任何我们在日常操作中看到的、正在执行的程序,如浏览器、文本编辑器、音乐播放器等,其背后的进程都在运行状态。当你在编辑一个文档时,你的文本编辑器进程就是处于运行状态;而当你在浏览器中浏览网页时,浏览器的

2025-04-25 19:43:43 1742 49

原创 Linux进程学习【基本认知】

冯诺依曼体系结构,又称普林斯顿结构,是一种经典的计算机结构设计模型。其核心思想是将程序指令存储器和数据存储器合并为一个统一的存储空间,并且通过共享的内存接口进行数据交换。在这种结构中,程序指令和数据位于内存的不同物理位置,但它们的存储形式和存取方式是一样的。冯诺依曼体系结构被广泛应用于各类计算机系统中,包括从最早的EDVAC电子计算机到现代的高性能处理器。这个结构的设计思想至今仍是计算机系统的基石。操作系统(OS)

2025-04-25 19:43:31 1266 23

原创 Linux工具学习之【git】

📘前言是一个代码托管平台,它的创始人是,git的诞生可以使我们对已提交的代码历史版本进行回溯,这是一个十分重要的功能,除了查看历史版本外,git 还支持代码合并和打标签等诸多使用功能;简言之,有了 git 以后,我们可以随时随地的对代码进行管理📘正文为了保证良好的阅读体验,本文中使用的都是新账号,可以跟着我一步一步来操作。

2025-04-24 01:15:00 741 12

原创 Linux工具学习之【gdb】

📘前言可以编写代码,可以编译代码,此时只最后一件神器,就能进行完整的开发工作,那就是通过调试代码,毕竟谁都不敢保证自己的代码没有问题,所以就有调试器这种东西帮助我们定位问题,进而解决问题。

2025-04-24 00:30:00 1127 21

原创 Linux-进度条小程序

2.执行下面代码。

2025-04-19 23:45:00 1884 13

原创 高效的项目构建:用 Makefile 自动化你的构建过程

依赖。

2025-04-19 23:15:00 1130 6

原创 Linux工具学习之【gcc/g++】

书接上文,我们已经学习了 Linux 中的编辑器 vim 的相关使用方法,现在已经能直接在 Linux 中编写C/C++代码,有了代码之后就要尝试去编译并运行它,此时就可以学习一下。

2025-04-18 19:08:14 1469 11

原创 Linux工具学习之【vim】

注意:

2025-04-18 19:08:02 1612 53

原创 深入理解 Linux 权限管理:从 Shell 到文件权限

Shell 是 Linux 操作系统中的一个中间层,类似于一个桥梁,连接了用户与操作系统的内核(kernel)。我们平时通过命令行输入的指令,都是通过 Shell 来传递给内核执行的。你可以把它想象成一个助手,它帮你传达命令并把执行结果反馈回来。Shell 比喻:小明和王婆的故事小明:用户,想要完成一些操作。王婆:Shell,作为一个中介,负责传递小明的需求。小美:操作系统,最终接收命令并执行。小王:权限限制,可能会阻止命令的执行。村长:超级用户(root),可以直接进行任何操作。

2025-04-17 14:17:00 2166 28

原创 软件安装包-yum

(不切换用户的情况下执行,执行root才能执行的命令)功能sudo允许系统管理员授权普通用户在一定的安全策略下以超级用户(root)或其他用户的身份执行特定的命令。通过sudo,普通用户可以在不切换到root用户的情况下,临时获得足够的权限来执行需要高权限的操作,如使用安装软件。工作原理:当普通用户使用sudo执行命令时,sudo会首先检查该用户是否在文件中有相应的授权记录。如果有,sudo会要求用户输入自己的密码(以确认是用户本人在操作),验证通过后,就会以指定的用户身份(通常是root。

2025-04-17 14:16:41 844 26

原创 Linux指令的详细介绍

🌼🌼Linux是一款强大且广泛使用的操作系统,命令行接口(CLI)是与其交互的核心方式。通过Linux指令,用户可以高效地执行文件管理、系统监控、进程控制等任务。虽然刚接触时可能感到有些复杂,但掌握基本指令后,操作将变得更加便捷和高效。本篇将简要介绍常用的Linux指令,帮助读者快速上手并提升工作效率。无论是文件管理、权限设置还是系统监控,我们都会提供清晰的解释和实用示例,帮助你深入了解Linux的强大功能。

2025-04-15 00:30:00 995 50

100期--数据结构板书+代码.zip

100期--数据结构板书+代码.zip

2024-05-13

空空如也

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

TA关注的人

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