多任务处理是指用户可以在同一时间内运行多个应用程序,每个正在执行的应用程序被称为一个任务。Linux就是一个支持多任务的os。多任务os使用某种调度策略(可以查看操作系统来了解)支持多个任务的并发执行。事实上,处理器在某一时刻只能执行一个任务。os会在当前任务的时间片用完时调度执行其他的任务,由于任务会频繁的切换执行,且分配的时间片都是几十到上百毫秒,因此给用户多个任务同时运行的错觉。多任务os中通常有几个概念:
1)任务
任务是一个逻辑概念,通常一个任务就是程序的一次运行,一个任务包含若干个完成独立功能的子任务,即是进程或线程。例如QQ的一次运行就是一个任务。
2)进程
概念:进程是指一个具有独立功能的程序在某个数据集合上的一次动态执行过程,它是操作系统进行资源分配和调度的基本单位。一个任务的运行可以激活若干个进程,有这些进程来互相合作完成该任务的功能。
特性: 并发性:即是os中多个进程可以同时执行,相互之间互不干扰。
动态性:指的是进程具有完整的生命周期,进程的状态是不断变化的,另外进程具有动态的地址空间。
交互性:指的是进程在执行过程中与其他进程之间的通信(IPC)。
独立性:指进程是os进行资源分配和调度是一个相对完整的基本单位,各个进程的地址空间是独立的,因此,进程间通信需要特定的通信机制来实现。
与程序的区别:进程是动态的概念,它是程序的一次执行过程;程序是一段静态的代码,是保存在磁盘上的指令和数据的集合;
进程具有生命周期(创建,调度,执行和消亡),是程序执行和资源管理的最小单位;程序没有生命周期这一概念。
分类: 交互式进程:这类进程经常与用户进行交互,需要等待用户的输入,当收到用户的输入之后,这类进程能够立刻响应。其代表有vim,图形应用程序运行等。
批处理进程:这类进程通常在后台运行,这类进程不必很快响应。代表有编译器的编译。
守护进程:这类进程一直在后台运行,和任何终端都无关联。一般在os启动时开始执行,os关闭时结束。在Linux中,init是0号进程,它是所有进程的父进程。
进程的数据结构:struct task_struct是用来描述一个进程,该结构包含了与一个进程相关的所有信息,在<include/Linux/sched.h>中定义。它可以完整的描述一个进程,例 如进程的状态,进程的基本信息,进程标识符,内存相关信息,父进程相关信息,与集成相关的终端信息,当前工作目录,打开的文件信息,所接受的 信号等。其中最重要的是:进程的状态(state)和进程标识符(唯一表示一个进程)。
进程的状态: 运行态(TASK_RUNNING):当前正在运行或者在运行队列中等待调度的。
可中断的阻塞态(TASK_INTERRUPTIBLE);进程处于睡眠态,正在等待某些事件的发生或者能够占用某些资源。可以被信号或显示的唤醒,唤醒之后进 入运行态。
不可中断的阻塞态(TASK_UNINTERRUPTIBLE);该状态类似于可中断的阻塞态,但是改状态下,不能被信号唤醒,只有它所等待的事件发生时,才能被 显示的唤醒。
暂停态(TASK_STOP);进程的执行被暂停,当进程收到SIGSTOP,SIGTSTP,SIGTTM,SIGTTOU等信号,会进入暂停态。
僵尸态(TASK_ZOMBLE):子进程结束,父进程未使用系统调用来回收资源。
消亡态(TASK_DEAD):是终态,父进程调用wait函数族回收,子进程由系统彻底删除。
进程的内存结构: Linux采用虚拟内存管理技术,这样每个进程都有独立的地址空间。Linux有4GB的线性虚拟空间,这个空间被分为两个部分:用户空间和内核空间,其 中0~0xc0000000是用户空间共3GB,内核空间的大小是剩下的1GB。用户进程只能通过系统调用才能访问到内核空间。
3)线程
进程拥有自己的代码段,数据段,堆栈段,因此在进程切换时操作系统开销大,为了解决这个问题,因此引入了线程这一概念,线程也称为轻量级进程。线程可以对进程的空间和资源进行访问,也可以与同一进程中的其他线程共享进程的资源,由于共享进程的资源,也引出了共享资源的同步问题。