- 博客(131)
- 收藏
- 关注
原创 Linux:进程 vs 线程:资源共享与独占全解析(线程四)
进程与线程的核心区别在于 “资源分配” 和 “调度执行” 的职责划分线程共享进程的大部分资源,仅独占执行上下文相关资源,这是其轻量级的本质理解资源共享与独占特性,是后续学习线程同步、通信的基础下一篇将讲解线程控制的核心操作:线程创建与终止,不见不散啦!!
2026-01-31 11:00:00
50
原创 Linux:虚拟地址空间与分页管理:线程共享资源的底层原理(线程三)
虚拟地址空间通过分页机制实现 “虚拟连续、物理离散”,解决物理内存碎片问题;缺页异常是动态内存映射的核心,支撑写时复制、共享内存等特性;线程共享虚拟地址空间的本质是共享mm_struct和页表,这是线程通信便捷、切换成本低的底层原因。下一篇将详细对比进程与线程的资源共享与独占特性,敬请关注!
2026-01-30 11:03:09
504
3
原创 Linux:线程入门:概念、内核实现与核心优缺点(线程二)
线程是进程内部的执行路线,简单理解为 “进程容器里干活的执行者”—— 一个进程至少包含一个主线程,多个线程共享进程的全部资源(虚拟地址空间、文件描述符等),但拥有独立的执行上下文(CPU 寄存器、栈空间)线程是进程内的独立执行流,Linux 中以轻量级进程实现,核心是共享mm_struct线程的核心优势是创建快、切换成本低、通信便捷,适合并发场景新手入门需先理解 “资源共享” 与 “独立调度” 的核心特性,后续重点掌握同步机制和线程控制。
2026-01-30 11:01:57
261
3
原创 Linux:线程的概念、与进程区别及内核实现(线程一)
线程(Thread)是进程内的独立执行流,是操作系统调度的基本单位。简单理解:进程是 “资源分配的容器”,而线程是 “容器里真正干活的执行者”—— 一个进程至少包含一个主线程,多个线程共享进程的全部资源(虚拟地址空间、文件描述符、信号表等),但拥有独立的执行上下文(CPU 寄存器、栈空间)线程是进程内的独立执行流,共享进程资源,调度成本低Linux 中线程本质是轻量级进程,通过描述,共享mm_struct区分于进程入门线程编程的核心是掌握 pthread 库的基本使用,理解线程的创建与回收流程。
2026-01-27 21:24:09
1071
8
原创 Linux:信号捕捉下(信号四)
可重入函数(Reentrant Function)指:函数在执行过程中被异步打断(如信号、中断、多线程调度),再次调用(重入)后,原执行流程和新执行流程都能正确完成,结果不受打断影响。
2026-01-23 15:16:43
849
23
原创 Linux:信号捕捉上(信号三)
在 Linux 进程信号的生命周期中,“信号捕捉” 是连接 “信号保存” 与 “信号处理” 的核心环节 —— 它允许我们自定义信号的响应逻辑,而非依赖系统默认行为(终止、忽略等)。本文将从内核视角拆解信号捕捉的底层机制,结合实操代码讲清signal()与的使用,帮你彻底搞懂 “内核如何调用用户写的处理函数”
2026-01-23 15:14:24
1062
21
原创 Linux:信号保存下(信号二)
键盘操作(如Ctrl+C触发 SIGINT)系统调用(如killraise等接口)系统命令(如终端执行kill命令)硬件异常(如内存越界触发 SIGSEGV)软件条件(如管道破裂触发 SIGPIPE)无论信号由哪种来源产生,信号的发送必须由操作系统(OS)完成,其底层本质是:修改目标进程在内核中对应的 “信号位图”(比特位),以此记录进程收到了该信号2.信号的保存。
2026-01-22 15:40:51
1334
21
原创 Linux:信号保存上(信号一)
那什么时异步通知呢,举个例子,在上课的时候老师发现张三还不在教室,如果此时继续上课而不等待张三,就可以说是异步,如果老师等张三回来在上课,那么就是同步那么根据上面的描述,我们可以得到几个关于信号的基本结论:1.信号处理,进程在信号没有产生的时候,就知道信号该如何处理了(你在外卖员未敲门前就知道敲门是因为你的外卖到了)
2026-01-20 20:30:58
1388
28
原创 Linux:深入剖析 System V IPC下(进程间通信九)
System V 共享内存的核心价值是 “零拷贝高性能”,其底层逻辑是 “内核物理内存映射到进程虚拟地址空间”。新手使用时,需重点关注 “资源生命周期”(创建→附加→分离→销毁)和 “同步机制”(信号量),避免权限错误、资源泄漏、数据竞争等问题。
2026-01-13 10:46:39
1234
28
原创 Linux:深入剖析 System V IPC上(进程间通信八)
System V IPC 是 Linux 内核原生的高性能 IPC 方案,其底层核心是 “内核统一管理的系统级资源”,优点是高性能、持久化、权限完善,缺点是易泄漏、移植性差、无内置同步。对于 Linux 系统编程学习者来说,吃透 System V IPC 的内核逻辑,不仅能掌握进程通信的核心原理,更能理解 “内核资源管理” 的本质 —— 这是进阶 Linux 高级编程的关键一步。
2026-01-13 10:45:12
1107
16
原创 Linux:命名管道实现IPC(进程间通信七)
上篇博客我们说过在这篇博客我们将改进我们上篇博客写的,命名管道实现简易通信,下面是改进之后的代码,这里我不详细写出来,希望大家可以凭借上节课的知识以及代码内容,真正的自己理解并且复现一遍~~
2026-01-09 22:34:08
204
15
原创 Linux:命名管道(进程间通信六)
我们学习了匿名管道,我们知道匿名管道只能适用于血缘关系间的通信(比如父子),但是我们想要在两个毫不相关的进程间通信,又该怎么办呢??于是我们的命名管道,开始表演他的独门绝技--实现通信。
2026-01-09 14:59:22
1092
27
原创 Linux:匿名管道的四种情况(进程间通信四)
了解了匿名管道的五种特性后,我们必须得谈谈匿名管道的四种情况--快读慢写,快写慢读,只写不读,只读不写,接下来我将一一讲述,话不多说现在开始。
2026-01-05 17:02:08
428
7
原创 Linux:匿名管道的五大特性(进程间通信三)
元旦快乐,期末周悲伤,这两个星期没时间学习计算机相关内容啦,今天是开年的的一篇博客,延续上一篇博客内容,今天我们来谈谈匿名管道的五大特征~~先说结论,
2026-01-05 10:46:00
1160
9
原创 Linux:匿名管道(进程间通信二)
看上图,父进程由*files指向files_struct,也就是文件描述符表,现在我们打开一个文件,fd = 3,对于打开的文件,该文件内容被存放在array[fd]中,我们创建一个子进程,子进程继承父进程的*files,files_struct等等,此时父子进程的指针指向同一块地方,也就是被打开的文件,于是父子进程同时可以访问该文件的缓冲区,或许你会疑问,被打开文件最后不是还要写回磁盘吗,其实真正的管道是由OS创建的一块内存,不需要刷回磁盘,和磁盘没关系,这也符合通信间的本质!
2025-12-25 20:58:14
142
11
原创 Linux:简介(进程间通信一)
不同进程之间为了交换数据、同步执行、协调资源而使用的一整套机制/技术。因为进程彼此隔离、地址空间独立,不能像同一进程里的线程那样直接共享变量,所以需要 IPC 来“搭桥”
2025-12-25 18:41:17
414
7
原创 Linux:库制作与原理(四)
可写区域:专门存放“外部函数/全局变量的真实地址”。动态链接器在加载库后,把 GOT 里的条目填成正确地址。关键词:动态库、ldd、LD_LIBRARY_PATH、ldconfig、GOT、PLT、PIC。第一次调用某个外部函数:先跳到 PLT 的“桩代码”,由它去解析真实地址并写回 GOT。动态库需要被加载到“任意位置”,所以内部不能写死绝对地址;关键:调用动态链接器完成依赖库加载、符号解析与重定位。这就是你常听到的:“第一次调用慢一些,后面就稳了”。输出会列出依赖的共享库,以及动态链接器(例如。
2025-12-24 16:23:49
1000
8
原创 Linux:库制作与原理(三)
同时把“可执行”和“可写”等权限隔离开,更安全。操作系统加载程序时,更关心 segment(段)。段是加载单位:哪些要映射进内存、权限是什么(R/W/X),这些信息记录在。到这里,你就不是“只会 gcc 一把梭”的选手了,下篇博客见啦~~是 ELF(可重定位),内部有 section 和符号等信息。的跳转地址像“空的”(例如全 0)。已经有了地址,说明链接把它“对上了”。:符号表(函数名/变量名等的记录)可执行文件:Executable。:未初始化的全局/静态变量占位。:已初始化的全局/静态变量。
2025-12-22 18:49:48
671
6
原创 Linux:库制作与原理(二)
动态库(.so):程序在运⾏的时候才去链接动态库的代码,多个程序共享使⽤库的代码⼀个与动态库链接的可执⾏⽂件仅仅包含它⽤到的函数⼊⼝地址的⼀个表,⽽不是外部函数所在⽬标⽂件的整个机器码在可执⾏⽂件开始运⾏以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中, 这个过程称为动态链接(dynamic linking)动态库可以在多个程序间共享,所以动态链接使得可执⾏⽂件更⼩,节省了磁盘空间。操作系统采⽤虚拟内存机制允许物理内存中的⼀份动态库被要⽤到该库的所有进程共⽤,节省了内存和磁盘空间。
2025-12-21 21:14:44
547
3
原创 Linux:库制作与原理(一)
什么是库库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能 每个⼈的代码都从零开始,因此库的存在意义⾮同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:静态库 .a[Linux]动态库 .so[Linux]如果你使用win系统,或许有这样的报错这就说明改软件动态库缺失。
2025-12-21 11:21:04
794
18
原创 Linux:Ext系列⽂件系统(三)
路径解析是文件访问的 “导航逻辑”,从根目录逐级查找,核心是目录的映射表挂载是分区的 “接入方式”,让多个分区融入统一的目录树软硬连接是文件的 “复用技巧”,根据是否跨分区、是否依赖原文件选择使用理解了这些内容,你就能更灵活地管理磁盘和文件,甚至解决一些常见的系统问题(比如死链接清理、挂载失败排查)。文件系统的底层逻辑看似复杂,但只要抓住 “inode 是核心、目录是映射、挂载是连接” 这三个关键点,就能一通百通。
2025-12-19 08:52:19
1088
7
原创 Linux:Ext系列⽂件系统(二)
用 “块” 存储文件内容,提高读写效率;用 “分区” 划分磁盘功能,方便管理;用 “inode” 存储文件属性,作为文件的唯一标识;用 “目录” 维护文件名与 inode 的映射,让我们能通过文件名访问文件。
2025-12-19 08:49:25
810
3
原创 Linux:Ext系列⽂件系统(一)
对我们(以及 OS)来说,磁盘就是一个 “元素为扇区的一维数组”,数组下标是 LBA 地址 —— 我们不用关心磁头怎么移动、盘片怎么旋转,只需要告诉磁盘 “我要访问 LBA=XXX 的扇区”,剩下的底层转换全由磁盘固件完成理解这些底层逻辑,不仅能搞懂 “磁盘为什么慢”(磁头移动、盘片旋转需要时间),也为后续学习文件系统(比如 EXT4、NTFS 怎么管理扇区)打下基础 —— 毕竟所有文件的内容和属性,最终都是存在一个个扇区里的。
2025-12-17 10:59:37
984
5
原创 Linux:基础IO(终)
⼜⽐如,我们使⽤打印机打印⽂档,由于打印机的打印速度相对较慢,我们先把⽂档输出到打印机相应的缓冲区,打印机再⾃⾏逐步打印,这时我们的CPU可以处理别的事情。读写⽂件时,如果不会开辟对⽂件操作的缓冲区,直接通过系统调⽤对磁盘进⾏操作(读、写等),那么 每次对⽂件进⾏⼀次读写操作时,都需要使⽤读写系统调⽤来处理此操作,即需要执⾏⼀次系统调⽤,执⾏⼀次系统调⽤将涉及到CPU状态的切换,即从⽤⼾空间切换到内核空间,实现进程上下⽂的切换,这将损耗⼀定的CPU时间,频繁的磁盘访问对程序的执⾏效率造成很⼤的影响。
2025-12-16 17:49:46
2041
13
原创 Linux : 基础IO(三)
如上图,我们先要知道一个进程可能会管理多个文件,同时这些文件有的可能要被打开,有的正在使用,有的打算关闭,而且系统里面存在多个进程,最后可能会有100个进程10000个文件,那么这些进程该怎么管理这些文件呢,我们类比一下就会想到进程调度,也是1:n的管理关系,采用的是链表链接struct的形式管理的。系统先读取磁盘文件到一个结构体struct_file里面,这个结构体保存着文件的属性集合,mode,读写位置等等等,其中还有一个缓冲区,这个缓冲区存放在文件的内容,文件的属性交给了其他变量。
2025-12-12 23:57:04
1241
9
原创 Linux:基础IO(二)
标志位(也常叫状态位 / 标志位掩码)是编程中一种利用整数的二进制位来表示多个独立的状态、命令或属性的设计技巧。一个整数在内存中以二进制形式存储(比如 32 位整数有 32 个二进制位,每位是 0 或 1);我们将每一个二进制位映射为一个独立的 “开关” 或 “命令”(1 表示开启 / 生效,0 表示关闭 / 无效);再通过宏定义给每个位赋予具体的语义(比如第 0 位代表 “读”,第 1 位代表 “写”);最终可以通过位运算(位或、位与等)来组合多个标志,或判断某个标志是否生效。
2025-12-11 23:02:54
989
3
原创 Linux:基础IO(一)
⽂件的读写本质不是通过 C 语⾔ / C++ 的库函数来操作的(这些库函数只是为⽤⼾提供⽅便),⽽真正对文件操作是通过⽂件相关的系统调⽤接⼝来实现的。发现是追加,即和fopen(a)的现象一样,都是追加写入,所以我们可以写出一个echo > >,即用fopen(a)打开,然后写入内容。发现和fopen(w)的现象一样,都是先清除再写入,所以我们可以写出一个echo > ,即用fopen(w)打开,然后写入内容。磁盘上的⽂件 本质是对⽂件的所有操作,都是对外设的输⼊和输出 简称 IO。
2025-12-10 00:15:52
703
5
原创 Linux进程最终篇章:自定义shell的编写,运用前面所有知识
前面我们一直学习进程相关知识,但是我们不能很好的将他们串起来,只是一味的接受理论知识,但是我们有一句话,,所以今天我们将运用到前面所学的知识,自定义编写一个shell。
2025-12-08 22:09:20
642
13
原创 Linux:进程替换(进程控制四)
对于返回值,exec*函数,只有失败返回值,如下图可是我们有一个问题,我不想让这个进程将我的原始进程给破坏掉,我想达到的效果是都执行,那该怎么办呢?--子进程来帮助我们,我们创造一个子进程(fork),让子进程执行我们需要替换的进程,父进程等待接收子进程就可以啦,这样完成了两个都实现下面对code.c的代码进行修改。
2025-12-06 10:42:02
631
5
原创 Linux:进程终止(进程控制二)
那么_exit存在的意义是什么呢,完全可以用exit取代呀,其实是因为我们这个测试代码无法体现,我们现在换一个代码(其实就是将printf("func start\n")的\n去掉)其实return是⼀种常⻅的退出进程⽅法,执⾏return n等同于执⾏exit(n),因为调⽤main的运⾏时函数会将main的返回值当做exit的参数。进程终⽌的本质是释放系统资源,就是释放进程申请的相关内核数据结构和对应的数据和代码。所以缓冲区应该在c库里面,没错,缓冲区是c语言自带的,而不是操作系统提供的。
2025-12-03 09:58:52
914
4
原创 linux:虚拟地址空间与物理地址空间(进程六)
我们在讲C语⾔的时候,⽼师给⼤家画过这样的空间布局图(32位)可是我们对他并不理解!可以先对其进⾏各区域分布验证:i < argc;i++)env[i];编译运行出结果:代码中的打印语句输出结果示例对应虚拟地址空间分区说明代码段(.text)main是程序的可执行函数,存放在代码段已初始化数据段(.data)g_val是初始化的全局变量,存放在.data 段未初始化数据段(.bss)g_unval是未初始化的全局变量。
2025-12-01 18:26:35
1233
2
原创 Linux:命令行参数与环境变量(进程五)
命令行参数是程序启动时,用户通过终端传递给程序的额外信息在 C 语言中,main函数通过argc和argv两个参数来接收它们argc是参数的总个数(包含程序名)argv是一个字符串数组,存储了具体的参数内容,argv[0]是程序名,argv[argc]为NULL掌握了命令行参数,你就可以编写更加灵活和通用的程序,比如像 lsgcc这样功能强大的命令行工具在下一部分,我们将学习环境变量,它是操作系统为进程提供的另一种重要的配置信息来源。
2025-11-30 20:59:37
988
13
原创 Linux:进程的切换与调度(进程四)
在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成本增加,我们称之为进程调度O(1)算法!
2025-11-27 23:20:58
1190
9
原创 Linux:进程优先级(进程三)
PRI值越⼩越快被执⾏,那么加⼊nice值后,将会使得PRI变为:(PRI = PRI(默认) + NI)能,还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤大改善系统整体性能。需要强调⼀点的是,进程的nice值不是进程的优先级,他们不是⼀个概念,但是进程nice值会影。PRI :代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏(默认是80,最快60,最慢99)PRI也还是⽐较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执⾏的先后顺序,此。
2025-11-27 11:50:14
891
4
原创 Linux:进程状态(进程二)
与僵尸进程相反,孤儿进程顾名思义就是没有父母的进程,也就是父进程比子进程先结束,那次是怎么办呢,如果没人接管他,就会变成僵尸进程,造成内存泄露,所以此时pid为1的进程(可以简单理解为操作系统)接管他了,不仅接管了,而且还自动将其变为后台进程(也就是.cmd &),所以我们无法使用ctrl+c退出,只能使用kill -9 pid来杀死子进程。可是这个事件里面谁都没有错,操作系统为了一整个进程无奈丢弃S状态进程,进程需要服从操作系统,所以必须被丢弃,磁盘需要干自己的事情,不可能一直等进程。
2025-11-24 20:44:45
864
14
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅