首页 > 代码库 > (三)进程

(三)进程

一、进程概念
进程是程序执行的一个实例。操作系统会以进程为单位,分配系统资源,进程是资源分配的最小单位。

Linux进程的四大要素

 

1:一段供进程执行的程序,该程序可以被多个进程执行。
2:独立的内核堆栈。
3:进程控制快(task_struct:有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核的调度。同时,这个结构还记录着进程所占用的各项资源。
4:独立的存储空间:即拥有专有的用户空间,除了前面的内核空间还有用户空间。

二、进程描述符
1.进程描述符包含了与一个进程相关的所有信息。
struct task_struct{
 进程信息
 }

2.进程描述符处理
对于每一个进程而言,内核为其单独分配了一个内存区域,这个区域存储的是内核栈和该进程所对应的一个小型进程描述符——thread_info结构。
struct thread_info { 

}

三、进程状态

  可运行(TASK_RUNNING)

  可中断的等待(TASK_INTERRUPTBLE)

  不可中断的等待(TASK_UNINTERRUPTILBE)

  暂停(TASK_STOPPED)

  跟踪(TASK_TRACED)

  僵死(TASK_ZOMBIE)

  僵死撤销(EXIT_DEAD)

线程
线程存在于进程当中,是操作系统调度执行的最小单位。说通俗点,线程就是干活的。

技术分享

四、进程间关系

进程0和进程1由内核创建,进程1(init)是其他所有进程的祖先。

五、进程与等待队列
等待队列(wait queue)用于使进程带等待某一特定的事件发生,而无需频繁的轮询操作,进程在等待时间内睡眠,在等待的事件发生时由内核自动唤醒

1.等待队列相关数据结构
每一个等待队列都由两部分组成:等待队列头(struct wait_queue_head_t)和等待队列成员(struct wait_queue)。

  1. struct __wait_queue_head {  
  2.     spinlock_t lock; /*因为等待队列可以在中断时随时修改,因此设置一个自旋锁保证一致性*/  
  3.     struct list_head task_list;  
  4. };  
  5. typedef struct __wait_queue_head wait_queue_head_t;  
  6.   
  7. struct __wait_queue {  
  8.     unsigned int flags; /*指明等待的进程是互斥进程还是非互斥进程*/  
  9.     struct task_struct *task; /*指向任务的task_struct*/  
  10.     wait_queue_func_t func;  
  11.     struct list_head task_list;  
  12. };  
  13. typedef struct __wait_queue_head wait_queue_head_t 
2.等待队列的使用分为以下两部分:
(1)为使当前进程在一个等待队列中睡眠,需要调用wait_event(或某个等价函数),此后,进程进入睡眠,将控制权交给调度器。以块设备为例,当内核向块设备发出请求后,因为数据传输不会立即发生,因此进程睡眠
(2)相对应的,是当数据到达后,必须调用wake_up函数(或某个等价函数)来唤醒等待队列中睡眠的进程

 五、进程创建

fork   vfork

 

(三)进程