Linux
文章平均质量分 94
救赎之道就在其中
UrSpecial
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux线程:基于环形队列的生产消费模型
本文介绍了使用POSIX信号量实现线程同步的方法,重点讲解了其在环形队列中的应用。文章首先对比了条件变量和信号量的线程同步机制,指出信号量通过计数器实现资源管理。随后详细说明了POSIX信号量的初始化、销毁、等待、释放等基本操作。最后通过一个环形队列的代码实例,展示了如何利用信号量解决假溢出问题,其中使用两个信号量分别控制空间和数据的可用性,配合互斥锁实现生产者和消费者的同步访问。原创 2025-09-13 13:59:15 · 890 阅读 · 0 评论 -
Linux线程同步与互斥
本文介绍了线程同步与互斥的关键机制,重点讲解了互斥锁和条件变量的使用方法。通过生产者-消费者模型示例,展示了如何利用阻塞队列实现多线程并发控制。文章详细说明了互斥锁的初始化、加锁、解锁和销毁操作,以及条件变量的等待和唤醒机制。最后给出了一个基于C++的阻塞队列实现代码,该实现使用互斥锁保护共享队列,并通过条件变量协调生产者和消费者线程的同步操作,有效解决了多线程环境下的资源共享问题。原创 2025-09-12 19:32:31 · 808 阅读 · 0 评论 -
Linux线程
本文介绍了线程的基本概念和操作,通过对比进程与线程的特点,阐述了引入线程的必要性。文章详细讲解了pthread库中创建线程、线程退出、等待和分离等核心函数的使用方法,并通过一个综合编程题演示了线程的实际应用:主线程创建两个子线程,实现线程间等待和资源回收。线程相比进程具有创建开销小、切换效率高、利于多核利用等优势,但也存在健壮性降低和编程复杂度增加的问题。文末的代码示例展示了如何实现题目要求的线程同步操作,为读者提供了线程编程的实践参考。原创 2025-09-11 17:40:10 · 1261 阅读 · 0 评论 -
Linux进程死锁
本文通过生动案例和代码示例详细讲解了操作系统中的死锁问题。首先以朋友借钱为例形象说明死锁概念,并指出死锁产生的四个必要条件:互斥、请求与保持、不可剥夺和循环等待。接着分析哲学家就餐和违反锁顺序两个经典死锁案例。针对死锁处理,提出四种策略:破坏互斥条件、破坏请求与保持条件、破坏不可剥夺条件和破坏循环等待条件。重点介绍了资源排序策略和银行家算法,通过安全序列确保系统处于安全状态来避免死锁。全文以通俗易懂的方式系统阐述了死锁原理及解决方案。原创 2025-09-05 21:10:58 · 685 阅读 · 0 评论 -
Linux内核O(1)调度算法
本文探讨了Linux2.6系统中普通进程的调度机制。操作系统通过快速切换进程创建多程序同时运行的假象,关键在于调度策略和时间片分配。理想的调度策略需兼顾公平性和吞吐量,而时间片长短直接影响系统响应和切换开销。进程分为I/O消耗型和CPU消耗型,通过静态和动态优先级调整实现调度优化。动态优先级基于进程等待时间、运行时间和类型动态调整,而静态优先级决定时间片长度。Linux采用O(1)调度算法,使用活动/过期队列和优先级位图快速选择进程,通过交换指针实现高效队列切换。这种机制确保了交互性进程的快速响应,同时兼顾原创 2025-09-02 23:44:20 · 679 阅读 · 0 评论 -
进程间通信:SystemV信号量
本文介绍了使用System V信号量实现进程间通信的方法。信号量通过计数器机制控制多进程对共享资源的访问,主要操作包括P(wait)和V(signal)。文章详细讲解了信号量核心概念(如信号量集)、常用API(semget、semctl、semop)及其参数,并提供了一个生产者-消费者模式的完整代码示例,展示了如何结合共享内存实现进程同步。最后强调System V信号量是内核持久的,需显式删除以防资源泄漏。该机制能有效解决多进程环境下的同步与互斥问题。原创 2025-09-01 00:11:28 · 1131 阅读 · 0 评论 -
进程间通信:共享内存
本文介绍了进程间通信(IPC)中的共享内存机制。共享内存通过映射相同物理内存到不同进程的虚拟地址空间,实现高效通信。文章详细讲解了shmget、shmat、shmdt和shmctl等关键系统调用接口,并提供了C++封装的共享内存类实现示例,演示了生产者-消费者模型的应用。共享内存的优势在于性能最优(无需数据拷贝),但存在数据同步问题。文章指出共享内存体现了"消除中间层释放硬件性能"的系统设计理念,是进程间通信的重要方式。原创 2025-08-28 02:02:16 · 887 阅读 · 0 评论 -
进程间通信:消息队列
本文介绍了进程间通信(IPC)中的消息队列实现方式。消息队列是一种先进先出(FIFO)的内核持久化通信机制,支持异步通信和选择性接收。文章详细讲解了SystemV消息队列的四个核心接口:msgget(创建/获取)、msgsnd(发送)、msgrcv(接收)和msgctl(控制管理)。通过server和client的示例代码演示了消息队列的实际应用:server创建消息队列并发送消息,client接收消息并在退出时删除队列。消息队列适用于需要解耦生产者和消费者的场景,能有效实现进程间的异步通信。原创 2025-08-16 17:15:29 · 768 阅读 · 0 评论 -
进程间通信:管道
本文介绍了进程间通信(IPC)中的管道技术,重点分析了匿名管道和命名管道的特性与实现方法。匿名管道仅适用于父子进程通信,具有半双工特性;命名管道通过文件系统实现,支持不相关进程间的通信。文章详细说明了两种管道的创建方式、通信机制及代码示例,并指出命名管道的阻塞特性可确保数据同步传输。通过对比两种管道的应用场景,展示了管道技术在进程通信中的实用价值。原创 2025-08-13 14:51:40 · 789 阅读 · 0 评论 -
解析进程:从原理到实践
本文介绍了进程的概念、本质及管理方法。进程是程序的执行实例,每个进程拥有独立的内存和资源。操作系统通过进程控制块(PCB/task_struct)管理进程。文章详细讲解了进程创建(fork)、状态(R/S/D/T/Z)、优先级(PRI/NI)以及进程切换等内容。特别分析了僵尸进程和孤儿进程的产生与解决方案。最后阐述了进程存在的意义,包括并发执行、资源隔离、权限控制等。通过系统调用和内核机制,进程实现了程序的高效运行和系统资源的合理分配。原创 2025-08-12 03:18:51 · 850 阅读 · 0 评论 -
页表:从虚拟地址到物理地址的转换
当程序尝试访问的页面不在物理内存中时,就会触发缺页中断。进程从用户态切换到内核态,将缺页中断交给操作系统处理,将所需的页面从磁盘调入内存。当缺页中断处理返回时,系统重新启动导致缺页中断的指令,该命令重新发出导致缺页中断的虚拟地址,然而这时,所需的页面已经存在于内存中了,程序就可以继续正常执行了。原创 2025-05-25 23:36:08 · 872 阅读 · 0 评论 -
从 select 到 epoll:拆解 I/O 多路复用的演进与实战
I/O 多路复用(I/O Multiplexing)是为了解决 高并发场景下传统阻塞式或非阻塞式 I/O 模型的效率缺陷 而诞生的核心技术。阻塞式IO,无论是单线程阻塞式IO还是多线程阻塞式IO,在数据未就绪时线程会被挂起,直到数据就绪后才恢复执行。而且,多线程还涉及到线程切换,以及内存开销。线程切换那是需要时间的,频繁的切换会导致效率降低。至于非阻塞式的IO,轮询高频发生,浪费CPU资源。原创 2025-03-30 22:29:57 · 1213 阅读 · 0 评论 -
【Linux取经之路】进程信号的处理
终于,从信号的产生、保存走到了信号的处理!三步上篮该落地了。在进程信号的产生、进程信号的保存这两篇博客中,我一直在回避一个问题——信号什么时候被处理。在之前,我一直都说是在合适的时候,并没有具体的说什么时候合适。到了这,我就直说了。信号的处理通常发生在进程从【内核态】返回【用户态】时。这是因为进程在内核态时可能正在执行一些关键的系统调用或中断处理程序,此时处理信号可能会干扰这些操作的正常进行。因此,操作系统通常会在进程从内核态返回用户态时,对信号进行检测及处理。原创 2024-11-18 17:34:52 · 1143 阅读 · 0 评论 -
【Linux取经之路】进程信号的产生
命令:kill -l其中,1到31号信号为普通信号,34到64号信号为实时信号。你可能会问——32和33号信号去哪了?这两个编号可能保留或者未使用。这里我们只谈普通信号。光看这堆信号没意思,我们挑一个常用的信号来讲一讲顺便引出操作系统是如何给进程传递信号的。9号信号——SIGKILL:强制终止一个进程,用法为kill -9 进程pid。它的操作比较见到,我就不演示了。下面我们谈谈操作系统是如何给进程发送信号的。操作系统是通过修改进程PCB内的位图来将信号发送给进程的。原创 2024-11-12 13:41:17 · 988 阅读 · 0 评论 -
【Linux取经之路】进程信号的保存
上一篇文章谈了进程信号的产生,这篇文章我们来聊一聊进程信号的处理。废话不多说,我们直入主题。我们已经知道了信号是如何产生的以及信号是由操作系统发送给指定进程的。那么,有以下几个问题。1)进程接收到操作系统发送的信号后,会立即处理吗?如果不是立即处理,那什么时候处理?不会立即处理,而是会在合适的时候处理。合适的时候处理,这不废话吗?是的,关于什么时候处理我们后面会说。这里我们先通过一个例子来感性的理解。张三正在寝室里打王者荣耀,这时接到了外卖小哥的电话说外卖到学校东门了,过来取一下。原创 2024-11-14 17:11:39 · 1232 阅读 · 0 评论 -
【Linux取经之路】Linux项目自动化构建工具-make/makefile & git三板斧
make是一个解释makefile中命令的工具。执行clean时,它实际上执行的是它对应的依赖方法,确实把所有的.o文件和目标文件都删除了。make是 Linux 系统中广泛使用的一个自动化构建工具,它根据用户定义的规则(通常保存在一个名为 makefile的文件中)来自动编译和链接程序。makefile中的OBJS就是我们定义的一个变量,我们通过这个变量来简化了makefile,下面我们看看变量的基本语法。我们在使用make的时候,它会去读取makefile的内容,并根据内容直接去给它编译相关的文件。原创 2024-09-16 12:43:56 · 1659 阅读 · 0 评论 -
【Linux取经之路】编译器gcc/g++的使用 & 调试器gdb的使用
程序的发布方式有两种,debug模式和release模式,gcc/g++直接编译出来的二进制程序,默认是release模式。如果我们要使用gdb调试,就必须在编译的时候加上-g选项。我们可以看到,加了-g选项生成的_g_test文件要比没加-g选项生成的test文件要大,这是因为_g_test文件里包含了调试信息,而test中没有包含。在谈gcc/g++的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。其中,-O0表示没有优化,-O1为缺省值,-O3的优化级别最高。原创 2024-09-15 14:15:18 · 1223 阅读 · 0 评论 -
【Linux取经之路】软件包管理器yum&编辑器vim及其配置
在Linux下安装软件,一个通常的办法是下载程序的源代码,并进行编译,得到可执行程序。但是,这样未免太麻烦了吧!这时,一些能人挺身 而出,把一些常用的软件提前编译好,做成软件包放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安 装。软件包和软件包管理器就好比App和应用商店的关系。yum(Yellow dog Updater, Modified) 是Linux下非常常用的一种包管理器,主要应用 在Fedora,RedHat,Centos等发行版上。原创 2024-09-14 11:25:02 · 1315 阅读 · 0 评论 -
【Linux取经之路】用户&权限管理
事先,我已经将home目录的权限改为777,也就是说所有用户都具有这个目录的写(w)权限,并且在该目录下,我以root的身份创建了一个名为test的文件,然后我从root切换到普通用户pcz,接着尝试删除root在home目录下创建的文件test,结果还删除的很成功!首先,我创建了一个名为test的文件,我们可以看到,test的所有者和所属组为pcz,所有者对应的权限为rw-,可读可写不可执行,所属组对应的权限为rw-,可读可写不可执行。当我们以普通用户的身份安装软件包的时,往往权限不够,需要提权。原创 2024-09-12 22:54:45 · 852 阅读 · 0 评论 -
【Linux取经之路】Linux常见指令
时间戳是指一份数据在特定时间点存在的可验证的数据,它表示从某个固定的起始点(通常是协调世界时,即UTC的起始时间,也被称为UNIX纪元,即1970年1月1日0时0分0秒,北京时间则为1970年1月1日8时0分0秒)起到现在的总秒数(或毫秒数、微秒数等)。说明:cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。说明:归档文件名是要创建或提取的归档文件的名称,而文件/目录名则是要打包或提取的文件或目录的名称。原创 2024-07-15 22:31:35 · 1049 阅读 · 1 评论
分享