第三章 进程管理笔记

20135109 高艺桐

3、1进程

1、程序本身并不是进程,进程是处于执行期的程序以及相关资源的总称。

2、执行线程,简称线程,是进程中活动的对象。每个线程都拥有一个独立的计数器、进程栈和一组进程计数器。

3、内核调度的对象是线程而不是进程,对Linux而言,线程是一种特殊的进程。

4、进程在创建它时开始存活,系统调用通过复制一个现有的进程来创建一个全新的进程,调用fork()的进程为父进程,新产生的进程为子进程。

5、fork()系统调用从内核返回两次:一次回到父进程,一次回到新产生的子进程。

3、2进程描述符及任务结构

1、内核把进程的列表存放叫做任务队列的双向循环列表,链表中的每一项都是类型为task_struck,成为进程描述符的结构,定义在<Linux/sched.h>文件中。

2、进程描述符包含一个进程的所有信息,包括:进程地址空间、挂起的信号、进程的状态等。

3、Linux通过slab分配器分配task_struck结构,这样能达到对象复用和缓存着色的目的。由于slab分配器动态生成task_struck,所以只需要在栈底(对于向下增长的栈来说)或栈顶(对于向上增长的栈来说)创建一个新的结构struck thread_info。

4、每个任务的thread_info结构在它的内核栈的低端分配,结构中task域中存放的是指向该任务实际task_struck的指针。

5、内核通过唯一的进程标识值或PID来标识每一个进程,PID实际上就是一个int类型。

6、在内核中,访问任务通常需要获得指向其task_struct的指针,实质上内核中大部分处理进程的代码都是直接通过task_struct进行的。有的硬件可以拿出一个专门的寄存器来存放当前进程的task_struct指针,加快访问速度,而想x86这样的体系结构,只能在栈的尾端创建thread_info结构,通过计算偏移间接的查找task_struct结构。

7、进程描述符中的state域描述了进程的当前状态,系统中的每个进程都必定处于这5种状态中的一种:

TASK_RUNNING(运行)

TASK_INTERRUPTIBLE(可中断)

TASK_UNINTERRUPTIBLE(不可中断)

_TASK_TRACED——被其他进程跟踪

_TASK_STOPPED——(停止)进程停止执行

8、内核经常需要调整某个进程的状态,这时最好使用set_task state(task,state)函数,这函数将指定的进程设置为指定的状态。

8、可执行程序代码是进程的重要部分,这些代码从一个可执行文件载入到进程的地址空间执行,一般程序在用户空间执行。我们称内核“代表进程”执行并处于进程中下文中。

9、所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。

系统中的每一个进程都必有一个父进程,相应的每个进程也可以拥有0个或多个子进程,每个task_struct都包含一个指向其父进程的task_struct、叫做parent指针,还包含一个children的字进程链表。

3、3进程创建

1、进程首先在新的地址空间里创建进程,读入可执行文件,最后开始执行,fork()通过拷贝当前进程的一个子进程,子进程与父进程的区别在于PID、PPID等;exec()函数负责读取可执行文件并将其载入地址空间开始运行。

2、写时拷贝:

Linux的fork()使用写时拷贝(copy-on-weite)页实现,fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述。

3、fork():

(1)Linux通过clone()系统调用fork(),然后由clone()去调度do_fork()

(2)do_fork()创建了大部分的工作,定义在kernel/fork.c的文件中,调用copy_process()函数,让进程开始运行。

(3)copy_process函数的工作流程:

1)调用dup_tast_struct()为进程创建内核栈、thread_info结构和task_struck等,这些值父进程与子进程完全一致。

2)子进程着手于父进程区别开。

3)子进程将状态设置为TASK_UNINTERRUPTIBLE,保证不会投入运行。

4)copy_process()调用copy_flags()更新task_struck的flags成员。

5)调用alloc_pid为新进程分配PID

6)根据传递给clone的参数标志,copy_process()拷贝或共享打开文件夹等。

7)copy_process()做扫尾工作,并返回子进程指针

8)回到do_fork()函数。

4、vfork():

(1)除了不拷贝父进程的页表外,vfork()系统调用和fork()系统调用基本相同。

(2)vfork()系统调用的实现是通过向clone()系统调用传递一个特殊的标志来进行的:

1)在调用copy_process()时,task_struck的vfor_done成员被设置成NULL;

2)执行do_fork时,vfor_done会指向一个特定的地址

3)子进程执行后,父进程不是马上执行而是继续等待,直到子进程的vfor_done向它发送信号

4)调用mm_release时进程退出内存地址空间,检查vfor_done是否为空,不为空则向父进程发送信号。

5)回到do_fork(),父进程继续工作。

3、4线程在Linux中的实现

1、线程机制是现代编程机制中一种常用的抽象概念,Linux把所有的线程都当做进程来实现。每一个线程都拥有自己的task_struck。

2、线程的创建和普通的进程创建类似,只不过在调用clone()的时候需要传递一些参数标志来指明需要共享的资源,传递给clone()的参数标志决定了新创建进程的方式和父子进程之间共享的资源类型。

3、内核线程和普通的进程间区别在于内核线程没有独立的地址空间(指向地址空间的mm指针被指向为NULL),他们只在内核空间运行,从来不切换到用户态去。

4、内核进程和普通进程一样,可以被调度也可以被抢占。

5、Linux会把一些任务交给内核线程去做,像flush和ksofirqd等。

3、5进程终结

1、进程终结时,内核必须释放它所占有的资源,终结依靠do_exit()。

2、在父进程获得子进程终结的信息后,子进程的task_struck结构才被释放。

3、wait()的标准动作是挂起调用它的进程,直到其中的一个子进程退出,此时函数会返回子进程的PID。

4、wait()用来检查子进程,清除所有与其相关的僵死进程。

5、如果父进程在子进程之前退出,必须有机制能保证子进程能找到一个新父亲,如果不行就让init做他们的父进程。在exit()中调用exit_notify(),该函数会调用forget_original_parent(),而后会调用find()_new_reaper()来寻找父进程。

时间: 2024-11-07 10:08:41

第三章 进程管理笔记的相关文章

Linux内核分析——第三章 进程管理

第三章 进程管理 3.1 进程 1.进程就是处于执行期的程序:进程就是正在执行的程序代码的实时结果:进程是处于执行期的程序以及相关的资源的总称:进程包括代码段和其他资源. 线程:是在进程中活动的对象. 2.执行线程,简称线程,是在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组进程寄存器. 3.内核调度的对象是线程,而不是进程.Linux对线程并不特别区分,视其为特殊的进程 4.在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存.在线程之间可以共享虚拟内存,但每个都拥

第三章 表单笔记

第三章                                                                表单  笔记 attion 此属性指示服务器处理表单输出的程序一般来说,当用户单点击的"提交"按钮后信息发送到Web服务器上,由attion属性所指的程序处理如果action为空则默认提交到本页method此属性告诉浏览器,如何将数据发送给服务器,他指向服务器发送数据的方法.语法为method=(getpost)<form method="

操作系统学习笔记--第三章--进程

1.1 定义 一个正在执行的程序 一个正在计算机上执行的程序实例 能分配给处理器并由处理器执行的实体 一个具有以下特征的活动单元:一组指令系统的执行.一个当前状态和相关的系统资源集 进程的两个基本元素是程序代码和代码相关联的数据集. 进程控制块,由操作系统创建和管理,进程控制块包含充分的信息,这样就可以中断一个进程的执行,并且再后来恢复进程执行时, 就好像进程从来未中断过一样.   1.2 进程的状态 1.2.1 两状态进程模型 运行态和未运行态 进程创建的原因: 进程终止的原因: 1.2.2

第十二章 进程管理

一.进程 1.进程概述 一个程序是一个可执行文件,而进程是程序执行的动态过程.进程是为运行着的程序提供执行环境的实体,它包括一个地址空间和一个控制点. 当执行一个程序的时候,系统加载程序会把此程序加载到内存中,它在内存中由5部分组成:正文.初始化数据.未初始化数据.栈.用户区 进程通常由三大部分组成:代码.数据.进程控制块(PCB).代码部分描述了进程所要完成的功能:数据部分包括程序在执行的时候所需要的数据和工作区.进程的代码部分和数据部分是进程存在的物质基础.进程控制块(PCB)包括了进程的描

《机器学习》第三章 决策树学习 笔记加总结

<机器学习>第三章 决策树学习 决策树学习方法搜索一个完整表示的假设空间,从而避免了受限假设空间的不足.决策树学习的归纳偏置是优越选择较小的树. 3.1.简介 决策树学习是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树. 决策树(Decision Tree)是一种简单但是广泛使用的分类器.通过训练数据构建决策树,可以高效的对未知的数据进行分类. 决策数有两大优点: 1)决策树模型可以读性好,具有描述性,有助于人工分析: 2)效率高,决策树只需要一次构建,反复使用,每一

操作系统——第二章 进程管理

二.进程管理 2.1进程与线程 2.1.1进程的基本概念 PID (ProcessID) 2.1.1进程的概念 多道并发执行可能会发生的问题: 不能让程序粗野的执行,我们必须给他们引入一些约束: 进程包括什么: 进程控制块是一种数据结构,在Linux中是一个结构体   (答案就是上面的那张图) 挂起状态 (Linux代码) 2.1.6线程 设计之初进程是独立的,进程间不允许用相同的地址空间,必须得开辟一块新的存储空间,然后来取,线程的设计解决了这种问题. 比如还是播放器问题: 单进程的话,读完了

【学习笔记】 深入理解Linux内核第三版 —— 第三章 进程

何为进程 进程(分享资源 单位)/线程(执行的单位)/轻量级进程(共享部分资源) Linux中线程通过pthead 标准库实现,其中存在实现轻量级进程的方法,方法也可针对线程组执行. 静态:进程如何描述 进程描述符:task_struct数据类型 进程与进程描述符一一对应.进程描述符指针指向进程描述符地址,内核由此来引用进程. PID(process id)可用来标识进程(linux维护pidbitmap-array位图来管理分配PID),同一个线程组的线程使用相同的PID(与第一个线程的值相同

《内核设计与实现》读书笔记(三)- 进程管理

进程是所有操作系统的核心概念,同样在linux上也不例外. 主要内容: 进程和线程 进程的创建 进程的终止 1. 进程和线程 1.1 进程 进程是处于执行期的程序以及相关的资源的总称. 线程是进程中活动的对象.内核调度的对象是线程,而不是进程. 进程和线程的管理操作(比如创建和销毁)都是由内核来实现的. Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线程,线程不过是一种特殊的进程. 所以下面只讨论进程,只有当线程与进程存在不一样的地方时才提一下线程. 进程提供2中虚拟机

第三章文件管理学习笔记

笔记整理起始时间:2018年3月31日16:16:55 本章内容文件系统结构元素创建和查看文佳复制.转移和删除文件使用Nautilus来管理文件软和硬链接 文件系统文件和目录被组织成一个单根倒置树结构文件系统从根木兰路下开始,用"/"表示根文件系统:rootfs,root filesystem文件名称,默认ext4,xfs下区分大小写以.开头的文件为隐藏文件路径分隔的/文件有两类数据元数据:metadata数据:data文件系统分层结构:LSB,Linux Standard BaseF