一.进程(或者称为“任务”)简介

进程是OS最基本的抽象之一,通常进程包括“可执行程序代码”,“其他资源”(如:打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间,一个或多个执行线程等)

二.执行线程简介

执行线程(或称线程)是进程中活动的对象,内核调度的对象是线程,而不是进程,每个线程中都有一个独立的程序计数器,进程栈,进程寄存器

三.进程虚拟机制简介

进程提供了两种虚拟机制(后面的章节,我们还会学习哈~):

1.虚拟处理器:给进程一种假象,让这些进程觉得自己独享处理器(这个需要控制好时间片哈~不能太长也不能太短)

2.虚拟内存: 让进程再获取和使用内存时觉得自己拥有整个系统的所有内存资源

(注:线程之间可以共享虚拟内存,但拥有各自的虚拟处理器)

四.进程在Linux内核中表示的数据结构task_struct

1.内核把进程存放在“任务队列”(一个双向循环链表的结构)中,链表中每一项都是类型为“task_struct(进程描述符)”的结构(<linux/sched.h>中)

2.进程的task_struct是通过slab分配器分配生成的

3.内核通过一个唯一的进程标识值或者PID来标识每个进程。PID是一个数,int类型(最大默认为32768 [short int最大值] )


struct task_struct {

         unsigned long state;(判断进程状态的参数)

         ....

         struct task_struct * parent; (指向父进程,涉及资源共享等问题)

         struct list_head tasks;  (任务链表)

         pid_t pid; (进程标识值)

         ....

         ....

}


五.进程七大状态

Linux中的进程有7种状态,进程的task_struct结构的state字段指明了该进程的状态。

可运行状态(TASK_RUNNING): 1.正在执行   2.在运行队列中等待执行

可中断的等待(TASK_INTERRUPTIBLE)[进程睡眠中]: 1.等待某些条件的达成,条件一达成,内核会把进程状态设置为运行状态(Running),处于此状态的进程也会因为接收到信号而提前被唤醒并投入运行

不可中断的等待(TASK_UNINTERRUPTIBLE):除了不会因为接到信号而被唤醒从而投入运行外,其他的和(可中断的等待状态一样)

暂停状态(TASK_STOPPED)[停止]:  1.进程没有投入运行也不能投入运行

跟踪状态(TASK_TRACED):进程被调试器暂停或监视。

僵死状态(EXIT_ZOMBIE):进程被终止,但父进程未调用wait类系统调用。

僵死撤销状态(TASK_DEAD):父进程发起wait类系统调用,进程由系统删除。

六.进程上下文和进程家族树

进程上下文:

当一个程序执行了系统调用或者触发了某个异常,它就陷入了内核空间(内核态),称内核“代表进程执行”并处于进程上下文中

系统调用和异常处理程序是对内核明确定义的接口,进程只有通过这些接口才能进入内核执行,对内核的所有访问都必须调用这些接口

进程家族树:

所有的进程都是PID为1的Init进程的后代,内核在系统启动的最后阶段启动init进程,该进程读取“初始化脚本”并执行其他相关程序,最终完成系统启动的整个过程

每个进程描述符(task_struct)中都包含一个指向其父进程的指针(parent),和一个包含所有子进程的链表(children)

关于init进程:

init是Linux系统操作中不可缺少的程序之一。
所谓的
init进程,它是一个由
内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和
数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果
内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。

七.进程状态转换图(引用网上图片)


八.进程的创建

创建进程的方法:

1.其他操作系统: 首先在新的地址空间里创建进程,读入可执行文件,最后开始执行

2.Unix/Linux: 用两个函数 fork() 和 exec() 来执行,完成进程创建工作

fork():该调用通过复制一个现有进程来创建一个全新的进程(父进程和子进程的区别仅仅在于PID不同,其他资源的话,父进程和子进程一样)

调用fork()进程的成为父进程,新产生的进程成为子进程,在调用结束后,在返回调用位置,父进程恢复执行,子进程开始执行,fork()系统调用从内核返回两次(一次返回父进程,一次返回子进程)

exec(): 负责读取可执行文件并将其载入地址空间开始运行

(exec()这个家族包括: execve(), execlp(), execle(), execv(), execvp() 等系统调用)

fork()详解:http://www.cnblogs.com/bastard/archive/2012/08/31/2664896.html

九.进程的终结

当一个进程终结时,内核必须释放它所有的资源并告知其父进程

进程的析构发生在它调用exit()后(既可以显式调用,也可以隐式调用[主函数返回时调用])或者遇到异常,也会被动终结

do_exit()(定义于kernel/exit.c中):http://hi.baidu.com/zengzhaonong/item/24cc74c0e74a8b2d46d5c023

十.进程描述符的删除

当调用do_exit()之后,进程已经处于僵死状态,但仍保留了它的进程描述符(能让父进程得到它的状态信息)

。。。。

。。。。

。。。有点事,回来再继续写~~~

《Linux内核设计与实现》学习笔记之“Linux进程管理机制”的更多相关文章

  1. Linux内核设计与实现——读书笔记2:进程管理

    1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...

  2. linux内核设计与实现学习笔记-模块

    模块 1.概念:  如果让LINUX Kernel单独运行在一个保护区域,那么LINUX Kernel就成为了“单内核”.    LINUX Kernel是组件模式的,所谓组件模式是指:LINUX K ...

  3. Linux内核设计与实现 读书笔记 转

    Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...

  4. linux内核分析第四周学习笔记

    linux内核分析第四周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  5. Linux内核分析第二周学习笔记

    linux内核分析第二周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  6. linux内核分析第一周学习笔记

    linux内核分析第一周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  7. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...

  8. Linux内核设计第一周学习总结 计算机如何工作

    北京电子科技学院 20135310陈巧然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002 ...

  9. Linux内核设计与实现 读书笔记

    第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...

  10. 20135320赵瀚青LINUX内核分析第一周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.概述 第一周的学习内容主 ...

随机推荐

  1. share my tools With Xcode

    1.让Xcode的控制台支持LLDB类型的打印 在Xcode断点调试的时候, 在控制台输入 po self.view.frame 或者 po id 类型的时候就死翘翘了. 进入正题: 安装LLDB调试 ...

  2. IronPython脚本调用C#dll示例

    上篇Python脚本调用C#代码数据交互示例(hello world)介绍了与C#紧密结合的示例,这里还将提供一个与C#结合更紧密的示例,直接调用C#编写的DLL.      我们还是沿用了上篇文章的 ...

  3. 今天,安装了一个GANGLIA玩玩,以后再测试NAGIOS吧。

    说不定以后派得上用场呢.. 还有,NGINX也要学,不能老是凭站IIS,APACHE混饭吃吧,现在它都这么流行了..新浪,网易,腾讯.

  4. Analysis Guidelines

    This section describes some best practices for analysis. These practices come from experience of ana ...

  5. 【网络流24题】No.8 机器人路径规划问题

    [题意] 机器人 Rob 可在一个树状路径上自由移动. 给定树状路径 T 上的起点 s 和终点 t, 机器人 Rob 要从 s 运动到 t. 树状路径 T 上有若干可移动的障碍物. 由于路径狭窄, 任 ...

  6. 子查询解嵌套in改写为exists

    SELECT * FROM (SELECT pubformdat0_.id id332_, pubformdat0_.domain_id domain2_332_, pubformdat0_.proc ...

  7. 【HDOJ】1963 Investment

    完全背包. #include <stdio.h> #include <string.h> #define max(a, b) (a>b) ? a:b ], an[]; ] ...

  8. [pod install] error: cannot open .git/FETCH_HEAD: Permission denied

    pod installAnalyzing dependencies[!] Pod::Executable pull error: cannot open .git/FETCH_HEAD: Permis ...

  9. svn文件提交时强制写注释

    这个操作需要修改版本库中的一个钩子文件,在你创建的版本库中有一个hooks文件夹,初始的时候其中有一个文件叫pre-commit.tmpl 在windows下将其修改为pre-commit.bat,在 ...

  10. 计数方法(扫描线):JLOI 2016 圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...