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 多对多模型:是两种的综合,可以将多个用户线程对应到多个内核线程。