码迷,mamicode.com
首页 > 系统相关 > 详细

第六周 linux内核进程的创建

时间:2015-04-12 17:26:39      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

1.task_struct数据结构分析

  对于linux而言,每个进程都有一个进程控制PCB(process control block)来保存每个进程的相关信息。其中task_struct则是PCB的具体的数据结构通过内核代码可以发现,内核当中定义一个task_struct的结构体用来保存进程的相关信息。这里先来分析下task_struct的结构体。task_struct的代码如下:

  http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235

 1 #define  TASK_RUNNING       0
 2 #define TASK_INTERRUPTIBLE  1   
 3 #define TASK_UNINTERRUPTIBLE    2
 4 #define __TASK_STOPPED      4
 5 #define __TASK_TRACED       8
 6 /* in tsk->exit_state */
 7 #define EXIT_DEAD       16
 8 #define EXIT_ZOMBIE     32      
 9 #define EXIT_TRACE      (EXIT_ZOMBIE | EXIT_DEAD)
10 /* in tsk->state again */
11 #define TASK_DEAD       64
12 #define TASK_WAKEKILL       128
13 #define TASK_WAKING     256
14 #define TASK_PARKED     512
15 #define TASK_STATE_MAX      1024

这里可以看到定义了进程的相关运行状态,这里特殊的地方在于TASK_RUNNING这里将运行态和就绪态的进程都用TASK_RUNNING表示。

进程状态之间切换如下

技术分享

1 pid_t pid;
2 pid_t tgid;

pid以及tpid的区别如下

http://blog.chinaunix.net/uid-26849197-id-3201487.html

简单说来,就是对于同一进程的不同线程而言pid不同,但是tgid相同

1 struct list {
2     struct list *next, *prev;
3 };

这里显示的内核进程链表的实现,内核通过这个链表实现进程间调度等等的功能。

1 struct task_struct __rcu *real_parent; /* real parent process */
2 struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
3 /*
4  * children/sibling forms the list of my natural children
5  */
6 struct list_head children;    /* list of my children */
7 struct list_head sibling;    /* linkage in my parent‘s children list */
8 struct task_struct *group_leader;    /* threadgroup leader */

以上是进程之间父子关系的代码,通过这些代码,可以用来访问父进程以及子进程,这样在fork新进程时可以用来复制相关的数据。

1 union thread_union {
2     struct thread_info thread_info;
3     unsigned long stack[THREAD_SIZE/sizeof(long)];
4 };

每个进程都有8kb的内存用来存放 thread_info以及进程的内核堆栈

 1 * CPU-specific state of this task */
 2     struct thread_struct thread;
 3 /* filesystem information */
 4     struct fs_struct *fs;
 5 /* open file information */
 6     struct files_struct *files;
 7 /* namespaces */
 8     struct nsproxy *nsproxy;
 9 /* signal handlers */
10     struct signal_struct *signal;
11     struct sighand_struct *sighand;

这段这是表示CPU的工作状态,以及文件系统和文件描述符的管理

1 struct mm_struct *mm, *active_mm;

这里则是进程的内存管理

 

第六周 linux内核进程的创建

标签:

原文地址:http://www.cnblogs.com/qtalker/p/4419513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!