当前位置:文档之家› 进程与线程、应用程序域关系

进程与线程、应用程序域关系

进程与线程、应用程序域关系
进程与线程、应用程序域关系

进程与线程、应用程序域关系

进程的出现:

进程由操作系统创建、管理的,离开了操作系统也就不谈什么进程了,先看看操作系统的四个基本特征:

1.并发(concurrence)

并行性与并发性这两个概念是既相似又区别的两个概念。

并行性是指两个或者多个事件在同一时刻发生,这是一个具有微观意义的概念,即在物理上这些事件是同时发生的;

并发性是指两个或者多个事件在同一时间的间隔内发生,它是一个较为宏观的概念。

在多道程序环境下,并发性是指在一段时间内有多道程序在同时运行,但在单处理机的系统中,每一时刻仅能执行一道程序,故微观上这些程序是在交替执行的。应当指出,通常的程序是静态实体,它们是不能并发执行的。为了使程序能并发执行,系统必须分别为每个程序建立进程。进程,又称任务,简单来说,是指在系统中能独立运行并作为资源分配的基本单位,它是一个活动的实体。多个进程之间可以并发执行和交换信息。一个进程在运行时需要运行时需要一定的资源,如 cpu,存储空间,及i/o设备等。在操作系统中引入进程的目的是使程序能并发执行。

2.共享 (sharing)

所谓共享是指,系统中的资源可供内存中多个并发执行的进程共同使用。由于资源的属性不同,故多个进程对资源的共享方式也不同,可以分为:互斥共享方式和同时访问方式

3.虚拟 (virtual)

是指通过技术吧一个物理实体变成若干个逻辑上的对应物。在操作系统中虚拟的实现主要是通过分时的使用方法。显然,如果n是某一个物理设备所对应的虚拟逻辑设备数,则虚拟设备的速度必然是物理设备速度的1/n。

4.异步 (asynchronism)

在多道程序设计环境下,允许多个进程并发执行,由于资源等因素的限制,通常,进程的执行并非“一气呵成”,而是以“走走停停”的方式运行。内存中每个进程在何时执行,何时暂停,以怎样的方式向前推进,每道程序总共需要多少时间才能完成,都是不可预知的。或者说,进程是以一步的方式运行的。尽管如此,但只要运行环境相同,作业经过多次运行,都会获得完全相同的结果,因此,异步运行方式是运行的。

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

进程的定义:可并发执行的程序在一个数据集合上的运行过程。

进程的特征:

1.动态性

进程既然是进程实体的执行过程,因此进程是有一定的生命期。而程序只是一组有序指令的集合,并放在某种介质上,本身无运行的含义,因此程序是个静态的实体。

2.并发性

3.独立性

这是指进程实体是一个能独立运行的基本单位,同时也是系统种独立获得资源和调度的基本单位。

4.异步性

5.结构特征

从结构上看,进程实体是由程序段、数据段及进程控制块三部分组成。

(进程控制块(PCB):进程控制块是进程实体的一部分,它记录了操作系统所需要的、用于描述进程情况及控制进程运行所需的全部信息。os 是根据PCB来对并发执行的进程进行控制和管理的)

关于进程的总结:

定义:可并发执行的程序在一个数据集合上的运行过程,每个进程有一个自己的地址空间以及一个单一的控制流程。

要解决的问题:为了使程序能并发执行,(要并发执行就要隔离进程,使进程独立,即每个进程有属于自己的数据段、程序段、进程控制块)

线程的出现:

我们首先回顾进程的两个基本属性:

(1)进程使一个可拥有资源的独立单位

(2)进程同时又是一个可以独立调度和分派的基本单位。正是由于这两个基本属性,才使进程成为一个能独立运行的基本单位,从而构成了进程并发执行的基础。

为了使程序能并发执行,系统必须进行以下操作:

(1) 创建进程。创建一个进程时必须为之人、分配所必需的、除处理器以外的所有资源,如内存空间、I/O设备以及建立相应的PCB.

(2) 撤消进程。系统在撤消进程时,需要先对这这些资源进行回收,然后再撤销PCB.

(3) 进程切换。在对进程进行切换时,由于要保留当前进程的CPU环境和设置新选中的进程的CPU环境,为此须花费不少处理器时间。

简言之,由于进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,也正因为如此,在系统中设置的进程的数目不宜过多,进程的切换的频率也不宜过高,但这也就限制了并发程度的进一步提高。为了解决这个问题,不少操作系统的学者们想到:将进程的两个属性分开,由操作系统分开处理。即对作为调度

和分派的基本单位,不同时作为独立分配资源的单位,以使之轻装运行;而对拥有资源的基本单位,又不频繁地对之进行切换,在这种思想的指导下,产生了线程的概念。

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

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

线程与进程的比较:

线程具有许多传统进程所具有的特征,故又称为轻型线程或进程元;而把传统的进程称为重型进程。在引入了线程的os中,通常一个进程拥有若干个线程。下面从四个方面来比较线程与进程。

1.调度

在“原始”的OS中,拥有资源的基本单位和独立调度、分配的基本单位都是进程。而在引入线程的OS中,则把线程作为调度和分派的基本单位,而把进程作为资源拥有的基本单位,使传统进程的两个属性分开,线程便能轻装运行,从而可以显著的提高系统并发程度。在同一进程中,线程的切换不会引起进程切换,在由一个进程中的线程切换到另一进程中的线程时,将会引起进程切换。

2.并发性

在引入线程的OS中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可以并发执行,因而使OS具有更好的并发性,从而能更有效的使用系统资源和提高系统吞吐量。

3.拥有资源

不论是“原始”的OS,还是设有线程的操作系统,进程都是拥有资源的一个独立单位,它可以拥有自己的资源。线程自己基本不再拥有系统资源,但它可以访问其隶属进程的资源。

4.系统开销

由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间,I/O设备等。因为,OS所付出的开销将显著地大于在创建或撤销线程时的开销。类似的,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU 环境设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。此外,由于同一进程中的多个线程具有相同的地址空间,使它们之间的同步和通信的实现变得比较容易。

这个机制在现代操作系统的实现主要可分为两大类。即根据操作系统内核是否对线程可感知,分为内核线程和用户线程。

1.内核线程无论是用户进程中的线程还是系统进程中的线程,它们的创建、撤销和切换都是由内核实现的。在内核中保留了一张线程控制块,内核根据该控制块而感知线程的存在并对线程进行控制。

2.用户线程它仅存在于用户级中,对于这种线程的创建、撤销和切换,都不利用系统调用实现,因而这种线程与内核无关。相应地,内核也并不知道用户级线程的存在。( 调度的实现方式是采用在用户空间增加运行库,这些运行库被称为“线程包”,每当用户进程获得CPU控制权,线程运行库决定该从哪里开始运行)

( 实际上,上面所说的线程是操作系统调度的基本单位,实际上指的只是内核线程。操作系统在调度时,参考各进程内的线程运行情况做出调度决定,如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU.

在Windows 2000中,操作系统进行调度时根本就不理采线程是属于哪个进程的,只是将所有的就绪线程统一排成若干个优先级队列,然后进行调度。在这个情况下,线程的确成了调度的最小单位)。

关于线程的总结:

出现的背景:由于进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提高。

要解决的问题:解决进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销的问题

解决的方法:将进程的两个属性分开,由操作系统分开处理。把“独立调度、分配的基本单位”这个属性分离出来作为线程;而把进程作为资源拥有的基本单位,线程作为进程中的一个实体而存在。

应用程序域的出现:

(来自msdn)

在.net出现以前,一个进程下,只能运行一个应用程序,而在,net出现后,一个进程下,可以运行多个应用程序,这都是因为应用程序域的出现。

以前使用进程边界来隔离在同一台计算机上运行的应用程序。每一个应用程序被加载到单独的进程中,这样就将该应用程序与在同一台计算机上运行的其他应用程序相隔离。

隔离这些应用程序的原因在于内存地址是与进程相关的;在目标进程中,不能通过任何有意义的方式使用从一个进程传递到另一个进程的内存指针。此外,您不能在两个进程间进行直接调用。您必须代之以使用代理,它提供一定程度的间接性。

应用程序域提供安全而通用的处理单元,公共语言运行库可使用它来提供应用程序之间的隔离。您可以在具有同等隔离级别(存在于单独的进程中)的单个进程中运行几个应用程序域,而不会造成进程间调用或进程间切换等方面的额外开销。在一个进程内运行多个应用程序的能力显著增强了服务器的可伸缩性。

隔离应用程序对于应用程序安全也是十分重要的。例如,您可以在单个浏览器进程中运行几个 Web 应用程序中的控件,同时使这些控件不能访问彼此的数据和资源。

应用程序域所提供的隔离具有以下优点(引入原因):

在一个应用程序中出现的错误不会影响其他应用程序。因为类型安全的代码不会导致内存错误,所以使用应用程序域可以确保在一个域中运行的代码不会影响进程中的其他应用程序。

能够在不停止整个进程的情况下停止单个应用程序。使用应用程序域使您可以卸载在单个应用程序中运行的代码。

应用程序域形成了托管代码的隔离、卸载和安全边界。线程是公共语言运行库用来执行

代码的操作系统构造。在运行时,所有托管代码均加载到一个应用程序域中,由特定的操作系统线程来运行。

应用程序域和线程之间不具有一对一的相关性。在任意给定时间,在单个应用程序域中可以执行几个线程,而且特定线程并不局限在单个应用程序域内。也就是说,线程可以自由跨越应用程序域边界;不为每个应用程序域创建新线程。

在任意给定时间,每一线程都在一个应用程序域中执行。运行库会跟踪在哪些应用程序域中有哪些线程正在运行。

一些相关面试题:

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)【使用多线程的缺点】难使数据同步、开发调试困难、任意使用多线程会降低效率{过犹不及}、不是可以随意使用多线程

进程与线程的区别 进程的通信方式 线程的通信方式

进程与线程的区别进程的通信方式线 程的通信方式 进程与线程的区别进程的通信方式线程的通信方式2011-03-15 01:04 进程与线程的区别: 通俗的解释 一个系统运行着很多进程,可以比喻为一条马路上有很多马车 不同的进程可以理解为不同的马车 而同一辆马车可以有很多匹马来拉--这些马就是线程 假设道路的宽度恰好可以通过一辆马车 道路可以认为是临界资源 那么马车成为分配资源的最小单位(进程) 而同一个马车被很多匹马驱动(线程)--即最小的运行单位 每辆马车马匹数=1 所以马匹数=1的时候进程和线程没有严格界限,只存在一个概念上的区分度 马匹数1的时候才可以严格区分进程和线程 专业的解释: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执 行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序 的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行 的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在 应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可 以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程 的调度和管理以及资源分配。这就是进程和线程的重要区别。 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的 能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中 必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的 其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以 并发执行 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有 独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响, 而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线 程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程 的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者 《操作系统的设计与实现》。对就个问题说得比较清楚。 +++ 进程概念

实验一 进程与线程

实验:进程与线程 一、实验目的 通过函数调用掌握进程之间的通信。 体会线程的存在,了解线程与进程的关系。 二、实验环境 PC+Win7操作系统 三、实验方法和实验步骤 1.准备工作 打开VC++6.0环境。 2.在程序编辑区内输入程序,实现两个数互换。 3. 在VC环境下建立一个控制台应用程序P1。系统启动一个进程(因为支持线程,OS会在进程中主动创建一个主线程)来运行该程序。输出该进程的ID号、以及该进程下面主线程的ID号。多运行几次,观察结果。 四、实验结果

补充:在VC环境下建立一个控制台应用程序P1。系统启动一个进程(因为支持线程,OS会在进程中主动创建一个主线程)来运行该程序。 在进程中,我们自己再创建一个子线程(子线程1),该子线程做的事情很简单,就是让它不停地输出如下信息: 子线程1正在运行第1次,其进程的ID号=~, 子线程1的ID号=~ 子线程1正在运行第2次,其进程的ID号=~, 子线程1的ID号=~ 。。。。。。 。。。。。。 子线程1正在运行第20次,其进程的ID号=~, 子线程1的ID号=~ 只要启动了一个子线程,实际上系统中是主线程和子线程1在并发执行。 主线程的功能是输出这样形式的内容: 主线程正在运行第1次,其进程的ID号=~,主线程的ID号=~ 主线程正在运行第2次,其进程ID号=~, 主线程的ID号=~ 。。。。。。 。。。。。。 主线程正在运行第20次,其进程ID号=~, 主线程的ID号=~ 多运行几次,观察主线程和子线程并发调动的次序。每次调度都一样吗?为什么?进程ID、主线程ID和子线程ID每次都一样吗? 体会操作系统中并发的异步性。 程序代码如下: #include #include DWORD WINAPI Thread1(LPVOID lpparameter){ int i; for(i=1;i<=20;i++){ printf("子线程1在运行中,它正在运行第%d times,所属进程的ID号=%ld, 本线程的ID号=%ld\n",i,GetCurrentProcessId(),GetCurrentThreadId());} return 0;} int main(){ int j; printf("一个进程在运行中\n"); printf("主线程在运行中\n"); HANDLE hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL); for(j=1;j<=20;j++){ printf("主线程正在运行第%d次;进程的ID号=%ld,线程ID号=%ld\n", j,GetCurrentProcessId(),GetCurrentThreadId()); Sleep(500); } return 0; } 多次运行的结果显示,每次调度是不一样的,因为操作系统中程序并发运行时的异步性原则,进程ID、主线程ID和子线程ID每次也都是不一样的。

操作系统第二章进程和线程复习题

第二章练习题 一、单项选择题 1.某进程在运行过程中需要等待从磁盘上读入数据,此时该进程的状态将( C )。 A. 从就绪变为运行; B.从运行变为就绪; C.从运行变为阻塞; D.从阻塞变为就绪2.进程控制块是描述进程状态和特性的数据结构,一个进程( D )。 A.可以有多个进程控制块; B.可以和其他进程共用一个进程控制块; C.可以没有进程控制块; D.只能有惟一的进程控制块。 3.临界区是指并发进程中访问共享变量的(D)段。 A、管理信息 B、信息存储 C、数据 D、 程序 4. 当__ B__时,进程从执行状态转变为就绪状态。 A. 进程被调度程序选中 B. 时间片到 C. 等待某一事件 D. 等待的事件发生 5. 信箱通信是一种( B )通信方式。 A. 直接通信 B. 高级通信

C. 低级通信 D. 信号量 6. 原语是(B)。 A、一条机器指令 B、若干条机器指令组成 C、一条特定指令 D、中途能打断的指令 7. 进程和程序的一个本质区别是(A)。 A.前者为动态的,后者为静态的; B.前者存储在内存,后者存储在外存; C.前者在一个文件中,后者在多个文件中; D.前者分时使用CPU,后者独占CPU。 8. 任何两个并发进程之间存在着(D)的关系。 A.各自完全独立B.拥有共享变量 C.必须互斥D.可能相互制约 9. 进程从运行态变为等待态可能由于(B )。 A.执行了V操作 B.执行了P 操作 C.时间片用完 D.有高优先级进程就绪 10. 用PV操作管理互斥使用的资源时,信号量的初值应定义为(B)。 A.任意整数 B.1 C.0 D.-1

查看程序的进程和线程实验报告

查看程序的进程和线程实验报告 篇一:程序实验2:11-多线程编程---实验报告 程序实验二:11-多线程编程实验 专业班级实验日期 5.21 姓名学号实验一(p284:11-thread.c) 1、软件功能描述 创建3个线程,让3个线程重用同一个执行函数,每个线程都有5次循环,可以看成5个小任务,每次循环之间会有随即等待时间(1-10s)意义在于模拟每个任务到达的时间是随机的没有任何的特定规律。 2、程序流程设计 3.部分程序代码注释(关键函数或代码) #include #include #include #define T_NUMBER 3 #define P_NUMBER 5 #define TIME 10.0

void *thrd_func(void *arg ) { (本文来自:https://www.doczj.com/doc/be18928318.html, 小草范文网:查看程序的进程和线程实验报告) int thrd_num=(int)arg; int delay_time =0; int count =0; printf("Thread %d is staraing\n",thrd_num); for(count=0;count { delay_time =(int)(rand()*TIME/(RAND_MAX))+1; sleep(delay_time); printf("\tTH%d:job%d delay =%d\n",thrd_num,count,delay_time); } printf("%d finished\n",thrd_num); pthread_exit(NULL); } int main()

操作系统--进程和线程实验报告

一.进程的创建 1.编辑源程序。 2. 编辑结果如下。 3.编译和运行程序。 4.运行解释结果 在语句p1=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了.这两个进程的几乎完全相同,将要执行的下一条语句都是if(p1==0). 而fork函数有三种返回值。(1)在父进程中,fork返回新创建子进程的进程ID; (2)在子进程中,fork返回0; (3)如果出现错误,fork返回一个负值; 所以,子进程中p1==0,输出I am child。父进程p1>0,输出I am parent。

1.编辑源程序。 2.编辑结果如下。 3.编译和运行程序。 4. 运行解释结果 在语句p1=fork()之前,只有父进程执行,putchar(‘x’)语句将x放入父进程的缓冲区。当成功创建子进程后,子进程复制父进程的缓冲区。接着子进程运行输出xby,父进程输出xay。

1.编辑源程序。 2.编辑结果如下。 3.编译和运行程序。 4. 运行解释结果 在语句p1=fork()之前,只有父进程执行,putchar(‘x’)语句将x放入父进程的缓冲区。当成功创建子进程后,子进程复制父进程的缓冲区。接着子进程输出b后,执行exit(0)系统调用终止执行。父进程输出a 后继续输出y。所以父进程输出xay而子进程输出xb。

1.编辑源程序。 2.编辑结果如下。 3.编译和运行程序。 4. 运行解释结果 语句while(p1=fork()==-1)创建了子进程和父进程。父进程执行到wait()时,等待子进程的终止信号,当子进程执行完exit(0)后,父进程才继续执行。实现了父进程等待子进程。

Linux下查看进程和线程

在Linux中查看线程数的三种方法 1、top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。 2、ps xH 手册中说:H Show threads as if they were processes 这样可以查看所有存在的线程。 3、ps -mp 手册中说:m Show threads after processes 这样可以查看一个进程起的线程数。 查看进程 1. top 命令 top命令查看系统的资源状况 load average表示在过去的一段时间内有多少个进程企图独占CPU zombie 进程:不是异常情况。一个进程从创建到结束在最后那一段时间遍是僵尸。留在内存中等待父进程取的东西便是僵尸。任何程序都有僵尸状态,它占用一点内存资源,仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的stop模式:与sleep进程应区别,sleep会主动放弃cpu,而stop 是被动放弃cpu ,例单步跟踪,stop(暂停)的进程是无法自己回到运行状态的。 cpu states: nice:让出百分比irq:中断处理占用 idle:空间占用百分比iowait:输入输出等待(如果它很大说明外存有瓶颈,需要升级硬盘(SCSI)) Mem:内存情况 设计思想:把资源省下来不用便是浪费,如添加内存后free值会不变,buff值会增大。判断物理内存够不够,看交换分区的使用状态。 交互命令: [Space]立即刷新显示 [h]显示帮助屏幕

进程和线程的选择

鱼还是熊掌:浅谈多进程多线程的选择 关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。 经常在网络上看到有的XDJM问“多进程好还是多线程好?”、“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有最好,只有更好。根据实际情况来判断,哪个更加合适就是哪个好。 我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受) 看起来比较简单,优势对比上是“线程 3.5 v 2.5 进程”,我们只管选线程就是了? 呵呵,有这么简单我就不用在这里浪费口舌了,还是那句话,没有绝对的好与坏,只有哪个更加合适的问题。我们来看实际应用中究竟如何判断更加合适。 1)需要频繁创建销毁的优先用线程 原因请看上面的对比。 这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的

2)需要进行大量计算的优先使用线程 所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。 这种原则最常见的是图像处理、算法处理。 3)强相关的处理用线程,弱相关的处理用进程 什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。 一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。 当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。 4)可能要扩展到多机分布的用进程,多核分布的用线程 原因请看上面对比。 5)都满足需求的情况下,用你最熟悉、最拿手的方式 至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,我只能说:没有明确的选择方法。但我可以告诉你一个选择原则:如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个。 需要提醒的是:虽然我给了这么多的选择原则,但实际应用中基本上都是“进程+线程”的结合方式,千万不要真的陷入一种非此即彼的误区。

进程线程的概念

提起程序这个概念,大家再也熟悉不过了,程序与进程概念是不可分的。程序是为了完成某项任务编排的语句序列,它告诉计算机如何执行,因此程序是需要运行的。程序运行过程中需要占有计算机的各种资源才能运行下去。如果任一时刻,系统中只有一道程序,即单道程序系统,程序则在整个运行过程中独占计算机全部资源,整个程序运行的过程就非常简单了,管理起来也非常容易。就象整个一套房子住了一个人,他想看电视就看电视,想去卫生间就去卫生间,没人和他抢占资源。但为了提高资源利用率和系统处理能力,现代计算机系统都是多道程序系统,即多道程序并发执行。程序的并发执行带来了一些新的问题,如资源的共享与竞争,它会改变程序的执行速度。就象多个人同时住一套房子,当你想去卫生间的时候,如果此时卫生间里有人,你就得等待,影响了你的生活节奏。如果程序执行速度不当,就会导致程序的执行结果失去封闭性和可再现性,这是我们不希望看到的。因此应该采取措施来制约、控制各并发程序段的执行速度。由于程序是静态的,我们看到的程序是存储在存储介质上的,它无法反映出程序执行过程中的动态特性,而且程序在执行过程中是不断申请资源,程序作为共享资源的基本单位是不合适的,所以需要引入一个概念,它能描述程序的执行过程而且可以作为共享资源的基本单位,这个概念就是进程。 进程的生命周期 进程和人一样是有生命的,从诞生到死亡要经历若干个阶段。一般说来进程有三种状态:就绪、执行、等待。由多种原因可以导致创建一个进程,例如一个程序从外存调入内存开始执行,操作系统就要为其创建进程,当然还可以有其它原因,如一个应用进程为完成一个特殊的任务,可以自己创建一个子进程。进程被创建后就是在内存中,处于就绪状态,所谓就绪状态就是具备除了CPU之外的所有资源,万事具备,只欠东风,一旦占有 了CPU,就变成了执行状态,执行中如果需要等待外围设备输入数据,则进程就沦落为 等待状态,操作系统又会从就绪状态队列中调度一个进程占有CPU。等到数据到来后, 等待状态的进程又被唤醒成为就绪状态。这些状态的转换是通过进程控制原语实现的。程序的运行是通过进程体现的,操作系统对进程进行管理和控制,那么操作系统怎么了解到进程的状态呢,怎么把资源分配给进程呢,而且进程做状态转换时CPU现场保存在那呢?这要说到PCB(进程控制快)。PCB是进程的唯一标志,在其中记录了进程的全部信息,它是一种记录型的数据结构,相当于进程的档案。操作系统就通过PCB感知进程的存在,通过PCB了解进程和控制进程的运行。PCB也是放在内存中的,如果PCB太大,有些系 统把PCB中一些不重要的信息放在外存中。 进程执行速度的制约 并发进程由于共享系统内部资源,因此导致进程执行速度上的制约,这种制约分为:间接制约与直接制约。间接制约引起进程之间的互斥执行,直接制约引起进程间的同步执行。例如一个家里如果只有一个卫生间,卫生间这个公有资源使得每个人只能互斥使用它,这就是间接制约。而直接制约是指并发进程各自执行的结果互为对方的执行条件,例如司机与售票员的关系,当司机到站停车后,售票员才能开门,而只有售票员关门后,司机才

线程、进程、多线程、多进程和多任务之间的区别与联系

线程、进程、多线程、多进程和多任务之间的区别与联系

可能学习操作系统开发的读者都听说过这些专业名词,但又多少人理解了? 首先,从定义开始,先看一下教科书上进程和线程定义:进程:资源分配的最小单位。线程:程序执行的最小单位。 1 进程进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。 举例说明进程:想象一位有一手好厨艺的计算机科学家正在为他的女儿烘制生日蛋糕,他有做生日蛋糕的食谱,厨房里有所需的原料:面粉、鸡蛋、糖、香草汁等。在这个比喻中,做蛋糕的食谱就是程序(即用适当形式描述的算法)计算机科学家就是处理器(CPU),而做蛋糕的各种原料就是输入数据。 进程就是厨师阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和。现在假设计算机科学家的儿子哭着跑了进来,说他的头被一只蜜蜂蛰了。计算机科学家就记录下他照着食谱做到哪儿了(保存进程的当前状态),然后拿出一本急救手册,按照其中的指示处理蛰伤。这里,我们看到处理机制是从一个进程(做蛋糕)切换到另一个高优先级的进程(实施医疗救治),每个进程拥有各自的程序(食谱和急救手册)。当蜜蜂蛰伤处理完之后,这位计算机科学

家又回来做蛋糕,从他离开时的那一步继续做下去。 2 线程线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 一个标准的线程有线程ID、当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现处间断性。 线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。举例说明线程:假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容)。若有多个进程,每个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的任务,进程C负责保存内容到硬盘中的任务。这里进程A,B,C间的协作涉及到了进程通信问题,而且有共同都需要拥有的东西——-文本内容,不停的切换造成性能上的损失。若有一种机制,可以使任务A,B,C共享资源,这样上下文切换所需要保存和恢复的内容就少了,同时又可以减少通信所带来的性能损耗,那就好了。这种机制就是线程。 总的来说:进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。

进程、线程、管程三者之间的关系

进程、线程、管程三者之间的关系 首先我们先了解进程、线程、管程各自的概念:进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。线程:线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。 管程:管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。 现在我们来了解进程和线程的关系: 简而言之,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有

多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。 下面我们用实际图解来加以分析进程和线程之间的关系:

进程和线程的区别

进程和线程的区别 进程和线程的概念 先了解一下操作系统的一些相关概念,大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(并发简单来说多个任务同时执行)。 进程 计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序侧是具有某种功能的程序,程序是运行于操作系统之上的。 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。 进程具有的特征: 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的; 并发性:任何进程都可以同其他进程一起并发执行; 独立性:进程是系统进行资源分配和调度的一个独立单位; 结构性:进程由程序、数据和进程控制块三部分组成。 进程的生命周期 ? 在早期只有进程的操作系统中,进程有五种状态,创建、就绪、运行、阻塞(等待)、退出。

进程与线程的区别[试题]

进程与线程的区别[试题] 进程与线程的区别: 通俗的解释 一个系统运行着很多进程,可以比喻为一条马路上有很多马车 不同的进程可以理解为不同的马车而同一辆马车可以有很多匹马来拉----这些马就是线程 假设道路的宽度恰好可以通过一辆马车道路可以认为是临界资源 那么马车成为分配资源的最小单位(进程) 而同一个马车被很多匹马驱动(线程)----即最小的运行单位 每辆马车马匹数>=1 所以马匹数=1的时候进程和线程没有严格界限,只存在一个概念上的区分度马匹数>1的时候才可以严格区分进程和线程 专业的解释: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者《操作系统的设计与实现》。对就个问题说得比较清楚。 +++++++++++++++++++++++++++++++++++++++++++++++ 进程概念 进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I,O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。

第02章 进程与线程习题解答

第2章进程与线程 习题2 参考解答 1. 简要回答下列问题。 1) 进程和线程有什么区别? 2) 线程是如何创建的?怎样设置线程的优先级? 3) 前台线程和后台线程有什么区别?如何将一个线程设置为后台线程? 【解答】 1) 一个完整的进程拥有自己独立的内存空间和数据,但是同一个进程内的线程是共享内存空间和数据的。一个进程对应着一段程序,它是由一些在同一个程序里面独立的同时运行的线程组成的。线程有时也被称为并行运行在程序里的轻量级进程,这是因为它的运行依赖于进程提供的上下文环境,并且使用的是进程的资源。 在一个进程里,线程的调度有抢占式或者非抢占的模式。在抢占模式下,操作系统负责分配CPU时间给各个线程,一旦当前的线程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU 分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。 2) C#中创建线程的工作是通过使用System.Threading名称空间下的Thread类的构造方法来完成的,如创建一个线程实例输出字符“a”1000次。 Thread thread = new Thread(new ThreadStart(func1)); thread.Priority =ThreadPriority.Normal; thread.Start(); static void func1() { for(int i =0;i<1000;i++) { Console.WriteLine("a"); } } C#中System.Threading名称空间下的ThreadPriority枚举类定义了线程可能具有的所有优先级的值,优先级由高到低排序为:Highest,AboveNormal,Normal,BelowNormal,Lowest。可以通过访问线程的Priority属性来获取和设置其优先级。每个线程都具有分配给它的线程优先级。在公共语言运行库中创建的线程最初分配的优先级为ThreadPriority.Normal。在运行库以外创建的线程保留它们在进入托管环境之前具有的优先级。可以使用Thread.Priority属性获取或设置任何线程的优先级。 3) 前台线程和后台线程的区别是后台线程不会影响进程终止。属于某个进程的所有前台线程都终止后,公共语言运行库就会结束该进程,而且所有属于该进程的后台线程也都会立即停止,而不管后台工作是否完成。 1

操作系统(进程与线程)习题与答案

1、下面哪种死锁处理策略代价最小?() A.死锁忽略 B.死锁检测+恢复 C.死锁避免 D.死锁预防 正确答案:A 2、下面哪种死锁处理策略引入的不合理因素最严重?() A.死锁检测+恢复 B.死锁忽略 C.死锁预防 D.死锁避免 正确答案:C 3、为什么进程切换的代价要比线程切换要大?() A.因为进程切换要切换控制块数据结构 B.因为进程切换要切换PC指针 C.因为进程切换要切换段表 D.因为进程切换要切换栈 正确答案:C 4、初值为N的信号量,当前值为-1表示的含义是什么?() A.有1个资源 B.有N-1个进程在等待 C.有1个进程在等待 D.有N-1个资源 正确答案:C

5、为什么PC机通常死锁忽略策略?() A.因为死锁检测算法在PC机器上不能执行 B.因为PC机上的发生死锁造成的破坏小 C.因为PC机上的死锁可以用重启来解决 D.因为PC机上的发生死锁的可能性小 正确答案:C 6、下面哪种参数可以用来表征操作系统可以对用户输入快速处理?() A.响应时间 B.等待时间 C.吞吐量 D.周转时间 正确答案:A 7、下面哪种调度算法可以保证用户的输入在一定的时间以后可以得到响应?() A.短作业优先 B.时间片轮转调度 C.剩余短作业优先 D.先来先服务算法 正确答案:B 8、下面哪个系统调用不是用来操控进程的?() A.open() B.fork() C.wait() D.exec() 正确答案:A 9、下面哪种状态下的进程不存放在内存中?()

A.运行态 B.阻塞态 C.挂起态 D.就绪态 正确答案:C 10、关于进程和线程的主要区别,下面哪种论述是正确的?() A.线程之所以切换快是因为TCB比PCB尺寸小 B.线程切换时可能会引起进程切换 C.进程不能成为调度的单位 D.线程可以没有栈 正确答案:B 11、在实际系统中实现进程调度算法需要考虑诸多因素,相比而言下面哪个因素最不需要考虑?() A.机器物理内存的大小 B.机器的使用环境 C.用户任务的特点 D.算法的复杂性 正确答案:A 12、进程和程序的区别主要体现在哪里?() A.进程在内存中,程序在磁盘上。 B.进程有代码段,程序没有。 C.进程在CPU上执行,程序没有执行。 D.进程有当前执行位置,程序没有。 正确答案:D

实验一 熟悉Windows2000XP中的进程和线程

实验一熟悉Windows2000/XP中的进程和线程 一、实验目的 1、熟悉Windows2000/XP中任务管理器的使用。 2、通过任务管理器识别操作系统中的进程和线程的相关信息。 3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。 二、实验理论基础及教材对应关系 1、实验理论基础: (1)操作系统中的进程和线程的概念; (2)进程PCB的各项指标含意; 2、本实验内容主要对应于教材第2章。 三、实验内容与步骤 1、启动操作系统自带的任务管理器: 方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。如下图所示:

2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成 下表(填满即可): 表一:统计进程的各项主要信息 3、从桌面启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。

再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是图标消失机器关机,原因是系统文件。 4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所 有窗口最小化,看看你的计算机系统起来什么样的变化桌面图标、开始任务栏消失、得到的结论是任务栏、桌面应用(说出explorer.exe进程的作用)。 5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表: 表二:统计线程的各项信息 进程:explorer.exe 中的各个线程

进程,轻量级进程,内核线程,用户线程的区别关系

进程,轻量级进程,内核线程,用户线程的区别关系 在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集合资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。 线程有自己的私有数据:程序计数器,栈空间以及寄存器。 Why Thread?(传统单线程进程的缺点) 1.现实中有很多需要并发处理的任务,如数据库的服务器端、网络服务器、大容量计算等。 2.传统的UNIX进程是单线程的,单线程意味着程序必须是顺序执行,不能并发;既在一个时刻只能运行在一个处理器上,因此不能充分利用多处理器框架的计算机。 3.如果采用多进程的方法,则有如下问题: a. fork一个子进程的消耗是很大的,fork是一个昂贵的系统调用,即使使用现代的写时复制(copy-on-write)技术。 b. 各个进程拥有自己独立的地址空间,进程间的协作需要复杂的IPC技术,如消息传递和共享内存等。 多线程的优缺点 多线程的优点和缺点实际上是对立统一的。 支持多线程的程序(进程)可以取得真正的并行(parallelism),且由于共享进程的代码和全局数据,故线程间的通信是方便的。它的缺点也是由于线程共享进程的地址空间,因此可能会导致竞争,因此对某一块有多个线程要访问的数据需要一些同步技术。 三种线程——内核线程、轻量级进程、用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。 轻量级进程[*] 轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWPs,每个LWP由一个内核线程支持。这种模型实际上就是恐龙书上所提到的一对一线程模型。在这种实现的操作系统中,LWP就是用户线程。 由于每个LWP都与一个特定的内核线程关联,因此每个LWP都是一个独立的线程调度单元。即使有一个LWP在系统调用中阻塞,也不会影响整个进程的执行。 轻量级进程具有局限性。首先,大多数LWP的操作,如建立、析构以及同步,都需要进行系统调用。系统调用的代价相对较高:需要在user mode和kernel mode中切换。其次,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(内核线程的栈空间)。因此一个系统不能支持大量的LWP。

线程与进程

1.进程与线程区别 从概念上: 进程:一个程序对一个数据集的动态执行过程,是分配资源的基本单位。 线程:一个进程内的基本调度单位。 线程的划分尺度小于进程,一个进程包含一个或者更多的线程。 从执行过程中来看: 进程:拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率。 线程:每一个独立的线程,都有一个程序运行的入口、顺序执行序列、和程序的出口。但是线程不能够独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看:(重要区别) 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。 2.我们写的程序,不论是C、C++、java还是其他的,其实都是一种文本,真正 运行、跑动的是进程。 程序可以分为两部分:源代码和可执行的二进制代码(经过汇编或编译)。操作系统加载这个可执行的二进制代码后,还要分配相应的内核数据结构——进程控制块(PCB:process control block),并进行一系列的初始化等过程(如:创建PID、分配时间片等)后才创建了真正可以“跑动”的进程。所以程序相当于是一个项目的计划书(或行动方案),而进程才是对该方案的实施过程。 进程对CPU来说其实就是一串可执行的指令序列,这个执行序列也叫执行线程,它是进程的控制流程。传统的用户进程只有一个执行流程,所以传统的进程都是单线程的。有了线程就是执行流程的概念后,进程模型得到了扩展,因为一个进程中完全可以设置多个执行流程,即多个执行线程。所以一个进程中可以创建多个线程,当然不创建的话,进程本身也可以看成是线程。 创建多个进程的话,每个进程都是独立的(都有自己独立的PCB数据结构,该数据结构比较大,将近1K的信息量,包括唯一的PID、上下文环境、持有的内存地址等等),内核要管理进程间的切换、内存管理等,开销相对比较大。 如果一个进程里创建多个线程的话,开销比进程要小,各线程共享进程的状态和资源,内核为线程创建的数据结构相对比进程的PCB就要小的多,当然额外的开销是CPU需要跟踪线程,同时线程间存在争用资源的问题。如果程序要完成一组相关任务,则用线程比较好。 下面再细讲下进程:

CPU进程与线程的关系和区别

CPU进程与线程的关系和区别 篇一:进程和线程的区别 进程和线程的区别线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源 (3)线程是处理器调度的基本单位,但进程不是. 4)二者均可并发执行. 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 和"stdio.h"区别 #include"stdio.h" 当要调用某个函数时 先在用户自已编写的文件中查找,如果找不到再到库文件里去找,而#include是直接到库文件里去找 所以如果是调用自己写的函数的话就用#include"stdio.h",这种形式 而调用标准库函数的话就用#include这种形式,可以提高速度 篇二:进程线程区别与联系 定义: 一程序只是一组指令的有序集合

Windows进程与线程

实验一Windows进程与线程 1.实验内容 观察Window进程、线程关键数据结构 实验环境: 主机Windows 7 目标机 Windows Server 2003 SP1 (虚拟机) Windbg 工具 2.理论基础 Windows系统内部有执行体对象和内核对象两种类型,执行体对象由执行体的各种组件,如进程管理器所实现,内核对象由Windows内核实现,其更为基础。Windows中的进程和线程在执行体中以对象的方式实现。 一个进程主要由几个部分组成,其中包括一个私有的虚拟地址空间,一个可执行的程序,一个已打开的句柄列表,一个称为访问令牌的安全环境,一个唯一标识,至少一个执行线程。 NOTS中每个进程有5个数据结构: EPROCESS,KPROCESS,PEB,WIN32KPROCESS,子系统csrss为每个win用户进程创建的进程信息数据结构。 线程是一个进程的内部实体,NTOS中每个线程也有5个数据结构: ETHREAD,KTHREAD,TEB,WIN32THREAD,csrss为每个线程建立的线程信息数据结构 3.实验步骤 搭建好实验环境,配置完成后在目标机里运行实验程序test.exe ,中断,在Windbg中Commad窗口输入!process 0 0,如下图,最后一项为测试程序信息。可知其虚地址为813d1948.

其EPROCESS 如下图

查看其偏移0x000处KPROCESS 结构的具体信息

查看进程环境块PEB 信息

查看其线程ETHREAD 结构信息

查看的ThreadsProcess 为 0x813d1948,也就是进程test.exe 的虚地址 继续查看KTHREAD 的信息,如下 kd> dt_kthread 813db4c0 nt!_KTHREAD +0x000 Header : _DISPATCHER_HEADER +0x010 MutantListHead : _LIST_ENTRY [ 0x813db4d0 - 0x813db4d0 ] +0x018 InitialStack : 0xfa0ec000 +0x01c StackLimit : 0xfa0e9000 +0x020 KernelStack : 0xfa0ebd44 +0x024 ThreadLock : 0 +0x028 ApcState : _KAPC_STATE +0x028 ApcStateFill : [23] "???" +0x03f ApcQueueable : 0x1 '' +0x040 NextProcessor : 0 '' +0x041 DeferredProcessor : 0 ''

相关主题
文本预览
相关文档 最新文档