多线程基础

     早期未配置OS的系统和单道批处理系统中,程序的执行方式是顺序执行,即在内存中仅装入一道用户程序,独占系统所有资源,一个用户程序执行完成后,才允许在内存装入另一个程序并执行。多道程序系统中,内存可同时装入多个程序,共享系统资源来并发执行,考虑到程序并发执行的特点,操作系统中才引入了进程的概念。

     进程在其生命周期内可能有多个状态,但至少应处于以下三种基本状态之一:就绪状态,执行状态,阻塞状态(申请缓存区失败,I/O请求等)

为了满足进程控制块对数据及操作的完整性要求及增强管理的灵活性,通常在操作系统还为进程引入了两种常见的状态:创建状态和终止状态。

挂起操作和进程状态的转换:

为了系统和用户观察,分析进程的需要,许多系统还引入了一个重要的对进程的操作——挂起操作,该操作作用于某个进程时,该进程挂起处理静止状态,若处于正在执行则将暂停执行,若原本处于就绪状态则将不接受调度。挂起操作对应的是激活操作。

进程与线程:

进程的两个基本属性:

1》进程是一个可拥有资源的独立单位

2》进程是一个可独立调度和分派的基本单位

 

每个核只能运行一个进程,进程切换时的时空开销比较大,而实际生活中一定需要某些功能是经常穿插执行(不断切换进程)的。于是引入了线程。例如:文字处理器可设置三个线程,一个用于从键盘读入数据,一个用于显示文字及图形,一个用于进行拼写和预发检查。网页浏览器可设置两个线程,一个线程来显示图像和文本,一个线程从网络中接收数据。还有处理多个相同功能的web服务器,一个服务器经常接收到多个用户的请求,若使用单线程的进程则每次只能为一个客户服务。有了多线程后可设置一个专门监听客户的请求,每到达一个请求则创建一个线程来处理该请求。

说白了,多线程就是为了降低为提高用户体验使相同或不同非阻塞进程之间进行的进程切换 和 进程阻塞时穿插执行非阻塞进程来提高CPU利用率时进行的进程切换(相互穿插的进程变为了同一进程中的相同或不同线程)。没有阻塞时单纯一个线程执行100个任务一定比100个线程不断切换交替执行的更快

 

对于一个进程,多线程的效率只能体现在同一进程中线程阻塞时切换到另一线程上(线程切换相对进程切换来说开销小)。

对于CPU,多线程的效率还体现在因线程的出现导致进程变少带来的进程切换次数减少。

 

 

线程状态:

Java的线程的调度机制都由JVM实现,假如有若干条线程,你想让某些线程拥有更长的执行时间,或某些线程分配少点执行时间,这时就涉及“线程优先级”,Java把线程优先级分成10个级别,线程被创建时如果没有明确声明则使用默认优先级,JVM将根据每个线程的优先级分配执行时间的概率。有三个常量Thread.MIN_PRIORITY、Thread.NORM_PRIORITY、Thread.MAX_PRIORITY分别表示最小优先级值(1)、默认优先级值(5)、最大优先级值(10)。

由于JVM的实现以宿主操作系统为基础,所以Java优先级值与各种不同操作系统的原生线程优先级必然存在某种映射关系,这样才足以封装所有操作系统的优先级提供统一优先级语义。例如1-10优先级值在linux可能要与0-99优先级值进行映射,而windows系统则有7个优先级要映射。

时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。

线程的调度策略决定上层多线程运行机制,JVM的线程调度器实现了抢占式调度,每条线程执行的时间由它分配管理,它将按照线程优先级的建议对线程执行的时间进行分配,优先级越高,可能得到CPU的时间则越长。

 

一个线程的生命周期有六个状态:新建线程后的初始状态,运行状态(执行start()方法后的就绪状态和线程运行中的状态。所有就绪态的线程存放在就绪队列中,若就绪队列没有线程则直接进入运行中的状态),阻塞状态,等待状态,超时等待状态,终止状态。

线程状态转换:

就绪态到运行态:JVM调度器从就绪队列中选择一个线程进入运行态,这是线程进入运行态的唯一方式,系统调度完成,不可控

运行态到就绪态:线程执行放弃方法yield()(只是放弃了此次轮询时被分配的时间片)

运行态到阻塞态:运行态的线程请求锁失败时进入阻塞态。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值