爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Linux源码阅读笔记02-进程原理及系统调用

      首页 知识中心 软件开发 文章详情页

      Linux源码阅读笔记02-进程原理及系统调用

      2024-12-05 08:49:45 阅读次数:23

      Linux,优先级,内核,状态,线程,进程

      进程和进程的生命周期

      • 进程:指计算机中已运行的程序。进程本身不是基本的运行单位,而是线程的容器。程序本身不是基本的运行单位,而是线程的容器。程序是指令、数据和组织形式的描述,进程才是程序的真正运行实例。
      • Linux内核把进程叫做Task,进程的虚拟地址空间可分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,每个进程有独立的用户虚拟地址空间。

      进程的两种特殊形式

      1. 没有用户虚拟地址空间的进程叫做内核线程
      2. 共享用户虚拟地址空间的进程叫做用户线程
      3. 共享同一个用户虚拟地址空间的所有用户线程叫做线程组
      C语言标准库进程 Linux内核进程
      包括多个线程的进程 线程组
      一个线程的进程 进程或者任务
      线程 共享用户虚拟地址的空间的进程

      Linux源码阅读笔记02-进程原理及系统调用

      Linux通过:ps输出当前系统的进程状态。显示瞬间进程状态,不是动态连续;如果想动态连续,使用top命令。

      • USER:使用者
      • PID:进程编号
      • VSZ:进程占用的虚拟内存容量(KB)
      • RSS:进程占用的固定内存量是多少
      • TTY:在哪个终端运行
      • STAT:程序目前状态
        • S:睡眠状态,但是基于唤醒
        • R:在运行

      进程的生命周期

      • 进程状态

        • 创建状态
        • 就绪状态
        • 执行状态
        • 阻塞状态
        • 终止状态

        Linux源码阅读笔记02-进程原理及系统调用

        • Linux内核提供API设置进程状态
          • TASK_RUNNING:运行态或者就绪态,在内核中时运行态和就绪态的集合;
          • TASK_INterRUPTIBLE:可中断睡眠状态(又叫浅睡眠状态),进程阻塞时如果条件满足,内核就将进程状态该问RUN状态,加入就绪队列;
          • TASK_UNINTERRUPTIBLE:不可中断状态(又叫深度睡眠状态),进程在睡眠不被干扰,我们可以通过ps命令查看被标记为D得到进程就是不可中断状态进程;
          • __TASK_STOPPED:终止状态;
          • EXIT_ZOMBIE:僵尸状态

      task_struct数据结构分析

      将进程抽象为进程控制块(PCB,Process Control BLock),Linux内核中使用task_struct结构描述进程控制块。

      Linux内核进程描述符(控制块)task_struct核心成员分析

      // 进程控制块
      struct task_struct {
      #ifdef CONFIG_THREAD_INFO_IN_TASK
      	/*
      	 * For reasons of header soup (see current_thread_info()), this
      	 * must be the first element of task_struct.
      	 */
      	struct thread_info		thread_info;
      #endif
      	/* -1 unrunnable, 0 runnable, >0 stopped: */
      	volatile long			state; // 进程状态标志
      
      	/*
      	 * This begins the randomizable portion of task_struct. Only
      	 * scheduling-critical items should be added above here.
      	 */
      	randomized_struct_fields_start
      
      	void				*stack; // 纸箱内核栈
      	refcount_t			usage;
      	/* Per task flags (PF_*), defined further below: */
      	unsigned int			flags;
      	unsigned int			ptrace;
      
      #ifdef CONFIG_SMP
      	struct llist_node		wake_entry;
      	int				on_cpu;
      #ifdef CONFIG_THREAD_INFO_IN_TASK
      	/* Current CPU: */
      	unsigned int			cpu;
      #endif
      	unsigned int			wakee_flips;
      	unsigned long			wakee_flip_decay_ts;
      	struct task_struct		*last_wakee;
      
      	/*
      	 * recent_used_cpu is initially set as the last CPU used by a task
      	 * that wakes affine another task. Waker/wakee relationships can
      	 * push tasks around a CPU where each wakeup moves to the next one.
      	 * Tracking a recently used CPU allows a quick search for a recently
      	 * used CPU that may be idle.
      	 */
      	int				recent_used_cpu;
      	int				wake_cpu;
      #endif
      	int				on_rq;
      
      	/*调度策略和优先级*/
      	int				prio;
      	int				static_prio;
      	int				normal_prio;
      	unsigned int			rt_priority;
      
      	const struct sched_class	*sched_class;
      	struct sched_entity		se;
      	struct sched_rt_entity		rt;
      #ifdef CONFIG_CGROUP_SCHED
      	struct task_group		*sched_task_group;
      #endif
      	struct sched_dl_entity		dl;
      
      #ifdef CONFIG_UCLAMP_TASK
      	/* Clamp values requested for a scheduling entity */
      	struct uclamp_se		uclamp_req[UCLAMP_CNT];
      	/* Effective clamp values used for a scheduling entity */
      	struct uclamp_se		uclamp[UCLAMP_CNT];
      #endif
      
      #ifdef CONFIG_PREEMPT_NOTIFIERS
      	/* List of struct preempt_notifier: */
      	struct hlist_head		preempt_notifiers;
      #endif
      
      #ifdef CONFIG_BLK_DEV_IO_TRACE
      	unsigned int			btrace_seq;
      #endif
      
      	unsigned int			policy;
      	int				nr_cpus_allowed; // 
      	const cpumask_t			*cpus_ptr; // 此成员允许进程在哪个cpu上运行
      	cpumask_t			cpus_mask;
      
      #ifdef CONFIG_PREEMPT_RCU
      	int				rcu_read_lock_nesting;
      	union rcu_special		rcu_read_unlock_special;
      	struct list_head		rcu_node_entry;
      	struct rcu_node			*rcu_blocked_node;
      #endif /* #ifdef CONFIG_PREEMPT_RCU */
      
      #ifdef CONFIG_TASKS_RCU
      	unsigned long			rcu_tasks_nvcsw;
      	u8				rcu_tasks_holdout;
      	u8				rcu_tasks_idx;
      	int				rcu_tasks_idle_cpu;
      	struct list_head		rcu_tasks_holdout_list;
      #endif /* #ifdef CONFIG_TASKS_RCU */
      
      	struct sched_info		sched_info;
      
      	struct list_head		tasks;
      #ifdef CONFIG_SMP
      	struct plist_node		pushable_tasks;
      	struct rb_node			pushable_dl_tasks;
      #endif
      
      	// 指向内存描述符。进程:mm和active_mm指向同一个内存描述符。内核线程:mm是空指针
      	// 当内核线程运行时,active_mm指向从进程借用内存描述符
      	struct mm_struct		*mm;
      	struct mm_struct		*active_mm; 
      
      	/* Per-thread vma caching: */
      	struct vmacache			vmacache;
      
      #ifdef SPLIT_RSS_COUNTING
      	struct task_rss_stat		rss_stat;
      #endif
      	int				exit_state;
      	int				exit_code;
      	int				exit_signal;
      	/* The signal sent when the parent dies: */
      	int				pdeath_signal;
      	/* JOBCTL_*, siglock protected: */
      	unsigned long			jobctl;
      
      	/* Used for emulating ABI behavior of previous Linux versions: */
      	unsigned int			personality;
      
      	/* Scheduler bits, serialized by scheduler locks: */
      	unsigned			sched_reset_on_fork:1;
      	unsigned			sched_contributes_to_load:1;
      	unsigned			sched_migrated:1;
      	unsigned			sched_remote_wakeup:1;
      #ifdef CONFIG_PSI
      	unsigned			sched_psi_wake_requeue:1;
      #endif
      
      	/* Force alignment to the next boundary: */
      	unsigned			:0;
      
      	/* Unserialized, strictly 'current' */
      
      	/* Bit to tell LSMs we're in execve(): */
      	unsigned			in_execve:1;
      	unsigned			in_iowait:1;
      #ifndef TIF_RESTORE_SIGMASK
      	unsigned			restore_sigmask:1;
      #endif
      #ifdef CONFIG_MEMCG
      	unsigned			in_user_fault:1;
      #endif
      #ifdef CONFIG_COMPAT_BRK
      	unsigned			brk_randomized:1;
      #endif
      #ifdef CONFIG_CGROUPS
      	/* disallow userland-initiated cgroup migration */
      	unsigned			no_cgroup_migration:1;
      	/* task is frozen/stopped (used by the cgroup freezer) */
      	unsigned			frozen:1;
      #endif
      #ifdef CONFIG_BLK_CGROUP
      	/* to be used once the psi infrastructure lands upstream. */
      	unsigned			use_memdelay:1;
      #endif
      
      	unsigned long			atomic_flags; /* Flags requiring atomic access. */
      
      	struct restart_block		restart_block;
      
      	pid_t				pid; // 全局进程号
      	pid_t				tgid; // 全局线程组的标识符
      
      #ifdef CONFIG_STACKPROTECTOR
      	/* Canary value for the -fstack-protector GCC feature: */
      	unsigned long			stack_canary;
      #endif
      	/*
      	 * Pointers to the (original) parent process, youngest child, younger sibling,
      	 * older sibling, respectively.  (p->father can be replaced with
      	 * p->real_parent->pid)
      	 */
      
      	/* Real parent process: */
      	struct task_struct __rcu	*real_parent; // 指向真实父进程
      
      	/* Recipient of SIGCHLD, wait4() reports: */
      	struct task_struct __rcu	*parent; // 指向父进程 如果使用系统调用跟踪进程,这个是跟踪进程,否则和real_parent是相同的
      
      	/*
      	 * Children/sibling form the list of natural children:
      	 */
      	struct list_head		children;
      	struct list_head		sibling;
      	struct task_struct		*group_leader; // 指向线程组的组长
      
      	/*
      	 * 'ptraced' is the list of tasks this task is using ptrace() on.
      	 *
      	 * This includes both natural children and PTRACE_ATTACH targets.
      	 * 'ptrace_entry' is this task's link on the p->parent->ptraced list.
      	 */
      	struct list_head		ptraced;
      	struct list_head		ptrace_entry;
      
      	/* PID/PID hash table linkage. */
      	struct pid			*thread_pid;
      	struct hlist_node		pid_links[PIDTYPE_MAX]; // 进程号,进程组标识符和会话标识符
      	struct list_head		thread_group;
      	struct list_head		thread_node;
      
      	struct completion		*vfork_done;
      
      	/* CLONE_CHILD_SETTID: */
      	int __user			*set_child_tid;
      
      	/* CLONE_CHILD_CLEARTID: */
      	int __user			*clear_child_tid;
      
      	u64				utime;
      	u64				stime;
      #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
      	u64				utimescaled;
      	u64				stimescaled;
      #endif
      	u64				gtime;
      	struct prev_cputime		prev_cputime;
      #ifdef CONFIG_VIRT_CPU_ACCOUNTING_GEN
      	struct vtime			vtime;
      #endif
      
      #ifdef CONFIG_NO_HZ_FULL
      	atomic_t			tick_dep_mask;
      #endif
      	/* Context switch counts: */
      	unsigned long			nvcsw;
      	unsigned long			nivcsw;
      
      	/* Monotonic time in nsecs: */
      	u64				start_time;
      
      	/* Boot based time in nsecs: */
      	u64				start_boottime;
      
      	/* MM fault and swap info: this can arguably be seen as either mm-specific or thread-specific: */
      	unsigned long			min_flt;
      	unsigned long			maj_flt;
      
      	/* Empty if CONFIG_POSIX_CPUTIMERS=n */
      	struct posix_cputimers		posix_cputimers;
      
      	/* Process credentials: */
      
      	/* Tracer's credentials at attach: */
      	const struct cred __rcu		*ptracer_cred;
      
      	/* Objective and real subjective task credentials (COW): */
      	const struct cred __rcu		*real_cred; // 此成员指向主体和真实客体证书
      
      	/* Effective (overridable) subjective task credentials (COW): */
      	const struct cred __rcu		*cred; // 指向有效证书 但是可以临时改变
      
      #ifdef CONFIG_KEYS
      	/* Cached requested key. */
      	struct key			*cached_requested_key;
      #endif
      
      	/*
      	 * executable name, excluding path.
      	 *
      	 * - normally initialized setup_new_exec()
      	 * - access it with [gs]et_task_comm()
      	 * - lock it with task_lock()
      	 */
      	char				comm[TASK_COMM_LEN]; // 进程名称
      
      	struct nameidata		*nameidata;
      
      	// 下面这两个成员用于UNIX系统,型号量和共享内存
      #ifdef CONFIG_SYSVIPC
      	struct sysv_sem			sysvsem;
      	struct sysv_shm			sysvshm;
      #endif
      #ifdef CONFIG_DETECT_HUNG_TASK
      	unsigned long			last_switch_count;
      	unsigned long			last_switch_time;
      #endif
      	/* 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 __rcu		*sighand;
      	sigset_t			blocked;
      	sigset_t			real_blocked;
      	/* Restored if set_restore_sigmask() was used: */
      	sigset_t			saved_sigmask;
      	struct sigpending		pending;
      
      
      
      
      	unsigned long			sas_ss_sp;
      	size_t				sas_ss_size;
      	unsigned int			sas_ss_flags;
      
      	struct callback_head		*task_works;
      
      #ifdef CONFIG_AUDIT
      #ifdef CONFIG_AUDITSYSCALL
      	struct audit_context		*audit_context;
      #endif
      	kuid_t				loginuid;
      	unsigned int			sessionid;
      #endif
      	struct seccomp			seccomp;
      
      	/* Thread group tracking: */
      	u64				parent_exec_id;
      	u64				self_exec_id;
      
      	/* Protection against (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;
      
      	struct wake_q_node		wake_q;
      
      #ifdef CONFIG_RT_MUTEXES
      	/* PI waiters blocked on a rt_mutex held by this task: */
      	struct rb_root_cached		pi_waiters;
      	/* Updated under owner's pi_lock and rq lock */
      	struct task_struct		*pi_top_task;
      	/* 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_DEBUG_ATOMIC_SLEEP
      	int				non_block_count;
      #endif
      
      #ifdef CONFIG_TRACE_IRQFLAGS
      	unsigned 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			48UL
      	u64				curr_chain_key;
      	int				lockdep_depth;
      	unsigned int			lockdep_recursion;
      	struct held_lock		held_locks[MAX_LOCK_DEPTH];
      #endif
      
      #ifdef CONFIG_UBSAN
      	unsigned int			in_ubsan;
      #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;
      
      #ifdef CONFIG_COMPACTION
      	struct capture_control		*capture_control;
      #endif
      	/* Ptrace state: */
      	unsigned long			ptrace_message;
      	kernel_siginfo_t		*last_siginfo;
      
      	struct task_io_accounting	ioac;
      #ifdef CONFIG_PSI
      	/* Pressure stall state */
      	unsigned int			psi_flags;
      #endif
      #ifdef CONFIG_TASK_XACCT
      	/* Accumulated RSS usage: */
      	u64				acct_rss_mem1;
      	/* Accumulated virtual memory usage: */
      	u64				acct_vm_mem1;
      	/* stime + utime since last update: */
      	u64				acct_timexpd;
      #endif
      #ifdef CONFIG_CPUSETS
      	/* Protected by ->alloc_lock: */
      	nodemask_t			mems_allowed;
      	/* Seqence number to catch updates: */
      	seqcount_t			mems_allowed_seq;
      	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_X86_CPU_RESCTRL
      	u32				closid;
      	u32				rmid;
      #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;
      	struct mutex			futex_exit_mutex;
      	unsigned int			futex_state;
      #endif
      #ifdef CONFIG_PERF_EVENTS
      	struct perf_event_context	*perf_event_ctxp[perf_nr_task_contexts];
      	struct mutex			perf_event_mutex;
      	struct list_head		perf_event_list;
      #endif
      #ifdef CONFIG_DEBUG_PREEMPT
      	unsigned long			preempt_disable_ip;
      #endif
      #ifdef CONFIG_NUMA
      	/* Protected by alloc_lock: */
      	struct mempolicy		*mempolicy;
      	short				il_prev;
      	short				pref_node_fork;
      #endif
      #ifdef CONFIG_NUMA_BALANCING
      	int				numa_scan_seq;
      	unsigned int			numa_scan_period;
      	unsigned int			numa_scan_period_max;
      	int				numa_preferred_nid;
      	unsigned long			numa_migrate_retry;
      	/* Migration stamp: */
      	u64				node_stamp;
      	u64				last_task_numa_placement;
      	u64				last_sum_exec_runtime;
      	struct callback_head		numa_work;
      
      	/*
      	 * This pointer is only modified for current in syscall and
      	 * pagefault context (and for tasks being destroyed), so it can be read
      	 * from any of the following contexts:
      	 *  - RCU read-side critical section
      	 *  - current->numa_group from everywhere
      	 *  - task's runqueue locked, task not running
      	 */
      	struct numa_group __rcu		*numa_group;
      
      	/*
      	 * numa_faults is an array split into four regions:
      	 * faults_memory, faults_cpu, faults_memory_buffer, faults_cpu_buffer
      	 * in this precise order.
      	 *
      	 * faults_memory: Exponential decaying average of faults on a per-node
      	 * basis. Scheduling placement decisions are made based on these
      	 * counts. The values remain static for the duration of a PTE scan.
      	 * faults_cpu: Track the nodes the process was running on when a NUMA
      	 * hinting fault was incurred.
      	 * faults_memory_buffer and faults_cpu_buffer: Record faults per node
      	 * during the current scan window. When the scan completes, the counts
      	 * in faults_memory and faults_cpu decay and these values are copied.
      	 */
      	unsigned long			*numa_faults;
      	unsigned long			total_numa_faults;
      
      	/*
      	 * numa_faults_locality tracks if faults recorded during the last
      	 * scan window were remote/local or failed to migrate. The task scan
      	 * period is adapted based on the locality of the faults with different
      	 * weights depending on whether they were shared or private faults
      	 */
      	unsigned long			numa_faults_locality[3];
      
      	unsigned long			numa_pages_migrated;
      #endif /* CONFIG_NUMA_BALANCING */
      
      #ifdef CONFIG_RSEQ
      	struct rseq __user *rseq;
      	u32 rseq_sig;
      	/*
      	 * RmW on rseq_event_mask must be performed atomically
      	 * with respect to preemption.
      	 */
      	unsigned long rseq_event_mask;
      #endif
      
      	struct tlbflush_unmap_batch	tlb_ubc;
      
      	union {
      		refcount_t		rcu_users;
      		struct rcu_head		rcu;
      	};
      
      	/* Cache last used pipe for splice(): */
      	struct pipe_inode_info		*splice_pipe;
      
      	struct page_frag		task_frag;
      
      #ifdef CONFIG_TASK_DELAY_ACCT
      	struct task_delay_info		*delays;
      #endif
      
      #ifdef CONFIG_FAULT_INJECTION
      	int				make_it_fail;
      	unsigned int			fail_nth;
      #endif
      	/*
      	 * When (nr_dirtied >= nr_dirtied_pause), it's time to call
      	 * balance_dirty_pages() for a dirty throttling pause:
      	 */
      	int				nr_dirtied;
      	int				nr_dirtied_pause;
      	/* Start of a write-and-pause period: */
      	unsigned long			dirty_paused_when;
      
      #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.
      	 */
      	u64				timer_slack_ns;
      	u64				default_timer_slack_ns;
      
      #ifdef CONFIG_KASAN
      	unsigned int			kasan_depth;
      #endif
      
      #ifdef CONFIG_FUNCTION_GRAPH_TRACER
      	/* Index of current stored address in ret_stack: */
      	int				curr_ret_stack;
      	int				curr_ret_depth;
      
      	/* Stack of return addresses for return function tracing: */
      	struct ftrace_ret_stack		*ret_stack;
      
      	/* Timestamp 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 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_KCOV
      	/* See kernel/kcov.c for more details. */
      
      	/* Coverage collection mode enabled for this task (0 if disabled): */
      	unsigned int			kcov_mode;
      
      	/* Size of the kcov_area: */
      	unsigned int			kcov_size;
      
      	/* Buffer for coverage collection: */
      	void				*kcov_area;
      
      	/* KCOV descriptor wired with this task or NULL: */
      	struct kcov			*kcov;
      
      	/* KCOV common handle for remote coverage collection: */
      	u64				kcov_handle;
      
      	/* KCOV sequence number: */
      	int				kcov_sequence;
      #endif
      
      #ifdef CONFIG_MEMCG
      	struct mem_cgroup		*memcg_in_oom;
      	gfp_t				memcg_oom_gfp_mask;
      	int				memcg_oom_order;
      
      	/* Number of pages to reclaim on returning to userland: */
      	unsigned int			memcg_nr_pages_over_high;
      
      	/* Used by memcontrol for targeted memcg charge: */
      	struct mem_cgroup		*active_memcg;
      #endif
      
      #ifdef CONFIG_BLK_CGROUP
      	struct request_queue		*throttle_queue;
      #endif
      
      #ifdef CONFIG_UPROBES
      	struct uprobe_task		*utask;
      #endif
      #if defined(CONFIG_BCACHE) || defined(CONFIG_BCACHE_MODULE)
      	unsigned int			sequential_io;
      	unsigned int			sequential_io_avg;
      #endif
      #ifdef CONFIG_DEBUG_ATOMIC_SLEEP
      	unsigned long			task_state_change;
      #endif
      	int				pagefault_disabled;
      #ifdef CONFIG_MMU
      	struct task_struct		*oom_reaper_list;
      #endif
      #ifdef CONFIG_VMAP_STACK
      	struct vm_struct		*stack_vm_area;
      #endif
      #ifdef CONFIG_THREAD_INFO_IN_TASK
      	/* A live task holds one reference: */
      	refcount_t			stack_refcount;
      #endif
      #ifdef CONFIG_LIVEPATCH
      	int patch_state;
      #endif
      #ifdef CONFIG_SECURITY
      	/* Used by LSM modules for access restriction: */
      	void				*security;
      #endif
      
      #ifdef CONFIG_GCC_PLUGIN_STACKLEAK
      	unsigned long			lowest_stack;
      	unsigned long			prev_lowest_stack;
      #endif
      
      	/*
      	 * New fields for task_struct should be added above here, so that
      	 * they are included in the randomized portion of task_struct.
      	 */
      	randomized_struct_fields_end
      
      	/* CPU-specific state of this task: */
      	struct thread_struct		thread;
      
      	/*
      	 * WARNING: on x86, 'thread_struct' contains a variable-sized
      	 * structure.  It *MUST* be at the end of 'task_struct'.
      	 *
      	 * Do not put anything below here!
      	 */
      };
      

      进程优先级和系统调用

      进程优先级

      • 限期进程的优先级是-1;
      • 实时进程的优先级是1-99,优先级数值越大,表示优先级越高;
      • 普通进程的静态优先级为100-139,优先级数值越小,优先级越高,可以通过修改nice值改变普通进程的优先级,优先级等于120+nice值。

      Linux源码阅读笔记02-进程原理及系统调用

      Linux源码阅读笔记02-进程原理及系统调用

      系统调用

      运行应用程序时,调用fork()/vfork()/clone()函数就是系统调用。系统调用就是应用程序进入内核空间执行任务,比如:创建进程、文件IO等等。具体如图:

      Linux源码阅读笔记02-进程原理及系统调用

      • 如何研究系统调用,举个例子:

        Linux源码阅读笔记02-进程原理及系统调用

      Linux源码阅读笔记02-进程原理及系统调用 Linux源码阅读笔记02-进程原理及系统调用

      Linux源码阅读笔记02-进程原理及系统调用

      内核线程

      他是独立运行在内核中的进程,与普通用户进程区别在于内核线程没有独立的进程地址空间。task_struct结构里面有一个成员指针mm设置为NULL,他只能运行在内核空间通常被称为守护线程。一般用于执行一下任务:

      • 周期性修改内存页与页来源块设备同步;
      • 如果内存页很少使用,写入交换区;
      • 管理延时动作(defferred action);
      • 实现文件系统的事务日志。

      Linux源码阅读笔记02-进程原理及系统调用

      退出进程

      • 主动终止:从某个主函数返回(链接程序会主动添加到exit系统调用,主动调用exit’函数)
      • 被动终止:接收到SIGKILL等杀死信号或异常被终止
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://lennlouis.blog.csdn.net/article/details/139730440,作者:小狮子安度因,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:javaScript(六):DOM操作

      下一篇:Linux线程详解

      相关文章

      2025-05-19 09:04:38

      mysql只有在任务处于完成状态才能运行

      mysql只有在任务处于完成状态才能运行

      2025-05-19 09:04:38
      MySQL , 任务 , 数据库 , 查询 , 状态
      2025-05-16 09:15:17

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      2025-05-16 09:15:17
      单例 , 线程 , 队列
      2025-05-16 09:15:10

      Linux系统基础-进程信号超详细讲解

      Linux系统基础-进程信号超详细讲解

      2025-05-16 09:15:10
      kill , 信号 , 命令 , 进程
      2025-05-16 09:15:10

      【强化学习】强化学习的基本概念与应用

      强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过与环境的交互来学习如何采取行动,以最大化累积奖励。强化学习在机器人控制、游戏AI、自动驾驶等领域取得了显著成就。

      2025-05-16 09:15:10
      代理 , 学习 , 状态
      2025-05-14 10:33:25

      超级好用的C++实用库之网络

      在网络相关的项目中,我们经常需要去获取和设置设备的IP地址、子网掩码、网关地址、MAC地址等信息。这些信息一般与操作系统相关,在Windows系统和Linux系统上调用的接口是不一样的。

      2025-05-14 10:33:25
      Linux , 参数 , 地址 , 接口 , 网卡 , 返回值
      2025-05-14 10:07:38

      超级好用的C++实用库之互斥锁

      互斥锁是一种用于多线程编程的同步机制,其主要目的是确保在并发执行环境中,同一时间内只有一个线程能够访问和修改共享资源。

      2025-05-14 10:07:38
      CHP , Lock , 互斥 , 线程 , 释放 , 锁定
      2025-05-14 10:03:13

      超级好用的C++实用库之线程基类

      在C++中,线程是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源,比如:内存空间和系统资源,但它们有自己的指令指针、堆栈和局部变量等。

      2025-05-14 10:03:13
      Linux , void , Windows , 函数 , 操作系统 , 线程
      2025-05-14 10:02:58

      Linux top 命令使用教程

      Linux top 是一个在Linux和其他类Unix 系统上常用的实时系统监控工具。它提供了一个动态的、交互式的实时视图,显示系统的整体性能信息以及正在运行的进程的相关信息。

      2025-05-14 10:02:58
      CPU , 信息 , 内存 , 占用 , 备注 , 进程
      2025-05-14 10:02:48

      互斥锁解决redis缓存击穿

      在高并发系统中,Redis 缓存是一种常见的性能优化方式。然而,缓存击穿问题也伴随着高并发访问而来。

      2025-05-14 10:02:48
      Redis , 互斥 , 数据库 , 线程 , 缓存 , 请求
      2025-05-14 09:51:15

      java怎么对线程池做监控

      对Java线程池进行监控是确保系统性能和稳定性的重要部分。监控线程池可以帮助我们了解线程池的状态,如当前活跃线程数、任务队列长度、已完成任务数等。

      2025-05-14 09:51:15
      Java , 方法 , 监控 , 示例 , 线程 , 队列
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5232089

      查看更多

      最新文章

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      2025-05-16 09:15:17

      超级好用的C++实用库之网络

      2025-05-14 10:33:25

      超级好用的C++实用库之互斥锁

      2025-05-14 10:07:38

      超级好用的C++实用库之线程基类

      2025-05-14 10:03:13

      互斥锁解决redis缓存击穿

      2025-05-14 10:02:48

      java怎么对线程池做监控

      2025-05-14 09:51:15

      查看更多

      热门文章

      Java线程同步synchronized wait notifyAll

      2023-04-18 14:15:05

      Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二)

      2024-09-25 10:13:46

      操作系统中的线程种类

      2023-04-24 11:27:18

      Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)

      2023-04-13 09:54:33

      实现远程线程DLL注入

      2023-05-04 08:57:15

      简单的内核编译安装图解

      2023-03-16 07:49:58

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      volatile可以保证原子性吗

      使用Java实现简单高效的并发控制

      多个线程同时写同一个日志文件,为什么相互写的内容不会被覆盖?

      Java多线程基础(一)---线程通信(wait,notifyAll,生产者消费者经典范式,wait set,自定义显式锁BooleanLock)

      Java之线程同步(同步方法、同步代码块)(关键字synchronized)(案例分析)

      驱动开发:内核封装TDI网络通信接口

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号