《linux kernel develpoment》第三章

本文详细介绍了Linux内核中的进程管理,包括进程的定义、进程描述符、进程状态、创建与销毁,以及线程在Linux上的实现。重点讲解了进程描述符的分配与存放、进程创建的fork和vfork机制,以及进程终结的过程。通过本章内容,读者可以深入了解Linux内核如何管理和控制进程的生命周期。
摘要由CSDN通过智能技术生成

《linux内核设计与实现》

进程管理

1、进程

进程是处于执行期的程序,进程不仅仅包括可执行代码,还需保安打开文件,挂起信号等其他资源。
线程是在进程中活动的对象,在linux中线程只是一种特殊的进程。
一个进程是在创建他的时候开始存活,通常是调用fork(注:现在的fork实际是用clone实现的)的结果,调用fork的叫父进程,创建的叫子进程。fork调用结束后,返回,父进程恢复执行,子进程开始执行。紧接着调用exec这组函数创建新的地址空间,将新的程序载入其中。最终进程通过exit退出执行,并释放资源,进入僵死,等待父进程调用wait或waitpid为止。

2、进程描述符及任务结构

内核把进程的列表存放在任务队列中,这是一个双向循环链表,其每项的类型都是task_struct(具体存放在linux/sched.h文件中)。主要包括有:打开的文件,进程的地址,挂起的信号等等。
struct task_struct {
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
void stack;
atomic_t usage;
unsigned int flags; /
per process flags, defined below /
unsigned int ptrace;
int lock_depth; /
BKL lock depth */

}

2.1 分配进程描述符

linux通过slab分配器分配task_struct结构,预先分配能够避免资源损耗。
如今的slab分配器是动态生成task_struct,因此只需要在栈底或者栈顶生成一个thread_info即可,该结构中已经包含了一个指向实际任务task_struct的指针task。
struct thread_info {
struct task_struct task; / main task structure /
struct exec_domain exec_domain; / execution domain /
__u32 flags; /
low level flags /
__u32 status; /
thread synchronous flags /
__u32 cpu; /
current CPU /
int preempt_count; /
0 => preemptable, <0 => BUG /
mm_segment_t addr_limit;
struct restart_block restart_block;
void __user sysenter_return;
#ifdef CONFIG_X86_32
unsigned long previous_esp; /
ESP of the previous stack in case of nested (IRQ) stacks
/
__u8 supervisor_stack[0];
#endif
unsigned int sig_on_uaccess_error:1;
unsigned int uaccess_err:1; /
uaccess failed */
};

2.2 进程描述符的存放

内核通过唯一的进程标识值或PID标识每个进程,其是pid_t类型,底层其实也是一个int类型。PID默认最大值为32768

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值