linux内核分析 第六周读书笔记
第三章 进程管理
3.1 进程
进程:处于执行期的程序
线程是在进程活动中的对象;内核调度的对象是线程而不是进程,在Linux系统中,并不区分线程和进程
在现代操作系统中, 进程提供两种虚拟机制:虚拟内存器和虚拟内存。
进程在创建它的时刻开始存活,这通常是调用fork系统的结果。该系统调用通过复制一个现有进程来创建一个全新的进程。fork系统调用从内核返回两次,一次到父进程,另一次回到新产生的子进程。
通常,创建新的进程都是为了立即执行新的不同的程序,而接着调用exec()这组函数就可以创建新的地址空间,并把新的程序载入其中,在现代Linux内核中,fork()实际上是由clone()系统调用实现的。
最终程序通过exit()系统调用退出执行,这个函数会终结进程并将其占用的资源释放掉。
3.2 进程描述符及任务结构
进程描述符:进程列表存放在任务队列(task list)这一双向链表中,链表的项是task_struct即进程描述符的结构。该类型定义在<linux/sched.h>中。进程描述符包含的数据能完整地描述一个正在执行的程序:
- 它打开的文件
- 进程的地址空间
- 挂起的信号
- 进程的状态
- 其他更多信息
3.2.1 分配进程描述符
Linux通过slab分配task_ struct结构,以达到对象复用以及和缓存着色的目的,避免资源动态分配和释放带来的资源消耗。
每个任务的thread_info结构在它的内核栈的尾端分配,结构中task域中存放的是指向该任务实际task_struct的指针。
3.2.2 进程描述符的存放
内核通过唯一的进程标志值火PID来标识每个进程,PID默认最大值是32768,需要的时候可以通过修改/proc/sys/kernel/pid_max来提高上限
内核中的大部分处理处理进程的代码都是通过task_ struct进行的;因此,需要通过current宏查找到当前正在运行进程的进程描述符
X86系统中,current把栈指针的后13个有效位屏蔽掉,用来计算出thread_ info的偏移
3.2.3 进程状态
进程在任何时刻,都必定处于五种状态中的一种
- TASK_RUNNING 运行——进程是可执行的
- TASK_INTERRUPT 可中断——进程正在睡眠
- TASK_UNINTERRUPT 不可中断
- TASK_TRACED 被其他进程跟踪的进程
- TASK_STOPPED 进程停止运行
3.2.4 设置当前进程状态
调用set_ task_ state(task,state)函数将进程设置为指定状态
3.2.5 进程上下文
可执行程序代码是进程的重要组成部分,这些代码从一个可执行文件载入到进程的地址空间执行。
3.2.6 进程家族树
所有进程都是PID为1的init进程的后代。
拥有同一个父进程的所有进程称为兄弟,进程间的关系存放在进程描述符中,每个task_struct都包含有一个指向其父进程的指针,还有一个子进程链表,对于当前进程,可以通过下面的代码获得父进程的进程描述符:
struct task_struct *my_parent = current->parent;
对于给定的进程,获取链表中下一个进程:
list_ entry(task->tasks.prev,struct task_struct,tasks)
3.3 进程创建
Unix系统的进程创建方式:
fork()通过拷贝当前进程创建一个子进程
exec()负责读取可执行文件并将其载入地址空间开始运行
3.3.1 写时拷贝
Linux的fork()使用写时拷贝推迟甚至免除拷贝。内核在创建新进程的时候并不复制整个地址空间,而是让父进程和子进程共享同一个拷贝;直到子进程/父进程需要写入的时候才进行拷贝
fork的实际开销只是复制父进程的页表以及给子进程创建唯一的进程描述符
3.3.2 fork()
Linux通过clone系统调用实现fork
fork()、vfork()、_clone()库函数根据各自需要的参数标志去调用clone(),然后由clone去调用do_fork()
定义在<kernel/fork.c>中的do_ fork()完成创建中的大部分工作,它调用copy_process函数,然后让进程开始运行
copy_process()函数完成的工作:
3.3.3 vfork()
vfork()不拷贝父进程的页表项。子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()。
vfork()系统调用的实现是通过向clone()系统调用传递一个特殊标志来进行的:
3.4 线程在linux中的实现
线程机制提供了在同一程序内共享内存地址空间运行的一组线程,这些线程还可以共享打开的文件和其他资源,线程机制支持并发程序设计技术,在多处理器系统上,它也能保证真正的并行处理。
在Linux系统中,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都有自己的task_struct。
3.4.1 创建线程
线程的创建与普通进程类似,只不过在调用clone()的时候需要传递一些参数标志来指明共享的资源
传递给clone()的参数标志决定了新创建进程的行为方式和父子进程之间共享的资源种类
3.4.2 内核线程
内核线程没有独立的地址空间,只在内核空间运行,不切换到用户空间去,可以被调度,也可以被抢占。
它只能通过其他内核线程创建;内核通过kthread内核进程衍生所有的内核线程
新创建的线程处于不可运行状态,直到wake_ up_process()明确地唤醒它
3.5 进程终结
do_exit()的工作:
3.5.1 删除进程描述符
该任务是和清理工作分开进行的,因为这样在进程终结之后系统仍然可以获得它的信息
通过release_task()实现进程描述符的删除
3.5.2 孤儿进程造成的进退维谷
父进程在进程之前退出,就会遗留下子进程,也就是孤儿进程
在当前的线程组内给孤儿进程寻找新的父进程,否则直接以init作为其父进程
3.6 小结
进程与线程,linux如何存放和表示进程,如何创建进程,父进程如何收集后代信息,进程如何结束。
linux内核分析 第六周读书笔记的更多相关文章
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- linux内核分析第六周学习笔记
LINUX内核分析第六周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...
- Linux内核分析——第六周学习笔记20135308
第六周 进程的描述和进程的创建 一.进程描述符task_struct数据结构 1.操作系统三大功能 进程管理 内存管理 文件系统 2.进程控制块PCB——task_struct 也叫进程描述符,为了管 ...
- Linux内核分析——第六周学习笔记
进程的描述和进程的创建 前言:以下笔记除了一些讲解视频中的概念记录,图示.图示中的补充文字.总结.分析.小结部分均是个人理解.如有错误观点,请多指教! PS.实验操作会在提交到MOOC网站的博客中写.
- linux内核分析 第八周读书笔记
第四章 进程调度 4.1 多任务 1.多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 2.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于 ...
- linux内核分析 第七周读书笔记
第七章 链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载到存储器并执行. 2.链接可以执行于编译时,加载时,运行时. 7.1编译器驱动程序 1.大多数编译系统 ...
- linux内核分析 第五周读书笔记
第18章 调试 内核调试的难度大于用户级 一.准备开始 开始之前需要的是: 一个行为可靠且定义明确的bug 一个隐匿bug的内核版本 相关内核代码的知识和运气 想要成功的调试,取决于能不能将这些bug ...
- LINUX内核分析第六周学习总结——进程的描述和进程的创建
LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- Linux内核分析第四章 读书笔记
Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...
随机推荐
- jar包冲突常用的解决方法
jar包冲突常见的异常为找不到类(java.lang.ClassNotFoundException).找不到具体方法(java.lang.NoSuchMethodError).字段错误( java.l ...
- 用 Delphi 7 实现基于 FFMS2 的视频转 GIF 工具 [原创]
儿子经常要把自拍的视频(ts格式)转成表情包,下载了几个工具都不大好用,更多的还要收费.那就想自己写一个吧,没想到这一下断断续续地,居然 3 个月过去了.现在总算弄出个作品来了,结个贴吧.唉,天资愚钝 ...
- pytorch 如何使用tensorboard实时查看曲线---- tensorboardX简介
用惯了tensorflow的小伙伴肯定都用过tensorboard工具吧.虽然Facebook也推出了visdom,但是在一次不小心误触clear之后,我放弃了这个工具(页面的一个clear按钮我本来 ...
- SQL ser 进行表中的插入操作时,变量字段名,导致报错时解决办法 :动态SQL
标题不能描述的很清楚,下面具体说所我要描述的问题,和解决的办法. 作为SQL小白一枚,近日在写一段代码,代码如下: 报错显示 变量@vv附近错误. 后来经过了解,原来是因为,这样需要使用 动态SQL去 ...
- Beta发布文案+美工
团队名称:探路者 1蔺依铭:http://www.cnblogs.com/linym762/(组长) 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www ...
- 必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】【用户体验篇】
1.序言: 随着手机功能的不断更新和推广,手机应用市场的竞争变得愈发激烈.这次我们选择必应词典和有道词典的苹果客户端作对比,进一步分析这两款词典的客户端在功能和用户体验方面的利弊.这次测评的主要评测人 ...
- [buaa-SE-2017]个人作业-week3
个人作业-week3:案例分析 分析产品:Bing词典 Part1:调研&评测 1.软件评测和Bug汇报 这次我选择Bing词典的原因是在于,首先我使用过的词典软件较多,平台涵盖PC端.网站. ...
- android assets下rar文件解压到sd卡
参考的 http://hzy3774.iteye.com/blog/1704419 不过只能解压zip文件 最多也就能解压1M多把 ,我1.5M的可以,4M的不行 还有...之前傻逼的把raw和 ...
- struts2.3.16.1+hibernate4.3.4+spring4.0.2
把之前的老项目用新的改了 发现新的有点很方便啊 Struts2+Hibernate+Spring整合 用的是 struts2.3.16.1 hibernate4.3.4 ...
- 关于JoptionPane提示框
import java.util.*; import javax.swing.JOptionPane; import javax.swing.UIManager; public class Main ...