操作系统---线程

1.线程引入的原因?

  1.1 对于现实世界存在的一个问题:MP3播放--大的任务可以划分为3个子任务---先读数据(属于IO绑定),解压数据(属于CPU绑定),最后播放;想提高

程序的并发性,可以通过使用多进程实现,每个进程负责一个任务,但是这样开销大,而且还要考虑资源共享,和进程之间的协作,所以操作系统提出了

线程概念---就是表示进程中的一条执行流(可并发执行的小任务)。进程中可以拥有多个线程,线程共享进程资源,线程有自己私有的栈,保存执行情况。

  1.2 线程的提出是为了提高进程的并发性。将进程的两个属性分开,进程依旧是资源分配的单位,线程是调度的单位(在支持线程的OS中)。

  1.3 需要注意的是并非所有的程序都应该设计成多线程程序,要根据程序的逻辑划分,确定哪些子任务是异步,那些子任务是同步的。

2.线程的分类

  2.1 用户级线程:最初操作系统是不支持线程的,但是为了用户的需求,又不能在短期内修改操作系统内核在内核态实现线程,所以只有先在用户

  态通过线程库实现线程。eg:Java Thread

  用户态线程特点:线程的创建、调度、TCB的维护都由用户态控制。OS内核态完全不知道用户态是多线程,同一个进程的线程之间切换速度快。

  用户态线程缺点:某个线程的阻塞,导致整个进程的所有线程阻塞;不支持基于线程的处理机抢占;CPU调度是按照进程来调度,线程获得时间片短。

注意:Java的JVM是运行在用户态的,Java的线程就是用户态线程。

  2.2 内核态线程:重写操作系统内核,在内核态支持线程,也就是说,线程的创建,TCB维护、线程切换等所有有关线程的操作都必须在内核态完成。

3.多线程模型

  3.1 一对一模型:真正的实现了线程是最基本的调度单位,内核态维护线程TCB。在支持线程的OS中,推荐使用这种。

  3.2 多对一模型:其实属于内核态不支持线程,只在用户态实现了线程,调度的单位其实还是进程,进程获的的时间片在分给进程中的线程。

同一个进程的线程切换速度快,但会出现一个阻塞,全部阻塞的情况。

  3.3 多对多模型:是两种的综合,可以将多个用户线程对应到多个内核线程。

 

posted @ 2017-11-06 17:47  sun1993  阅读(311)  评论(0编辑  收藏  举报