背景
Long Long Ago,计算机一次只能处理一个程序,如果有多个程序任务需要执行的时候,必须排队等待,前一个完毕后,后续程序才能被加载到内存中执行。这就是所谓的串行处理。
后来的计算机允许同时加载多个程序到内存中执行。为了调度多个程序的同时执行,引入了一些新概念,进程和线程就包含其中。
进程
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。
(若不支持线程机制,进程是系统调度的单位。否则,线程是系统调度的单位)。
简单来说,操作系统之前只用管理一个程序,执行完后换下一个;现在要同时管理多个程序,就通过进程去做,每个进程内部的结构和此前的单任务一样,这样只要管理好多个进程就可以了,不用太关心进程内部的细节。
特点
- 进程是程序的一次执行过程。若程序执行两次甚至多次,则需要两个甚至多个进程。
- 进程是是正在运行程序的抽象,也称进程是对CPU的抽象(想象以前的单任务串行模式)。
- 内存等系统资源以进程为单位分配。
- 拥有独立的地址空间,一个进程崩溃,不影响其他进程的执行。
- 操作系统通过“调度”把控制权交给进程。
在实际应用中,进程有这样的问题:
- 进程切换的代价、开销比较大;
- 进程内也有并发的需求,来实现不同的功能。
- 进程有时候性能比较低。
线程
引入线程有以下三个方面的考虑
- 应用的需要。
比如打开一个浏览器,用户希望一边浏览网页,一边下载文件,一边播放音乐。如果一个浏览器是一个进程,那么这样的需求需要线程机制。 - 开销的考虑。
在进程内创建、终止线程比创建、终止进程要快。同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。线程之间相互通信无须通过内核(同一进程内的线程共享内存和文件) - 性能的考虑。
多个线程中,任务功能不同(有的负责计算,有的负责I/O),如果有多个处理器,一个进程就可以有很多的任务同时在执行。
线程的特点
- 有标识符ID
- 有状态及状态转换,所以需要提供一些状态转换操作
- 不运行时需要保存上下文环境,所以需要程序计数器等寄存器
- 有自己的栈和栈指针
- 共享所在进程的地址空间和其它资源
补充
以前的计算机中只有一个CPU,为了同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。
如果一台计算机有多个CPU,情况就不同了,如果进程数小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行。但如果进程数大于CPU数,则仍然需要使用并发技术。
操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
在运行于32位处理器上的32位Windows操作系统中,可将一个进程视为一段大小为4GB(232字节)的线性内存空间,它起始于0x00000000结束于0xFFFFFFFF。这段内存空间不能被其他进程所访问,所以称为该进程的私有空间。这段空间被平分为两块,2GB被系统所有,剩下2GB被用户所有。
如果有N个进程运行在同一台机器上,那么将需要N×4GB的海量RAM,还好事实并非如此。
Windows是按需为每个进程分配内存的,4GB是32位系统中一个进程所占空间的上限。
将进程所需的内存划分为4KB大小的内存页,并根据使用情况将这些内存页存储在硬盘上或加载到RAM中,通过系统的这种虚拟内存机制,我们可以有效地减少对实际内存的需求量。当然这些对用户和开发者来说都是透明的。
线程只能归属于一个进程并且它只能访问该进程所拥有的资源。当操作系统创建一个进程后,该进程会自动申请一个名为主线程或首要线程的线程。
应用程序(application)是由一个或多个相互协作的进程组成的。例如,Visual Studio开发环境就是利用一个进程编辑源文件,并利用另一个进程完成编译工作的应用程序。
网友评论