进程/线程要点

来源:互联网 发布:mac 风暴英雄 鼠标 编辑:程序博客网 时间:2024/06/06 12:46
  • 转自 http://www.cnblogs.com/qiaoconglovelife/p/5319779.html

  • 进程与PCB

    进程:进程是程序的一次执行过程,是系统进行资源分配和调度的一个独立单位。

    进程实体(进程映像):由程序段、相关数据段和PCB三部分构成。进程是动态的,进程实体是静态的。

    PCB(进程控制块):系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程;所谓创建进程,实际上是创建进程映像中的PCB;PCB是进程存在的唯一标志。

  • 进程的状态

    进程有5种状态,其中前3种是基本状态。

    (1)运行态:进程正在处理机上运行。在单处理机的情况下,任一时刻最多只有一个进程处理运行态。

    (2)就绪态:进程已经获得除处理机之外的一切所需资源,一旦得到处理机就可以进入运行态。

    (3)阻塞态(等待态):进程正在等待某一事件/某一资源而暂停运行。这时候,即使处理机空闲,该进程也不能进入运行态。

  • 进程的创建过程

    (1)分配ID与PCB:为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败则创建失败。

    (2)分配资源:为新进程的程序和数据、以及用户栈分配必要的内存空间(在PCB 中体现)。注意:这里如果资源不足(比如内存空间),并不是创建失败,而是处于阻塞态。

    (3)初始化PCB:主要初始化(1)标志信息(2)处理机状态信息(3)处理机控制信息,以及(4)设置进程的优先级等。

    (4)调度:如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列,等待被调度运行。

    注意,进程的创建是一个原子操作,执行期间不允许中断,它是一个不可分割的基本单位。


  • 进程的终止

    引起进程终止的事件主要有:

    (1)正常结束

    (2)异常结束:如存储区越界、非法指令、I/O故障等

    (3)外界干预:如操作员或操作系统干预、父进程请求、父进程终止。

    操作系统终止进程的过程如下:

    (1)根据被终止进程的ID,检索PCB,从中读出该进程的状态

    (2)若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程

    (3)若该进程还有子进程,则应将其所有的子进程终止

    (4)将该进程所拥有的资源,或归还给其父进程或归还给操作系统

    (5)将该PCB从所在队列(链表)中删除。

  • 进程之间的切换

    (1)保存处理机上下文,包括程序计数器和其他寄存器。

    (2)更新PCB信息。

    (3)把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。

    (4)选择另一个进程执行,并更新其PCB。

    (5)更新内存管理的数据结构。

    (6)恢复处理机上下文。

    注意:“调度”和“切换”的区别:调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说,等有资源的调度,再有进程的切换。

 

  • 线程

    线程是轻量化的进程,是程序执行流的最小单位;由线程ID、程序计数器、寄存器集合和堆栈组成;线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。

          在多线程环境下,每个线程拥有一个栈和一个程序计数器。栈和程序计数器用来保存线程的执行历史和线程的执行状态,是线程私有的资源。其他的资源(比如堆、地址空间、全局变量)是由同一个进程内的多个线程共享。
        1. 调度
        由于进程之间的线程共享同一个进程地址空间,因此在进程的线程之间做进程切换,并不会引起进程地址空间的切换,从而避免了昂贵的进程切换。当然不同进程组之间是需要进程切换的
       2. 拥有资源
       进程是操作系统中拥有资源的独立单位,在创建和撤销进程时,操作系统都会为进程分配和回收资源,资源包括地址空间,文件,IO,页表等。但是由于线程是依附与创建进程的,线程的代码段,数据段,打开文件,IO资源,地址空间,页表等都是和进程的所有线程共享的。
从上面我们看出线程并没有独立的地址空间,这就意味着隶属同一进程的所有线程栈,都在所属进程的地址空间中,他们的栈地址不同,但是如果操作栈时发生越界,是有可能破坏其他线程的栈空间的。
而进程实际上可以看作是主线程,它的栈和其它线程栈没有区别。
单线程只有一个栈,多线程则为每个线程都分配一个栈,并且这些栈的地址不同,可以通过如下方法验证这个结

  • 进程与线程区别


线程是指进程内的一个执行单元,也是进程内的可调度实体。与进程的区别:


(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。


(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。


(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.


(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

  • 线程独有的内容:

      线程ID

      寄存器集合,包括程序计数器和栈指针

      栈(用于存放局部变量和返回地址)

      errno

      信号掩码

      优先级

  • 线程共享的内容:

      进程指令

      大多数数据

      打开的文件(即描述符)

      当前工作目录

      用户ID和组ID




  • 相比进程

  • ,线程有什么好处

    (1)易于调度。

    (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

    (3)开销少。创建线程比创建进程要快,所需开销很少。。

    (4)利于充分发挥多处理器的功能。 

  • 相比进程,线程有什么缺点

    (1)线程之间的同步和加锁控制比较麻烦

    (2)一个线程的崩溃影响到整个程序的稳定性

    (3)线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU 

  • 分离线程

    • 线程可以是可结合的,或者是可分离的;
    • 可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是没有被释放的,相反一个分离的线程是不能被其他线程回收或杀死的。它的存储器资源在它终止时由系统自动释放;
    • 为避免存储器泄漏,每个可结合线程都应该被其他线程显式地收回,要么通过调用pthread_detach函数被分离;
    • 默认情况下,线程被创建成可结合的。
  •  进程/线程间通信

0 0
原创粉丝点击