操作系统课程设计报告

  • 格式:doc
  • 大小:149.00 KB
  • 文档页数:26

下载文档原格式

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

成绩:____《操作系统原理》课程设计报告

设计题目

Linux的fork.c代码的分析

Linux 的exit.c代码的分析

姓名班级学号

负责人:

参与人:

指导老师:

一、设计目的:

通过对Linux的fork.c、exit.c代码的分析, 了解一个操作系统进程的创建、退出的过程, 锻炼学生分析大型软件代码的能力通过与同组同学的合作, 锻炼学生的合作能力

二、设计步骤:

1.了解基础知识;

2.与同组同学一起讨论出任务的分配方式;

马瑞骁(计023-37):Release()函数、Sys_kill()函数、

Tell_father()函数,Sys_waitpid()函数董欣(计022-24):、Copy_progress函数,Fork.c程序流程图、

Exit.c程序流程图;

3.对自己的任务部分的代码充分阅读,注释代码,同时得到相

应的框图;

4.撰写报告。

三、设计内容:

根据课程设计指导书提供的基础知识和有关资料, 分析相关代码, 得到相关的框图, 写出设计报告。

四、设计结果:

(一)Exit.c分析:

Exit.c程序主要描述了进程终止和退出的处理事宜。主要包含进程释放、会话终止和程序推出处理函数以及杀死进程、终止进程、刮起进程等系统调用函数。还包括进程信号发送函数send_sig()和同志父进程终止的函数tell_father()。

Exit.c程序流程图:

1. Release()函数:

Release( )主要根据制定的任务数据结构(任务描述符)指针,在任务数组中删除指定的进程指针、释放相关内存页并立刻让内核重新调度任务的运行。

/*************程序分析************************/

void release(struct task_struct * p) //参数p 是任务数据结构的指针。该函数在后面的sys _ ki1l ( )和sys _waitPid ( )

中被调用。

//扫描任务指针数组表task 「」以寻找指定的任务。若

找到,则先清空该任务槽,然后释放该任务数据结构所

占用的内存页面,最后执行调度函数并在返回时立即退

出。若在任务数组表中没有找到指定任务对应的项,则

内核panic

{

int i;

if (!p)

return;

for (i=1 ; i

if (task[i]==p)

{

task[i]=NULL; //该任务项置空,然后释放相关的内存页。

free_page((long)p);

schedule(); //重新调度

return;

}

panic("trying to release non-existent task"); //指定任务若不存在则死机

}

/****************************************************/ Release( )程序框图如下所示:

2. Sys_kill()函数:

系统调用sys_kill( )用户向进程发送任何指定的信号。根据参数pid 的数值的不同,该系统调用会向不用的进程或进程组发送信号。

/*************程序分析************************/

int sys_kill(int pid,int sig) //参数pid 是进程号;sig是需要发送的信号。

{

struct task_struct **p = NR_TASKS + task;

int err, retval = 0;

if (!pid) //如果pid =0 ,那么信号就会被发送给当前进程的进程组中的所有进程。

while (--p > &FIRST_TASK)

{

if (*p && (*p)->pgrp == current->pid)

if (err=send_sig(sig,*p,1)) //强制发送信号。

retval = err;

}

else if (pid>0) //如果pid 值>0 ,则信号被发送给进程号是pid 的进程。while (--p > &FIRST_TASK) {

if (*p && (*p)->pid == pid)

if (err=send_sig(sig,*p,0))

retval = err;

} else if (pid == -1) while (--p > &FIRST_TASK) //如果pid =-1 ,则信号sig就会发送给除第一个进程外的所有进程。

if (err = send_sig(sig,*p,0))

retval = err;

else while (--p > &FIRST_TASK)

if (*p && (*p)->pgrp == -pid) //如果pid <-1 ,则信号sig将发送给进程组--sig 的所有进程。

if (err = send_sig(sig,*p,0))

retval = err;

return retval;

}

/****************************************************/ Sys_kill( )程序框图如下所示: