Linux:浅谈tack_struct

来源:互联网 发布:服装店记账软件 编辑:程序博客网 时间:2024/06/05 16:51

进程的概念:

OS:程序的一个执行实例。正在执行的程序,能分配处理器并由处理器执行的实体。
内核:但当分配系统资源的实体。
进程的两个基本元素是程序代码和代码相连的数据集。进程是一种动态描述,但并不代表所有进程都在运行。

进程描述:

每个进程在内核中都有⼀一个进程控制块(PCB)来维护进程相关的信息,Linux内核的
进程控制块是task_struct结构体。现在我们全⾯面了解⼀一下其中都有哪些信息。
task_struct
{
标示符 : 描述本进程的唯⼀一标⽰示符,⽤用来区别其他进程。
状态 :任务状态,退出代码,退出信号等。
优先级 :相对于其他进程的优先级。
程序计数器:程序中即将被执⾏行的下⼀一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下⽂文数据:进程执⾏行时处理器的寄存器中的数据。
I/O状态信息:包括显⽰示的I/O请求,分配给进程的I/O设备和被进程使⽤用的⽂文件列表。
记账信息:可能包括处理器时间总和,使⽤用的时钟数总和,时间限制,记账号等。
}
以结构体形式展示,并且保存在include/linux/sched.h中,可以用vim打开进行阅读,分析。所有运行在系统的进程都以task_struct链表形式存在内核里。
进程的信息可以通过/pro系统文件查看,要获得PID为400的进程信息,则为/proc/400,当然大多数进程可以使用top和ps这些工具获得。

如何找到tack_struct:

在超级用户下,输入:
vim /usr/src/kernels/2.6.32-431.el6.i686/include/linux/sched.h
就可以打开sched.h文件
这里写图片描述
内容还是比较多的,不过都有注释进行讲解,下面我将库中的描述附于下方:

struct task_struct {  /*调度数据成员---------------------------------------------------------------------*/      volatile long state;  //进程运行时状态/* -1 就绪, 0 运行, >0 停止 */      void *stack;        atomic_t usage;  //有几个进程正在使用此结构      unsigned int flags; //每个进程的标志,在下面定义      unsigned int ptrace;      int lock_depth;     //锁的深度  #ifdef CONFIG_SMP  #ifdef __ARCH_WANT_UNLOCKED_CTXSW      int oncpu;  #endif  #endif      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_PREEMPT_NOTIFIERS      //有限占有链表      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_TRACE      unsigned int btrace_seq;  #endif      unsigned int policy;//进程调度策略      cpumask_t cpus_allowed;  #ifdef CONFIG_TREE_PREEMPT_RCU      int rcu_read_lock_nesting;      char rcu_read_unlock_special;      struct rcu_node *rcu_blocked_node;      struct list_head rcu_node_entry;  #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */  #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)      struct sched_info sched_info;  #endif      struct list_head tasks;      struct plist_node pushable_tasks;      //进程的内存描述符,链表和红黑树。      struct mm_struct *mm, *active_mm;   /* task state */        //进程状态参数      int exit_state;      //退出码 信号处理      int exit_code, exit_signal;      //父进程终止时发送信号      int pdeath_signal;  /*  The signal sent when the parent dies  */      /* ??? */      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;      /* Revert to default priority/policy when forking */      unsigned sched_reset_on_fork:1;      pid_t pid;//进程号 gitpid()       pid_t tgid;//进程组号  gitppid()   #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 *real_parent; //初始父进程      struct task_struct *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. */      //PID与PID散列表的联系      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 */      //utime在用户态下执行的时间      //stime在内核执行的时间      cputime_t utime, stime, utimescaled, stimescaled;      cputime_t gtime;      cputime_t prev_utime, prev_stime;      //上下文切换计数      unsigned 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 *real_cred;   /* objective and real subjective task                       * credentials (COW) */      const struct cred *cred;    /* effective (overridable) subjective task                       * credentials (COW) */      struct mutex cred_guard_mutex;  /* guard against foreign influences on                       * credential calculations                       * (notably. ptrace) */      struct cred *replacement_session_keyring; /* for KEYCTL_SESSION_TO_PARENT */      //去除路径后的可执行文件名称, TASK_COMM_LEN长度为len      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 */      //该进程在特定CPU下的状态      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 audit_context *audit_context;  #ifdef CONFIG_AUDITSYSCALL      uid_t loginuid;      unsigned int sessionid;  #endif      seccomp_t seccomp;  #ifdef CONFIG_UTRACE      struct utrace *utrace;      unsigned long utrace_flags;  #endif  /* 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;  #ifdef CONFIG_GENERIC_HARDIRQS      /* IRQ handler threads */      struct irqaction *irqaction;  #endif      /* Protection of the PI data structures: */      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_IRQFLAGS      unsigned int irq_events;      int hardirqs_enabled;      unsigned long hardirq_enable_ip;      unsigned int hardirq_enable_event;      unsigned long hardirq_disable_ip;      unsigned int hardirq_disable_event;      int softirqs_enabled;      unsigned long softirq_disable_ip;      unsigned int softirq_disable_event;      unsigned long softirq_enable_ip;      unsigned int softirq_enable_event;      int hardirq_context;      int softirq_context;  #endif  #ifdef CONFIG_LOCKDEP  # define MAX_LOCK_DEPTH 48UL      u64 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 *bio_list, **bio_tail;  /* 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_CPUSETS      nodemask_t mems_allowed;    /* Protected by alloc_lock */  #ifndef __GENKSYMS__      /*       * This does not change the size of the struct_task(2+2+4=4+4)       * so the offsets of the remaining fields are unchanged and        * therefore the kABI is preserved.  Only the kernel uses       * cpuset_mem_spread_rotor and cpuset_slab_spread_rotor so       * it is safe to change it to use shorts instead of ints.       */         unsigned short cpuset_mem_spread_rotor;      unsigned short cpuset_slab_spread_rotor;      int mems_allowed_change_disable;  #else      int cpuset_mem_spread_rotor;      int cpuset_slab_spread_rotor;  #endif  #endif  #ifdef CONFIG_CGROUPS      /* Control Group info protected by css_set_lock */      struct css_set *cgroups;      /* cg_list protected by css_set_lock and tsk->alloc_lock */      struct list_head cg_list;  #endif  #ifdef CONFIG_FUTEX      struct robust_list_head __user *robust_list;  #ifdef CONFIG_COMPAT      struct compat_robust_list_head __user *compat_robust_list;  #endif      struct list_head pi_state_list;      struct futex_pi_state *pi_state_cache;  #endif  #ifdef CONFIG_PERF_EVENTS  #ifndef __GENKSYMS__      void * __reserved_perf__;  #else      struct perf_event_context *perf_event_ctxp;  #endif      struct mutex perf_event_mutex;      struct list_head perf_event_list;  #endif  #ifdef CONFIG_NUMA      struct mempolicy *mempolicy;    /* Protected by alloc_lock */      short il_next;  #endif      atomic_t fs_excl;   /* holding fs exclusive resources */      struct rcu_head rcu;      /*       * cache last used pipe for splice       */      struct pipe_inode_info *splice_pipe;  #ifdef  CONFIG_TASK_DELAY_ACCT      struct task_delay_info *delays;  #endif  #ifdef CONFIG_FAULT_INJECTION      int make_it_fail;  #endif      struct prop_local_single dirties;  #ifdef CONFIG_LATENCYTOP      int 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.       */      //松弛时间道,用来规定select()和poll()的超时时间,单位是纳秒      unsigned long timer_slack_ns;      unsigned long default_timer_slack_ns;      struct list_head    *scm_work_list;  #ifdef CONFIG_FUNCTION_GRAPH_TRACER      /* Index of current stored adress 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 of trace recursion */      unsigned long trace_recursion;  #endif /* CONFIG_TRACING */      /* reserved for Red Hat */      unsigned long rh_reserved[2];  #ifndef __GENKSYMS__      struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts];  #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* 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 bytes;        /* uncharged usage */          unsigned long memsw_bytes; /* uncharged mem+swap usage */      } memcg_batch;  #endif  #endif  };  
0 0
原创粉丝点击