操作系统课外实践报告
项 目 名 称: Linux 进程理
班 级: 软件工程(10Net)
组 成 员:
指 导 教 师:
项目基信息
项目名称
项目简介
Linux 进程表示进程理进程创建进程销毁系统解学
Linux 种动态系统够适应断变化计算需求Linux 计算需求表现进程 通抽象中心进程短期(命令行执行命令)长期(种网络服务)进程调度进行般理显极重户空间进程进程标识符(PID)表示户角度 PID 数字值惟标识进程 PID 进程整生命期间会更改 PID 进程销毁重新进行缓存见总理想户空间创建进程采种方式执行程序(会导致新进程创建)程序调 fork exec 系统调fork 调会导致创建子进程 exec 调会新程序代前进程文
首先展示进程核表示核理然进程创建调度种方式(处理器)介绍进程销毁
进程表示
Linux 核进程相称 task_struct 结构表示结构包含表示进程必需数外包含量数统计(accounting)维护进程关系(父子) task_struct 完整介绍超出文范围清单 1 出 task_struct 部分代码包含文探索特定元素task_struct 位 linuxincludelinuxschedh
清单 1 task_struct 部分
struct task_struct {
volatile long state
void *stack
unsigned int flags
int prio static_prio
struct list_head tasks
struct mm_struct *mm *active_mm
pid_t pid
pid_t tgid
struct task_struct *real_parent
char comm[TASK_COMM_LEN]
struct thread_struct thread
struct files_struct *files
清单 1 中预料中项执行状态堆栈组标志父进程执行线程()开放文件稍会进行详细说明里简单加介绍state 变量表明务状态特位常见状态:TASK_RUNNING 表示进程正运行排运行队列中正运行TASK_INTERRUPTIBLE 表示进程正休眠TASK_UNINTERRUPTIBLE 表示进程正休眠醒TASK_STOPPED 表示进程停止等等
flags 定义指示符表明进程否正创建(PF_STARTING)退出(PF_EXITING)进程前否分配存(PF_MEMALLOC)执行程序名称(包含路径)占 comm(命令)字段
进程会赋予优先级(称 static_prio)进程实际优先级基加载素动态决定优先级值越低实际优先级越高
tasks 字段提供链接列表力包含 prev 指针(指前务) next 指针(指务)
进程址空间 mm active_mm 字段表示mm 代表进程存描述符 active_mm 前进程存描述符(改进文切换时间种优化)
thread_struct 标识进程存储状态元素赖 Linux 运行特定架构 linuxincludeasmi386processorh 样例子结构找该进程执行文切换存储(硬件注册表程序计数器等)
进程理
进程数
Linux 然进程动态分配需考虑进程数核进程数称 max_threads 符号表示 linuxkernelforkc 找通 procsyskernelthreadsmax proc 文件系统户空间更改值
现 Linux 理进程情况进程动态创建动态分配 task_struct 表示例外 init 进程身总存静态分配 task_struct 表示 linuxarchi386kernelinit_taskc 找样例子
Linux 进程分配两种方式第种方式通哈希表 PID 值进行哈希计算第二种方式通双链循环表循环表非常适合务列表进行迭代列表循环没头尾 init_task 总存作继续前迭代锚点遍历前务集例子
务列表法户空间访问该问题容易解决方法模块形式核插入代码清单 2 中示简单程序会迭代务列表会提供关务少量信息(namepid parent 名)注意里模块 printk 发出结果查具体结果通 cat 实工具(实时 tail f varlogmessages)查 varlogmessages 文件next_task 函数 schedh 宏简化务列表迭代(返回务 task_struct 引)
清单 2 发出务信息简单核模块(procsviewc)
#include
#include
#include
int init_module( void )
{
* Set up the anchor point *
struct task_struct *task &init_task
* Walk through the task list until we hit the init_task again *
do {
printk( KERN_INFO *** s [d] parent s\n
task>comm task>pid task>parent>comm )
}
while ( (task next_task(task)) &init_task )
return 0
}
void cleanup_module( void )
{
return
}
清单 3 示 Makefile 编译模块编译时 insmod procsviewko 插入模块象 rmmod procsview 删
清单 3 构建核模块 Makefile
插入varlogmessage objm + procsviewo
KDIR libmodules(shell uname r)build
PWD (shell pwd)
default
(MAKE) C (KDIR) SUBDIRS(PWD) modules s 显示输出示中里空闲务(称 swapper) init 务(pid 1)
Nov 12 221951 mtjdesktop kernel [8503873310] *** swapper [0] parent swapper
Nov 12 221951 mtjdesktop kernel [8503904182] *** init [1] parent swapper
Nov 12 221951 mtjdesktop kernel [8503904215] *** kthreadd [2] parent swapper
Nov 12 221951 mtjdesktop kernel [8503904233] *** migration0 [3] parent kthreadd
注意标识前正运行务Linux 维护称 current 符号代表前运行进程(类型 task_struct)果 init_module 尾部插入行代码:
printk( KERN_INFO Current task is s [d] current>comm current>pid )
会:
Nov 12 224845 mtjdesktop kernel [10233323662] Current task is insmod [6538]
注意前务 insmod init_module 函数 insmod 命令执行文运行current 符号实际指函数(get_current) arch 关头部中找( linuxincludeasmi386currenth 找)
进程创建
系统调函数
您已系统调模式情况系统调命名 sys_* 提供某初始功实现调(例错误检查户空间行)实际工作常常会委派外名 do_* 函数
妨亲户空间创建进程户空间务核务底层机制致二者终会赖名 do_fork 函数创建新进程创建核线程时核会调名 kernel_thread 函数(参见 linuxarchi386kernelprocessc)函数执行某初始化会调 do_fork
创建户空间进程情况类似户空间程序会调 fork会导致名 sys_fork 核函数系统调(参见 linuxarchi386kernelprocessc)函数关系图 1 示
图 1 负责创建进程函数层次结构
图 1 中 do_fork 进程创建基础 linuxkernelforkc 找 do_fork 函数(合作函数 copy_process)
do_fork 函数首先调 alloc_pidmap该调会分配新 PID接do_fork 检查调试器否踪父进程果 clone_flags 设置 CLONE_PTRACE 标志做执行 fork 操作准备 do_fork 函数会调 copy_process传递标志堆栈注册表父进程新分配 PID
新进程 copy_process 函数作父进程副创建函数执行启动进程外操作启动进程进行处理copy_process 第步验证 CLONE 标志确保标志致果致会返回 EINVAL 错误接询问 Linux Security Module (LSM) 前务否创建新务
接调 dup_task_struct 函数( linuxkernelforkc )会分配新 task_struct 前进程描述符复制新线程堆栈设置状态信息会初始化会控制返回 copy_process控制回 copy_process 限制安全检查外会执行常规理包括新 task_struct 种初始化会调系列复制函数复制进程方面复制开放文件描述符(copy_files)复制符号信息(copy_sighand copy_signal)复制进程存(copy_mm)终复制线程(copy_thread)
新务会指定处理程序时允许执行进程处理程序进行额外检查(cpus_allowed)新进程优先级父进程优先级继承执行部分额外常规理控制会返回 do_fork时新进程存尚未运行do_fork 函数通调 wake_up_new_task 修复问题函数( linuxkernelschedc 找)初始化某调度程序常规理信息新进程放置运行队列然唤醒便执行旦返回 do_fork PID 值返回调程序进程完成
进程调度
存 Linux 进程通 Linux 调度程序调度然调度程序超出文讨范围 Linux 调度程序维护针优先级组列表中保存 task_struct 引务通 schedule 函数( linuxkernelschedc )调根加载进程执行历史决定佳进程
进程销毁
进程销毁通事件驱动 — 通正常进程结束通信号通 exit 函数调进程退出进程结束助核函数 do_exit( linuxkernelexitc )调程图 2 示
图 2 实现进程销毁函数层次结构
do_exit 目前进程引操作系统删(针没享资源)销毁程先通设置 PF_EXITING 标志表明进程正退出核方面会利避免进程删时试图处理进程进程生命期间获种资源分离开通系列调实现 exit_mm(删存页) exit_keys(释放线程会话进程安全键)do_exit 函数执行释放进程需种统计通调 exit_notify 执行系列通知(告知父进程子进程正退出)进程状态更改 PF_DEAD会调 schedule 函数选择执行新进程请注意果父进程通知必需(进程正踪)务会彻底消失果需通知调 release_task 实际收回进程部分存
安阳师范学院
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档