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 };
- Linux:浅谈tack_struct
- 【Linux】进程控制块PCD结构(tack_struct)
- 浅谈linux
- 浅谈LINUX
- 浅谈Linux
- 浅谈Linux
- 浅谈如何学习linux
- 浅谈如何学习linux
- 浅谈如何学习Linux
- 浅谈如何学习linux
- 浅谈如何学习linux
- 浅谈如何学习linux
- 浅谈Linux的文件系统
- 浅谈如何学习linux
- 浅谈如何学习linux
- 浅谈如何学习linux
- 浅谈linux安全配置
- linux 内存管理浅谈
- java开发中的23种设计模式
- web.config中配置数据库连接的两种方式
- canvas 画图
- Https的交互流程
- 记录自已学习之ARM汇编语言ldr和str
- Linux:浅谈tack_struct
- 欢迎使用CSDN-markdown编辑器
- poj 1985 Cow Marathon 树的直径
- Linux系统:ls命令(学习记录)
- SSL/TLS的Handshake过程与javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure异常
- 三分相关
- 在Java中直接调用js代码
- C++之多态性与虚函数
- LeetCode 146 LRUCache Python题解