进程的概念
首先说一下程序,计算机程序只是存储在磁盘上的可执行的二进制(或其他类型的)文件,只有把他们加载到内存中并被系统调用,才拥有自己的生命周期进程(又被称为重量级进程)则是一个可执行的程序。每一个进程都拥有自己的地址空间,内存,数据栈以及其他用于跟踪执行的辅助数据。
操作系统管理所有进程的执行,并为这些进程合理的分配时间。进程也可以通过派生(fork或spawn)新的进程来执行其他任务,不过每一个新的进程都拥有自己的内存和数据栈,所以只能采用进程间通信(IPC)的方式共享信息。
线程的概念
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行的最小单元。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
线程包括开始,执行顺序和结束三部分,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。其中指令指针,用于记录当前运行的上下文。当其他线程执行时,它可以被强占(中断)和临时挂起(睡眠)----这种做法叫做让步。
一个进程中的各个线程与主线程共享同一片数据空间因此相对于独立的进程而言,线程间信息共享和通讯更加容易。线程一般是并发方式的执行的,正是由于这种并行和数据共享机制,使得多任务间的协作成为可能。
当然,在单核的CPU系统中,真正的并发是不能的,所以线程的执行时这样规划的:每个线程运行一小会,然后让步给其他线程(再次排队等待更多的CPU时间)。在整个进程的执行过程中,每个线程的执行他自己的特定任务,在必要时和其他进程进行结果通信。
当然,这种共享并不是没有风险的。如果两个或者多个线程访问同一片的数据,由于数据访问顺序不同,可能导致结果不同。这种情况通常称为竞态条件(race condition)幸运的是,大多数的线程库都有一些线程管理器控制执行和访问。
另外一个需要注意的问题是,线程无法给与公平的执行时间。这是因为一些函数会在完成前保持阻塞状态,如果没有专门为多线程情况进行修改,会导致CPU的时间分配向这些贪婪的函数倾斜。
上面是关于关于进程和线程的详细描述,下面是就是总结性的概括下:
进程:
- 是系统进行资源分配和调度的一个独立单位.
- 是程序的一次执行,每个进程都有自己的地址空间、内存、数据栈及其他辅助记录运行轨迹的数据
线程:
- 是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位
- 所有的线程运行在同一个进程中,共享相同的运行资源和环境
- 线程一般是并发执行的,使得实现了多任务的并行和数据共享。
进程和线程的区别:
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程
- 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
- 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
- CPU分给进程程,即真正在CPU上运行的是线程
- 线程不能够独立执行,必须依存在进程中
优缺点:
线程执行开销小,但不利于资源的管理和保护;而进程正相反