重庆邮电大学移通学院毕业设计论文任务书.DOC

上传人:国*** 文档编号:1142271 上传时间:2018-12-14 格式:DOC 页数:65 大小:248.50KB
下载 相关 举报
重庆邮电大学移通学院毕业设计论文任务书.DOC_第1页
第1页 / 共65页
重庆邮电大学移通学院毕业设计论文任务书.DOC_第2页
第2页 / 共65页
重庆邮电大学移通学院毕业设计论文任务书.DOC_第3页
第3页 / 共65页
重庆邮电大学移通学院毕业设计论文任务书.DOC_第4页
第4页 / 共65页
重庆邮电大学移通学院毕业设计论文任务书.DOC_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、 重庆邮电大学移通学院毕业设计(论文) 1重庆邮电大学移通学院毕业设计(论文)任务书设计(论文)题目 Linux 多进程编程及应用 学生姓名 * 系别 计算机 专业 计算机科学与技术 班级 * 指导教师 * 职称 讲师 联系电话 * 指导教师所在单位 重庆邮电大学移通学院计算机系 主要研究内容、方法和要求要求:熟悉 Linux 内核进程相关代码,熟悉 Linux 多进程编程。内容:1、掌握 Linux 内核进程相关代码。2、掌握 Linux 进程的静态结构。3、熟悉 Linux 进程的创建,调度,及撤销。4、熟悉 Linux 进程间通信。进度计划第 4 周-第 6 周:了解 Linux 历史第

2、 7 周-第 9 周:学习 Linux 进程相关内核代码。第 10 周-第 13 周:学习 Linux 多进程编程第 14 周-第 15 周:系统性总结及论文撰写、修改论文阶段。主要参考文献1Daniel P.Bovet the kernel analysis; Linux programming 重庆邮电大学移通学院毕业设计( 论文) 目录4前 言 .5第 1 章 LINUX 进程相关内核代码简要分析 .61.1 基本概念 .61.1.1 进程 .61.1.2 轻量级进程和线程 .61.2 进程的静态结构 .71.2.1 进程描述符 13.71.3 进程的创建 18 .81.4 Linux

3、进程调度 138911.101.4.1 总述 .101.4.2 runqueque 结构 13.101.4.3 runqueque 结构分析 3.111.5 进程的撤销 3.13第 2 章 LINUX 多进程编程 .142.1 进程的创建 123715 .142.1.1 fork()1315 .142.1.2 fork()与 vfork()区别 3 .162.2 exec 函数族 12315.172.2.1 简介 .172.2.2 exec()函数族解析 3 .182.3 进程间通信 12347 .212.3.1 总述 .212.3.2 管道 10.212.3.3 信号 4616 .292.3

4、.4 消息队列 34.392.3.5 共享内存 1234 .462.3.6 Socket15 .48第 3 章 LINUX 多进程编程应用 .513.1 Linux 网络服务器中的 .513.1.1 传统的 TCP 进程并发服务器程序 15 .513.1.2 TCP 预先派生子进程并发服务器程序 .51结束语 .54致 谢 .55参考文献 .56附件 .571. 英文原文 .57GNU/Linux profile .57重庆邮电大学移通学院毕业设计( 论文) 前言5前 言Linux 是类 UNIX 系统大家族中的一员。从 20 实际 90 年代末开始,Linux这位相对比较新的成员突然变得非常

5、流行,并且跻身于那些知名的商用 UNIX操作系统之列。Linux 以其无与伦比的优越性,已经在高档计算机占有了一席之地。而现今众多 Linux 桌面版的推出也使一般用户能够体验到 Linux 所到来的高性能,和高稳定性。Linux 能够吸引众多的用户不仅仅因为其性能和稳定性,另一个关键的因素是 Linux 内核的所有源代码对用户开放。这样,任何用户都可以从用户接口层到与硬件密切相关的核心层,对这个最成功的系统而又最现代的操作系统做深入的研究。本人所介绍的 Linux 多进程编程所用编程语言为 C 语言,程序测试环为Ubuntu10.04,C 语言编译器为 GCC4.5。命令解释器为 Bash。

6、本论文的体系主要分为以下几章。第一章:Linux 进程相关内核代码简要分析第二章:Linux 多进程编程第三章:Linux 多进程编程应用重庆邮电大学移通学院毕业设计(论文) 第 1 章 Linux 进程相关内核代码简要分析 6第 1 章 Linux 进程相关内核代码简要分析1.1 基本概念1.1.1 进程进程是任何多任务操作系统中的基本概念。通常把进程定义为一个应用程序运行实例。如果当前有 n 个用户同时运行一个程序,例如 mplayer,那么就有n 个独立的进程( 尽管它们共享同一段可执行代码)1.1.2 轻量级进程和线程为什么这个部分要将轻量级进程和线程同时提出。因为在 Linux 系统

7、很少使用线程的概念。为什么 Linux 要很少使用线程的概念。因为线程在处理一些任务的时候性能并不令人满意。例如:现在我们有一个 GUI(Graphical User Interface,简称 GUI,又称图形用户接口)程序,程序分为两部分,其一是图形处理部分,其二是后台数据处理。可以将这两部分分为两个线程,如果这个程序是一个单独的进程,就会出现这样的问题。图形处理线程会常常阻塞等待用户的各种操作,这样就会导致数据处理的线程也会阻塞。相反,图形处理线程要使用非常复杂的非阻塞技术来确保进程是运行的。为了解决上述问题,Linux 传奇式的引入了一个轻量级进程的概念,此概念只存在在 Linux 系统

8、中。轻量级进程是线程的替代。轻量级进程其实就是一个普通的进程,不同的是几个轻量级进程之间可以共享资源,如地址空间,打开的文件。只要其中一个修改共享资源,另一个就会立即查看这种修改。当两个轻量级进程访问共享资源是就必须同步它们。虽然 Linux 很少使用线程的概念,但任然提供了线程的支持,具体可参考pthread.h。重庆邮电大学移通学院毕业设计(论文) 第 1 章 Linux 进程相关内核代码简要分析 71.2 进程的静态结构1.2.1 进程描述符 13为了管理进程,内核必须对每个进程做清晰的描述。Linux 内核代码中进程描述数据结构 task_struct 存放在 include/linu

9、x/sched.h13头文件中。Linux 进程描述符中所包含的信息有进程标识符(PID),进程所占内存区域,相关文件的文件描述符,安全信息,进程环境,信号处理,资源安排,同步处理,和进程状态几个方面 13。task_struct 结构中的的几个特殊成员:进程状态定义在 sched.h 头文件中#define TASK_RUNNING 0 /正在运行中的进程#define TASK_INTERRUPTIBLE 1 /等待队列中的进程,等待资源有效时唤醒进入就绪队列#define TASK_UNINTERRUPTIBLE 2 /等待队列中的进程,等待资源有效时唤醒,但不可被其他进程中断#defi

10、ne TASK_STOPPED 4 /进程暂停,通过其他信号才能唤醒#define TASK_TRACED 8 /进程处理跟踪状态#define EXIT_ZOMBIE 16 /僵尸状态task数组中任然有个tast_struct数据结构项,它只等待父进程将他释放#define EXIT_DEAD 32 /最终状态,父进程发出wait4()调用或waitpid()调用,进程由系统删除2.进程标志位(flags)#define PF_ALIGNWARN 0x00000001 /* 打印对齐警告短信息 */#define PF_STARTING 0x00000002 /* 进程被创造 */#def

11、ine PF_EXITING 0x00000004 /* 标志进程开始关闭 */#define PF_DEAD 0x00000008 /* 僵尸进程 */#define PF_FORKNOEXEC 0x00000040 /* 进程刚创建但没有运行 */#define PF_SUPERPRIV 0x00000100 /* 使用超级用户权限 */#define PF_DUMPCORE 0x00000200 /* 标志是否清空core文件 */#define PF_SIGNALED 0x00000400 /* 标志进程被信号signal终止 */#define PF_MEMALLOC 0x00000

12、800 /* 标志进程正在分配内存 */#define PF_FLUSHER 0x00001000 /* 磁盘回写 */#define PF_USED_MATH 0x00002000 /* 如果不进行初始化的fpu必须在使用前 */#define PF_FREEZE 0x00004000 /* 进程被暂停 */重庆邮电大学移通学院毕业设计(论文) 第 1 章 Linux 进程相关内核代码简要分析 8#define PF_NOFREEZE 0x00008000 /* 进程未被暂停 */#define PF_FROZEN 0x00010000 /* 系统暂停 */#define PF_FSTRAN

13、S 0x00020000 /* 读/写文件系统 */#define PF_KSWAPD 0x00040000 /* 创建swap */#define PF_SWAPOFF 0x00080000 /* 清空swap */#define PF_LESS_THROTTLE 0x00100000 /* 内存清空 */#define PF_SYNCWRITE 0x00200000 /* 我在做一个同步写 */#define PF_BORROWED_MM 0x00400000 /* 我是一个kthread做use_mm */3.跟踪标志(unsigned long ptrace)#define PF_PT

14、RACED 0x00000010 /* 进程正在被跟踪 */#define PF_TRACESYS 0x00000020 /* 正在跟踪系统调用 */4.进程优先级int prio 优先级,在 0MAX_PRIO-1 之间(MAX_PRIO 为 140),其中0MAX_RT_PRIO-1(MAX_RP_PRIO 为 100)属于实时进程范围,MAX_RT_PRIOMAX_PRIO 为非实时进程,数值越大,优先级越小。5.prio_array_t *array优先级数组,将进程优先级为序号的数组。实时优先级 unsigned long rt_priorityrt_priority 给出实时优先级

15、,rt_priority+1000 给出进程每次获得 CPU 后,可以使用的时间,实时进程优先级可以由系统调用 sys_sched_setschedule()改变。1.3 进程的创建 18让我们不妨亲自看看如何从用户空间创建一个进程。用户空间任务和内核任务的底层机制是一致的,因为二者最终都会依赖于一个名为 do_fork 的函数来创建新进程。在创建内核线程时,内核会调用一个名为 kernel_thread 的函数(参见 ./linux/arch/i386/kernel/process.c),此函数执行某些初始化后会调用 do_fork。重庆邮电大学移通学院毕业设计(论文) 第 1 章 Linu

16、x 进程相关内核代码简要分析 9图 1.1 进程创建从图 1.1 中,可以看到 do_fork 是进程创建的基础。可以在 ./linux/kernel/fork.c 内找到 do_fork 函数。do_fork 函数首先调用 alloc_pidmap,该调用会分配一个新的 PID。接下来,do_fork 检查调试器是否在跟踪父进程。如果是,在 clone_flags 内设置 CLONE_PTRACE 标志以做好执行 fork 操作的准备。之后 do_fork 函数还会调用 copy_process,向其传递这些标志、堆栈、注册表、父进程以及最新分配的 PID。新的进程在 copy_proces

17、s 函数内作为父进程的一个副本创建。此函数能执行除启动进程之外的所有操作,启动进程在之后进行处理。copy_process 内的第一步是验证 CLONE 标志以确保这些标志是一致的。如果不一致,就会返回 EINVAL 错误。接下来,询问 Linux Security Module (LSM) 看当前任务是否可以创建一个新任务。接下来,调用 dup_task_struct 函数(在 ./linux/kernel/fork.c 内) ,这会分配一个新 task_struct 并将当前进程的描述符复制到其内。在新的线程堆栈设置好后,一些状态信息也会被初始化,并且会将控制返回给 copy_proces

18、s。控制回到 copy_process 后,除了其他几个限制和安全检查之外,还会执行一些常规管理,包括在新 task_struct 上的各种初始化。之后,会调用一系列复制函数来复重庆邮电大学移通学院毕业设计(论文) 第 1 章 Linux 进程相关内核代码简要分析 10制此进程的各个方面,比如复制开放文件描述符(copy_files)、复制符号信息(copy_sighand 和 copy_signal)、复制进程内存(copy_mm)以及最终复制线程(copy_thread)。之后,这个新任务会被指定给一个处理程序,同时对允许执行进程的处理程序进行额外的检查(cpus_allowed)。新进程

19、的优先级从父进程的优先级继承后,执行一小部分额外的常规管理,而且控制也会被返回给 do_fork。在此时,新进程存在但尚未运行。do_fork 函数通过调用 wake_up_new_task 来修复此问题。此函数( 可在 ./linux/kernel/sched.c 内找到)初始化某些调度程序的常规管理信息,将新进程放置在运行队列之内,然后将其唤醒以便执行。最后,一旦返回至 do_fork,此 PID 值即被返回给调用程序,进程完成。1.4 Linux 进程调度 1389111.4.1 总述2.6 调度系统从设计之初就把开发重点放在更好满足实时性和多处理机并行性上,并且基本实现了它的设计目标。新调度系统的特性为如下几点:1.交互式作业优先2.轻载条件下调度/唤醒的高性能3.公平共享4.基于优先级调度5.高 CPU 使用率6.SMP 高效亲和7.实时调度和 cpu 绑定等调度手段1.4.2 runqueque 结构 13此结构定义在./linux/kernel/sched.c 中,runpuepue 中的 prio_arrary_t *active,*expired,arrays2成员说明,此是这个结构中的关键数据结构,每个

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 企业管理资料库 > 人力资源

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。