进程创建详解

进程的创建

  • 进程

程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括代码段(text section)和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等.

Linux把所有的进程使用双向链表连接起来,Linux内核为了加快获取当前进程的的task_struct结构, 使用了一个技巧, 就是把task_struct放置在内核栈的栈底, 这样就可以通过esp寄存器快速获取到当前运行进程的task_struct结构. 获取当前运行进程的task_struct代码如下:

static inline struct task_struct * get_current(void)

{

    struct task_struct *current;

    __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL));

    return current;

 }

  • 进程状态

进程描述符的state字段用于保存进程的当前状态, 进程的状态有以下几种:

TASK_RUNNING (运行) -- 进程处于可执行状态, 在这个状态下的进程要么正在被CPU执行, 要么在等待执行(CPU被其他进程占用的情况下).

TASK_INTERRUPTIBLE (可中断等待)-- 进程处于等待状态, 其在等待某些条件成立或者接收到某些信号, 进程会被唤醒变为运行状态.

TASK_UNINTERRUPTIBLE (不可中断等待) -- 进程处于等待状态, 其在等待某些条件成立, 进程会被唤醒变为运行状态, 但不能被信号唤醒.

TASK_TRACED (被追踪)-- 进程处于被追踪状态, 例如通过ptrace命令对进程进行调试.

TASK_STOPPED (停止)-- 进程处于停止状态, 进程不能被执行. 一般接收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU信号进程会变成TASK_STOPPED状态.

各种状态间的转换如下图:

 

  • 进程描述符

   Linux进程使用struct task_struct来描述(include/linux/sched.h), 如下:

struct task_struct {

    volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */

    unsigned long flags; /* 0  or   1*/

    int sigpending;

    mm_segment_t addr_limit;

    struct exec_domain *exec_domain;

    volatile long need_resched;

    unsigned long ptrace;

    int lock_depth; /* Lock depth */

    long counter;

    long nice;

    unsigned long policy;

    struct mm_struct *mm;

    int processor;

    ...

}



struct mm_struct {
	//vma链表的起始结构
	struct vm_area_struct * mmap;		/* list of VMAs */
	struct rb_root mm_rb;        //红黑树根节点主要组织vma
	stru
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值