慢慢欣赏linux 进程哈希表

本文详细解析了Linux内核中PID哈希表的初始化、元素添加及进程搜索的过程。通过`pid_hash_init`函数初始化哈希表,`attach_pid`函数实现PID与任务结构的关联,`find_task_by_vpid`函数查找指定PID的进程。哈希表的高效查找依赖于`pid_hashfn`函数的哈希计算。这些内容深入展示了Linux内核对进程管理的底层机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始化

struct hlist_head {
	struct hlist_node *first;
};

static struct hlist_head *pid_hash;
static unsigned int pidhash_shift = 4;

void __init pidhash_init(void)
{
	int i, pidhash_size;

	pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18,
					   HASH_EARLY | HASH_SMALL,
					   &pidhash_shift, NULL, 4096);
	pidhash_size = 1 << pidhash_shift;

	for (i = 0; i < pidhash_size; i++)
		INIT_HLIST_HEAD(&pid_hash[i]);
}

操作之添加元素

void attach_pid(struct task_struct *task, enum pid_type type,
		struct pid *pid)
{
	struct pid_link *link;

	link = &task->pids[type];
	link->pid = pid;
	hlist_add_head_rcu(&link->node, &pid->tasks[type]);
	=>static inline void hlist_add_head_rcu(struct hlist_node *n,
					struct hlist_head *h)
	{
		struct hlist_node *first = h->first;

		n->next = first;
		n->pprev = &h->first;
		rcu_assign_pointer(h->first, n);
		if (first)
			first->pprev = &n->next;
	}
}

根据进程号搜索进程

struct task_struct *find_task_by_vpid(pid_t vnr)
{
	return find_task_by_pid_ns(vnr, task_active_pid_ns(current));
	=>struct task_struct *find_task_by_pid_ns(pid_t nr, struct pid_namespace *ns)
	{
		return pid_task(find_pid_ns(nr, ns), PIDTYPE_PID);
		=>struct pid *find_pid_ns(int nr, struct pid_namespace *ns)
		{
			struct hlist_node *elem;
			struct upid *pnr;

			hlist_for_each_entry_rcu(pnr, elem,
					&pid_hash[pid_hashfn(nr, ns)], pid_chain)
				if (pnr->nr == nr && pnr->ns == ns)
					return container_of(pnr, struct pid,
							numbers[ns->level]);
				=>#define pid_hashfn(nr, ns)	hash_long((unsigned long)nr + (unsigned long)ns, pidhash_shift) // 2.6.34版本用哈希表, 4.16.3版本用基树了

			return NULL;
		}
	}
}

Linux内核 hlist_head/hlist_node结构解析
https://www.cnblogs.com/vinozly/p/5707166.html

Linux 内核 hlist 详解
https://blog.csdn.net/hs794502825/article/details/24597773/

Linux内核中哈希链表hlist_head
https://blog.csdn.net/hhhhhyyyyy8/article/details/102642220

Linux内核中的PID散列表实例
http://blog.chinaunix.net/uid-24227137-id-3630753.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值