zoukankan      html  css  js  c++  java
  • OS之多线程

    os中引入进程的目的是,为了描述和实现多个程序的并发执行,以改善资源利用率及提高系统的吞吐量。

      为什么要引入线程?这是为了减少程序并发执行时系统所付出的额外开销(堆栈切换的开销等),使os具有更好的并发性。

     进程的两个基本属性:

        1、进程是一个拥有资源的独立单位;

        2、进程同时又是一个可以独立调度的基本单位;

    系统为进程进行的操作:

      创建进程、 撤销进程、进程切换

    进程作为资源的拥有者和系统的调度对象,需要花费系统较大的额外开销,故,系统中同时存咋的进程数目不宜过多,进程切换的频率也不宜过高,而这也就限制了并发度的进一步提高;

    目标:既能提高进程并发度,又能降低系统的额外开销;

    实现:将进程的资源申请和调度属性分开,即进程作为资源的申请和拥有者,但不作为调度的基本单位。这样,就产生了线程的概念;

      线程是进程中的一个实体,是独立调度和分派的基本单位;

    线程自身基本上不拥有资源,只拥有少许运行中必不可少的私有资源。线程可与同属一个进程的其他线程共享进程的全部资源;

      进程中的所有线程共享该进程的状态;

    线程具有三种基本状态:就绪、执行和阻塞;一般没有挂起状态;

    一个进程可以创建和撤销一个或多个线程,同一进程的多个线程可以并发执行;

      对线程的操作包括:

        1、派生(spawn),当系统创建一个进程时,同时也为该进程派生一个线程(主线程),同一进程中的线程可以再派生其他线程;

        2、阻塞(Block), 当线程需要等待其他事件,它将被阻塞,释放处理机执行其他线程;

        3、解除阻塞(Unblock),当线程的阻塞事件发生,其状态转换为就绪,并插入到就绪队列,等待调度执行;

        4、结束(Finish),当线程执行完毕,释放其私有资源,(共享资源没有权限释放)

     注意:线程阻塞不一定会引起整个进程的阻塞,否则,引入线程带来的并发性就不会提高;(有时候线程阻塞会引起进程的阻塞,比如: )

      传统os,一个进程可以创建一个线程;MS DOS就是一个单用户,单进程,单线程的os,unix是一个多用户,多进程,单线程的os;

      现代os,windows和linux 都是多进程、多线程技术;java虚拟机是一个单进程、多线程的运行环境;

      引入线程的os中,线程是独立调度的基本单位(进程也要被调度);进程是资源拥有的基本单位,从而可以显著提高os的并发程度;

      同一进程中的线程间切换不会引起进程切换;但当一个进程中的线程切换到另一进程中的线程时,将会引起进程切换;

      进程之间可以并发执行;

      同属于一个进程的多个线程之间,也可并发执行;

      因而使os具有更好的并发性,从而更有效地使用系统资源和提高os吞吐量;

    思考:不同进程之间的线程能否并发执行;

    进程与线程  ----拥有资源

      进程是拥有资源的独立单位,它有权申请系统的各类资源;

    线程除了拥有很少的私有资源以外,不能申请系统资源,可以共享其所属今晨的资源,即,进程的代码段、数据段以及系统资源,如已打开的文件,I/O设备等,都可被其内的所有线程共享;

        

      

  • 相关阅读:
    正则
    cookie、sesion
    POJ-1509
    HDU-3374
    ZOJ-3822
    HDU-5492
    在什么情况下Java比C++快?
    HDU-5451
    SPOJ-913
    莫比乌斯反演入门
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3803112.html
Copyright © 2011-2022 走看看