www.9778.com 13

www.9778.com:对进程、线程、应用程序域的理解

本文主要参考自孙钟秀主编的《操作系统教程》一书中关于进程和线程的部分。

在传统的操作系统中,进程是系统进行资源分配的单位,由于并行技术、网络技术、并发程序设计效率的反正,引入了多线程机制;

   
前几天面试的一道题是谈谈进程、线程、应用程序域的区别,虽然能说上来几点,但感觉理解的很肤浅、很不透彻,闲暇时从书箱里翻出尘封已久的《操作系统》(还好,毕业时偶没舍得卖),翻了翻进程的那一章。看之前我列出了下面三个问题:

1定义

进程

为什么引入进程?

一,刻画系统动态性,发挥系统并发性,提高资源利用率。

以C#为例,在编辑器Visual Studio
Code写了几行代码,保存为cs文件。在未运行状态的下的代码,称之为静态的程序。静态的程序是一个相对的概念。当程序运行起来,它的运行依赖于处理器(CPU)和主存储器资源,我可以称之为动态的程序。以该程序动态执行的过程为基本单位,抽象出一个概念,进程,即进行中的程序。

进程二字,主要是强调动态性。处理器调动进程,存储器为进程分配进程空间,为处理器分配调动控制进程的空间,进程因此创建。当资源不足,或者需等待某个事件发生,进程暂停执行。乃至最后进程运行结果,程序退出主存储器,进程消亡。进程的出现到消亡,无疑是在不断地动态变化。

二,解决共享性。

当你完成一个公用函数时,该函数可以被多个程序调用。
www.9778.com 1

函数A在被程序甲调用,程序甲正在等待写入磁盘数据操作的返回,处理器空闲,为提高处理器利用效率,程序乙于此同时开始执行,进入起始点a。

此时,如何描述函数A?A处于等待点?A处于起始点a?试着引入进程的概念,将函数和程序联系起来,A对于程序甲构成进程A,A对于程序乙构成进程A。进程A处于等待点,进程A处于起始点。

进程(process)这个名词最早是1960年在MIT的MULTICS和IBM公司的
TSS/360系统中提出的,直到目前对进程的定义和名称均不统一,不同的系统中采用不同的术语名称,例如,MIT称进程(process),IBM公司称任务(task)和
Univac公司称活动(active)。可以说进程的定义多种多样,国内学术界较为一致的看法是:进程是一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位(1978
年全国操作系统学术会议)

进程属性:

  1. 结构性。进程至少有三要素组成:程序块、数据块、进程控制块。
  2. 共享性。多个进程可共享相同的程序。
  3. 动态性。进程是动态的概念,有生命周期。程序作为一组有序指令的序列合集,是静态概念,程序可以作为一种系统资源永远存在。
  4. 独立性。进程既是系统中资源分配和保护的基本单位,也是系统调度的独立单位(单线程进程)。凡是未建立进程的程序,都不能作为独立单位参与运行。通常,每个进程都可以各自独立的速度在
    CPU上推进。
  5. 制约性:并发进程之间存在着制约关系,进程在进行的关键点上需要相互等待或互通消息,以保证程序执行的可再现性和计算结果的惟一性。
  6. 并发性:进程可以并发地执行,进程的并发性能改进资源利用率和提高系统效率。

1、多线程环境下的进程与线程

  1. 这些概念(技术)出现的背景以及要解决的问题 (要干什么)
  2. 它们之间的联系与区别
  3. 三者之间的发展脉络
     
    进程的出现:
    (复习功课嘛,就把相关的内容都看看了,哎,都忘的差不多了)
     
    进程由操作系统创建、管理的,离开了操作系统也就不谈什么进程了,先看看操作系统的四个基本特征:
      1.并发(concurrence)
          并行性与并发性这两个概念是既相似又区别的两个概念。并行性是指两个或者多个事件在同一时刻发生,这是一个具有微观意义的概念,即在物理上这些事件是同时发生的;而并发性是指两个或者多个事件在同一时间的间隔内发生,它是一个较为宏观的概念。在多道程序环境下,并发性是指在一段时间内有多道程序在同时运行,但在单处理机的系统中,每一时刻仅能执行一道程序,故微观上这些程序是在交替执行的。  应当指出,通常的程序是静态实体,它们是不能并发执行的。为了使程序能并发执行,系统必须分别为每个程序建立进程。进程,又称任务,简单来说,是指在系统中能独立运行并作为资源分配的基本单位,它是一个活动的实体。多个进程之间可以并发执行和交换信息。一个进程在运行时需要运行时需要一定的资源,如
    cpu,存储空间,及i/o设备等。在操作系统中引入进程的目的是使程序能并发执行。
      2.共享 (sharing)
       
    所谓共享是指,系统中的资源可供内存中多个并发执行的进程共同使用。由于资源的属性不同,故多个进程对资源的共享方式也不同,可以分为:互斥共享方式
    和 同时访问方式
      3.虚拟 (virtual)
       
    是指通过技术吧一个物理实体变成若干个逻辑上的对应物。在操作系统中虚拟的实现主要是通过分时的使用方法。显然,如果n是某一个物理设备所对应的虚拟逻辑设备数,则虚拟设备的速度必然是物理设备速度的1/n。
      4.异步 (asynchronism)
       
    在多道程序设计环境下,允许多个进程并发执行,由于资源等因素的限制,通常,进程的执行并非“一气呵成”,而是以“走走停停”的方式运行。内存中每个进程在何时执行,何时暂停,以怎样的方式向前推进,每道程序总共需要多少时间才能完成,都是不可预知的。或者说,进程是以一步的方式运行的。尽管如此,但只要运行环境相同,作业经过多次运行,都会获得完全相同的结果,因此,异步运行方式是运行的。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程

随着并行技术、网络技术和软件设计技术的发展,给并发程序设计效率带来了一系列新的问题,主要表现在:

  • 进程时空的开销大,频繁的进程调度将耗费大量处理器时间,要为每个进程分配存储空间限制了操作系统中进程的总数。
  • 进程通信的代价大,每次通信均要涉及通信进程之间或通信进程与操作系统之间的信息传递。
  • 进程之间的并发性粒度较粗,并发度不高,过多的进程切换和通信延迟使得细粒度的并发得不偿失。
  • 不适合并行计算和分布并行计算的要求,对于多处理器和分布式的计算环境来说,进程之间大量频繁的通信和切换,会大大降低并行度。
  • 不适合客户!服务器计算的要求。对于
    C/S结构来说,那些需要频繁输入输出并同时大量计算的服务器进程(如数据库服务器、事务监督程序)很难体现效率。

如果说操作系统中引入进程的目的是为了使多个程序能并发执行,以改善资源使用率和提高系统效率,那么,在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。

进程可以分为两项功能:一是独立分配资源,二是被调度分派执行。分配资源仍由进程实现,无需频繁切换。抽出线程的概念,将被调度分派执行的任务移交给线程,可以被频繁的调度和切换。

1、多线程下的进程

在单线程进程模型中,进程和线程的概念可以不加区别,它是由进程控制块和用户地址空间,以及系统/用户堆栈等组成。在进程运行时,处理器的寄存器由进程控制,而进程不运行时,这些寄存器的内容会被保护,所进程与进程之间的关系比较疏远,相对独立,进程管理的开销大,进程间通信效率低微。

www.9778.com 2

image.png

使用单线程进程进行并发程序设计称为并发多进程程序设计,采用此种方式时,并发进程之间的切换和通信均要借助进程管理和进程通信机制,因而实现代价较大,进一步影响了并发的粒度。

为解决这一问题,我们将一个进程的运行划分为两个部分:对资源的管理者和实际的指令执行序列

www.9778.com 3

image.png

如果把进程的管理和执行相分离,进程是操作系统中进行保护和资源分配的单位,允许一个进程中包含由多个可并发执行的控制流,这些控制流的切换时,不需要通过进程调度,通信时可以借助共享内存区,这就是并发多线程序设计

www.9778.com 4

image.png

在多线程环境中,仍然有与进程相关的是PCB
和用户地址空间,而每个线程则存在独立堆栈,以及包含寄存器信息、优先级、其它有关状态信息的线程控制块。线程之间的关系较为密切,一个进程中的所有线程共享其拥有的状态和资源。它们驻留在相同的地址空间,可以存取相同的数据。例如,当一个线程改变了主存中一个数据项时,如果这时其它线程也存取这个数据项,它便能看到相同的结果。

www.9778.com 5

image.png

可见,操作系统为了使程序并发执行而产生了进程。

注意,进程一般有三个状态:就绪状态、执行状态和等待状态【或称阻塞状态】;进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系;挂起命令可由进程自己和其他进程发出,但是解除挂起命令只能由其他进程发出。进程的特征:

进程和线程的相对概念

单线程(结构)进程(single threaded
process):进程在任一时刻只有一个执行控制流
在单线程(结构)进程(single threaded
process)中,进程和线程的概念可以不加区分。

www.9778.com 6

多线程(结构)进程(multiple threaded process):

  • 在同一进程中设计出多条控制流;
  • 多控制流之间可以并行执行;
  • 多控制流切换不需通过进程调度;
  • 多控制流之间还可以通过内存区直接通信,降低通信开销

www.9778.com 7

多线程环境中进程的定义:进程是操作系统中进行保护和资源分配的基本单位。
它具有:

  • 一个虚拟地址空间,用来容纳进程的映像;
  • 对处理器、其他(通信的)进程、文件和 I/O资源等的有控制有保护的访问。

而传统进程原先所承担的控制流执行任务交给称作线程的部分完成。

多线程环境中的线程概念:线程是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。同一个进程中的所有线程共享进程获得的主存空间和资源,但不拥有资源。

线程具有:

  • 线程执行状态(运行、就绪、等待⋯⋯)。
  • 当线程不运行时,有一个受保护的线程上下文,用于存储现场信息。所以,观察线程的一种方式是运行在进程内一个独立的程序计数器。
  • 一个执行堆栈。
  • 一个容纳局部变量的主存存储区。

线程属性:

  1. 并发性:同一进程的多个线程可在一个或多个处理器上并发或并行地执行,而进程之间的并发执行演变为不同进程的线程之间的并发执行。
  2. 共享性:同一个进程中的所有线程共享但不拥有进程的状态和资源,且驻留在进程的同一个主存地址空间中,可以访问相同的数据。所以,需要有线程之间的通信和同步机制。通信和同步的实现十分方便。
  3. 动态性:线程是程序在相应数据集上的一次执行过程,由创建而产生,至撤销而消亡,有其生命周期,经历各种状态的变化。每个进程被创建时,至少同时为其创建一个线程,需要时线程可以再创建其他线程。
  4. 结构性:线程是操作系统中的基本调度和分派单位,因此,它具有惟一的标识符和线程控制块,其中应包含调度所需的一切私有信息。

进程可以划分为两个部分:资源集合和线程集合。进程要支撑线程运行,为线程提供地址空间和各种资源,它封装了管理信息,包括对指令代码、全局数据和
I/O状态数据等共享部分的管理。线程封装了执行信息,包括对CPU寄存器、执行栈(用户栈、内核栈)和局部变量、过程调用参数、返回值等线程私有部分的管理。由于线程具有许多传统进程所具有的特征,所以也把线程称为轻量进程
LWP(Light-Weight Process)。

www.9778.com 8

2、多线程环境下的线程概念

线程则是指进程过程中的一条执行路径(控制流),每个进程内允许包含多个并行执行的路径,这就是多线程。多线程时系统进行处理器调度的基本单位,同一个进程下的所有线程共享进程获得的主内存空间和资源。线程具体:

  • 一个线程执行状态(就绪、运行。。。)
  • 有一个受保护的线程上下文,当线程不执行时,用于存储现场信息
  • 一个独立的程序指令计数器
  • 一个执行堆栈
  • 一个容纳局部变量的静态存储器
  • 无挂起
    其含义以下特性:
  • 并行性:同一个进程的多线程可以在一个或多个处理器上并发或并行的运行
  • 共享性:同一个进程中的所有线程共享进程获得主存空间和一切资源
  • 动态性:线程也是程序在相应数据集上的一个执行,由创建而产生,至撤销而消亡,由生命周期

www.9778.com 9

image.png

空间是完成一个程序的运行所需占有和管理的内存空间,它封装了对进程的管理,包括对指令代码、全局数据和
I/O 状态数据等共享部分的管理。线程封装了并发(concurrency),包括对 CPU
寄存器、执行栈(用户栈、内核栈)和局部变量、过程调用参数、返回值等线程私有部分的管理。线程主动地访问空间。

进程的定义:可并发执行的程序在一个数据集合上的运行过程。
进程的特征:
1.动态性
进程既然是进程实体的执行过程,因此进程是有一定的生命期。而程序只是一组有序指令的集合,并放在某种介质上,本身无运行的含义,因此程序是个静态的实体。
2.并发性
3.独立性 
这是指进程实体是一个能独立运行的基本单位,同时也是系统种独立获得资源和调度的基本单位。
4.异步性
5.结构特征
从结构上看,进程实体是由程序段、数据段及进程控制块三部分组成。
  
(进程控制块(PCB):进程控制块是进程实体的一部分,它记录了操作系统所需要的、用于描述进程情况及控制进程运行所需的全部信息。os
是根据PCB来对并发执行的进程进行控制和管理的)
 
关于进程的总结:
定义:可并发执行的程序在一个数据集合上的运行过程,每个进程有一个自己的地址空间以及一个单一的控制流程。
要解决的问题:为了使程序能并发执行,(要并发执行就要隔离进程,使进程独立,即每个进程有属于自己的数据段、程序段、进程控制块)

1.动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。

3、线程的状态

于进程相似,线程也有一个生命周期,因而也存在各种状态。从理论上来说,线程的关键状态由:运行、就绪、和阻塞。其状态变换类似于进程

线程的出现:

2.并发性:任何进程都可以同其他进程一起并发执行。

2、线程的实现

从实现的角度,线程分为两种,用户级线程(ULT 如Java),内核级线程(KLT
如OS/2)。后者可归结为内核支撑线程或轻量进程。还有一些为混合式线程;

www.9778.com 10

image.png

    我们首先回顾进程的两个基本属性:(1)进程使一个可拥有资源的独立单位
(2)进程同时又是一个可以独立调度和分派的基本单位。正是由于这两个基本属性,才使进程成为一个能独立运行的基本单位,从而构成了进程并发执行的基础。
   为了使程序能并发执行,系统必须进行以下操作:
(1)
创建进程。创建一个进程时必须为之人、分配所必需的、除处理器以外的所有资源,如内存空间、I/O设备以及建立相应的PCB.
(2)
撤消进程。系统在撤消进程时,需要先对这这些资源进行回收,然后再撤销PCB.
(3)
进程切换。在对进程进行切换时,由于要保留当前进程的CPU环境和设置新选中的进程的CPU环境,为此须花费不少处理器时间。
  
简言之,由于进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,也正因为如此,在系统中设置的进程的数目不宜过多,进程的切换的频率也不宜过高,但这也就限制了并发程度的进一步提高。为了解决这个问题,不少操作系统的学者们想到:将进程的两个属性分开,由操作系统分开处理。即对作为调度和分派的基本单位,不同时作为独立分配资源的单位,以使之轻装运行;而对拥有资源的基本单位,又不频繁地对之进行切换,在这种思想的指导下,产生了线程的概念。

3.独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。

1、内核级线程 KLT

在纯内核级线程设施中,线程管理的所有工作由操作系统OS内核来完成。KLT专门提供一个API,以供调用,应用区不需要有线程管理的代码,而是由内核调度KLT。

www.9778.com 11

image.png

线程引入的原因:
为了减少程序并发执行所付出的时空开销,使os具有更好的并发性。

4.异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。

2、用户级线程 ULT

纯 ULT
设施中,线程管理的全部工作都由应用程序来做,内核是不知道线程的存在的。用户级多线程由线程库来实现,任何应用程序均需通过线程库进行程序设计,再与线程库连接后运行来实现多线程。线程库是一个
ULT
管理的例行程序包,它包含了建立/毁灭线程的代码、在线程间传送消息和数据的代码、调度线程执行的代码、以及保护和恢复线程状态(contexts)的代码。

www.9778.com 12

image.png

Jacketing 技术
为了解决用户级线程的缺点,使用一种称作jacketing的技术。主要思想是把阻塞式的系统调用改造成非阻塞式的,当线程调用系统调用,首先调用
jacketing 实用程序,由jacketing
程序来检查资源使用情况,以决定是否调用系统调用或传递控制权给另一个线程;

www.9778.com 13

image.png

    在引入线程的os
中,线程是进程中的一个实体(进程中的一个或多个指令执行流),是被系统独立调度和分派的基本单位。线程基本上不再拥有系统资源,(只拥有一点在运行中必不可少的资源,如程序计数器、寄存器和栈),但它可与同属一个进程的其他线程功能共享进程所拥有的全部资源。线一个线程可以创建和撤销另一个线程;同一进程中的多个线程之间可以并发执行。

线程:线程是进程中的一个实体,作为系统调度和分派的基本单位。它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

 线程与进程的比较:
   
线程具有许多传统进程所具有的特征,故又称为轻型线程或进程元;而把传统的进程称为重型进程。在引入了线程的os中,通常一个进程拥有若干个线程。下面从四个方面来比较线程与进程。
1.调度
  
在“原始”的OS中,拥有资源的基本单位和独立调度、分配的基本单位都是进程。而在引入线程的OS中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位,使传统进程的两个属性分开,线程便能轻装运行,从而可以显著的提高系统并发程度。在同一进程中,线程的切换不会引起进程切换,在由一个进程中的线程切换到另一进程中的线程时,将会引起进程切换。
2.并发性
   
在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可以并发执行,因而使OS具有更好的并发性,从而能更有效的使用系统资源和提高系统吞吐量。
3.拥有资源
   
不论是“原始”的OS,还是设有线程的操作系统,进程都是拥有资源的一个独立单位,它可以拥有自己的资源。线程自己基本不再拥有系统资源,但它可以访问其隶属进程的资源。
4.系统开销
    由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间,I/O设备等。因为,OS所付出的开销将显著地大于在创建或撤销线程时的开销。类似的,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU
环境设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。此外,由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信的实现变得比较容易。
   
这个机制在现代操作系统的实现主要可分为两大类。即根据操作系统内核是否对线程可感知,分为内核线程和用户线程。
1.内核线程  
无论是用户进程中的线程还是系统进程中的线程,它们的创建、撤销和切换都是由内核实现的。在内核中保留了一张线程控制块,内核根据该控制块而感知线程的存在并对线程进行控制。
2.用户线程      它仅存在于用户级中,对于这种线程的创建、撤销和切换,都不利用系统调用实现,因而这种线程与内核无关。相应地,内核也并不知道用户级线程的存在。(
调度的实现方式是采用在用户空间增加运行库,这些运行库被称为“线程包”,每当用户进程获得CPU控制权,线程运行库决定该从哪里开始运行)

线程的优点:除了提高进程的并发度,线程还有个好处,就是可以有效地利用多处理器和多核计算机。现在的处理器有个趋势就是朝着多核方向发展,在没有线程之前,多核并不能让一个进程的执行速度提高,原因还是上面所有的两点限制。但如果讲一个进程分解为若干个线程,则可以让不同的线程运行在不同的核上,从而提高了进程的执行速度

(
实际上,上面所说的线程是操作系统调度的基本单位,实际上指的只是内核线程。操作系统在调度时,参考各进程内的线程运行情况做出调度决定,如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU.
  在Windows
2000中,操作系统进行调度时根本就不理采线程是属于哪个进程的,只是将所有的就绪线程统一排成若干个优先级队列,然后进行调度。在这个情况下,线程的确成了调度的最小单位)。

2.关系

关于线程的总结
www.9778.com,出现的背景:由于进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提高。
要解决的问题:解决进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销的问题
解决的方法:将进程的两个属性分开,由操作系统分开处理。把“独立调度、分配的基本单位”这个属性分离出来作为线程;而把进程作为资源拥有的基本单位,线程作为进程中的一个实体而存在。

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

应用程序域的出现: (来自msdn)
  
在.net出现以前,一个进程下,只能运行一个应用程序,而在,net出现后,一个进程下,可以运行多个应用程序,这都是因为应用程序域的出现。
   
以前使用进程边界来隔离在同一台计算机上运行的应用程序。每一个应用程序被加载到单独的进程中,这样就将该应用程序与在同一台计算机上运行的其他应用程序相隔离。
  
隔离这些应用程序的原因在于内存地址是与进程相关的;在目标进程中,不能通过任何有意义的方式使用从一个进程传递到另一个进程的内存指针。此外,您不能在两个进程间进行直接调用。您必须代之以使用代理,它提供一定程度的间接性。
   
应用程序域提供安全而通用的处理单元,公共语言运行库可使用它来提供应用程序之间的隔离。您可以在具有同等隔离级别(存在于单独的进程中)的单个进程中运行几个应用程序域,而不会造成进程间调用或进程间切换等方面的额外开销。在一个进程内运行多个应用程序的能力显著增强了服务器的可伸缩性。
    
隔离应用程序对于应用程序安全也是十分重要的。例如,您可以在单个浏览器进程中运行几个
Web 应用程序中的控件,同时使这些控件不能访问彼此的数据和资源。

相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

应用程序域所提供的隔离具有以下优点(引入原因): 
   
在一个应用程序中出现的错误不会影响其他应用程序。因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。 
   
能够在不停止整个进程的情况下停止单个应用程序。使用应用程序域使您可以卸载在单个应用程序中运行的代码。
   
应用程序域形成了托管代码的隔离、卸载和安全边界。线程是公共语言运行库用来执行代码的操作系统构造。在运行时,所有托管代码均加载到一个应用程序域中,由特定的操作系统线程来运行。
   
应用程序域和线程之间不具有一对一的相关性。在任意给定时间,在单个应用程序域中可以执行几个线程,而且特定线程并不局限在单个应用程序域内。也就是说,线程可以自由跨越应用程序域边界;不为每个应用程序域创建新线程。
   
在任意给定时间,每一线程都在一个应用程序域中执行。运行库会跟踪在哪些应用程序域中有哪些线程正在运行。

区别:(1)调度:

一些相关面试题:

       
在传统的操作系统中,CPU调度和分派的基本单位是进程。而在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位,从而使传统进程的两个属性分开,线程编程轻装运行,这样可以显著地提高系统的并发性。

Q:谈谈你对Windows多线程编程的认识
回答思路:
(1)【什么是进程和线程?】进程是系统资源的拥有者;线程是Windows任务调度的最小单位。
(2)【进程和线程有什么?】Windows下,进程占有4G的地址空间;线程只占用运行必须的stack。
(3)【进程和线程的关系?】进程是线程的容器,线程必须在进程中运行,每个进程创建时都会有一个主线程被创建。
(4)【从数量上比较】线程数远大于进程数,一个进程可以有一个或多个线程。
(5)【关于线程调度】线程调度的两种方式:抢占式(如Win9X、UNIX、OS/2)、非抢占式(DOS、Win3.X
(6)【Windows如何实现多线程并发】Windows用时间片模拟多线程并发
(7)【为什么要使用多线程?】 为了减少程序并发执行所付出的时空开销,使os具有更好的并发性。
(8)【使用多线程的优点】提高并发程度、提高效率
(9)【使用多线程的缺点】难使数据同步、开发调试困难、任意使用多线程会降低效率{过犹不及}、不是可以随意使用多线程
 原文地址:

(2)并发性:

一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。显著地提高了文件服务的质量以及系统的吞吐量。

但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

(3)拥有资源:不论是引入了线程的操作系统,还是传统的操作系统,进程都是拥有系统资源的一个独立单位,他可以拥有自己的资源。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

(4)独立性:进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序
健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

(5)系统开销:

     
 由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统为此所付出的开销将显著地大于在创建或撤消线程时的开销。

6)支持多处理机系统:

     
 在多处理机系统中,对于传统的进程,即单线程进程,不管有多少处理机,该进程只能运行在一个处理机上。但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行,这无疑将加速进程的完成。因此,现代处理机OS都无一例外地引入了多线程。

参考文献: