今天初步学习了一下内核进程设计思想 , 简单的做一下记录。
(1)概念
进程:程序执行程度以及信息的数据结构的结合。
轻量级线程:线程之间可以共享资源,两个线程修改共享资源,双方都能查看到修改。当然,每个线程,都可以由内核独立调度。
(2)进程描述符
task_struct结构体,在sched.h中,内容多,咱们就不贴在这里了。
但是,书上面写的thread_info,指的是stack,#define task_thread_info(task) ((struct thread_info *)(task)->stack)
我们先看state,这里有几种,我们贴出来:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
/* in tsk->exit_state */
#define EXIT_DEAD 16
#define EXIT_ZOMBIE 32
#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD)
/* in tsk->state again */
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
#define TASK_PARKED 512
#define TASK_STATE_MAX 1024
#define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWP"
extern char ___assert_task_state[1 - 2*!!(
sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)];
/* Convenience macros for the sake of set_task_state */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)
#define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED)
/* Convenience macros for the sake of wake_up */
#define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE)
#define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED)
/* get_task_state() */
#define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \
TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \
__TASK_TRACED | EXIT_ZOMBIE | EXIT_DEAD)
当内核需要对进程进行引用的时候,通过对进程描述符指针来操作。
对于pid,上限设置的位置在/proc/sys/kernel/pid_max
pidmap_array是内核管理的一个位图,用来管理已分配的pid和闲置 的pid。
同一线程组的tgid是相同的,即第一个线程的pid号。
一般,将thread_info和stack放在两个相邻的叶匡之内。
current_thread_info()获取thread_info