进程的描述和进程的创建

一、进程描述符task_struct

  为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。

代码关键点:

  1.Struct list_head task进程链表,双向循环链表链接。

  2.Struct mm_struct *mm,*active_mm进程地址空间,内存管理

  3.每个进程都有自己独立的4G进程地址空间。

  4.Struct thread Struct thread当前任务相关的CPU代码

  5.Struct fs_Struct *fs文件系统数据结构

  6.Struct files_struct *files打开的文件描述符列表

  7.struct signal_stract *signal信号处理

二、进程的创建

  一号进程是所有用户态进程的祖先,二号进程是所有内核线程的祖先。

  fork、vfork和clone三个系统调用都可以创建一个新进程,而且都是通过调用do_fork来实现进程的创建;

1.fork 系统调用,用户态用于创建一个子进程。(部分代码如下)

  if (pid < 0)   出错处理

  10     {

  11         /* error occurred */

  12         fprintf(stderr,"Fork Failed!");

  13         exit(-1);

  14     }

  15     else if (pid == 0)

  16     {

  17         /* child process */  子进程   pid=0时 if和else都会执行  fork系统调用在父进程和子进程各返回一次

  18         printf("This is Child Process!\n");

  19     }

  20     else

  21     {

  22         /* parent process  */

  23         printf("This is Parent Process!\n");

  24         /* parent will wait for the child to complete*/

  25         wait(NULL);

  26         printf("Child Complete!\n");

  27     }

2.对代码的理解

  函数对else和else if都会执行,也就是说在fork之后变成两个进程,子进程中pid返回值是0,父进程中pid的返回值是子进程的ID,fork系统调用在子进程和父进程中各返回一次。

创建一个进程是通过复制当前进程来实现的。大致分为三个步骤:

  1.复制PCB(copy process)

  2.修改PCB

  3.分配新的内核堆栈(部分数据拷贝父进程以便返回)

  *childregs = *current_pt_regs(); //复制内核堆栈

  childregs->ax = 0; //为什么子进程的fork返回0,这里就是原因!

  p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶

  p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址

3.子进程从哪里开始执行

  Childregs 调度到子进程的内核堆栈

  Ret_from_fork调度到子进程的第一条指令地址

     ↓

  Syscall_exit

     ↓

  Restore_all正常返回到用户态

三、实验

更新到最新版本后开始进行跟踪调试:

这里注意:执行一个fork,会发现只输出一个fork的命令描述,后面并没有执行,因为它停在了sys_clone这个位置。

20135123 秦兆琪

linux作业六——进程的描述和进程的创建的更多相关文章

  1. LINUX内核分析第六周学习总结——进程的描述和进程的创建

    LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  2. 《Linux内核分析》 第六节 进程的描述和进程的创建

    <Linux内核分析> 第六节 进程的描述和进程的创建 20135307 张嘉琪 原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study ...

  3. 20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 第六周 进程的描述 ...

  4. Linux分析第六周——进程的描述和进程的创建

    Linux分析第六周--进程的描述和进程的创建 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...

  5. 《Linux内核分析》第六周笔记 进程的描述和进程的创建

    进程的描述和进程的创建 一.进程的描述 1.进程描述符task_struct数据结构(一) 操作系统的三大功能:进程管理(核心).内存管理.文件系统. 进程控制块PCB——task_struct(进程 ...

  6. 20135327郭皓--Linux内核分析第六周 进程的描述和进程的创建

    进程的描述和进程的创建 一.进程的描述 操作系统三大功能: 进程管理 内存管理 文件系统 进程描述符task_struct数据结构 task _ struct:为了管理进程,内核必须对每个进程进行清晰 ...

  7. 20135239益西拉姆 Linux内核分析 进程的描述和进程的创建

    [益西拉姆 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] 第六周 进程的描述 ...

  8. Linux内核分析——进程的描述和进程的创建

    进程的描述和进程的创建 一. 进程的描述 (一)进程控制块PCB——task_struct 1.操作系统的三大管理功能包括: (1)进程管理 (2)内存管理 (3)文件系统 2.PCB task_st ...

  9. Linux内核分析第六周学习总结:进程的描述和进程的创建

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程的描述 ...

随机推荐

  1. JS辨别浏览器系统IOS或安卓

    详细内容请点击 /* * 智能机浏览器版本信息: * */ (function($,window,document){     $.extend({         browser:{         ...

  2. Android使用JNI(从java调用本地函数)

    当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...

  3. github 学习笔记【一】

    这几天在学习github ,其实学了主要用来管理自己的项目!因为要在家里和公司两头做! 所以就开始学习使用!目前熟练几个命令,其他的一边用一遍学吧!想一举成功应该是不太可能的! 反复记忆才能更好,据说 ...

  4. Js判断CSS文件加载完毕的实例教程

    要判断这个 CSS 文件是否加载完毕,各个浏览器的做法差异比较大,这次要说IE浏览器做的不错,我们可以直接通过onload方法来处理CSS加载完成以后的处理: 代码如下 复制代码 // 代码节选至se ...

  5. 对象this、currentTarget和target

    在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标.如果直接将事件处理程序指定给了目标元素,则this.currentTarget和targe ...

  6. Spring IoC容器的设计—1—主线

    IoC容器的接口设计图 下面对接口关系做一些简要的分析,可以依据以下内容来理解这张接口设计图. 从接口BeanFactory到HierarchicalBeanFactory,再到Configurabl ...

  7. 8款功能强大的最新HTML5特效实例

    1.HTML5 Canvas画板画图工具 可定义笔刷和画布 今天要分享的这款HTML5 Canvas画图工具就可以简单实现网络画图的功能,我们可以自定义笔刷的类型.粗细.颜色,也可以定义画布的大小和背 ...

  8. idea基本

    IntelliJ IDEA特色功能 IDEA所提倡的是智能编码,是减少程序员的工作,IDEA的特色功能有以下25点:智能的选取在很多时候我们要选取某个方法,或某个循环或想一步一步从一个变量到整个类慢慢 ...

  9. .NET中的标识符、关键字 以及 .NET中的命名规范

    1.关键字 C#定义了一些关键字(public/static/void/class/int/string),这些关键字是构成C#基本语法用的. VS中蓝色字的才是关键字. Main.String.Co ...

  10. Java HttpURLConnection 抓取网页内容 解析gzip格式输入流数据并转换为String格式字符串

    最近GFW为了刷存在感,搞得大家是头晕眼花,修改hosts 几乎成了每日必备工作. 索性写了一个小程序,给办公室的同事们分享,其中有个内容 就是抓取网络上的hosts,废了一些周折. 我是在一个博客上 ...