码迷,mamicode.com
首页 > 编程语言 > 详细

第7章 线程

时间:2016-05-12 14:47:34      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

7.1  进程的分身术--线程(Thread)

  • process 只能干一件事情,所有的task 都需要串行执行,对资源的利用率、和一个job的效率都比较地;这时如果想让一个进程并发干多件事情,我们就引入了进程的"分身术“---线程;线程是进程的分身术,是进程不同的执行序列;也就是不同的代码序列(代码转换未指令集由cpu 来执行)
  • 线程从一个角度上理解就是一个、一个进程的执行序列;一个进程可以有多个执行序列,也就是有多个线程
  • 线程的另外一个核心作用:提高计算机多core的利用率,如果一个进程只有一个线程,那这个进程(唯一的线程)最多可以占用一个core,即便是这个core 100%,其他的core 也是空闲的;但如果是多个Thread 那就可以每个线程占用一个core的资源,合理利用所有core的资源
  • 进程、线程的一个典型case:打开一个word 文件,进行编辑时就打开了多个线程:
  1.    首先打开word程序---进程
  2.    1个线程负责显示word的内容(窗形显示)
  3.    1个线程负责接受I/O输入;键盘、鼠标
  4.    1个线程负责把修改的数据保持到磁盘(定时保持) 
        这写线程同时运行,保证我们可以同时看到显示、同时输入数据、同时默认保存数据,可以很流畅、自然的给用户提供服务

7.2 线程的管理

      进程需要进程管理,那线程也需要线程管理;线程相关的信息和数据都放在线程控制快里面;跟进程不同,所有的线程都属于同一个进程,发明线程就是在一个程序(进程)里面
并发执行多个task,所以多个线程协同工作可以最大的提升效率;所以资源共享也是多线程追求的一个目标;但不是所有的资源都可以共享的;
  1.     共享的资源
  • 地址空间(各种资源:内存、全局变量、磁盘、文件、。。。)
  • 信号以及信号服务程序
  1.    不可以共享的资源
  • 程序计数器
  • 寄存器
  • 栈信息

7.3 线程的实现方式

因为线程是由进程产生,那是由进程自己来管理线程、还是由操作系统自己来管理;2种方式就出现了:用户态线程实现和内核态线程实现;
因为进程是在cpu上实现并发,也就是需要操作系统对各个进程进行cpu 切换,所以所有的进程都是操作系统来管理,也就是所有进程都是内核态实现方式
  1.  内核态线程的实现: 
  • 操作系统来管理线程,就跟操作系统管理进程是相似的,就是给线程分配一个线程控制块(线程表);统一放在内存中,这样os系统就可以分配cpu 到不同的进程,不同的线程,实现线程和进程一样的资源管理、和效率调度;
  • 但用户态的线程有缺点:1). 因为线程很多,如果线程控制快都放在内核空间,那内核空间很快就满了,占满后如果新的线程创建失败,会导致进程出现问题  2). 而且如果让操作系统来管理线程,还需要说服操作系统来修改代码,再线程没有证明自己的时候是不可能是实现的
  1. 用户态线程的实现
  • 用户态线程就是所有的线程都是进程自己创建、自己管理;os 都不需要知道线程的存在;因为进程获取CPU 的控制权后可以分配给下面的线程;但是进行也没有强制从一个线程的cpu 剥夺或者转移,所以所有的线程如果并发执行,必须采取合作的方式;
  • 既然进程要管理所有的线程:就需要进程自己写一个执行系统(runtime system)作为线程的调度器,也就是必须有一个线程专门负责线程的调度工作,一般我们把这个线程成为主线程,或者管理线程
  • 因为主线程没有cpu的管理权限,所以线程的调度(cpu 的切换)必须采用线程合作的方式,就是主线程设置每个线程获取cpu的时间,每个线程时间到后必须释放出cpu的控制权,然后主线程通知另外一个线程去获取cpu然后开始执行
  • 用户态线程的缺点: 如果一个线程阻塞(I/O: 写磁盘) 这时就不能释放cpu,到时时间后,操作系统会收回cpu直接给另外一个进程:一般可以采取2此机会,就是如果os 获取cpu控制器后,再跟进程(主线程) 确认下是否还有其他的线程等待执行,如果有继续把cpu给进程,然后主线程通知另外一个线程接收cpu继续运行
  • 用户台缺点:二次机会会导致os 调用用户程序,这是如果用户程序写一段病毒,会导致os出现崩溃,所以安全问题非常大

7.4 现代操作系统的线程实现

     因为用户态线程和内核态线程都有自己的优缺点,所以现代操作系统就结合2种方式来实现多线程的方式:
  •   在进程创建线程时(现在高级语言写代码的时候,都已经封装到类库里面了,所以写程序基本感知不到)会创建2类线程;一类是用户态线程(数量多),一类是内核态线程(数量少),这样用户态线程用主线程来管理,内核态线程用os来管理
  •  可以在一个进程里面对线程进行分组,多个用户态线程+ 1个内核态线程 = 1个线程组,
  •  内核线程用来执行阻塞概率比较大的task,用户态线程执行阻塞概率比较小的task
  •  但是如果用户态线程还是阻塞了,但这个组的线程也就阻塞了;其他的线程组还可以正常工作

第7章 线程

标签:

原文地址:http://blog.csdn.net/caoshuming_500/article/details/51362025

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!