Linux内核分析 读书笔记 (第三章)
第三章 进程管理
3.1 进程
1.进程:
进程就是处于执行期的程序。进程就是正在执行的程序代码的实时结果。进程是处于执行期的程序以及相关的资源的总称。进程包括代码段和其他资源。
2.线程:执行线程,简称线程,是在进程中活动的对象。
内核调度的对象是线程而不是进程。Linux对线程并不特别区分,视其为特殊的进程。
3.在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。包含在同一个进程中的线程可以共享虚拟内存,但是每个都拥有各自的虚拟处理器。
4.几个函数
fork():创建新进程exec():创建新的地址空间并把新的程序载入其中clone():fork实际由clone实现exit():退出执行wait4():父进程查询子进程是否终结wait()、waitpid():程序退出执行后变为僵死状态,调用这两个消灭掉。
3.2 进程描述符及任务结构
内核把进程的列表存放在叫做任务队列的双向循环链表中。链表中的每一项都是进程描述符。进程描述符的类型为task_struct。
3.2.1 分配进程描述符
Linux通过slab分配器分配task_struct结构——能达到对象复用和缓存着色的目的。slab分配器——动态生成,只需在栈底或者栈顶创建一个新的结构struct thread_info。每个任务的thread_info结构在它的内核栈的尾端分配。结构中task域中存放的是指向该任务实际task_struct的指针。
3.2.2 进程描述符的存放
内核通过一个唯一的进程标识值PID来标识每个进程。pid类型为pid_t,实际上就是一个int类型,最大值默认设置为32768,上限私改/proc/sys/kernel/pid_max。pid存放在各自进程描述符中。
3.2.3 进程状态
进程描述符中的state域是用来描述进程当前状态的。共有五种状态,标志如下:
TASK_RUNNING(运行):进程是可执行的,或者正在执行,或者在运行队列中等待执行TASK_INTERRUPTIBLE(可中断):进程正在睡眠/被阻塞TASK_UNINTERRUPTIBLE(不可中断):睡眠/被阻塞进程不被信号唤醒 TASK_TRACED:被其他进程跟踪的进程TASK_STOPPED(停止):进程停止执行;进程没有投入运行也不能投入运行。 接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号时,或者调试时收到任何信号,都可以进入这种状态。
3.2.4 设置当前进程状态
用set_task_state(task,state)函数。
3.2.5 进程上下文
程序执行系统调用或者触发异常后,会陷入内核空间,这时候内核代表进程执行,并且处于进程上下文中。
进程对内核的访问必须通过接口:系统调用和异常处理程序
3.2.6 进程家族树
所有的进程都是pid为1的init进程的后代。内核在系统启动的最后阶段启动init进程。系统中的每一个进程必有一个父进程,可以拥有0个或多个子进程,拥有同一个父进程的进程叫做兄弟。这种关系存放在进程描述符中,parent指针指向父进程task_struct,children是子进程链表。
3.3 进程创建
Unix系统的进程创建方式
- fork()通过拷贝当前进程创建一个子进程
- exec()负责读取可执行文件并将其载入地址空间开始运行
3.1 写时拷贝
- Linux的fork()使用写时拷贝推迟甚至免除拷贝。内核在创建新进程的时候并不复制整个地址空间,而是让父进程和子进程共享同一个拷贝;直到子进程/父进程需要写入的时候才进行拷贝
- fork的实际开销只是复制父进程的页表以及给子进程创建唯一的进程描述符
3.2 fork()
- Linux通过clone系统调用实现fork
- 由clone去调用do_fork()
- 定义在<kernel/fork.c>中的do_ fork()完成创建中的大部分工作,它调用copy_process函数,然后让进程开始运行

最后copy_process返回的就是指向子进程的指针
3.3 vfork()
除了不拷贝父进程的页表项外,vfork()系统调用和fork()功能相同。子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()。
vfork()系统调用的实现是通过向clone()系统调用传递一个特殊标志来进行的:

3.4 线程在Linux中的实现
线程机制提供了在同一程序内共享内存地址空间运行的一组线程。在Linux系统中,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都有自己的task_struct。
3.4.1 创建线程
1. 线程的创建与普通进程类似,只不过在调用clone()的时候需要传递一些参数标志来指明共享的资源
2. 传递给clone()的参数标志决定了新创建进程的行为方式和父子进程之间共享的资源种类
3.4.2 内核线程
内核线程与普通进程的区别只在于内核线程没有独立的地址空间:
- 它只能通过其他内核线程创建;内核通过kthread内核进程衍生所有的内核线程
- 新创建的线程处于不可运行状态,直到wake_ up_process()明确地唤醒它
3.5 进程终结
终结进程大部分依赖于do_exit()来完成:


3.5.1 删除进程描述符
- 该任务是和清理工作分开进行的,因为这样在进程终结之后系统仍然可以获得它的信息
- 通过release_task()实现进程描述符的删除
- 至此,所有资源都被释放了
3.5.2 解决孤儿进程
1. 孤儿进程:父进程在进程之前退出,就会遗留下子进程,也就是孤儿进程
2. 解决方法:在当前的线程组内给孤儿进程寻找新的父进程;否则直接以init作为其父进程
- 调用顺序:do_ exit()-->forget_ original_ parent()-->find_ new_ parent()-->ptrace_ exit_ finish()
一旦系统为进程成功地找到和设置了新的父进程,就不会再有出现驻留僵死进程的危险了。init进程会例行调用wait()来检查其子进程,清除所有与其相关的僵死进程。
Linux内核分析 读书笔记 (第三章)的更多相关文章
- Linux内核分析 读书笔记 (第一章、第二章)
第一章 Linux内核简介 1.1 Unix的历史 Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的. 在Unix中,所有东西都被当做文件,这种抽象使对数据和对设备的操作是通过一套相 ...
- 20135239 益西拉姆 linux内核分析 读书笔记之第四章
chapter 4 进程调度 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 多任务系统可以划分为两类: - 非抢占式多任务: - 进程会一直执行直到自己主动停止运行(这一 ...
- 《Linux内核分析》之第三章读书笔记
进程管理 进程是处于执行期的程序以及相关的资源的总称,也称作任务.执行线程,简称线程,是在进程中活动的对象. 可以两个或两个以上的进程执行同一个程序 也可以两个或两个以上并存的进程共享许多资源 内核调 ...
- Linux内核分析 读书笔记 (第七章)
第七章 链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行. 2.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于 ...
- Linux内核分析 读书笔记 (第五章)
第五章 系统调用 5.1 与内核通信 1.调用在用户空间进程和硬件设备之间添加了一个中间层.该层主要作用有三个: 为用户空间提供了硬件的抽象接口. 系统调用保证了系统的稳定和安全. 实现多任务和虚拟内 ...
- Linux内核分析 读书笔记 (第四章)
第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最大限 ...
- STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法
1.准备知识 typename用法 用法1:等效于模板编程中的class 用法2:用于显式地告诉编译器接下来的名称是类型名,对于这个区分,下面的参考链接中说得好,如果编译器不知道 T::bar 是类型 ...
- Linux内核分析 读书笔记 (第十八章)
第十八章 调试 18.1 准备开始 1. 需要的只是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在跟踪bug的时候,掌握的信息越多越好. 18.2 内核中的bug 1. ...
- 《Linux内核设计与分析》第六周读书笔记——第三章
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...
随机推荐
- java.sql.SQLSyntaxErrorException: ORA-00904: "column": 标识符无效
java.sql.SQLSyntaxErrorException: ORA-00904: "column": 标识符无效 首先查看无效的列是不是orcale关键字 , 如果不是 , ...
- Instruments模板介绍(更新中...)
第一章.Instruments(仪器)快速入门 Instruments可以用来收集关于一个或者多个系统进程的性能和行为的数据,并跟踪睡着时间产生的数据.它提供了好几个分析模板: Blank 任何类型都 ...
- [BUG]Appium1.9.1 这个问题竟然花了我5分钟进行定位
1.先上问题,知道是什么问题先 EE ====================================================================== ERROR: tes ...
- webpack 开发环境与生成环境的 配置
写在前面 最近学习react,之前做vue项目的时候,一直都是拿来主义,浑浑噩噩,感觉不太好,趁学习react的机会,在顺带学习一下webpack.一般配置文件分两份,为开发环境和生成环境.有此区分, ...
- Djando 的 cmd命令
1.黑窗口命令 安装Django pip install django==1.11.16 -i https://pypi.doubanio.com/simple/ 创建项目 django-ad ...
- ethereum/EIPs-160 EXP cost increase
eip title author type category status created 160 EXP cost increase Vitalik Buterin Standards Track ...
- Linux企业运维人员最常用150个命令汇总 [转]
近来发现新手学习Linux记不住命令,不会分类.不会筛选重点,胡子眉毛一把抓当然记不住了. 特别整理Linux运维最常用150个命令和大家分享,大家学习命令不用在盲目了,根据分类,然后逐步学习! 命令 ...
- java 日期与时间类
1.Date类: https://www.cnblogs.com/huangminwen/p/5994927.html 2.DateFormat和SimpleDateFormat (simple简单 ...
- Linux 局域网同步时间
选择一台能上外网的机器作为时间服务器(都不能上亦可以,任选一台即可,但是只能保证局域网内时间同步) 配置此时间服务器 安装 ntp 在 /etc/ntp.conf 中配置 restrict 127.0 ...
- P4111 [HEOI2015]小Z的房间
你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着.你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把 ...