Java进程与线程

今天简单写一下线程、进程、协程吧Frighting!

简要说说进程、协程吧(线程就说一下概念,因为讲线程就要讲线程安全、线程池、多线程、锁等,我打算放一起作为一章):

线程是进程的最小单元(组成部分),之前讲的JVM的内存模型其实就是进程的所用内存,即1个进程有堆、方法区、栈、本地方法栈、程序计数器;之前到了堆、方法区是线程共享的,栈、本地方法栈、程序计数器是线程私有的,不知道各位有印象?下一写线程安全再讲,这里先明白线程间竞争与对共享数据修改的安全性都是进程的内存模型中

进程组成:进程控制块(PCB)、程序段(程序代码/指令序列)、数据段(内存模型的数据)。

线程组成:线程ID、当前指令指针、寄存器集合、栈、程序计数器、局部变量。

进程的单位(线程):

  1. 一个进程由多个线程组成:其优点是多线程共享进程的内存数据,缺点是一旦某一线程崩溃则全线程崩溃。
  2. 线程有三种实现:用户线程(用户态)、内核线程(内核态)、轻量级进程(内核支持用户)。TCB线程控制块 (在3种不同线程中有不同维护者)。
  3. 用户线程和内核线程关系:多用户单内核、 单用户单内核、 多用户多内核。
  4. 用户线程(多用户单内核):管理和调度由用户级线程库函数完成,操作系统不参与,TCB由线程库函数维护。优点:在用户态下完成,无需切换内核态,效率更快,进程私有TCB列表记录线程状态,兼容不支持线程系统; 缺点:操作系统不参与线程调度,其中一个有调用系统操作其它均阻塞。
  5. 内核线程(单用户单内核):管理和调度由操作系统完成,TCB也是操作系统维护,优点:多线程进程的CPU运行时间可获取更多,系统调用操作其它不阻塞; 缺点:进程和线程上下文信息(PCB和TCB)都由系统维护,开销较大
  6. 轻量级进程(多用户多内核):内核支持的用户线程,进程有-单或多的轻量级进程。

进程的切换:进程生命周期如

         

 

  1. 线程生命周期也如图相似(没有就绪挂起、阻塞挂起阻塞状态下超时等待。
  2. 进程执行慢(如读硬盘)返回结果期间,CPU不会等待而是切换执行其他进程。
  3. 进程状态:创建—就绪—运行—阻塞—死亡,挂起状态是因为缺页异常引发的。阻塞挂起:进程数据在磁盘中,等待某事件出现激活; 就绪挂起:进程数据在磁盘中,当置换到内存时立刻执行。
  1. 进程都有自己的PCB,通过链表将相同状态的进程PCB链成队列(就绪队列、阻塞队列)如阻塞队列:进程阻塞的是PCB、线程阻塞的是Runnable对象。
  2. CPU上下文切换:CPU寄存器、程序计数器(记正执行/下条指令)合称CPU上下文。切换过程:当前任务CPU上下文的数据保存起来,加载新任务数据,依据程序计数器跳指定位置。其中说的任务可以是进程、线程、中断。
  3. CPU上下文切换分为:进程上下文切换、线程上下文切换、中断上下文切换。
  4. 进程上下文切换因素:进程时间片用尽、系统资源空间不足、进程sleep、进程优先级抢占、硬件中断。进程上下文切换仅在内核态进行。
  5. 线程上下文切换因素:线程执行完、线程IO阻塞、线程抢占、执行代码进行中断、硬件中断。同一进程内的线程切换更高效、不同进程内的线程切换需要切换进程资源。

进程的调度(即决定哪个进程执行的标准):

  1. 影响调度程序指标:CPU使用率、吞吐量、等待时间、响应时间、周转时间。
  2. 进程调度算法:轮询调度(按时间片分配),时间片多切换频繁性能低,时间片少后面的进程的响应时间变长; 优先级调度分为静态优先级(优先级顺序已固定),动态优先级(包含抢占式、非抢占式); 先来先服务(适合CPU密集型,不适合IO密集); 最短作业(进程)优先(适合提高系统吞吐量,但执行时间长的业务会等待时间长); 多级反馈队列(兼顾轮询和优先级调度,优先级高的时间片短,低的时间片长); 高响应比优先(要求服务时间短的优先,兼顾先来先服务和最短作业优先调度)。
  3. 僵尸进程:已完成进程且终止状态,但仍在进程表中存在的进程。

进程的通信(进程间交互的方式):

  1. 进程的用户空间和内存页是相互独立的,但进程间共享内核空间可以内核进行通信。
  2. 进程间通信:管道-(半双工通信-单向数据传输)、 FIFO队列-(全双工通信-双向数据传输)、 消息队列-(链表存进程所有消息)、 共享内存-(多进程共享1块额外内存页)、 临界区-(共享内存基础上+信号量互斥进程)、 消息传递-(跨网络socket通信)。
  3. 通信机制问题:管道(优点是实现简单、缺点是通信频繁时效率低);消息队列(优点无需等待就可获取数据、缺点是获取数据频繁内存拷贝频繁);共享内存(优点是无需拷贝数据的消耗、缺点是进程竞争内存且数据不安全);信号量(优点是解决进程竞争内存问题、缺点是互斥同步会造成阻塞);Socket(优点是解决仅单机通信、缺点是需要网络)。

协程组成:协程运行体(运行体上下文、栈、运行状态)、协程调度器(寄存器上下文、epoll、就绪队列、红黑树)。协程缺点:无法使用CPU多核、且都要使用非阻塞代码。

协程(异步阻塞+CPU跳转) :

1. 独立的寄存器、上下文、栈(Java目前不支持,需要框架支持),单线程高并发。

2. 协程是比线程更小的执行单元(可认为是轻量级的线程),轻原因:协程的栈比线程小,每个线程约1M栈空间、协程可能几十到几百KB,

   3. 性能方面: IO密集场景(协程优于线程)、CPU密集场景(协程约等于线程)。

4. 协程调度是在用户空间进行,人工调用系统相关api完成; 线程调度是操作系统进行。

 5. 生产者消费者模式:休眠/等待集合(超时后放入)—>就绪集合—>CPU轮询消费。

多状态模式:休眠(超时)/就绪(符合条件)/等待(超时)—>CPU轮询检测消费。

6.基于线程实现协程,协程(创建、切换、销毁)都在线程中进行,协程切换成本低:分为:有栈协程(每个协程1个栈,实现简单性能高、栈的利用率低,推荐); 无栈协程(协程共享一个线程栈,实现复杂性能低、但栈的利用率高)。

7. 协程的切换:切换时,寄存器保存和加载的数据量小,有效利用高速缓存、没有用户模式到内核模式的切换,只在用户空间进行、协程没有抢占,正常执行完或阻塞,无需数据同步。

8. 线程用时间片算法,会进行很多没必要的切换(为了尽量让用户感知不到某个线程卡)。

9. 协程不会阻塞切换,但协程是依赖线程或进程的,即协程阻塞是线程或进程的阻塞。

10. 协程多核模式:借助线程,每个线程1个调度器(无需锁性能高,但成本大); 借助进程,每个进程1个调度器(代码简单,性能低)。

磁盘调度算法:(即在磁盘上寻址数据方式

  1. 先来先服务:先来的任务先去寻道找,但寻道分散,以目标寻道造成寻道次数多。
  2. 最短寻道时间优先:距当前磁头最近的任务优先,但可能存在左右两边最近,来回寻道此区,远处任务处于饥饿。
  3. 扫描算法:磁头向最近/远任务寻道,直至头部,再从头部寻道至最远/近任务,但中间区寻道2次,中间响应频率高。
  4. 循环扫描算法:磁头向前/后顺序寻道1圈(可能不到1圈,以寻道任务为终点),仅道头道尾切换期间不响应新任务。
  5. LOOK(扫描的优化):磁头向最近/远任务寻道,到达后反向寻道至最远/近任务,反向寻道期间响应新任务。
  6. C-LOOK(循环扫描的优化):磁头向最近/远任务寻道,到达后直接调头寻道至最远/近任务,调头期间不响应新任务
  7. 磁盘顺序读写不一定慢于内存读写,因内存读写涉及-缺页异常、数据过大缓存命中问题、垃圾过多GC消耗大的问题

声明:因文章是个人笔记,顾偏向于知识总结,文中提到的相关知识还需细化学习,因篇幅有限无法逐一讲解,最后谢谢支持与指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值