このページを編集する際は、編集に関する方針に従ってください。

概要

実装

struct task_struct {

	volatile long state;	/* -1 unrunnable, 0 runnable, >0 stopped */
  • タスクのステータス
    ステータスの名前値(10進)値(2進)説明
    TASK_RUNNING00CPU上で実行中、実行待ち状態
    TASK_INTERRUPTIBLE11待機状態。シグナルによる待機状態解除可能
    TASK_UNINTERRUPTIBLE210待機状態。シグナルによる待機状態解除不可
    TASK_STOPPED4100実行の停止中
    TASK_TRACED81000停止状態
    EXIT_ZOMBIE161 0000メモリ解放待ち
    EXIT_DEAD3210 0000即座に解放
    • 走行不可:-1
    • 走行可:0
    • 停止:1〜
	struct thread_info *thread_info;
  • プロセスに関する低レベルな情報とカーネル用スタックを保持する
	atomic_t usage;
  • このタスクの使用数
	unsigned long flags;	/* per process flags, defined below */
  • このプロセスのEFLAGS情報
    フラグ名説明
    PF_ALIGNWARN0x00000001アライメント警告(486では実装されていない)
    PF_STARTING0x00000002作成された
    PF_EXITING0x00000004終了された
    PF_DEAD0x00000008死んでいる
    PF_FORKNOEXEC0x00000040forkしたが、実行されていない
    PF_SUPERPRIV0x00000100スーパユーザの権限を使用した
    PF_DUMPCORE0x00000200コアダンプ
    PF_SIGNALED0x00000400シグナルによってkillされた
    PF_MEMALLOC0x00000800メモリを確保中
    PF_MEMDIE0x00001000メモリの範囲外アクセスをしたためにkillされた
    PF_FLUSHER0x00002000ディスクへライトバックする必要がある
    PF_FREEZE0x00004000このタスクはサスペンドの為に凍結する必要がある
    PF_NOFREEZE0x00008000このタスクは凍結する必要はない
    PF_FROZEN0x00010000システムサスペンドの為に凍結する
    PF_FSTRANS0x00020000ファイルシステムのトランザクション中
    PF_KSWAPD0x00040000このタスクはkswapdである
    PF_SWAPOFF0x00080000swapoff中である
    PF_LESS_THROTTLE0x00100000使用可能なメモリが少ない:メモリを解放する必要がある
    PF_SYNCWRITE0x00200000このタスクは同期書き込み中
    PF_BORROWED_MM0x00400000このタスクはuse_mmを行うカーネルスレッドである
	unsigned long ptrace;
	int lock_depth;		/* Lock depth */
  • ロッキングの深さ
	int prio, static_prio;
  • prio: 優先度
  • static_prio: 固定優先度
	struct list_head run_list;
  • このタスクが属している優先度スロットのリストへのリンク
	prio_array_t *array;
  • このタスクが属している優先度スロットを指す
	unsigned long sleep_avg;
  • sleepしている時間
	long interactive_credit;
  • 対話型のクレジット
	unsigned long long timestamp, last_ran;
	int activated;
  • 以下のような値を持つ
    意味
    -1TASK_UNINTERRUPTIBLE状態からの起床
    1TASK_INTERRUPTIBLE状態からの起床。プロセスが起床要求を出した
    2TASK_INTERRUPTIBLE状態からの起床。割り込み処理が起床要求を出した
	unsigned long policy;
  • スケジューリングポリシー
    スケジューリングポリシー
    SCHED_NORMAL0
    SCHED_FIFO1
    SCHED_RR2
	cpumask_t cpus_allowed;
  • 狙ったCPUにmigrateするため、これに2^nをいれてschedule()を呼び出すと、cpuid = nのCPUで動作するようになる
	unsigned int time_slice, first_time_slice;
  • time_slice--タイムスライス
  • first_time_slice--タイムスライスの初期値

#ifdef CONFIG_SCHEDSTATS

	struct sched_info sched_info;

#endif

	struct list_head tasks;
  • このタスクのスレッドグループリーダーのリストへのリンク
	/*
	 * ptrace_list/ptrace_children forms the list of my children
	 * that were stolen by a ptracer.
	 */
	struct list_head ptrace_children;
	struct list_head ptrace_list;
	struct mm_struct *mm, *active_mm;
  • mm--このタスクのメモリディスクリプタ
    • カーネルスレッドの場合は、常にNULLになる
  • active_mm--このタスクにマッピングされたメモリディスクリプタ
    • 通常のプロセスの場合はactive_mm==mmとなる
    • 詳細はmm_struct/linux2.6を参照

/* task state */

	struct linux_binfmt *binfmt;
	long exit_state;
	int exit_code, exit_signal;
	int pdeath_signal;  /*  The signal sent when the parent dies  */
	/* ??? */
	unsigned long personality;
	unsigned did_exec:1;
	pid_t pid;
  • PID
	pid_t tgid;
  • スレッドグループID
	/* 
	 * pointers to (original) parent process, youngest child, younger sibling,
	 * older sibling, respectively.  (p->father can be replaced with 
	 * p->parent->pid)
	 */
	struct task_struct *real_parent; /* real parent process (when being debugged) */
  • 本当の親タスク
    • トレースされている状態だと、'本当の親'はreal_parentになり、トレースしているタスクを'一時的な親'に設定される
    • トレースされていない状態だとparent==real_parent
	struct task_struct *parent;	/* parent process */
  • 一時的な親タスク
    • トレースされている状態だとトレースしているタスクを'一時的な親'に設定する
    • トレースされていない状態だとparent==real_parent
	/*
	 * children/sibling forms the list of my children plus the
	 * tasks I'm ptracing.
	 */
	struct list_head children;	/* list of my children */
	struct list_head sibling;	/* linkage in my parent's children list */
  • 同じ親を持つタスクリスト(つまり兄弟タスクのリスト)へのリンク
	struct task_struct *group_leader;	/* threadgroup leader */
  • スレッドグループリーダ
	/* PID/PID hash table linkage. */
	struct pid pids[PIDTYPE_MAX];
  • PIDの管理
	wait_queue_head_t wait_chldexit;	/* for wait4() */
	struct completion *vfork_done;		/* for vfork() */
	int __user *set_child_tid;		/* CLONE_CHILD_SETTID */
	int __user *clear_child_tid;		/* CLONE_CHILD_CLEARTID */
	unsigned long rt_priority;
  • リアルタイム優先度
	unsigned long it_real_value, it_prof_value, it_virt_value;
  • it_virt_value:タスクのユーザモードでの走行時間
  • it_prof_value:タスクの走行時間(ユーザモード、カーネルモードとも)を合計
  • it_real_value:リアルタイムタスクの走行時間
	unsigned long it_real_incr, it_prof_incr, it_virt_incr;
  • it_virt_incr:it_virt_valueが0になっとき、it_virt_valueに設定する値
  • it_prof_incr:it_prof_valueが0になっとき、it_prof_valueに設定する値
  • it_real_incr:it_real_valueが0になっとき、it_real_valueに設定する値
	struct timer_list real_timer;
	unsigned long utime, stime;
  • utime:ユーザ使用時間
  • stime:システム使用時間
	unsigned long nvcsw, nivcsw; /* context switch counts */
	struct timespec start_time;

/* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */

	unsigned long min_flt, maj_flt;
  • min_flt:副ページフォルト(minor fault)の発生回数
    • カレントプロセスがブロックされることなくページフォルトが処理できたことを意味する
  • maj_flt:主ページフォルト(major fault)の発生回数
    • カレントプロセスがブロックされるページフォルトを意味する
  • これらの情報はシステムの最適化時に用いられる

/* process credentials */

	uid_t uid,euid,suid,fsuid;
  • uid--実ユーザID
  • euid--実効ユーザID
  • suid--保存ユーザID
  • fsuid--ファイルシステムユーザID
	gid_t gid,egid,sgid,fsgid;
  • gid--実グループID
  • egid--実効グループID
  • sgid--保存グループID
  • fsgid--ファイルシステムグループID
	struct group_info *group_info;
	kernel_cap_t   cap_effective, cap_inheritable, cap_permitted;
  • cap_effective--実行ケーパビリティセット
  • cap_inheritable--継承可能ケーパビリティセット
  • cap_permitted--許可ケーパビリティセット
	unsigned keep_capabilities:1;
	struct user_struct *user;
  • ユーザーID

#ifdef CONFIG_KEYS

	struct key *session_keyring;	/* keyring inherited over fork */
	struct key *process_keyring;	/* keyring private to this process (CLONE_THREAD) */
	struct key *thread_keyring;	/* keyring private to this thread */

#endif

	unsigned short used_math;
	char comm[16];
  • 実行コマンド名

/* file system info */

	int link_count, total_link_count;

/* ipc stuff */

	struct sysv_sem sysvsem;

/* CPU-specific state of this task */

	struct thread_struct thread;

/* filesystem information */

	struct fs_struct *fs;

/* open file information */

	struct files_struct *files;
  • このタスクがオープンしているファイルを管理する

/* namespace */

	struct namespace *namespace;

/* signal handlers */

	struct signal_struct *signal;
	struct sighand_struct *sighand;
	sigset_t blocked, real_blocked;
  • blocked--シグナルマスク
  • real_blocked--現在のシグナルマスク
	struct sigpending pending;
  • シグナル配送待ちオブジェクト
    • 生成されて、配送待ちをしているシグナルを記述する。
    • シグナルはプロセスとスレッドグループに対して配送されるので、task_struct構造体pendingメンバーとsignalメンバーを持つ
    • 詳細はsigpending/linux2.6を参照
	unsigned long sas_ss_sp;
	size_t sas_ss_size;
	int (*notifier)(void *priv);
	void *notifier_data;
	sigset_t *notifier_mask;
	
	void *security;
	struct audit_context *audit_context;

/* Thread group tracking */

  	u32 parent_exec_id;
  	u32 self_exec_id;

/* Protection of (de-)allocation: mm, files, fs, tty, keyrings */

	spinlock_t alloc_lock;

/* Protection of proc_dentry: nesting proc_lock, dcache_lock, write_lock_irq(&tasklist_lock); */

	spinlock_t proc_lock;

/* context-switch lock */

	spinlock_t switch_lock;

/* journalling filesystem info */

	void *journal_info;

/* VM state */

	struct reclaim_state *reclaim_state;
	struct dentry *proc_dentry; 
	struct backing_dev_info *backing_dev_info;
	struct io_context *io_context;
	unsigned long ptrace_message;
	siginfo_t *last_siginfo; /* For ptrace use.  */

/*

* current io wait handle: wait queue entry to use for io waits
* If this thread is processing aio, this points at the waitqueue
* inside the currently handled kiocb. It may be NULL (i.e. default
* to a stack based synchronous wait) if its doing sync IO.
*/
	wait_queue_t *io_wait;

#ifdef CONFIG_NUMA

 	struct mempolicy *mempolicy;
 	short il_next;		/* could be shared with used_math */
  • mempolicy/linux2.6のポリシーにてノードインタリーブが指定されている場合、メモリを取得するノードのノード識別子が格納される

#endif

};

履歴

  • 作者:ひら
  • 日付:2005/1/21
  • 対象:2.6.10
    更新日更新者更新内容

コメント

  • 1 -- 1? 2015-06-04 (木) 00:04:54
  • 1 -- 1? 2015-06-04 (木) 00:05:01
  • 1 -- -1'? 2015-06-04 (木) 00:05:03
    • 1' -- 1? 2015-06-04 (木) 00:05:04
  • 1 -- 1? 2015-06-04 (木) 00:05:06
  • 1 -- 1? 2015-06-05 (金) 12:50:35
  • 1 -- -1'? 2015-06-05 (金) 12:50:36
    • 1' -- 1? 2015-06-05 (金) 12:50:37
  • 1 -- 1? 2015-06-05 (金) 12:50:39
  • 1 -- 1? 2015-06-11 (木) 06:20:47
  • 1 -- 1? 2015-06-11 (木) 06:20:54
  • 1 -- 1? 2015-06-11 (木) 06:20:57
  • 1 -- -1'? 2015-06-11 (木) 06:20:59
    • 1' -- 1? 2015-06-11 (木) 06:21:01
  • 1 -- 1? 2015-06-11 (木) 06:21:02
  • 1 -- 1? 2015-06-14 (日) 02:27:53
  • 1 -- 1? 2015-06-14 (日) 02:27:57
  • 1 -- -1'? 2015-06-14 (日) 02:27:59
    • 1' -- 1? 2015-06-14 (日) 02:28:01
  • 1 -- 1? 2015-06-14 (日) 02:28:03

  • 1 -- 1? 2015-06-14 (日) 02:27:56
  • 1 -- 1? 2015-06-11 (木) 06:20:56
  • 1 -- 1? 2015-06-05 (金) 12:50:32
  • 1 -- 1? 2015-06-04 (木) 00:05:00

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-06-14 (日) 02:28:04 (769d)