没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
Linux 进程 和 线程 的基本 编程、通讯 和 例
程
注:【杂记】系列为日常网搜资料的堆砌而积累成之。如有错误恭谢指出。标识为“原创”其实不完
全是,只是多引用再整理和加上自己的理解,进行记录备查,大都引自网络,侵删!
大量参考 100ask、网络文章等资料(参考源均以给出,侵删),这里参考网络文章和官方文档并做
多处横向对比,形成系统性 一文全解,给出保姆级别的参考,则避免 同质化(不完全是直接引用,我整
理了很好、很漂亮的格式,还为了 句子流畅、整理标点符号 和 补充说明(中文语境的名词混乱、口水
话输出等等,你懂的) 做了很多 整理、修改和补充)。
注:在 Github 上的原版文章日后可能会更新,但这里不会跟进。文章的 Gitee 仓库地址,Gitee 访
问更流畅。
查看进程/线程/系统运行状况等的命令
主线剧情02-ARM-Linux基础学习记录_Real-Staok的博客-CSDN博客 里面的 Linux Shell 一
节 的 任务后台执行 / 任务&进程查看 部分。
关于Linux下进程的详解【进程查看与管理】 - AshJo - 博客园 (cnblogs.com)。
linux top命令查看内存及多核CPU的使用讲述 - tamatama - 博客园 (cnblogs.com)。
Linux vmstat命令实战详解浮生忆梦的博客-CSDN博客vmstat。
etc.
前置了解和其他
这里仅仅是将我随机看到的放在这里,网搜会有更多/更好的文章,广泛的看看。这里也是本文的参
考源之一。
进程 & 线程相关知识 - blcblc - 博客园 (cnblogs.com),基本概念 和其 异同 的介绍。
linux基础——linux进程与线程的区别与联系_yexz的博客-CSDN博客。
操作系统基础知识复习总结loserChen.的博客-CSDN博客操作系统基础知识、操作系统基础
_wang德华的博客-CSDN博客、操作系统基础知识整理零分分分分的博客-CSDN博客操作系统
基础知识、操作系统基础知识总结整理EasyChill的博客-CSDN博客操作系统基础知识总结。
etc.
一些进程/线程调试经验
设计模式 / 分配策略 相关:
【杂记】进程和线程的分配策略Real-Staok的博客-CSDN博客资源在进程和线程上如何分配 里
面的 “启发任务分配的规则” 和 “进程 和 线程 设计经验参考” 一节。
从内核角度分析:当linux多线程遭遇Linux多进程 - 知乎 (zhihu.com)。
一些 线程池 编写经验 linux基础——经典线程同步问题解析及编程实现_yexz的博客-CSDN博
客。
设计模式 POSIX多线程程序设计(第4章:使用线程的几种方式)瓦釜苑-CSDN博客posix多线
程程序设计。
etc.
调试相关:
Linux进程崩溃原调试_guotianqing的博客-CSDN博客。
etc.
Linux 进程
参考:
「linux操作系统」进程的切换与控制·到底有啥关系? - 知乎 (zhihu.com),Linux进程解析
_deep_explore的博客-CSDN博客,腾讯面试:进程的那些数据结构 - 知乎 (zhihu.com),如何
在Linux下的进行多进程编程(初步) - 知乎 (zhihu.com),彻底搞定面试官,linux的进程里
面的一些细节 - 知乎 (zhihu.com),操作系统进程的概念,进程的状态及状态转换,进程控制
程小智的博客-CSDN博客进程的状态及其转换。
Linux 进程详解 - 程序员大本营 (pianshen.com)。Linux进程基础教程详解Linux脚本之家
(jb51.net)。
【Linux】Linux进程的创建与管理Yngz_Miao的博客-CSDN博客linux 创建进程。
《Linux System Prorgrammin》,Linux系统编程 _ 中文版 _ by _ 哈工大(翻译)-第五章-进
程管理。
Linux 操作系统 C 语言编程入门。
进程基础概念
程序与进程
通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件。而进程是一个开始执行但
是还没有结束的程序的实例。就是可执行文
件的具体实现。一个程序可能有许多进程,而每一个进程又可以有许多子进程。
进程状态
1. 创建态:进程正在被创建,尚未转到就绪态。
2. 就绪态:进程获得了除处理机以外的一切所需资源,一旦得到处理机便可立即运行。
状态特点:处理机(或者理解为调度器)资源:只缺处理机。资源获得:已获
得所需资源。当获得处理机时:立即运行。
状态转换:就绪态——>运行态:处于就绪态的进程被调度后,获得处理机资
源,于是进程由就绪态切换为运行态。
3. 运行态:进程正在处理机上运行;对于单处理机,同一时刻只有一个进程处于运行态。
状态转换:运行态——>就绪态:情况1:处于运行态的进程在时间片用完后,
不得不让出处理机,进而转换为就绪态。情况2:在可剥夺的操作系统中,当
有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更
高优先级的进程执行。
状态转换:运行态——>阻塞态(主动行为):进程请求某一资源(如外设)
的使用或等待某一事件的发生(如I/O操作的完成)时,它就从运行态转换为
阻塞态。进程以系统调用的形式请求操作系统提供服务,这是一种特殊的,由
用户态程序调用操作系统内核过程的形式。
4. 阻塞态:又称等待态,进程正在等待某一事件而暂停运行/休眠,如等待某资源或IO完
成,即使处理机空闲,该进程也不能运行。
状态特点:处理机(或者理解为调度器)资源:可能缺;也可能不缺。资源获
得:等待某资源可用或等待一件事情完成。当获得处理机时:即使处理机空
闲,当等待的事情没有完成,仍无法运行。
状态转换:阻塞态——>就绪态(被动行为,需要其他相关进程的协助):进
程等待的事件到来,如I/O操作结束或中断结束时,中断处理程序必须把相应
进程的状态由阻塞态转换为就绪态。
5. 终止态:进程正从系统中消失,可能是进程正常结束或其他原因退出运行。
对应到 Linux 内核中,各个进程状态的标志:
TASK_RUNNING 说明进程已经准备好了,就看操作系统给不给分时间片在 CPU 上执行
了,进程获得了时间片,就是执行状态,不分配时间片就是就绪状态。代表状态的字段
又不用变。
其实 TASK_RUNING 这个字段既对应了进程的就绪态又对应了进程的运行态。
只有在该状态的进程才可能在 CPU上运行。而同 一时刻可能有多个进程处于
可执行状态,这些进程的 task_struct结构(进程控制块)被放入对应 CPU的
可执行队列中(一个进程最多只能出现在一个 CPU的可执行队列中)。进程调
度器的任务就是从各个 CPU的可执行队列中分别选择一个进程在该 CPU 上运
行。
只要可执行队列不为空,其对应的 CPU就不能偷懒,就要执行其中某个进程。
一般称此时的 CPU“忙碌”。对应的, CPU“空闲”就是指其对应的可执行队列为
空,以致于 CPU无事可做。
很多操作系统教科书将正在 CPU上执行的进程定义为 RUNNING状态、而将可
执行但是尚未被调度执行的进程定义为 READY状态,这两种状态在 linux下统
一为 TASK_RUNNING状态。
TASK_INTERRUPTIBLE 和 TASK_UNINTERRUPTIBLE 是两种睡眠状态,对应上面的阻塞
状态。 TASK_INTERRUPTIBLE 可以再被信号唤醒, TASK_UNINTERRUPTIBLE 不可被信
号唤醒。
TASK_INTERRUPTIBLE,可中断的睡眠状态。处于这个状态的进程因为等待某
某事件的发生(比如等待 socket连接、等待信号量),而被挂起。这些进程的
task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中
断触发、或由其他 进程触发),对应的等待队列中的一个或多个进程将被唤
醒。通过 ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于
TASK_INTERRUPTIBLE状态(除非机器的负载很高)。
TASK_UNINTERRUPTIBLE,不可中断的睡眠状态。与 TASK_INTERRUPTIBLE
状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的
并不是 CPU不响应外部硬件的中断,而是指进程不响应异步信号。即 kill -9
无法 关掉/杀死 这种进程。TASK_UNINTERRUPTIBLE 状态存在的意义就在
于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流
程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于
内核态,也可能延伸到用户态),于是原有的流程就被中断了。
在进程对某些硬件进行操作时(比如进程调用 read 系统调用对某个设备文件
进行读操作,而 read 系统调用最终执行到对应设备驱动的代码,并与对应的
物 理设备进行交互),可能需要使用 TASK_UNINTERRUPTIBLE 状态对进程进
行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的 状态。
这种情况下的 TASK_UNINTERRUPTIBLE 状态总是非常短暂的,通过 ps 命令
基本上不可能捕捉到。Linux系统中也存在容易捕捉的
TASK_UNINTERRUPTIBLE状态。执行 vfork系统调用后,父进程将进入
TASK_UNINTERRUPTIBLE状态,直到子进程调用 exit或 exec。
TASK_STOPPED 是在进程收到 SIGSTOP 以及 SIGTTIN 等信号的状态,你 Linux 进程运
行起来按 Ctrl + z 后进程就是这个状态。
向进程 发送一个 SIGSTOP信号,它就会因响应该信号而进入 TASK_STOPPED
状态(除非该进程本身处于 TASK_UNINTERRUPTIBLE状态而不响应信号)。
( SIGSTOP与 SIGKILL信号一样,是非常强制的。不允许用户进程通过 signal
系列的系统调用重新设置对应的信号处理函数。)
向进程发送一个 SIGCONT信号,可以让其从 TASK_STOPPED状态恢复到
TASK_RUNNING状态。
TASK_TRACED 是进程被监视的状态。
当进程正在被跟踪时,它处于 TASK_TRACED这个特殊的状态。“正在被跟踪”
指的是进程暂停下来,等待跟踪它的进程对它进行操作。比如在 gdb中 对被跟
踪的进程下一个断点,进程在断点处停下来的时候就处于 TASK_TRACED状
态。而在其他时候,被跟踪的进程还是处于前面提到的那些状态。
TASK_STOPPED和 TASK_TRACED状态判断。对于进程本身来说,
TASK_STOPPED和 TASK_TRACED状态很类似,都是表示进程暂停下来。而
TASK_TRACED状态相当于在 TASK_STOPPED之上多了一层保护,处于
TASK_TRACED状态的进程不能响应 SIGCONT信号而 被唤醒。只能等到调试进
程通过 ptrace系统调用执行 PTRACE_CONT、 PTRACE_DETACH等操作(通过
ptrace系统调用的参数指定 操作),或调试进程退出,被调试的进程才能恢复
TASK_RUNNING状态。
TASK_DEAD - EXIT_ZOMBIE ,退出状态,进程成为僵尸进程。 EXIT_DEAD 是最终状
态,进入这个状态代表进程要从系统中删除了 EXIT_ZOMBIE 是 EXIT_DEAD 的前一个状
态,这个时候进程已经终止,但父进程还没有用 wait() 等系统调用来获取他的终止信
息,这个状态的进程叫做僵尸进程。这个状态 kill 命令是杀不死的,你们可以想以下应
该怎样清楚僵尸进程,以及怎样避免僵尸进程的存在。
关于 退出 相关的 进程状态(上面四个),更多可详见 Linux进程解析_deep_explore的
博客-CSDN博客。
Linux 进程状态转换示意图:
系统进程常见的 STAT 代码:
就绪队列与阻塞队列:
就绪队列:系统中处于就绪状态的进程可能有多个,通常把它们排成一个队列。只要就绪队列
不空,CPU就总是可以调度进程运行,保持繁忙,这与就绪进程的数目没有关系;除非就绪队列为
空,此时CPU进入等待态,CPU效率下降。
阻塞队列:系统通常将处于阻塞态的进程也排成一个队列,甚至根据阻塞原因不同,设置多个
阻塞队列。
进程的构成
引自 进程的那些数据结构 - 知乎 (zhihu.com),Linux下的task_struct结构体 - 百度文库
(baidu.com)。
进程一般由以下几个部分组成:
进程控制块(PCB):每个进程在创建时, 系统都会为进程创建一个相应的 PCB。PCB
是进程存在的唯一标志。
剩余51页未读,继续阅读
ask_ai_app
- 粉丝: 18
- 资源: 326
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0