(三)进程
一、进程概念
进程是程序执行的一个实例。操作系统会以进程为单位,分配系统资源,进程是资源分配的最小单位。
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)。
- struct __wait_queue_head {
- spinlock_t lock; /*因为等待队列可以在中断时随时修改,因此设置一个自旋锁保证一致性*/
- struct list_head task_list;
- };
- typedef struct __wait_queue_head wait_queue_head_t;
- struct __wait_queue {
- unsigned int flags; /*指明等待的进程是互斥进程还是非互斥进程*/
- struct task_struct *task; /*指向任务的task_struct*/
- wait_queue_func_t func;
- struct list_head task_list;
- };
- typedef struct __wait_queue_head wait_queue_head_t
2.等待队列的使用分为以下两部分:
(1)为使当前进程在一个等待队列中睡眠,需要调用wait_event(或某个等价函数),此后,进程进入睡眠,将控制权交给调度器。以块设备为例,当内核向块设备发出请求后,因为数据传输不会立即发生,因此进程睡眠
(2)相对应的,是当数据到达后,必须调用wake_up函数(或某个等价函数)来唤醒等待队列中睡眠的进程
五、进程创建
fork vfork