自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux生产者消费者模型

生产者消费者模型是一种解决生产者和消费者强耦合问题的多线程同步机制。该模型通过缓冲区(阻塞队列)作为中介,生产者将数据放入队列后无需等待消费者处理,消费者直接从队列获取数据。这种设计实现了松耦合,支持并发操作,并能应对生产消费速度不均的情况。文中以超市运营为例,将供应商比作生产者,顾客为消费者,货架作为缓冲区,生动阐释了模型中的互斥与同步关系。代码实现展示了基于阻塞队列的生产消费逻辑,强调了条件判断和线程唤醒机制的重要性。该模型在提高系统稳定性和效率方面具有显著优势。

2025-06-18 19:30:03 492 2

原创 多线程并发编程中的竞态条件分析

这篇文章分析了一个多线程并发程序的输出可能性。题目涉及两个线程同时执行修改全局变量并输出的操作。关键点包括:线程并发执行的非原子性操作、共享变量的竞态条件、I/O缓冲机制的影响。详细解释了四种可能的输出结果(22,23,32,33),并从机器指令、线程调度和缓冲机制等角度进行了说明。特别强调了printf缓冲机制对输出顺序的影响,以及非原子操作导致的数据竞争问题。通过具体时序分析展示了不同线程交错执行可能产生的各种输出组合。

2025-06-16 17:13:21 699 1

原创 Linux-多线程安全

Linux线程管理与同步机制摘要 本文详细介绍了Linux系统中的线程管理与同步机制,主要内容包括: 线程状态管理 分离线程(Detached)与可连接线程(Joinable)的区别 pthread_detach()函数的作用和使用方法 线程资源回收机制 线程互斥 临界资源和临界区的概念 互斥量(mutex)的原理和接口 原子操作的重要性 互斥量实现原理(swap/exchange指令) 线程安全问题 可重入与线程安全的区别与联系 常见线程不安全情况分析 死锁的四个必要条件及避免方法 线程同步机制 条件变量

2025-06-15 12:13:57 1000 12

原创 Linux多线程-进阶

本片文章主要先从进程来对比讲解线程,然后分析线程与进程的关系。然后介绍了POSIX线程库。之后介绍了线程的整个生命周期,及其对应的函数。

2025-06-08 21:41:56 936 8

原创 Linux详谈进程地址空间

本文探讨了进程地址空间与页表的底层原理及操作系统调度机制。首先解释了虚拟地址空间隔离机制,指出不同进程的相同虚拟地址通过独立页表映射到不同物理内存。接着分析了内核空间与用户空间的差异,强调所有进程共享内核级页表。在进程切换时,CPU通过CR3寄存器更新页表基址实现地址空间切换。文章还详细介绍了二级页表设计,说明其通过页目录和页表项两级映射,以4KB为单位管理内存,有效降低内存消耗。最后揭示了操作系统的本质是基于时钟中断的事件驱动循环,通过中断机制实现进程调度和资源管理。整个过程涉及硬件(如MMU、CR3寄存

2025-05-30 16:08:22 1392 18

原创 SIGCHLD信号--补充

本文介绍了两种避免僵尸进程的方法。第一种是通过自定义SIGCHLD信号处理函数,父进程可以异步处理子进程终止,无需阻塞或轮询。示例代码演示了父进程使用waitpid获取子进程退出状态的过程。第二种方法是将SIGCHLD动作设置为SIG_IGN,使子进程自动终止而不产生僵尸进程,但指出这种方法可能不适用于所有UNIX系统。文章强调了Linux环境下可以验证后一种方法的有效性。代码示例展示了父进程收到SIGCHLD信号后处理子进程终止的具体实现。

2025-05-28 13:36:06 451 4

原创 Linux多线程-入门

摘要本文介绍了Linux系统中线程的基本概念及其特性。线程是进程内部的一个执行路线,本质是在进程地址空间内运行的轻量级执行流。Linux通过进程(task_struct)模拟线程,所有线程共享进程资源。相比进程,线程创建和切换代价更小,能更好利用多处理器资源,但存在同步困难、健壮性降低等问题。线程适用于提高CPU密集型和IO密集型程序的性能。需要注意的是,Linux并没有真正的线程实现,而是通过轻量级进程(共享地址空间的进程)来模拟线程功能。线程异常会导致整个进程终止,合理使用多线程能显著提升程序性能和用

2025-05-28 13:23:00 811 2

原创 Linux进程间信号

执行该信号的默认处理动作。提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号。忽略该信号在Linux当中,我们可以通过man手册查看各个信号默认的处理动作。

2025-05-10 23:25:18 1153 8

原创 Linux平台下SSH 协议克隆Github远程仓库并配置密钥

在使用Git进行代码管理时,配置SSH密钥是确保安全连接的重要步骤。首先,检查是否已有SSH密钥,若无则使用ssh-keygen -t ed25519 -C "your_email@example.com"生成新密钥。接着,将生成的SSH密钥添加到ssh-agent,并将公钥复制到GitHub的SSH and GPG keys设置中。完成这些步骤后,通过ssh -T git@github.com测试连接,确保配置成功。最后,使用SSH协议的地址进行git clone操作,确保Git使用S

2025-05-10 22:30:53 825 6

原创 Linux中的31个普通信号

SIGKILL和SIGSTOP。SIGKILL和SIGSTOP。)的具體行为由程序自行定义。的信号需系统配置支持(

2025-04-27 09:24:43 791 1

原创 Linux的进程间通信

进程间通信(Inter-Process Communication, IPC)是指在不同进程之间传递数据或信号的机制。由于进程拥有独立的地址空间,无法直接访问彼此的内存,因此需要特定的IPC方法来实现数据交换和协调。管道是Unix中最古老的进程间通信的形式,我们把从一个进程连接到另一个进程的数据流称为一个“管道”。在本质上管道就是基于文件级别的通信方式。管道又分为匿名管道与命名管道。

2025-04-23 17:24:57 1096 6

原创 Linux的动态库与静态库

静态库在编译时直接嵌入到最终的可执行文件中。

2025-03-02 16:12:09 886 18

原创 理解文件系统

线性存储介质理解文件系统,首先我们将磁盘所有的存储空间想象成一个线性的存储介质,想想磁带,当磁带被卷起来时,其就像磁盘一样是圆形的,但当我们把磁带拉直后,其就是线性的。磁盘分区将磁盘想象为线性存储后,磁盘就可以被看作一个巨大的块设备,数据以扇区(Sector)为单位进行存储和访问。计算机为了更好的管理磁盘,于是对磁盘进行了分区。

2025-03-01 11:53:35 1082 11

原创 Linux的基础IO内容补充-FILE

而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,

2025-01-14 14:17:53 1296 16

原创 Linux的基础IO

那么,这里我们温习一下操作系统的概念我们在Linux平台下运行C代码时,C库函数就是对Linux系统调用接口进行的封装,在Windows平台下运行C代码时,C库函数就是对Windows系统调用接口进行的封装,这样做使得语言有了跨平台性,也方便进行二次开发。这就是因为在根本上操作系统确实像银行一样,并不完全信任用户程序,因为直接开放底层资源(如内存、磁盘、硬件访问权限)给用户程序会带来巨大的风险。所以就向银行一样他的服务是由工作人员隔着一层玻璃,然后对顾客进行服务的。

2025-01-13 11:54:45 6836 9

原创 c语言的文件操作与文件缓冲区

如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。

2025-01-05 22:44:12 1277 12

原创 解决Git中没有小绿勾与红叉叉的问题

找到下面这个地址:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers。后产生的,要在圈住的这几个在前面,添加空格(右击重命名加空格就能使它提到前面)关于要添加几个空格的问题,一般来说添加四个或者八个就可以。然后,重启电脑就能产生小绿勾和红叉叉的图标了。运行完重启电脑就好使。注意这一步一定要操作对,操作错误就会很多麻烦。寻找与自己电脑相配的软件版本就可以了。

2024-12-30 10:29:42 2077 12

原创 函数和进程之间的相似性

在一个C程序可以fork/exec另一个程序,其过程是先fork一个子进程,然后让子进程使用exec系列函数将子进程的代码和数据替换为另一个程序的代码和数据,之后子进程就用该程序的数据执行该程序的代码,从而达到程序之间相互调用的效果。在学了C语言、C++或是JAVA等高级语言,你会知道,在这些语言中的函数是可以相互进行见调用的,但是在学习了Linux的前面的知识后,你就会有意无意的认识到其实进程也是与函数有相同之处的,进程之间也是可以相互调用的。程序之间相互调用带来的好处之一。那么下面就将这部分内容扩展。

2024-12-30 10:15:46 632 8

原创 Windows下使用git配置gitee远程仓库

就在前几天因为一些原因,我的电脑重装了系统,然后再重新配置git的环境的时候就遇到了一些小问题。所以我决定自己写一篇文章,以便以后再配置git时,避免一些错误操作,而导致全网搜方法,找对的文章去找对应的解决方法。下面为了演示方便就拿gitee来演示,不拿GitHub了写文章了。

2024-12-22 23:26:08 2178 6

原创 Linux进程控制(详细讲解)

进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。

2024-12-21 23:27:52 821 10

原创 [蓝桥杯 2019 国 B] 排列数

对于本篇文章是站在别人的基础之上来写的,对于这道题作为2019年国赛B组的最难的一题,他的难度肯定是不小的,这道题我再一开始接触的时候连思路都没有,也是看了两三遍别人发的题解,才慢慢明白了怎么去写。那么对于题解我就直接引用别人的优秀题解,但后再加上我对题解写的不详细的地方进行尽可能详细的描述补充。

2024-12-17 10:54:06 1393 6

原创 Linux2.6内核进程调度队列

本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。

2024-12-15 15:24:03 1294 8

原创 解决 Linux git push 成功后(但没有出现绿点)的问题

最近学习使用Git,发现有时候在Linux下提交自己的小绿点并没有增加,单在仓库中却可以看到提交的代码。看着连续的绿点中出现几个零零散散的灰点,着实让一个强迫症患者十分难受。接下来分享以下我所知道的问题。

2024-12-11 16:59:42 298 5

原创 Linux进程概念-详细版(二)

在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。

2024-12-11 14:47:58 751 8

原创 位运算的总结--奇思妙解

目录前言先回顾常用的位运算1:给一个数 n ,确定它的二进制表示中的第x位是0 还是 12:将一个数 n 的二进制表示的第x 位修改成 1 3:将一个数 n 的二进制表示的第 x位修改成 0 4:与位图联系5:提取一个数(n)二进制表示中最右侧的 1(重要)6:干掉一个数(n)二进制表示中最右侧的 1(重要)7:要考虑位运算的优先级吗?(了解)8:异或(^)运算的运算律(重要)9:对于~的妙用实现++/--(知道有就行)在这篇文章中,我将总结我所知道的所有位运算的独特之处。这些妙用非常重要,运用得当可以显著

2024-12-09 18:14:35 889 6

原创 定长滑动窗口--灵神题单(一刷进阶)

这篇文章主要围绕灵神题单中的定长滑动窗口进阶题进行探讨,首先解决了一些基本题目,然后附带了一些相对困难题目的解题思路。值得注意的是,大部分解答都是在前人的基础上进行了一些小的修改和调整。希望文章对大家的学习和解题能力有所帮助。如果您需要更具体的内容或者对某一部分有兴趣深入讨论,请告诉我!

2024-12-01 22:25:19 1143 5

原创 Linux进程概念-详细版(一)

子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。

2024-12-01 17:02:39 1170 5

原创 解决 git 报错 “fatal: unable to access ‘https://github.com/.../.git‘: Recv failure Connection was rese

在使用 Git/Git小乌龟 进行代码管理的过程中,经常会遇到各种各样的问题,其中之一就是在执行 git clone 或 git pull 等操作时出现 “fatal: unable to access ‘https://github.com/…/.git’: Recv failure Connection was reset” 的报错。这个问题通常是由网络连接问题或代理设置不正确导致的。在我的个人使用经验中,我亲自尝试了四种方法,它们都能够有效地解决这个报错。个人比较推荐方法二。

2024-11-27 19:45:34 10351 2

原创 定长滑动窗口--灵神题单(一刷基础)

首先我们先介绍一下滑动窗口的第一类型--定长;这里的介绍我就直接截图截取灵神写的题解了。对于出窗口的判断条件就是唯一的就是有边界-左边界+1>=限定长度。本文章大致思路为:先给出题目,如果题目比较难理解,在给出解释。然后给出少些思路,然后你自己去思考剩余部分,自己写代码。最后在给出代码,如果代码的效率低也会给出相应的优化。总的来说灵神的定长滑动窗口的基础题一共18道题。其中5道是会员题。

2024-11-25 11:20:18 909 3

原创 初步认识操作系统(Operator System)

管理者管理被管理者,实际上是先将被管理者的各种信息进行描述,然后再将多个被管理者的描述信息根据某种数据结构组织起来,最后管理者管理被管理者实际上就是对数据结构的管理。

2024-11-23 20:11:25 1142 2

原创 冯 • 诺依曼体系结构

后经过内存与CPU的处理返回到显示器,就完成了一次信息的聊天。然后在网络当中经过一系列处理(这里忽略网络处理细节),之后你朋友的网卡从网络当中获取到你所发的消息后,将该消息加载到内存当中,你朋友的CPU再从内存当中获取消息并对消息进行解包操作,然后将解包好的消息写回内存,最后你朋友的显示器从内存当中获取消息并显示在他的电脑上。对,你的思考是正确的,但是理解是有点问题的,其实一个程序运行时必须将其相应的各种数据全都加载出来,加载的地方就为内存,加载出来后,如果要进行操作与修改,这时候CPU就开始工作了。

2024-11-23 10:20:37 1014 1

原创 在Linux下配置gitee与Github的远程仓库

注意,git push后,是输入你的账号与密码。这个步骤可以通过特殊设置省去,但是一开始还是不要太省。

2024-11-20 18:40:43 1172 3

原创 Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)

本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。

2024-11-18 13:41:33 1364 10

原创 海量数据面试题

在大数据时代,海量数据处理已成为技术领域中的一项重要课题。无论是企业级应用、互联网平台,还是人工智能和机器学习的实现,都离不开对大规模数据的高效处理。而对于C++开发者来说,如何在面对海量数据时保证系统的高效性和可扩展性,已经成为面试中常见的考察内容。C++作为一种高性能的编程语言,凭借其接近硬件的操作和精细的内存管理,常常被用于构建对性能要求极高的系统。在海量数据的处理过程中,C++开发者需要不仅具备扎实的基础知识,还需掌握一些特殊的算法和数据结构,以应对各种挑战性的问题。

2024-11-15 23:14:02 1186 8

原创 利用滑动窗口解题

本篇文章还是以先介绍题目意思,然后再解释以下算法原理,最后再是给出代码的实现。但是与上篇文章不同的是,这篇文章回给出为什么要用滑动窗口解题,怎么想到的,以及滑动窗口的原理到底是什么。所以前两题会以最详细的方法进行说明,会先从暴力解法出发,进行一步一步的优化,从而到达其代码与滑动窗口类似,从而达到解释为什么用滑动窗口解题。滑动窗口(Sliding Window)是一种在数组或字符串等线性数据结构上进行子数组(或子字符串)操作的技术,常用于处理具有连续性或局部性质的问题。

2024-11-13 12:40:55 1014 5

原创 Xshell,Shell的相关介绍与Linux中的权限问题

首先,先介绍一下我们学习Linux的工具:XshellXShell 是一个流行的 Windows 平台上的 SSH、Telnet 和 Rlogin 客户端,主要用于远程连接 Linux/Unix 系统。它的运行原理大致如下:1:协议支持: XShell 支持多种远程协议(如 SSH、Telnet、Rlogin 等)。最常用的是 SSH 协议,它提供了安全的加密通信。SSH(Secure Shell)通过加密对客户端和服务器之间的通信进行保护,以防止数据在网络中被窃听和篡改。2:建立连接。

2024-11-09 22:46:56 1060 3

原创 利用双指针法解题

双指针是一种常用的算法技术,主要用于处理数组、链表等线性结构中的问题。它通过使用两个指针在数据结构中同时移动,从而达到有效解决问题的目的。这种方法通常能够减少空间复杂度或时间复杂度,或者使代码更加简洁。但是在这里的指针并非真正的指针它可以是数组的下标,亦或是链表的第k个值。

2024-10-30 23:02:06 840 4

原创 用哈希封装出unordered_set与unordered_map

上一篇文章已经介绍了如何去实现哈希表与哈希桶,那么这一篇文章就会讲解如何在上一篇文章的基础上进行修改与添加新内容通过封装来实现unordered_set与unordered_map。那么下面的封装就直接使用哈希桶来封装了,不用哈希表来进行封装了。

2024-10-28 21:03:31 661 1

原创 Linux下进行用户的切换与创建以及细微设置

然而对于新创建的普通用户,一般是对于系统来说是不信任的,那么对于这个新创建的用户,系统是不允许再此普通用户的身份下执行root权限的操作的,那么我们如何将其这个新创建的普通用户设置为系统所信任的用户呢?在Linux下,从使用上来说,我们一般所有的操作都是在普通用户下进行执行的,并且学习都是使用普通用户来学习的,即便是工作以后也是用普通用户,那么对于如果创建普通用户就显得及其重要。请不要轻易用-r选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。

2024-10-19 19:56:47 1310 1

原创 c++的哈希表、哈希桶的介绍与实现

这一篇文章大致实现详细介绍什么是哈希,然后再介绍什么是哈希表,怎么代码实现哈希表,然后再介绍哈希桶,怎么代码实现哈希桶,最后再介绍他俩有什么细节上的差别,与代码的一些细节优化。

2024-10-18 19:01:05 1189 1

空空如也

空空如也

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

TA关注的人

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