LINUX 操作系统 第3章 进程管理

合集下载

操作系统实验报告进程管理

操作系统实验报告进程管理

操作系统实验报告进程管理操作系统实验报告:进程管理引言操作系统是计算机系统中的核心软件,负责管理计算机的硬件资源和提供用户与计算机之间的接口。

进程管理是操作系统的重要功能之一,它负责对计算机中运行的各个进程进行管理和调度,以保证系统的高效运行。

本实验报告将介绍进程管理的基本概念、原理和实验结果。

一、进程管理的基本概念1. 进程与线程进程是计算机中正在运行的程序的实例,它拥有独立的内存空间和执行环境。

线程是进程中的一个执行单元,多个线程可以共享同一个进程的资源。

进程和线程是操作系统中最基本的执行单位。

2. 进程状态进程在运行过程中会经历不同的状态,常见的进程状态包括就绪、运行和阻塞。

就绪状态表示进程已经准备好执行,但还没有得到处理器的分配;运行状态表示进程正在执行;阻塞状态表示进程由于某些原因无法继续执行,需要等待某些事件的发生。

3. 进程调度进程调度是操作系统中的一个重要任务,它决定了哪个进程应该获得处理器的使用权。

常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转等。

二、进程管理的原理1. 进程控制块(PCB)PCB是操作系统中用于管理进程的数据结构,它包含了进程的各种属性和状态信息,如进程标识符、程序计数器、寄存器值等。

通过PCB,操作系统可以对进程进行管理和控制。

2. 进程创建与撤销进程的创建是指操作系统根据用户的请求创建一个新的进程。

进程的撤销是指操作系统根据某种条件或用户的请求终止一个正在运行的进程。

进程的创建和撤销是操作系统中的基本操作之一。

3. 进程同步与通信多个进程之间可能需要进行同步和通信,以实现数据共享和协作。

常见的进程同步与通信机制包括互斥锁、信号量和管道等。

三、实验结果与分析在本次实验中,我们使用了一个简单的进程管理模拟程序,模拟了进程的创建、撤销和调度过程。

通过该程序,我们可以观察到不同调度算法对系统性能的影响。

实验结果显示,先来先服务(FCFS)调度算法在一些情况下可能导致长作业等待时间过长,影响系统的响应速度。

U035计算机操作系统教程_第四版_(张尧学著)_清华大学出版社_第3章

U035计算机操作系统教程_第四版_(张尧学著)_清华大学出版社_第3章

3.1.2 进程的定义 进程的概念是60年代初期,首先在MIT 的 Multics系 统和IBM 的 TSS/360系统中引用的。从那以来,人 们对进程下过许多各式各样的定义。 (1) 进程是可以并行执行的计算部分(S.E.Madnick, J.T.Donovan); (2) 进程是一个独立的可以调度的活动(E.Cohen, D.Jofferson); (3) 进程是一抽象实体,当它执行某个任务时,将要 分配和释放各种资源(P.Denning); (4) 行为的规则叫程序,程序在处理机上执行时的活 动称为进程(E.W.Dijkstra);
W(Si)={b1 b2 … bn},bj(j=1,…,n) 是语句Si在执行期间必须对其进行修改、访问的变量; 如果对于语句S1和S2,有 ① R(S1)∩ W(S2)={∮}, ② W(S1)∩ R(S2)={∮}, ③ W(S1)∩ W(S2)={∮} 同时成立,则语句S1和S2是 可以并发执行的。
(1) 进程是一个动态概念,而程序则是一个静态概念。程序是 指令的有序集合,没有任何执行的含义。而进程则强调执 行过程,它动态地被创建,并被调度执行后消亡。 (2) 进程具有并行特征,而程序没有。由进程的定义可知,进 程具有并行特征的两个方面,即独立性和异步性。也就是 说,在不考虑资源共享的情况下,各进程的执行是独立的, 执行速度是异步的。显然,由于程序不反映执行过程,所 以不具有并行特征。 (3) 进程是竞争计算机系统资源的基本单位,从而其并行性受 到系统自己的制约。这里,制约就是对进程独立性和异步 性的限制。 (4) 不同的进程可以包含同一程序,只要该程序所对应的数据 集不同。
第3章 进程管理
3.1 进程的概念 3.2 进程的描述 3.3 进程状态及其转换 3.4 进程控制 3.5 进程互斥 3.6 进程同步 3.7 进程通信 3.8 死锁问题 3.9 线程 本章小结 习题

linux进程管理的实验报告

linux进程管理的实验报告

实验报告:Linux进程管理1. 引言本实验报告将详细介绍Linux系统中进程管理的相关知识和操作。

进程管理是操作系统中的一个重要组成部分,它负责控制和调度系统中运行的各个进程,确保系统资源的合理分配和进程的正常运行。

在本实验中,我们将通过一系列步骤来了解Linux系统中进程的创建、监控和控制。

2. 实验环境为了完成本实验,我们需要在一台运行Linux操作系统的计算机上进行操作。

本实验报告基于Ubuntu 20.04 LTS操作系统进行撰写,但是适用于大多数Linux 发行版。

3. 实验步骤步骤一:创建新进程在Linux系统中,可以通过fork()系统调用来创建新的进程。

以下是一个简单的示例代码:#include <stdio.h>#include <unistd.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程逻辑printf("这是子进程\n");} else if (pid > 0) {// 父进程逻辑printf("这是父进程\n");} else {// 进程创建失败printf("进程创建失败\n");}return0;}步骤二:查看进程信息Linux系统提供了多种命令来查看系统中运行的进程信息。

以下是一些常用的命令:•ps:显示当前终端下的进程列表。

•top:实时显示进程的CPU、内存等资源占用情况。

•pstree:以树状结构显示进程的层次关系。

步骤三:杀死进程有时候我们需要终止一个运行中的进程,可以使用kill命令来发送终止信号给目标进程。

以下是一个示例:kill <PID>请将<PID>替换为目标进程的进程ID。

步骤四:进程优先级调整通过调整进程的优先级,可以影响进程在系统中的调度顺序。

在Linux系统中,可以使用nice命令来调整进程的优先级。

操作系统的进程管理机制

操作系统的进程管理机制

操作系统的进程管理机制
操作系统的进程管理机制是指操作系统对进程的创建、调度、同步、通信和终
止等各种操作的管理方式。

进程是程序的执行实例,每个进程都有自己的地址空间、数据和代码段,以及执行时的状态信息。

首先,操作系统的进程管理机制包括进程的创建。

当用户启动程序时,操作系
统会创建一个新的进程来执行这个程序。

进程的创建包括为进程分配资源、初始化进程控制块等步骤。

其次,操作系统的进程管理机制涉及进程的调度。

进程调度是指操作系统根据
一定的策略从就绪队列中选择一个进程来执行。

常见的调度算法包括先来先服务、短作业优先、优先级调度、时间片轮转等。

此外,操作系统的进程管理机制还包括进程的同步与互斥。

在多进程环境下,
进程之间需要进行同步和互斥操作,以确保数据的一致性和正确性。

常用的同步机制有信号量、互斥锁、条件变量等。

进程的通信也是操作系统的进程管理机制的重要部分。

进程之间需要进行信息
交换和共享数据,常用的通信方式包括管道、消息队列、共享内存和信号量等。

通过这些通信方式,进程可以实现协作工作和数据传输。

最后,操作系统的进程管理机制也包括进程的终止。

当进程完成任务或发生错
误时,操作系统会终止该进程,并释放其占用的资源。

进程终止时,操作系统会清理进程控制块、关闭文件描述符和释放内存等。

总的来说,操作系统的进程管理机制是确保多个进程能够有序地执行、协作工
作和共享资源的重要手段。

通过合理的进程管理机制,操作系统可以提高系统的性能和可靠性,提升用户体验。

第3章-进程管理与调度详解

第3章-进程管理与调度详解
操作系统讲义
孙清
房地产E网 西安财经学院
LOGO
Contents
课程内容安排
第一章 第二章 第三章 第四章 第五章 第六章 第七章
操作系统概述 系统启动及用户界面 进程管理与调度 进程同步 存储器管理 文件管理 设备管理
房地产E网 西安财经学院
管态(核心态):系统态 目态:用户态
状态之间的转换
• 目态→管态:唯一途径是中断 • 管态→目态:设置程序状态字PSW
房地产E网 西安财经学院
LOGO
进程控制块(PCB)
PCB:用于存放管理进程运行的必要信息。 PCB处于核心段,用户不能直接访问和修改PCB。 OS把所有PCB组织在一起,放在固定的内存区域, 构成PCB表。
房地产E网 西安财经学院
LOGO
进程的状态迁移
房地产E网 西安财经学院
LOGO
3.2 进程的控制
进程的控制使用原语实现。
原语(primitive)是在管态下运行,执行期间不 允许被中断。
原语的实现方法是以系统调用方式提供原语接口, 采用中断屏蔽方式来实现原语功能。
进程的控制原语包括:
创建、撤销、阻塞、唤醒、挂起、激活。
房地产E网 西安财经学院
LOGO
1、进程的创建
父进程创建子进程时,系统从空PCB池中取一个 空PCB,并在进程表中增加一项; 为新进程分配地址空间,传递环境变量,构造共 享地址空间; 查找辅存,将新进程正文装到内存;
LOGO
4、进程的唤醒 当进程所等待的事件发生,由系统进程或 事件发生进程调用唤醒原语。
将被唤醒的进程置为就绪态,并将其PCB 加入相关的就绪队列。
房地产E网 西安财经学院

操作系统-进程管理

操作系统-进程管理

02
最短作业优先(SJF):优先调度预计运行时 间最短的进程。
03
最短剩余时间优先(SRTF):优先调度剩余 时间最短的进程。
04
优先级调度:根据进程的优先级进行调度。
死锁的产生与预防
死锁的产生
死锁是指两个或多个进程在无限期地等待对方释放资源的现象。产生死锁的原因包括资源分配不当、 请求和保持、环路等待等。
操作系统-进程管理
• 进程管理概述 • 进程的同步与通信 • 进程调度与死锁 • 进程的并发控制 • 进程管理的发ห้องสมุดไป่ตู้趋势与挑战
01
进程管理概述
进程的定义与特点
01
进程是程序的一次执行,具有动态性、并发性、独立性和制 约性。
02
进程拥有独立的内存空间,执行过程中不受其他进程干扰。
03
进程是系统资源分配和调度的基本单位,能够充分利用系统 资源进行高效计算。
进程同步的机制
进程同步的机制主要包括信号量机制、消息传递机制和共享内存机制等。这些 机制通过不同的方式协调进程的执行顺序,以实现进程间的有效协作。
信号量机制
信号量的概念
信号量是一个整数值,用于表示系统资源或临界资源的数量 。信号量可以用来控制对共享资源的访问,以避免多个进程 同时访问导致的数据不一致问题。
消息传递的机制
消息传递的机制包括发送和接收操作。发送操作将消息发送给目标进程,接收操 作从消息队列中获取消息并进行处理。通过这种方式,多个进程可以通过发送和 接收消息来协调执行顺序和交换数据。
共享内存机制
共享内存的概念
共享内存是一种实现进程间通信的有效方式,通过共享一段内存空间来实现不同进程之间的数据交换和共享。
预防死锁的方法

操作系统进程管理

第三章 进程管理
Process Management
处理机管理是操作系统的基本管理功能之一,它所关心的是处理机的 分配问题。也就是说把CPU(中央处理机)的使用权分给某个程序。
通常把正准备进入内存的程序称为作业,当这个作业进入内 存后我们把它称为进程。处理机管理分为作业管理和进程管 理两个阶段去实现处理机的分配,常常又把直接实行处理机 时间分配的进程调度工作作为处理机管理的主要内容。
3、系统进程在管态下活动,而用户进程则在用户态 (目态)下活动。
另一种分类:计算进程,I/O进程等 注意:在UNIX系统中没有这样对进程进行分类。
动。 (4)在进程调度中,系统进程的优先级高于用
户进程。
2.5 进程的类型与区别
系统进程与用户进程的区别:
1、系统进程被分配一个初始的资源集合,这些资源 可以为它独占,也能以最高优先权的资格使用。用 户进程通过系统服务请求的手段竞争使用系统资源;
2、用户进程不能直接做I/O操作,而系统进程可以 做显示的、直接的I/O操作。
2.3进程的特征
5)结构特征:为能正确的执行并发,为每一个进程配置
了一个数据结构,称为进程控制块(PCB)。则一个进 程实体就由数据段、程序段、PCB三部分构成。
• 进程实体 = 数据段+程序段+PCB
PCB
私有 数据块
程 序 段
进程的结构
• 程序和进程不一定具有一一对应的关系。
2.4 与程序的区别
2、进程是一个独立的运行单位,能与其它进程并行(并 发)活动。而程序则不是。
3、进程是竞争计算机系统有限资源的基本单位,也是进 行处理机调度的基本单位。
4、一个程序可以作为多个进程的运行程序,一个进程也 可以运行多个程序。

linux的进程管理实验总结

linux的进程管理实验总结Linux的进程管理实验总结1. 引言Linux中的进程管理是操作系统的核心功能之一,在实际的系统运行中起着重要的作用。

进程管理能够有效地分配系统资源、管理进程的运行状态和优先级,以及监控进程的行为。

本文将以Linux的进程管理实验为主题,分步骤介绍实验过程及总结。

2. 实验目的本次实验的目的是理解Linux中进程的概念,掌握进程的创建、运行和终止的基本操作,以及进程的状态转换过程。

3. 实验环境本次实验使用的是Linux操作系统,可以选择使用虚拟机安装Linux或者使用Linux主机进行实验。

4. 实验步骤4.1 进程的创建在Linux中,可以使用系统调用fork()来创建一个新的子进程。

在实验中,可以编写一个简单的C程序来调用fork()系统调用,实现进程的创建。

具体步骤如下:(1)创建一个新的C程序文件,例如"process_create.c"。

(2)在C程序文件中,包含必要的头文件,如<stdio.h>和<unistd.h>。

(3)在C程序文件中,编写main()函数,调用fork()函数进行进程的创建。

(4)编译并运行该C程序文件,观察控制台输出结果。

实验中,可以通过观察控制台输出结果,判断新的子进程是否被成功创建。

4.2 进程的运行在Linux中,通过调用系统调用exec()可以用一个新的程序替换当前进程的执行。

可以使用exec()函数来实现进程的运行。

具体步骤如下:(1)创建一个新的C程序文件,例如"process_run.c"。

(2)在C程序文件中,包含必要的头文件和函数声明,如<stdio.h>和<unistd.h>。

(3)在C程序文件中,编写main()函数,调用execl()函数来执行一个可执行程序。

(4)编译并运行该C程序文件,观察控制台输出结果。

实验中,可以通过观察控制台输出结果,判断新的程序是否被成功执行。

操作系统实验报告----进程管理

实验内容:进程管理一、实验目的1、掌握Linux中进程的创建方法及执行情况;2、加深对进程、进程树等概念的理解;3、掌握Linux中如何加载子进程自己的程序;4、掌握父进程通过创建子进程完成某项任务的方法;5.、掌握系统调用exit()和_exit()调用的使用。

6、分析进程竞争资源的现象,学习解决进程互斥的方法;进一步认识并发执行的实质二、实验内容(一)进程的创建1、编写一段程序,使用系统调用fork( )创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符。

#include<stdio.h>main(){int p,x;p=fork();if(p>0){x=fork();if(x>0)printf("father\n");elseprintf("child2");}elseprintf("child1");}输出结果:child1child2father2、运行以下程序,分析程序执行过程中产生的进程情况。

#include <stdio.h>main(){int p,x;p=fork();if (p>0)fork();else{fork();fork();}sleep(15);}实验步骤:编译连接gcc –o forktree forktree.c后台运行./forktree &使用pstree –h 查看进程树运行结果:├─gnom e-terminal─┬─bash─┬─forktree─┬─forktree─┬─forkt ree───forktree││││└─forktree│││└─forktree││└─pstree 分析:程序运行,系统首先创建一个进程forktree,执行到p=fork()创建一个子进程forktree,子进程获得处理机优先执行,父进程等待;执行else,当执行到第一个fork()函数时,子进程创建了一个进程forktree,称之为孙进程,孙进程获得处理机往下执行,子进程等待;执行到第二个fork()函数时,孙进程又创建一个进程forktree,称之为重孙进程,重孙进程很快执行完,将处理机还给孙进程,孙进程很快执行完,将处理机还给子进程;子进程继续往下执行,执行到第二个fork()函数,又创建一个进程forktree,称之为第二孙进程,并获得处理机执行,此进程很快执行完,将处理机还给子进程,子进程也很快执行完,将处理机还给父进程,父进程P>0执行if语句,运行fork()函数,又创建一个进程forktree,称之为第二子进程,此进程获得处理机执行很快运行完,将处理机还给父进程,父进程运行sleep(15)语句,休眠15秒,用pstree命令查询进程树。

精品文档-计算机操作系统教程(第二版)(徐甲同)-第3章


第3章 进程管理 图 3.1 程序的顺序执行
第3章 进程管理
显然,程序的顺序执行具有如下特性: (1) 当顺序程序在处理机上执行时,处理机严格地顺序执行 程序规定的动作。每个动作都必须在前一动作结束后才能开始。 除了人为的干预造成机器暂时停顿外,前一动作的结束就意味着 后一动作的开始。程序和机器执行程序的活动严格一一对应。 (2) 一个程序在机器中执行时,它独占全机资源,除了初始 状态外,只有程序本身规定的动作才能改变这些资源的状态。
第3章 进程管理
2. 程序和机器执行程序的活动不再一一对应 程序和机器执行程序的活动是两个概念。程序是指令的有序 集合,是静态的概念;而机器执行程序的活动是指指令序列在处 理机上的执行过程,或处理机按照程序执行指令序列的过程。通 常把机器执行程序的活动称为“计算”。显然,“计算”是一个 动态的概念。
程序和数据集合两部分是进程存在的物质基础,即进程的实 体。
第3章 进程管理
进程控制块(或任务控制块)包含了进程的描述信息和控制信 息,是进程的动态特性的集中反映。不同的操作系统其进程控制 块的内容及信息量也不同。在小型机、微型机等比较简单的操作 系统中,PCB只占用十几个单元;而在一些大、中型机的操作系 统中,PCB的内容可能占用几十甚至上百个单元。
第3章 进程管理
直接制约关系通常是在彼此之间有逻辑关系的两个并发执行 的程序之间发生的。例如,一个正在执行的程序段需要另一程序 段的计算结果,只有当另一程序段在某一时刻送来计算结果时, 正在执行的程序段才能继续执行下去。否则它就一直等待,无法 执行。两个并发程序段以间接方式发生制约关系是由竞争使用同 一资源引起的。得到资源的程序段可以继续执行,得不到资源的 程序段就只好暂停等待。
第3章 进程管理
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define #define #define #define #define #define #define #define …… PF_ALIGNWARN PF_STARTING PF_EXITING PF_FORKNOEXEC PF_SUPERPRIV PF_DUMPCORE PF_SIFNALED PF_MEMALLOC //仅486使用 //正在创建中 //正在shut down //创建但未执行 //使用超级用户权限 //dump核心 //被信号杀死 //正在分配内存
9

在x86系统上,通过current_thread_info( ) 函数完成。汇编代码如下:
static inline struct thread_info *current_thread_info(void)
{
struct thread_info *ti; _ _asm_ _("andl %%esp, %0; " :"=r" (ti) : "0" (~(THREAD_SIZE - 1))); return ti;
11
进程状态

系统中的每个进程都必然处于五种进程状 态之一。其具体定义见sched.h。
#define TASK_RUNNING #define TASK_INTERRUPTIBLE 0 1
#define TASK_UNINTERRUPTIBLE
#define TASK_STOPPED #define TASK_TRACED
struct task_struct *task; for_each_process(task) { /*打印每个任务的名称和PID*/ printk(“%s[%d]\n”,task->comm, task->pid); } printk函数见教材第12页。
24
3.2 进程创建

Linux将进程的创建与目标程序的执行分成 两步:
15
3.1.4 设置当前进程状态


使用set_task_state(task, state)函数(在 sched.h中定义) set_task_state(task, state); /* 将任务task的状态设置为state*/ 方法set_current_state(state)与 set_task_state(current, state)作用相同。
4
3.1 进程描述符及任务结构



内核把进程放在一个双向循环链表(叫做 任务队列)中。见17页图3-1。 链表中的每一项都是类型为task_struct、 称为进程描述符的结构。 task_struct中包含了一个具体进程的所有 信息,它在include/linux/sched.h中定义。
5
3.1.1 分配进程描述符
29
写时拷贝


写时拷贝技术使地址空间上的页的拷贝被 推迟到实际发生写入的时候,在页根本不 会被写入的情况下(如fork( )后立即调用 exec( )),它们就无需复制了。 一般情况下,进程创建后都会马上运行一 个可执行的文件,这种优化可以避免拷贝 大量根本就不会被使用的数据。

第一步:从已经存在的“父进程”复制出一
个“子进程”。复制出来的子进程有自己的 task_struct和系统空间堆栈,但与父进程共享 其它所有的资源。 Linux为此提供了两个系统调用:fork( )和 clone( )。 第二步:目标程序的执行。 Linux为此提供了 一个系统调用:execve( )。



在内核中,访问进程通常需要获得指向其 task_struct的指针。 通过current宏查找到当前正在运行进程的 进程描述符。 硬件体系结构不同,current宏的实现也不 同。对x86体系结构,在内核栈的尾端创建 thread_info结构,通过计算偏移间接地查 找task_struct结构。


Linux通过slab分配器分配task_struct结构。 由于使用slab分配器动态生成task_struct, 故只需在栈底创建一个新的结构 thread_info,这个结构能使在汇编代码中 计算其偏移量变得相当容易。
6
thread_info结构

在/include/asm/thread_info.h中定义
26
vfork( )


vfork( )是后来增设的一个系统调用。 与fork( )相比,vfork( )也不带参数,但是 除task_struct和系统空间堆栈以外的资源 全都通过数据结构指针的复制“遗传”, 所以vfork( )出来的是线程而不是进程。
27
创建子进程后父进程的选择

创建子进程后,父进程可以有三种选择: 父进程不受影响,继续执行,也称“异步”方式。 父进程停下来,等待子进程完成后,父进程再继 续执行,也称“同步”方式。用系统调用wait3( ) 和 wait4( )实现。 wait3( )是等待任何一个子进程 完成; wait4( )等待特定的子进程完成。 父进程创建了子进程后,马上结束自己。用系统 调用exit( )实现。其实是第一种选择的特例。
3.1.2 进程描述符的存放

内核通过PID(其值是唯一的)来标识每个 进程。PID是pid_t类型的,实际上是int型。 PID在task_struct结构中定义,如下: pid_t pid;

为了与老版本的Linux兼容,PID的最大值 默认设置为32768。
8
访问进程——获取task_struct指针
25

fork( )与clone( )的区别



fork( )是全部复制,父进程所有的资源全 都通过数据结构的复制“遗传”给子进程。 clone( )则可以将资源有选择地复制给子进 程,而没有复制的数据结构则通过指针的 复制让子进程共享。在极端的情况下,一 个进程可以clone( )出一个线程。 fork( )是无参数的, clone( )是带有参数的。
注:缺了其中任何一条就不成其为“进程”。如果只具备了前面3 条而缺第4条,那就称为“线程”。特别地,如果完全没有用户空 间,就称为“内核线程”,而如果共享用户空间则就称为“用户 线程”。
3
task与process
Linux系统中的“进程” (process) 和“任 务” (task)是同一个意思,在内核代码中 也常混用这两个名词。
22
依次访问整个任务队列

通过在include/linux/sched.h中定义的一个 宏来实现,如下:
#define for_each_process(p) \ for (p = &init_task ; \ (p = next_task(p)) != &init_task ; )
23
for_each_process( ) 应用举例
18
获取当前进程的父进程的进程描述符

ቤተ መጻሕፍቲ ባይዱ
代码如下:
struct task_struct *my_parent = current->parent;
19
依次访问当前进程的子进程
struct task_struct *task; struct list_head *list; list_for_each (list, &current->children) { task=list_entry(list, struct task_struct, sibling); } 其中,list_for_each函数在include/linux/list.h中定义, 代码如下: #define list_for_each(pos, head) \ for (pos = (head)->next, prefetch(pos->next); \ pos != (head); \ pos = pos->next, prefetch(pos->next)) 20
16
3.1.5 进程家族树


Linux系统中的所有进程构成一棵进程家族 树,所有进程都是PID为1的init进程的后 代。 系统中的每个进程必有一个父进程,每个 进程也可以拥有零个或多个子进程。拥有 同一个父进程的所有进程被称为兄弟。
17
进程家族树

进程间的关系存放在进程描述符中,每个 task_struct都包含一个指向其父进程的 parent指针,和一个叫做children的子进程 链表。其定义如下:
}
10
3.1.3 进程状态

task_struct结构中的state域描述了进程的 当前状态。
struct task_struct { volatile long state; struct thread_info *thread_info; atomic_t usage; unsigned long flags; unsigned long ptrace; …… };
struct thread_info { 指向该任务实 struct task_struct *task; 际的task_struct struct exec_domain *exec_domain; 的指针。 unsigned long flags; unsigned long status; _ _u32 cpu; _ _s32 preempt_count; mm_segment_t addr_limit; struct restart_block restart_block; unsigned long previous_esp; _ _u8 supervisor_stack[0]; 7 };
#define next_task(p) \ list_entry((p)->tasks.next, struct task_struct, tasks) #define prev_task(p) \ list_entry((p)->tasks.prev, struct task_struct, tasks)
相关文档
最新文档