Linux进程管理

合集下载

Linux命令行的进程管理与问题解决办法

Linux命令行的进程管理与问题解决办法

Linux命令行的进程管理与问题解决办法一、进程的基本概念进程是 Linux 系统中正在运行的程序的实例。

每个进程都有自己的进程标识符(PID)、内存空间、系统资源等。

了解进程的状态对于有效的进程管理至关重要。

进程通常有以下几种状态:1、运行态(Running):进程正在 CPU 上执行。

2、就绪态(Ready):进程已准备好运行,等待CPU 分配时间片。

3、阻塞态(Blocked):进程由于等待某些资源(如I/O 操作完成)而暂时无法运行。

二、查看进程的命令1、`ps` 命令`ps` 命令是最常用的查看进程的命令之一。

它可以提供关于进程的各种信息,如 PID、CPU 使用率、内存使用情况等。

例如,使用`ps aux` 命令可以显示系统中所有进程的详细信息,包括用户、CPU 使用率、内存使用等。

2、`top` 命令`top` 命令提供了一个动态的、实时的进程查看界面。

它不仅显示进程的信息,还能按照 CPU 使用率、内存使用率等进行排序。

在`top` 界面中,可以通过按键来进行交互操作,例如按`P` 键按照 CPU 使用率排序,按`M` 键按照内存使用率排序。

三、进程的控制命令1、`kill` 命令当需要终止一个进程时,可以使用`kill` 命令。

通过指定进程的PID,向进程发送指定的信号来终止它。

例如,`kill 1234` 会向 PID 为 1234 的进程发送默认的终止信号(SIGTERM)。

如果进程没有响应,可以使用`kill -9 1234` 发送强制终止信号(SIGKILL),但这种方式可能会导致数据丢失或其他不可预期的后果,应谨慎使用。

2、`killall` 命令如果需要根据进程的名称来终止多个相关进程,可以使用`killall` 命令。

例如,`killall firefox` 会终止所有名为`firefox` 的进程。

四、进程的优先级调整1、`nice` 命令在启动进程时,可以使用`nice` 命令来设置进程的优先级。

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命令来调整进程的优先级。

linux进程管理实验心得

linux进程管理实验心得

linux进程管理实验心得在操作系统课程中,我们进行了一系列关于Linux进程管理的实验。

通过这些实验,我对Linux进程管理有了更深入的理解,并且学到了很多有关进程管理的知识和技巧。

在这篇文章中,我将分享我的实验心得和体会。

首先,我学会了如何创建和终止进程。

在实验中,我们使用了fork()函数来创建子进程,并使用exec()函数来加载新的程序。

这样,我们可以在一个进程中创建多个子进程,并且每个子进程可以执行不同的任务。

而通过调用exit()函数,我们可以终止一个进程的执行。

这些操作让我更加清楚地了解了进程的创建和终止过程。

其次,我学会了如何管理进程的优先级。

在Linux中,每个进程都有一个优先级,用于决定进程在CPU上执行的顺序。

通过使用nice命令,我们可以为进程设置不同的优先级。

较高的优先级意味着进程将更频繁地获得CPU时间片,从而提高了进程的执行效率。

这对于提高系统的整体性能非常重要。

此外,我还学会了如何监控和调试进程。

在实验中,我们使用了ps命令来查看当前系统中正在运行的进程。

通过查看进程的状态和资源使用情况,我们可以了解到系统的运行状况。

而使用top命令,则可以实时地监控进程的运行情况。

此外,我们还学会了使用gdb调试器来调试进程。

通过设置断点和观察变量的值,我们可以找到程序中的错误并进行修复。

最后,我认识到进程管理是操作系统中非常重要的一部分。

一个好的进程管理系统可以提高系统的性能和稳定性。

通过合理地管理进程的创建、终止和调度,可以使系统更加高效地利用资源,并且能够更好地响应用户的需求。

因此,学习和掌握进程管理技术对于成为一名优秀的系统管理员或开发人员来说是非常重要的。

通过这些实验,我不仅学到了很多关于Linux进程管理的知识,还提高了自己的实践能力和问题解决能力。

在实验过程中,我遇到了各种各样的问题,但通过查阅资料、与同学讨论和不断尝试,我最终成功地解决了这些问题。

这让我更加自信地面对未来的挑战。

Linux进程管理-实验报告

Linux进程管理-实验报告

《Linux 操作系统设计实践》实验一:进程管理实验目的:(1) 加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质.(3) 学习通过进程执行新的目标程序的方法。

(4) 了解Linux 系统中进程信号处理的基本原理.实验环境:Red Hat Linux实验内容:(1)进程的创建编写一段程序,使用系统调用fork()创建两个子进程,当此进程运行时,在系统中有一个父进程和两个子进程活动,让每一个进程在屏幕上显示一个字符,父进程显示字符“a";子进程分别显示字符“b”和字符“c”,试观察记录屏幕上的显示结果,并分析原因.程序代码:#include<stdio。

h〉int main(){int p1 ,p2 ;while((p1=fork())==-1);if(p1==0)putchar(’b');else{while((p2=fork())==—1);if(p2==0)putchar(’c');elseputchar(’a');}return 0;}运行结果:bca分析:第一个while里调用fork()函数一次,返回两次。

子进程P1得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来父进程和子进程P1两个分支运行,判断P1==0,子进程P1符合条件,输出“b”;接下来else里面的while里再调用fork()函数一次,子进程P2得到的返回值是0,父进程得到的返回值是新子进程的进程ID(正整数);接下来判断P2==0,子进程P2符合条件,输出“c”,接下来父进程输出“a”,程序结束。

(2)进程的控制①修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。

程序代码:#include〈stdio。

h>int main(){int p1,p2;while((p1=fork())==-1);if(p1==0)printf("Child1 is running!\n”);else{while((p2=fork())==—1);if(p2==0)printf(”Child2 is running!\n”);elseprintf(”Fath er is running!\n”);}return 0;}运行结果:Child1 is running!Child2 is running!Father is running!分析:本实验和上一个实验一样,只是将每个进程输出一个字符改为每个进程输出一句话.第一个while里调用fork()函数一次,返回两次。

Linux后台进程管理的一些命令小结

Linux后台进程管理的一些命令小结

如 果 后 台 的 任 务 号 有 2个 , 【 1 】 , 终 止 进 程 ,进 程 不 能 监 听 这 个 信 【 2 】 ; 如 果 当 第 一个 后 台 任 务 顺 利 执 号 。 进 程 的挂 起
( 1 ) 后 台进 程 的挂 起 :
s t O p p e d ,T e r mi n a t e d ,但 是 如 果 任 务 行 完 毕 , 第二个后 台任 务还在执行
查 看 当 前 有 多 少 在 后 台运 行 的 受 命 令 。 命令 。 j o b 。一 1 选 项 可 显 示 所 有 任 务 的 P I D, j o b s的 状 态 可 以 是 r u n n i n g , 当前 任 务
持 。 如果 进 程 还 没 有 终 止 ,可 以使 用k i l l— S I G K I L L p i d, 这 是 由 内 核 来
如 何 应 对 路 由器 密 码 被 人 修 改
如 果 路 由 器 密 码 被 修 改 或 者 丢 果 之 前 没 有 针 对 参 数 配 置 文 件 进 行 会 写有 类 似 r e s e t 的 字样 ,这 就 是 复 失 ,我 们 该 进 行 怎 样 的 设 置 呢 ?相 保 存 的话 ,要 想 在 保 存 当前 设 置 参 位 键 。找 一 根 针 装 物 ( 普通 的 圆珠 笔 信 看 过 此 文 你 对 于 处 理 密 码 问 题 就 数 的 前 提 下 恢 复 密 码 是 不 太 可 能 会游刃有余 。 的 。要 想 能 够 再 次 登 录 到 无 线 路 由 也 可 以) 直 接插到该孔 中 , 并 按 住 坚 持 3 0秒 到 1分 钟 后松 开 。 第 三 步 :完 成 上 面 的 操 作 后 我
被终 止 了( k i l 1 ) , s h e n从 当 前 的 s h e l l 中时 , 当 前 任 务 便 会 自动 变 成 后 台

linux的进程管理实验总结

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程序文件,观察控制台输出结果。

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

Linux终端管理如何查找和杀死进程

Linux终端管理如何查找和杀死进程进程管理是Linux操作系统中一项重要的任务之一,在终端中查找和杀死进程是每个系统管理员和开发人员需要了解和掌握的技能。

本文将介绍Linux终端中如何查找和杀死进程的方法及相关命令。

一、查找进程查找进程是指在Linux系统中获取正在运行的进程的信息,以便进行后续操作。

有以下几种常见的查找进程的方法:1. ps命令ps命令是Linux中最常用的查看进程信息的命令,通过ps命令可以查看正在运行的进程以及其相关信息。

在终端中输入以下命令可以列出当前运行的所有进程:```ps aux```该命令将显示出进程的PID(进程ID)、运行状态、CPU使用率、内存使用率等信息。

2. top命令top命令是一个动态显示系统进程信息的实用工具。

在终端中输入以下命令可以查看系统当前的进程活动情况,并按照CPU使用率进行排序:top```该命令将动态地显示出进程的PID、进程名、CPU使用率、内存使用率等信息,并持续更新。

3. pstree命令pstree命令是一个以树状图形式显示进程之间关系的工具。

在终端中输入以下命令可以查看系统中所有进程以及其子进程之间的关系:```pstree```该命令将以树形结构展示进程之间的关系,方便进行进程的查找和理解。

二、杀死进程杀死进程是指将正在运行的进程彻底停止,以释放系统资源或解决异常问题。

有以下几种常见的杀死进程的方法:1. kill命令kill命令是Linux中最常用的杀死进程的命令,可以使用进程的PID (进程ID)来指定要杀死的进程。

在终端中输入以下命令可以杀死指定PID的进程:kill PID```其中PID为进程的PID,可以通过前述的ps命令或top命令查找到。

2. pkill命令pkill命令可以根据进程名来杀死进程,而不需要手动输入PID。

在终端中输入以下命令可以杀死指定进程名的进程:```pkill 进程名```其中进程名为要杀死的进程的名称。

linux核心函数

linux核心函数Linux 内核是操作系统的核心部分,它提供了操作系统的核心功能,包括进程管理、内存管理、文件系统等。

Linux 内核的源代码中包含了大量的函数,用于实现各种操作系统的功能。

以下是一些Linux 内核中常见的核心函数,它们扮演着关键的角色:1.进程管理函数:–fork():创建一个新的进程。

–exec():在当前进程中执行一个新的程序。

–wait():等待子进程结束。

–exit():终止当前进程。

2.调度和任务管理函数:–schedule():进行进程调度。

–yield():主动让出CPU,将当前进程移动到就绪队列的末尾。

–wake_up_process():唤醒一个等待中的进程。

3.内存管理函数:–kmalloc():在内核中分配内存。

–kfree():释放内核中的内存。

–vmalloc():在虚拟地址空间中分配内存。

4.文件系统函数:–open():打开一个文件。

–read():从文件中读取数据。

–write():向文件中写入数据。

–close():关闭文件。

5.设备驱动函数:–register_chrdev():注册字符设备。

–unregister_chrdev():注销字符设备。

–request_irq():注册中断处理函数。

6.网络函数:–socket():创建套接字。

–bind():将套接字与地址绑定。

–listen():侦听传入连接请求。

–accept():接受传入的连接请求。

7.定时器和时钟函数:–timer_create():创建一个定时器。

–timer_settime():设置定时器的时间。

–gettimeofday():获取当前时间。

8.同步和互斥函数:–spin_lock():获取自旋锁。

–spin_unlock():释放自旋锁。

–mutex_lock():获取互斥锁。

–mutex_unlock():释放互斥锁。

这些函数仅仅是Linux 内核中众多函数的一小部分,Linux 内核的源代码非常庞大而复杂,包含了各种各样的功能和模块。

Linux命令行使用技巧如何查看和管理系统进程优先级

Linux命令行使用技巧如何查看和管理系统进程优先级在Linux操作系统中,进程优先级是指操作系统对运行中的进程进行调度和分配资源的重要参数之一。

通过合理地设置进程优先级,能够有效地提高系统的性能和稳定性。

本文将介绍一些Linux命令行使用技巧,帮助你查看和管理系统进程优先级。

一、查看系统进程1. top命令:top命令是Linux下常用的查看系统进程的命令。

通过top命令,你可以实时地查看各个进程的运行情况、进程ID、CPU使用率等信息。

2. ps命令:ps命令也是查看系统进程的常用命令。

通过ps命令,你可以查看当前用户的进程情况、各个进程的状态、进程ID等信息。

二、了解进程优先级在Linux系统中,进程的优先级用一个范围为-20到19的数值表示,其中-20表示最高优先级,19表示最低优先级。

默认情况下,普通用户创建的进程的优先级为0,系统进程的优先级通常较高。

三、修改进程优先级1. renice命令:renice命令用于修改已经运行的进程的优先级。

通过renice命令,你可以提高或降低进程的优先级。

假设你想将进程ID为12345的进程的优先级提高到10,你可以使用以下命令:```renice 10 12345```2. nice命令:nice命令用于在启动进程时指定进程的优先级。

通过nice命令,你可以创建一个具有较高或较低优先级的进程。

假设你想在运行一个新的进程时将其优先级设置为5,你可以使用以下命令:```nice -n 5 command```其中,command表示你要运行的命令或程序。

四、管理系统进程优先级1. taskset命令:taskset命令用于将进程绑定到指定的CPU或CPU 集。

通过taskset命令,你可以管理进程的调度情况。

假设你想将进程ID为12345的进程绑定到CPU 0上,你可以使用以下命令:```taskset -p 0x1 12345```2. chrt命令:chrt命令用于修改进程的调度策略和优先级。

Linux系统进程优先级管理Shell脚本

Linux系统进程优先级管理Shell脚本Linux操作系统是一个开源的、稳定可靠的操作系统,拥有良好的多任务处理能力。

为了实现高效的任务调度和资源管理,Linux系统提供了进程优先级的概念。

通过合理的进程优先级管理,可以使系统在运行多个任务时更好地满足用户的需求。

本文将介绍一种基于Shell脚本的Linux系统进程优先级管理方法。

一、进程优先级简介进程优先级是指操作系统对不同进程分配的优先级或重要程度的不同程度。

优先级的高低直接影响进程的调度顺序,决定了哪些进程能够更快地获得系统资源和执行时间。

Linux系统中,进程的优先级范围是-20~19,数值越小表示优先级越高。

二、Shell脚本实现进程优先级管理为了实现对进程优先级的管理,我们可以通过编写Shell脚本来控制。

下面是一个简单的示例:```#!/bin/bashpid=$1priority=$2if [[ -z $pid || -z $priority ]]; thenecho "请输入进程ID和优先级!"exit 1fi# 检查进程是否存在ps -p $pid >/dev/null 2>&1if [[ $? -ne 0 ]]; thenecho "进程不存在!"exit 1fi# 设置进程优先级chrt -p $priority $pidif [[ $? -ne 0 ]]; thenecho "设置优先级失败!"exit 1fiecho "设置进程优先级成功!"```以上脚本首先接收两个参数,分别是进程ID和优先级。

然后,脚本会检查参数是否为空,如果为空则提示用户输入。

接着,脚本会通过`ps`命令检查进程是否存在,如果不存在则提示用户进程不存在。

最后,使用`chrt`命令设置进程的优先级。

三、使用示例将上述脚本保存为`set_priority.sh`,并给予执行权限。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

八. Linux 的进程管理(一)Linux 的进程结构// 在文件 include/linux/task.h 中#define NR_TASKS 512//在文件 /kernal/ seched.c中struct task_struct *task [ NR_TASKS ]= { &init_task };//在文件 /include/linux / seched.h 中struct task_struct { … } //Linux的PCB内容Linux的PCB: struct task_struct { …} 结构[ 见补充材料 p13](1) 进程状态(2) 进程调度信息(3) 进程标识(4) 内部通信信息(5) 进程链接指针(6) 时间和定时器信息(7) 文件系统信息(8) 虚拟内存信息(9) 进程上下文1.Linux进程状态 long state;2.进程调度信息:进程普通进程——优先级调度实时进程——先来先服务调度FCFS时间片轮转调度 RR(1) long counter ; 进程剩余时间片(2) long priority; 优先级(同时还表示进程时间片)当counter=0时,priority =〉counter(3) unsigned long policy;SCHED_ OTHER 普通进程调度策略 SCHED_ FIFO 实时进程SCHED_ RR 实时进程(4)unsigned long rt_priority;实时优先级(调度程序求权重时用到它)3.标识号(1) int pid ; //进程标识号(2) unsigned short uid,euid,suid,fsuid;//用户标识,有效标识,备份标识,文件系统标识(3) unsigned short gid,egid,sgid,fsgid;//用户组标识,有效组标识,备份组标识,文件系统用户组标识4. 内部通信信息(IPC —— Inter Process Communication)为使在同一任务上协调工作,进程间必须作通信即:交流数据信号Linux 支持通信机制管道共享内存信号量消息队列(1) long signal; //进程接收到的信号(共有32 种类型号:0~ 31表示)(2) long blocked; //信号掩码(3) struct signal_struct *sig;// 信号处理函数结构指针(4) struct sem_queue *semsleeping;//与信号量相关的等待队列指针(5) struct sem_undo * semundo;//为避免死锁在信号量上设置取消操作5.进程指针可运行队列进程链接信息队列指针各种等待队列进程树(家属关系)(1) struct task_struct *next_run.. .. *prev_run//可运行队列(2) struct task_struct *next_task.. .. *prev_task(3) struct task_struct *p_opptr;// ( original parent 祖先) .. .. *p_pptr//( parent 双亲).. .. *p_cptr// ( child 孩子).. .. *p_osptr//( older sibling 左兄弟) .. .. *p_ysptr//( younger sibling 右兄弟)6.时间和定时器信息(1) long start_time; //进程创建时间(2) long utime;// 进程在用户态下耗费时间stimr;// 进程在系统态下耗费时间cutime;// 子进程在用户态下耗费时间 cstime;// 子进程在系统态下耗费时间(3) long counter; // 进程剩余时间片(4) unsigned long timeout;//进程申请延迟时间Linux 允许进程创建三种定时器实时定时器虚拟定时器概况定时器每种定时器包含三项内容:(5) unsigned long it_real_value,it_virt_value, it_prof_value;// 到期时间unsigned long it_real_incr,it_virt_ incr, it_prof_incr; //定时间隔,当定时间隔〉0,循环置定时值第三项仅对实时定时器存在:struct timer_list real_timer;//实时定时器到期要触发的事件及到期时间结构[若有时,按到期时间,将所有进程此结构,挂入系统实时钟例程任务队列中 ]7. 文件系统信息(1)struct fs_struct *fs;本进程可执行映像文件所在根目录(root)本进程可执行映像文件所在当前目录(pwd)(2) struct files_struct *files;进程打开文件描述符表8.虚拟内存信息【除了内核线程(kernel thread) 或守护进程(daemon)外,每个进程都拥有自己的虚拟内存空间。

Linux 内核负责进程的虚拟内存和物理内存映射】(1) struct mm_struct *mm;// 描述进程虚拟内存(2) struct desc_struct *ldt;// 局部(进程)描述符表9.处理器与相关环境(上下文)信息执行环境:寄存器、堆栈、…(1) long debugreg [ 8];//8个调试寄存器(2) struct thread_struct *tss;//任务切换状态(二) Linux 进程控制1.进程创建即:构造进程:PCB 、程序与数据区进程映像系统调用fork( ),创建一个子进程,使子进程成为一个处于“可运行状态”(入可运行队列)、竞争CPU 单位。

子进程映像除pid进程标识外,即基本复制父进程映像格式:int fork( )0 ——子进程从fork后调度到时返回值为0返回值 >0 ——父进程fork后调度到时返回值(子pid)-1 ——创建子进程失败.例(1) : 父子 C语言程序# include <stdio.h># include <sys/types.h> #include <unistd.h>int main(void){ pid_t pid;pid =fork();//①系统存在二个进程,父、子,其执行映象程序数据//都相同.但各有一个备份!if( pid <0) { printf(“forkerror\n”);//②fork失败exit(0);} //③系统调用,终止本进程//执行,此为父进程else if( pid = = 0){ printf(“This is child process!”);} //④子进程从fork返回时,执行printf else{ printf(“This is parent process!”); } //⑤父进程从fork返回时,执行printf exit(0); // ⑥父,或子正常终止}分析:执行顺序 (1)fork创子进程失败①②③结果:fork error(2)fork 后父进程先调度到: ①判pid<0 pid≠0⑤输出: this is parent process!⑥再调子进程判pid<0 pid= = 0④⑥输出:This is child process!(3)fork 后子进程先调度列: ①判pid<0 pid==0 ④⑥后再调度父:判pid<0 pid≠0 ⑤⑥输出结果:This is child process!This is parent process!处理过程:fork()创建一子进程 (调用do_fork()完成)调用exec()使子进程运行2. 进程执行3. 父等子进程终止___wait()父与子同步父阻塞,入等待队列,等待子进程终止时,唤醒父#include <sys/type.h>#include <sys/wait.h>Pid_t wait (int *statloc)子进程ID__正确返回子终止时返回给父状态参数0 ___其他-1 __出错返回功能:父等子终止并获子状态参数return返回4. 进程终止 exit() 或exit()返回使子进程处于TASK_ZOMB 终止状态,仅保留task_struct,唤醒父进程(若父调用了wait),向父发送信号,通知父,子要求终止处理.父消亡____改父为1#init作子的善后处理.子终止前父未亡____由父进程作子善后处理:◆读task_struct信息:PID,终止状态信息,CPU时间信息(用机时间)作记帐用task_struct格式: #include <stdio.h>void exit ( int status )传给父状态信息例3.fork() 、wait()、exit() 举例综合#include <sys/types.h>#include <sys/wait.h>#include <unistd.h>#include <stdio.h>int main(){ pid_t pid1,pid2; int stat;if((pid1 =fork())< 0){ printf(“fork1 error!”); //创子进程出错失败! exit(1); }else if( pid1== 0 ) //创子进程成功//子又创”孙进程”“fork2 error!”) //孙未成功创建 }exit(0); //子创孙成功则子结束. else {//入睡2秒printf(“this is grandson, parentis:%d,”getppid());//孙结束(可能子已消亡,则1//#init代替孙的父亲(子进程)//善后处理孙进程}}wait ( &stat); // 父成功创子后阻塞,等待子消亡 exit(0); // 子消亡后,父消亡}孙入睡2秒,唤醒后再输出.此时孙之父(子)已消亡,则1#代其父(子)若成功创建结果:当孙进程运行时输出:This is grandson, parent is 1孙 (孙的父为1号进程)( Ⅲ ) Linux核心进程调度(一)内核机制中断分割中断处理(分割)调度程序schedule() { …do_bottom_ 延迟到half }系统调用返回时:ret_from_syscall ( ) (尽可能快执行){…}1.内核机制――数据结构(1)b otton_half―内核例程处理程序(<=32个)全局变量unsigned long bh_active=0 是否激活内核例程处理程序位=0 未激活位=1 已激活unsigned long bh_mask=0 是否安装了内核例程处理程序位=0未安装位=1已安装void ( *bh_base[32] ) ( viod ) 内核例程控制程序数组即:一组指向函数的指针每一元素为一指向例程(函数)指针bh_mask是否安装void(*bh_base[32])(viod)0 实时定时Void timer_bh(void)1 控制台0-未安装 2 TTY消息队列1-已安装 3(按安装例程置位)8bh_active是否激活0-未激活1-已激活何时置位:每发生一次相应设备中断(如时钟中断)则设备在bh_active中相应位置1(时钟为第0位)在bottom half中处理结束复位(置0)每个bottom_half例程干什么?处理一个任务队列(2)任务队列①结点结构:struct tq_struct //(一般任务结点){ struct tq_struct *next; // 指向下一个结点int sync;// 初始为0void ( *rountune ) ( void * ); // 调用例程指针void *data; // 例程参数}②定时器任务结点结构(与一般队列结点不同)Linux同时支持两种定时机制(兼顾老机制)(a) 老机制:定时器表结构:struct timer_struct{ unsigned long expires; // 到期时间void (*fn)(void); // 要触发例程}timer_active timer_table数组timer_struct31 i 1 0 0i31初始化时:unsigned long timer_active = 0;示无定时器任务(b) 新机制:定时器队列结构:struct timer_list{ struct timer_list *next;struct timer_list *prev;unsigned long expires;//到期时间(定义定时器: 当前jiffies +// it_real_value )unsigned long *data; // 数据void (*function) (unsigned long );// 该结点触发一个例程指针}timer_list timer_list timer_list (P88)到期时间升序排队!!!初始化时:struct timer_listtimer_head={&timer_head, &timer_head, ~0 ,0, NULL}队列头指针头尾指向自己最大数2.d o_bottom_half――处理所有(32个)内核例程(P内核书78)void do_bottom_half ( void ){ unsigned long active; // 定义无符号长整型工作变量unsigned long mask, left;void ( **bh ) (void) , (*fn ) (void );// 定义fn为指向函数的指针, bh指向函数指针的指针sti ( ); // 开中断bh=bh_base; // 取出函数型指针数组首址=> bh active = bh_active & bh_mask;// 看是否有激活内核例程for (mask=1, left= ~0; left & active;// e1 e2// 置00…01, 全1 视:32位及还有否激活例//程需处理bh++ , mask<<1, left<<1 )// e3 mask形如:00….10…..0用于判断当前位// left 形如:11…110….0用于判32位是否都处理完成了!if ( mask & active ) // 判当前位,有否要动作?{bh_active &= ~mask // 有:清当前位上的bh_active位fn=*bh;bh_baseif ( ! fn ) bh→0 例程函数go to bad_bh; bh++fn ( );31// 执行例程程序(函数)处理一个任务队列}return;bad_bh: printf( “irqc:bad bottom half entry %08lx \n ”,mask );}3. 特殊任务队列――tq_scheduler【因为】内核bh_base[32]数组仅32个项目tq_scheduler目的扩充【所以】该队列中每个例程也是一个内核例程处理程序(bottom half_handler )调度程序中被运行处理____ tq_scheduler队列void schedule (void) // Linux调度程序!{ ……run_task_queue (& tq_scheduler );……..}1.timer bottom half handler――定时器内核例程处理程序即:timer_bh()(1)struct task_struct// 有关实时定时器工作单元{ ……unsigned long it_real_value; //到期时间unsigned long it_real_incr; //定时间隔:(是否循环定时!=0是循环)struct timer_list real_timer; //定时器队列结构……….} 此结构被链入(双向勾链)系统中的timer_list 结构队列(到期时间是时钟单位jiffies)(依it_real_value及it_real_incr置)(2)void timer_bh(void) 定时器内核例程处理程序{ run_old_timers (); // 处理定时器表(老定时器机制)cli(); // 临界段处理(关锁)(关中)run_timer_list (); // 处理定时器队列(新机制)sti();//(开锁)(开中)…….if ( - - current-> counter<=0 ){ current-> counte r =0; // 用完时间片(配额)need_resched=1; // 置再调度标志}do_process_times(current,user,system);// 记录当前进程使用CPU时间do_it_virt();// 更新当前进程(用户态)虚拟定时器,若到期:发//SIGVTALRM信号do_it_prof();//更新当前进程概况定时器,若到期,发SIGPROF//信号(占CPU不论用户态,核心态)}( 3 ) void run_timer_list(void) 定时器队列(新机制)处理函数{struct timer_list *timer; // 工作指针,指向当前任务队列中一个结点// 循环直到timer-> timer_head为止timer-> expires<=jiffies )本队列结点到期时间//{ /* 将结点:定时器中一个例程从定时器中移走*/void ( *fn (unsigned long) =timer-> function; // 定义函数指针fnunsigned long data = timer-> data; // 取结点中参数及函数指针(地址)timer->next ->prev = timer->prev;timer->prov->next = timer->next;timer->next = timer->prev = NULL; //当前结点双向指针置空sti();fn(data);// 执行该结点的定时器例程(函数)cli();}}即:本函数遍历定时器队列,处理所有到期定时器,然后将定时器从队列中移走。

相关文档
最新文档