理解进程和线程

  作业:最早出现在批处理系统中,指的是用户向系统提交的一项工作的基本单位,是用户在一次事务处理或计算过程中要求计算机所做的工作的和任。简单的说,就是用户要求计算机所做的一项工作,有时候进程也叫做任务,这是在多道系统中而言的。

程序:它是代码和数据的集合;程序可以作为目标模块存在于磁盘上,或者做为段存在于地址空间中。

上下文:是由程序正确运行所需要的状态组成的。这个状态包含存放在存储器中的程序代码和数据,它的栈,它的通用目的寄存器的内容,程序计数器(PC),环境变量以及打开文件描述符的集合。

进程:它是执行中程序的一个实例;程序总是运行在某个进程的上下文中。每个进程都有自己独立的地址空间。每次用户通过shell输入一个可执行文件的名字运行一个程序或在windows下通过鼠标双击一个可执行文件时,系统会创建一个新的进程。

进程通常被定义为一个正在运行的程序的对象的实例,它有两个部分组成:

l    一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。

l           另一个是地址空间,它包含所有可执行模块或DLL的代码和数据。它还包含动态内存分配的空间。如线程栈(Stack)和堆(Heaps)分配空间。

     进程的优点:每个进程都有自己独立的地址空间,这样一来一个进程就不会不小心覆盖另一个进程的虚拟存储器。基于进程的多任务处理的特点是允许计算机能同时运行两个或更多的程序,进程共享CPU时间,系统负责进程的切换。

     进程的缺点:独立的地址空间是进程共享状态信息变得困难。另外,线程间的切换和通讯开销很大。

线程:其实说到程序的最小执行单元就应该是线程了,线程是对CPU单元的独立占有的最小单位,每个线程共享进程的数据,在每个进程被创建的时候只有一个主线程。一个线程就是运行在一个进程上下文中的一个逻辑流。每个线程都有自己的线程上下文,包括唯一的整数线程ID、栈、栈指针、程序计数器、通用目的寄存器。所有运行在一个进程中的线程共享该进程的整个虚拟地址空间。

     线程执行模型:每个进程开始生命周期时都是单一线程,称为主线程,在某一时刻主线程创建一个对等线程。如果主线程停滞则系统就会切换到其对等线程。

     线程优点:线程的上下文要比进程的上下文小的多,所以线程的上下文切换要比进程的上下文切换要快。

线程不像进程按照严格的父子关系来组织。和一个进程相关的线程组成一个对等线程池,一个线程可以杀死其任意对等线程。每个线程都能读写相同的共享数据。

     线程缺点:由于数据共享会带来同步问题,进而会导致死锁的产生。死锁在语言层面上不能解决,需要一个对程序的良好设计来避免死锁。

 

 

进程是不活泼的。要是进程完成某项操作,它必须拥有一个在它的环境中运行的线程,该线程负责执行包含在进程的地址空间中的代码。实际上,单个进程可能包含若干个线程,所有这些线程都“同时”执行进程地址空间中的代码。为此,每个线程都有他自己的一组CPU寄存器(即,线程的上下文,定义在:WinNT.h头文件中)和它自己的堆栈。但是,由于Windows中,是针对进程来分配系统资源的。所以,线程的堆栈实际上位于其所属进程的虚拟地址空间中。

每个进程至少拥有一个线程,来执行进程地址空间中的代码。如果没有线程来执行进程的地址空间中的代码,那么进程就没有存在的理由了,系统将自动撤销该进程和它的地址空间。

若要使所有线程都能运行,操作系统就要为每个线程安排一定的CPU时间片。它通过一种循环方式为线程提供时间片(称为:量程),造成一种假象,仿佛所有线程都是同时运行的一样。

当创建一个进程时,系统会自动创建它的第一个线程,成为主线程。然后,该线程可以创建其他的线程或者进程。

Win32平台中,粗略的讲,可以认为进程是应用程序的一个运行实例。更精确的说,进程描述的是应用程序的一个运行实例所拥有的资源,进程的资源包括:地址空间、文件、内核对象句柄、虚拟内存、堆以及线程等。

这些资源是静态的,而应用程序的一个运行实例中活跃的部分是线程,线程隶属于进程,它是进程中的一条执行路径(即一系列代码),一个进程可以拥有多个线程,这些线程在进程资源所构成的环境中运行。操作系统中的调度程序为系统中的所有进程的所有线程分配CPU时间片,而不是为进程分配时间片。系统通过合理的为线程分配CPU时间片,使得用户感觉系统中的线程在同时运行。

    Windows NT/2000/XP支持多CPU,如果主机中有多个CPU,系统会把各CPU分配给不同的线程,使得这些线程可以真正的同时运行。Windows 95只支持一个CPU,即使运行Windows 95的主机含有多个CPU芯片,Windows 95也只能一次调度一个线程,其他的CPU处于休眠状态。

    由于进程是惰性的,因此,它至少拥有一个称为主线程的线程。如果需要多个线程,可以通过主线程创建更多的线程。主线程由系统在加载应用程序时自动为进程创建。每个线程有自己的CPU寄存器组和自己的栈。

 

 

 

关于进程和线程通俗的理解:

进程:多任务系统的产物。很久很久以前,是没有进程这个东西的。那时候的操作系统只能把要做的工作排好队,做完这件再做下一件,最多也就加个优先级,哪个关系好就先做哪一个。于是那些想一边听歌一边写程序的程序员们便不干了,开始修理那个操作系统,使之能同时运行多个程序。于是进程就出现了:它就是一个程序在数据集合上的一次执行。

 

因为突然变得僧多粥少了,所以每个进程只好做一些额外的事情:在别人使用之前把自己的东西收拾好,下次轮到自己时再摆出来。为了保存这些额外的东西,进程的结构也发生了相应的变化。一个进程被分成三大部分:代码段、数据段和PCB(进程控制块)

 

在多出来的PCB中,我们保存了如下信息:

l  进程标识符(操作系统用于识别进程的唯一标识)

l 处理机状态(主要是通用寄存器,指令寄存器,PSW和用户栈指针)

l 进程调度信息(状态、优先级,被阻塞原因和其他一些乱七八糟的东西)

l 进程控制信息(同步信息、代码段和数据段的信息、资源清单和指向下一PCB的指针)

 

操作系统正是通过PCB来管理这多个进程。在这样的系统里,进程既是操作系统独立调度和分派的基本单位,又是一个可拥有资源的独立单位。

 

线程:进程的再分身好了,现在程序员可以一般听歌一边写程序了。可是不幸的或者说是幸运的,新的问题出现了。如果多个进程间使用很多相同数据的话,实在是太浪费了。我们当然不能允许这样的事情持续下去,所以线程出现了。同一个进程下可以拥有多个线程,它们共享这个进程的资源,它们之间的切换也不再需要PCB,而只需要极少一点资源就可以了。在这样的操作系统里,线程变成了系统调度和分派的基本单位。

 

简单的说进程和线程有如下不同:

l    进程可以拥有资源,线程共享进程拥有的资源

l    进程间的切换必须保存PCB,同个进程的多个线程间的切换不用那么麻烦

 

最后以一个实例来说明:

在一台PC上打开两个QQ时,每一个QQ是一个进程;而当你在一个QQ上和多人聊天时,每一个聊天窗口就是一个线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值