进程的创建
- 进程
程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括代码段(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