首先,关于这三个的 定义 及 联系 ,我自己的简单理解:
程序(Program) :为了完成特定功能,一组计算机指令的集合,是一个 静态 概念;
进程(Process):运行中的程序实例,操作系统进行 资源分配和调度 的基本单位,一个 程序 在运行时,至少有一个进程;
线程(Thread):进程中的一个指令执行序列,是CPU调度的基本单位,一个 进程 至少有一个线程,一个进程中的多个线程代表不同执行的序列;
计算机程序是指一组指示计算机或其他具有消息处理能力装置每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
进程与线程的区别与联系:
- 定义:进程是系统进行 资源分配和调度 的基本单位;线程是 CPU调度 的基本单位;
- 拥有资源:进程有独立的内存空间;线程只拥有一点儿在运行中必不可少的资源(线程ID,PC,寄存器和栈),与同属一个进程的其它线程共享进程所拥有的资源;
- 关系:一个进程至少有一个线程,随进程启动而启动的线程称为主线程,负责创建其他线程;
- 独立执行:进程可以独立执行,线程必须在进程中执行;
- 奔溃影响:线程没有独立的内存空间,一个线程奔溃,其所在的进程也会奔溃,这个进程中的其他线程也就奔溃了;进程有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响;
- 并发切换效率:进程切换时,耗费资源较大;线程切换时,耗费的资源要小得多;
进程切换消耗比线程切换消耗大的简单理解:
- 无论是进程切换还是线程切换,都要保存当前进程/线程的"现场",并切到下一个就绪的进程/线程"现场";
- 线程切换"现场"时,只需要切换PC,寄存器和栈等自身有的可怜的资源,而进程切换"现场",除了前面的这些线程切换有的工作外,还要切换内存(比如缓存到内存的映射)等;
我们为什么比较这些概念
或许是这个问题被问了很多遍,或许我们都习以为常,我们似乎忘了我们当初是如何想到这个问题的,通过进行上述的比较,我们不能确定自己的目的是否达到;而另一个问题是,在经过上面这些所谓的比较之后,我们真的理解了程序、进程和线程这些概念吗,我看并不是,我们似乎只是记住了一些可能考试或者面试需要的答案,仅此而已;
之前在网上看过很多这种xx概念比较,在阅读完后,我总感觉这种比较缺少了点什么?恰巧,为了补足自己的基础(非计算机专业),最近学习了操作系统相关,重新回来自己比较上述概念.
顺便总结一下,缺少的东西包括:
-
对单一概念的本质理解;上述应该先对分别的各个概念进行理解,知道其本质之后,在其基础上进行比较;
比较,是成年人的游戏;
-
历史纵深;其实如果对操作系统的历史有稍许理解,上述的比较都可以看做毫无意义,只配做面/考试答案而已,最初为什么要有程序?为什么要有进程?为什么要有线程?如果理解了这些,那有什么好比较的;
-
直观实践;这个就涉及到实践了,写个程序,运行起来,搞个多线程,有啥不能理解的;