linux内核学习 进程表示

来源:互联网 发布:windows过期如何激活 编辑:程序博客网 时间:2024/04/20 18:14

稍微学习一下linux进程有关的东东,做一下记录

----------------------------------------------------------------------------

首先看一下进程表示的核心,task_struct结构体,进程管理的所有算法都是围绕此结构体展开的。

struct task_struct {volatile long state;/* -1 unrunnable, 0 runnable, >0 stopped */void *stack;atomic_t usage;unsigned int flags;/* per process flags, defined below */unsigned int ptrace;#ifdef CONFIG_SMPstruct llist_node wake_entry;int on_cpu;#endifint on_rq;int prio, static_prio, normal_prio;unsigned int rt_priority;const struct sched_class *sched_class;struct sched_entity se;struct sched_rt_entity rt;#ifdef CONFIG_CGROUP_SCHEDstruct task_group *sched_task_group;#endif#ifdef CONFIG_PREEMPT_NOTIFIERS/* list of struct preempt_notifier: */struct hlist_head preempt_notifiers;#endif/* * fpu_counter contains the number of consecutive context switches * that the FPU is used. If this is over a threshold, the lazy fpu * saving becomes unlazy to save the trap. This is an unsigned char * so that after 256 times the counter wraps and the behavior turns * lazy again; this to deal with bursty apps that only use FPU for * a short time */unsigned char fpu_counter;#ifdef CONFIG_BLK_DEV_IO_TRACEunsigned int btrace_seq;#endifunsigned int policy;int nr_cpus_allowed;cpumask_t cpus_allowed;#ifdef CONFIG_PREEMPT_RCUint rcu_read_lock_nesting;char rcu_read_unlock_special;struct list_head rcu_node_entry;#endif /* #ifdef CONFIG_PREEMPT_RCU */#ifdef CONFIG_TREE_PREEMPT_RCUstruct rcu_node *rcu_blocked_node;#endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */#ifdef CONFIG_RCU_BOOSTstruct rt_mutex *rcu_boost_mutex;#endif /* #ifdef CONFIG_RCU_BOOST */#if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)struct sched_info sched_info;#endifstruct list_head tasks;#ifdef CONFIG_SMPstruct plist_node pushable_tasks;#endifstruct mm_struct *mm, *active_mm;#ifdef CONFIG_COMPAT_BRKunsigned brk_randomized:1;#endif#if defined(SPLIT_RSS_COUNTING)struct task_rss_statrss_stat;#endif/* task state */int exit_state;int exit_code, exit_signal;int pdeath_signal;  /*  The signal sent when the parent dies  */unsigned int jobctl;/* JOBCTL_*, siglock protected *//* ??? */unsigned int personality;unsigned did_exec:1;unsigned in_execve:1;/* Tell the LSMs that the process is doing an * execve */unsigned in_iowait:1;/* task may not gain privileges */unsigned no_new_privs:1;/* Revert to default priority/policy when forking */unsigned sched_reset_on_fork:1;unsigned sched_contributes_to_load:1;pid_t pid;pid_t tgid;#ifdef CONFIG_CC_STACKPROTECTOR/* Canary value for the -fstack-protector gcc feature */unsigned long stack_canary;#endif/* * pointers to (original) parent process, youngest child, younger sibling, * older sibling, respectively.  (p->father can be replaced with * p->real_parent->pid) */struct task_struct __rcu *real_parent; /* real parent process */struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports *//* * children/sibling forms the list of my natural children */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 *//* * ptraced is the list of tasks this task is using ptrace on. * This includes both natural children and PTRACE_ATTACH targets. * p->ptrace_entry is p's link on the p->parent->ptraced list. */struct list_head ptraced;struct list_head ptrace_entry;/* PID/PID hash table linkage. */struct pid_link pids[PIDTYPE_MAX];struct list_head thread_group;struct completion *vfork_done;/* for vfork() */int __user *set_child_tid;/* CLONE_CHILD_SETTID */int __user *clear_child_tid;/* CLONE_CHILD_CLEARTID */cputime_t utime, stime, utimescaled, stimescaled;cputime_t gtime;#ifndef CONFIG_VIRT_CPU_ACCOUNTINGstruct cputime prev_cputime;#endif#ifdef CONFIG_VIRT_CPU_ACCOUNTING_GENseqlock_t vtime_seqlock;unsigned long long vtime_snap;enum {VTIME_SLEEPING = 0,VTIME_USER,VTIME_SYS,} vtime_snap_whence;#endifunsigned long nvcsw, nivcsw; /* context switch counts */struct timespec start_time; /* monotonic time */struct timespec real_start_time;/* boot based time *//* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */unsigned long min_flt, maj_flt;struct task_cputime cputime_expires;struct list_head cpu_timers[3];/* process credentials */const struct cred __rcu *real_cred; /* objective and real subjective task * credentials (COW) */const struct cred __rcu *cred;/* effective (overridable) subjective task * credentials (COW) */char comm[TASK_COMM_LEN]; /* executable name excluding path     - access with [gs]et_task_comm (which lock       it with task_lock())     - initialized normally by setup_new_exec *//* file system info */int link_count, total_link_count;#ifdef CONFIG_SYSVIPC/* ipc stuff */struct sysv_sem sysvsem;#endif#ifdef CONFIG_DETECT_HUNG_TASK/* hung task detection */unsigned long last_switch_count;#endif/* CPU-specific state of this task */struct thread_struct thread;/* filesystem information */struct fs_struct *fs;/* open file information */struct files_struct *files;/* namespaces */struct nsproxy *nsproxy;/* signal handlers */struct signal_struct *signal;struct sighand_struct *sighand;sigset_t blocked, real_blocked;sigset_t saved_sigmask;/* restored if set_restore_sigmask() was used */struct sigpending pending;unsigned long sas_ss_sp;size_t sas_ss_size;int (*notifier)(void *priv);void *notifier_data;sigset_t *notifier_mask;struct callback_head *task_works;struct audit_context *audit_context;#ifdef CONFIG_AUDITSYSCALLkuid_t loginuid;unsigned int sessionid;#endifstruct seccomp seccomp;/* Thread group tracking */   u32 parent_exec_id;   u32 self_exec_id;/* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed, * mempolicy */spinlock_t alloc_lock;/* Protection of the PI data structures: */raw_spinlock_t pi_lock;#ifdef CONFIG_RT_MUTEXES/* PI waiters blocked on a rt_mutex held by this task */struct plist_head pi_waiters;/* Deadlock detection and priority inheritance handling */struct rt_mutex_waiter *pi_blocked_on;#endif#ifdef CONFIG_DEBUG_MUTEXES/* mutex deadlock detection */struct mutex_waiter *blocked_on;#endif#ifdef CONFIG_TRACE_IRQFLAGSunsigned int irq_events;unsigned long hardirq_enable_ip;unsigned long hardirq_disable_ip;unsigned int hardirq_enable_event;unsigned int hardirq_disable_event;int hardirqs_enabled;int hardirq_context;unsigned long softirq_disable_ip;unsigned long softirq_enable_ip;unsigned int softirq_disable_event;unsigned int softirq_enable_event;int softirqs_enabled;int softirq_context;#endif#ifdef CONFIG_LOCKDEP# define MAX_LOCK_DEPTH 48ULu64 curr_chain_key;int lockdep_depth;unsigned int lockdep_recursion;struct held_lock held_locks[MAX_LOCK_DEPTH];gfp_t lockdep_reclaim_gfp;#endif/* journalling filesystem info */void *journal_info;/* stacked block device info */struct bio_list *bio_list;#ifdef CONFIG_BLOCK/* stack plugging */struct blk_plug *plug;#endif/* VM state */struct reclaim_state *reclaim_state;struct backing_dev_info *backing_dev_info;struct io_context *io_context;unsigned long ptrace_message;siginfo_t *last_siginfo; /* For ptrace use.  */struct task_io_accounting ioac;#if defined(CONFIG_TASK_XACCT)u64 acct_rss_mem1;/* accumulated rss usage */u64 acct_vm_mem1;/* accumulated virtual memory usage */cputime_t acct_timexpd;/* stime + utime since last update */#endif#ifdef CONFIG_CPUSETSnodemask_t mems_allowed;/* Protected by alloc_lock */seqcount_t mems_allowed_seq;/* Seqence no to catch updates */int cpuset_mem_spread_rotor;int cpuset_slab_spread_rotor;#endif#ifdef CONFIG_CGROUPS/* Control Group info protected by css_set_lock */struct css_set __rcu *cgroups;/* cg_list protected by css_set_lock and tsk->alloc_lock */struct list_head cg_list;#endif#ifdef CONFIG_FUTEXstruct robust_list_head __user *robust_list;#ifdef CONFIG_COMPATstruct compat_robust_list_head __user *compat_robust_list;#endifstruct list_head pi_state_list;struct futex_pi_state *pi_state_cache;#endif#ifdef CONFIG_PERF_EVENTSstruct perf_event_context *perf_event_ctxp[perf_nr_task_contexts];struct mutex perf_event_mutex;struct list_head perf_event_list;#endif#ifdef CONFIG_NUMAstruct mempolicy *mempolicy;/* Protected by alloc_lock */short il_next;short pref_node_fork;#endif#ifdef CONFIG_NUMA_BALANCINGint numa_scan_seq;int numa_migrate_seq;unsigned int numa_scan_period;u64 node_stamp;/* migration stamp  */struct callback_head numa_work;#endif /* CONFIG_NUMA_BALANCING */struct rcu_head rcu;/* * cache last used pipe for splice */struct pipe_inode_info *splice_pipe;struct page_frag task_frag;#ifdefCONFIG_TASK_DELAY_ACCTstruct task_delay_info *delays;#endif#ifdef CONFIG_FAULT_INJECTIONint make_it_fail;#endif/* * when (nr_dirtied >= nr_dirtied_pause), it's time to call * balance_dirty_pages() for some dirty throttling pause */int nr_dirtied;int nr_dirtied_pause;unsigned long dirty_paused_when; /* start of a write-and-pause period */#ifdef CONFIG_LATENCYTOPint latency_record_count;struct latency_record latency_record[LT_SAVECOUNT];#endif/* * time slack values; these are used to round up poll() and * select() etc timeout values. These are in nanoseconds. */unsigned long timer_slack_ns;unsigned long default_timer_slack_ns;#ifdef CONFIG_FUNCTION_GRAPH_TRACER/* Index of current stored address in ret_stack */int curr_ret_stack;/* Stack of return addresses for return function tracing */struct ftrace_ret_stack*ret_stack;/* time stamp for last schedule */unsigned long long ftrace_timestamp;/* * Number of functions that haven't been traced * because of depth overrun. */atomic_t trace_overrun;/* Pause for the tracing */atomic_t tracing_graph_pause;#endif#ifdef CONFIG_TRACING/* state flags for use by tracers */unsigned long trace;/* bitmask and counter of trace recursion */unsigned long trace_recursion;#endif /* CONFIG_TRACING */#ifdef CONFIG_MEMCG /* memcg uses this to do batch job */struct memcg_batch_info {int do_batch;/* incremented when batch uncharge started */struct mem_cgroup *memcg; /* target memcg of uncharge */unsigned long nr_pages;/* uncharged usage */unsigned long memsw_nr_pages; /* uncharged mem+swap usage */} memcg_batch;unsigned int memcg_kmem_skip_account;#endif#ifdef CONFIG_HAVE_HW_BREAKPOINTatomic_t ptrace_bp_refcnt;#endif#ifdef CONFIG_UPROBESstruct uprobe_task *utask;#endif};
好吧,这是目前我见过的最长的结构体,貌似内容很多的样子,我们先分解一下:

1、状态和执行信息。
2、已经分配到的虚拟内存信息。
3、进程身份标识符,各类ID。
4、使用的文件。
5、线程信息,记录该进程特定与CPU的运行时间数据。
6、进程见通信信息。
7、进程私有的信号处理程序。


看一些比较重要的结构体成员。

1、进程当前的状态

volatile long state;/* -1 unrunnable, 0 runnable, >0 stopped */
此变量可以使用以下值:
#define TASK_RUNNING0//进程处于可运行状态,并不意味着已经分配到了CPU。#define TASK_INTERRUPTIBLE1//针对等待某事件或资源的睡眠进程设置的。#define TASK_UNINTERRUPTIBLE2//由内核指示而停用的睡眠进程。只能由内核亲自唤醒。#define __TASK_STOPPED4//进程特意停止运行。(比如调试)#define __TASK_TRACED8//用于区分被调试和常规进程。



原创粉丝点击