LKD-Linux系统进程管理

  本章介绍linux系统进程概念以及线程,讨论在linux内核中是如何对进程进行管理的以及进程结束流程。

    关于进程的概念在操作系统概念--操作系统中的进程、线程中已经描述过,这里不在赘述,在应用层一般理解是一个应用实例是一个进程,一个进程又可以包含多个线程,但是在传统的unix系统中每个进程都是由一个线程组成的,而Linux系统内核中也有单独的对线程的实现机制:即不区分线程和进程。

进程创建销毁概述

    Linux中一个进程生命周期的开始要从fork()这个大名鼎鼎的系统调用开始,fork()调用返回两次:一次是父进程pid,然后是子进程pid,fork完成后子进程和父进程还是一样的,直到调用exec()家族函数为子进程创建自己的地址空间以及加载相关代码到内存,fork函数实际上是调用的clone系统调用来实现进程拷贝的,

    进程的结束是通过调用exit系统调用来实现的,此函数会结束当前进程并且释放当前进程所占用的相关资源,父进程可以通过wait4()系统调用来收集子进程的退出信息,当进程结束的时候会被置为zombie状态,如果父进程调用wait或者waitpid,标记为zombie状态的进程就会结束。

进程描述符

    内核会把进程存储在一个叫做task list的循环双链表结构中,双链表中的每个元素都使用task_struct结构体描述该结构体被定义在头文件<linux/sched.h>中<include/linux/sched.h>:

struct task_struct {
    volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
    struct thread_info *thread_info;
    atomic_t usage;
    unsigned long flags;    /* per process flags, defined below */
    unsigned long ptrace;
    int lock_depth;     /* Lock depth */
    int prio, static_prio;
    struct list_head run_list;
    prio_array_t *array;
...
...
#endif
#ifdef CONFIG_NUMA
    struct mempolicy *mempolicy;
    short il_next;
#endif
};

该结构体内容较多,请自行下载内核源代码进行预览,此结构体在32为机器上大概会占用1.7kb,但是考虑到此结构体所携带的所有内核所需要的关于进程的信息而言,这点空间占用也不算大,它包含了描述进程的数据:打开的文件、进程空间地址、信号量、进程状态等等。

分配进程描述符

task_struct结构体通过slab内存分配器来分配空间,linux kernel 2.6系列中task_struct被存储在每个进程的内核栈的尾部,这样可以避免使用额外的寄存器去存储结构体的位置,这就为寄存器紧张的架构如x86带来了好处,通过计算栈指针就可以找到task_struct的存储位置了,在linux系统中,虽然task_struct是用来描述一个进程,但是task_struct描述的是进程的通用部分,不同CPU架构之间的差异化描述则由thread_info结构体来描述,该结构体存储在内核栈的尾部,它包含一个task元素指向和他对应的一个task_struct,所以实际上一个进程是由thread_info和task_struct两个结构体共同来描述的,定义在thread_info.h头文件中

<include/asm-xxx/thread_info.h>:

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;

    mm_segment_t        addr_limit; 
    struct restart_block    restart_block;
};

进程状态

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值