Linux内核一些进程管理知识点

本文详细探讨了Linux内核中的进程管理,包括current宏获取当前进程,fork、vfork、clone的差异,O(N)和O(1)调度器的工作原理,以及CFS调度器的公平调度策略。还涵盖了进程切换、SMP和NUMA模型,进程优先级表示,以及进程间通信和线程同步方法。此外,解释了fork和vfork的区别以及死锁的四个必要条件。
摘要由CSDN通过智能技术生成

1. current

内核有一个常用的常量current用于获取当前进程task_ struct 数据结构,它利用了内核栈的特性。首先通过SP寄存器获取当前内核栈的地址,对齐后可以获取struct thread info 数据结构指针,最后通过thread_ info->task 成员获取task_ struct 数据结构。

#define get_current() {current_thread_info()->task}
#define current get_current()

2. fork、vfork、clone的区别

fork实现:
do_fork(SIGCHLD, 0, 0, NULL, NULL);
vfork实现:
do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0, 0, NULL, NULL);
clone实现:
do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
内核线程:
do_fork(flags|CLONE_VM|CLONE_UNTRACED, (unsigned long)fn, (unsigned long)arg, NULL, NULL);

上面4种实现都是通过调用do_fork()函数来完成的,只是调用的参数不一样。fork 只使用SIGCHLD标志位,在子进程终止后发送SIGCHLD信号通知父进程。fork 是重量级调用,为子进程建立了一个基于父进程的完整副本,然后子进程基于此运行。为了减少工作量采用写时复制技术(copy on write, COW),子进程只复制父进程的页表,不会复制页面内容。当子进程需要写入新内容时才触发写时复制机制,为子进程创建一个副本。vfork 的实现比fork多了两个标志位,分别是CLONE VFORK和CLONE_VM。CLONE_VFORK表示父进程会被挂起,直至子进程释放虚拟内存资源。CLONE_VM表示父子进程运行在相同的内存空间中。clone用于创建线程,并且参数通过寄存器从用户空间传递下来,通常会指定新的栈地址(newsp)。

POSIX协议规定在一个进程内部多个线程共享一个PID。

struct

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值