进程管理

  进程是处于执行期的程序以及相关的资源的总称,也称作任务。执行线程,简称线程,是在进程中活动的对象。 可以两个或两个以上的进程执行同一个程序 也可以两个或两个以上并存的进程共享许多资源 内核调度的对象是线程,而不是进程。

进程描述符及任务结构

  内核把进程的列表存放在任务列表(task list)的双向循环链表中。 链表中每一项都是类型为task_struct的进程描述符的结构。 进程描述符中包含的数据能完整地描述一个正在执行的程序: 打开的文件 进程的地址空间 挂起的信号 进程的状态 more

分配进程描述符

  Linux通过slab分配器分配task_struct结构-->达到对象复用和缓存着色的目的 每个任务的thread_info结构在它的内核栈的尾端分配。

进程描述符的存放

  内核通过一个唯一的进程标识值或PID来标志每个进程。 PID是一个数,表示为pid_t隐含类型(其物理表示是未知或不相关的),实际上是一个int类型的。

进程状态

  存在五种进程状态标志: TASK_RUNNING(运行) TASK_INTERRUPTIBLE(可中断) TASK_UNINTERRUPTIBLE(不可中断) _TASK_TRACED(被追踪) _TASK_STOPPED(停止)

各种状态之间存在转换的条件,若满足则进行转换,跟模拟电路中所学的状态机是一个道理。 通过st_task_state(task,state)函数来设置当前进程状态

进程家族树

  Unix系统的进程之间存在一个明显的继承关系 在Linux中,所有的进程都是PID为1的init进程的后代。(在孤儿进程处理时,为其找新的父亲,则可将其设为init进程的子程序) 系统中的每个进程必有一个父进程 每个进程可以没有子进程也可以有多个子进程。 拥有同一个父进程的所有进程被成为兄弟。 每个task_struct都包含一个指向其父进程task_struct、叫做parent的指针,还包含一个成为children的子进程链表。

进程创建

  产生进程的机制:首先在新的地址空间里创建进程,读入可执行文件,最后开始执行。fork函数所创建的子进程和父进程之间的区别在于PID、PPID和某些资源和统计量。fork和exec两个单独的函数来完成上句前半部分和后半部分的内容。 fork进程通过拷贝当前进程创建一个子进程。 exec负责读取可执行文件并将其载入地址空间开始执行。

  写时拷贝 资源的复制只有在需要写入的时候才进行,在此之前,知识以只读方式共享。 fork的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。

  fork clone通过系统调用实现fork,do_fork完成了创建中的大部分工作,它被定义在了kernel/fork.c文件中。 do_fork调用copy_process函数,让进程开始运行。 vfork与fork的区别在于:vfork不拷贝父进程的页表项。

创建线程

  线程的创建和普通进程的创建类是,只不过在调用clone的时候需要传递一些参数标志来指明需要共享的资源。 内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,它们只在内核空间运行,从来不切换到用户空间去。 内核进程和普通进程一样,可以被调度,也可以被抢占。

进程终结

  do_exit完成终结进程的大部分任务,定义于kernel/exit.c。do_exit永不返回。进程终止时所需要的清理工作和进程描述符的删除被分开执行。wait这一族函数都是通过唯一的系统调用wait4()来实现的。当最终需要释放进程描述符时,release_task会被调用。

孤儿进程造成的进退维谷

  如果父进程在子进程之前退出,则会造成子进程没有父进程,则被成为孤儿进程。若这些孤儿进程无法找到新的父进程,则它就会在退出的时候永远处于僵死的状态,白白消耗内存空间。 解决的办法就是为其找到一个新的父进程,若不行,则让init做为它们的父进程。

《Linux内核分析》之第三章读书笔记的更多相关文章

  1. linux内核分析 1、2章读书笔记

    一.linux历史 20世纪60年代,MIT开发分时操作系统(Compatible TIme-Sharing System),支持30台终端访问主机: 1965年,Bell实验室.MIT.GE(通用电 ...

  2. 《Linux内核分析》第三周学习笔记

    <Linux内核分析>第三周学习笔记 构造一个简单的Linux系统MenuOS 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.stud ...

  3. 《Linux内核分析》第六周 读书笔记

    <Linux内核设计与实现>CHAPTER3阅读梳理 [学习时间:3hours] [学习内容:进程的描述:进程的生命周期(包括创建.终结)] 一.进程(任务)描述 1.进程是处于执行期的程 ...

  4. 《Linux内核分析与设计实现》读书笔记一

    第一章 Linux内核简介 1.1 Unix的历史 Unix的特点: Unix很简洁,仅仅提供几百个系统调用并且有一个非常明确的设计目的: 在Unix中,所有的东西都被当做文件对待. Unix的内核和 ...

  5. 《Linux内核分析》第七周 读书笔记

    <深入理解计算机系统>CHAPTER7阅读梳理 [学习时间:3hours] [学习内容:链接需要的代码&数据:链接机制:链接生成的目标文件] 一.链接概述 1.链接 定义:链接是将 ...

  6. 《linux内核》课本第五章读书笔记

  7. 《Linux内核分析》第三周学习报告

    <Linux内核分析>第三周学习报告                                    ——构造一个简单的Linux系统MenuOS 姓名:王玮怡  学号:201351 ...

  8. 《Linux内核设计与实现》 Chapter4 读书笔记

    <Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...

  9. 《Linux内核分析》第八周学习笔记

    <Linux内核分析>第八周学习笔记 进程的切换和系统的一般执行过程 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163 ...

  10. 《Linux内核分析》第七周学习笔记

    <Linux内核分析>第七周学习笔记 可执行程序的装载 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

随机推荐

  1. cocos2d-x学习

    http://www.cocos2d-x.org/wiki/How_to_Start_A_New_Cocos2D-X_Game Cocos2d-x版本:cocos2d-x-3.6 一.设置脚本参数 1 ...

  2. 【Android端 APP 启动时长获取】启动时长获取方案及具体实施

    一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分 ...

  3. arduino编程语言Wiring参考手册API

    对Arduino的编程是利用 Arduino编程语言 (基于 Wiring)和Arduino开发环境(based on Processing)来实现的. 通过编程,Arduino可以实现很多种功能. ...

  4. linux内核升级图文攻略(转)

    一.Linux内核概览Linux是一个一体化内核(monolithic kernel)系统.设备驱动程序可以完全访问硬件.Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置 ...

  5. hdu 1299 Diophantus of Alexandria (数论)

    Diophantus of Alexandria Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  6. 常用的PHP框架

    ThinkPHP  http://www.thinkphp.cn Yii            http://www.yiichina.com laravel      https://laravel ...

  7. ELK日志管理之——logstash配置语法

    Logstash 设计了自己的 DSL -- 有点像 Puppet 的 DSL,或许因为都是用 Ruby 语言写的吧 -- 包括有区域,注释,数据类型(布尔值,字符串,数值,数组,哈希),条件判断,字 ...

  8. python出输出字符串方式:

    python出输出字符串方式: >>> who='knights' >>> what='NI' >>> print ('we are the',w ...

  9. Hishop网站迁移后出现DataProtectionConfigurationProvider错误

    错误代码如下: 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误信息: 未能使用提供程序“DataProtectionCon ...

  10. 深度学习主机环境配置: Ubuntu16.04 + GeForce GTX 1070 + CUDA8.0 + cuDNN5.1 + TensorFlow

    深度学习主机环境配置: Ubuntu16.04 + GeForce GTX 1070 + CUDA8.0 + cuDNN5.1 + TensorFlow 最近在公司做深度学习相关的学习和实验,原来一直 ...