Day01 【学习日记】并发编程-进程与线程

58 阅读3分钟

1.进程与线程

进程

  • 程序由指令和数据组成,当指令需要运行,数据需要读写操作时,这时就需要将指令加载至CPU中,数据加载至内存中。在指令运行的过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的
  • 当一个程序被运行,从磁盘加载这个程序代码到内存中,这就开启了一个进程
  • 进程可以被视为是一个程序的实例,大部分程序可以同时运行多个实例进程,也有部分程序只能运行一个实例进程

线程

  • 一个进程可以有一到多个线程
  • 一个线程就是一个指令流,线程会按照一定的顺序交给CPU执行
  • java中,线程作为最小调度单位,进程作为资源分配的最小单位。windonws中进程就是线程的容器,进程不需要去执行指令

二者对比

  • 进程基本是相互独立的,而线程存在于进程内,是进程的一个子集
  • 进程拥有共享的资源,如内存空间,供内部的线程共享
  • 进程之间的通信较为复杂 -同一台计算机上的通信称为IPC -不同计算机上的进程通信需要遵守共同的协议,比如HTTP协议
  • 线程之间通信较为简单,因为他们共享进程中的内存,比如多个线程可以访问同一个共享变量
  • 线程更为轻量,线程的上下文切换成本一般比进程低

2.并行和并发

区别

  • 在单核CPU中,多个线程同时运行其实还是串行。操作系统中有个组件叫做任务调度器,将CPU中的时间片分配给不同的程序使用,只是因为CPU时间片非常的快(Windows下CPU时间片最小约为15ms),由于特别的快,人通常是无感的,感觉是在同时运行的。总结一句话就是:微观串行,宏观并行(一般将这种轮流使用CPU的说话称为“concurrent”并发)

3.异步和同步

区别

  • 需要等待执行结果返回的就是同步
  • 不需要等待执行结果返回的就是异步

应用

  • 在项目中,一些比较耗时的不需要结果返回的操作可以使用异步操作进行处理,比如进行视频文件转码这种耗时的操作,可以单独开个新的线程进行处理
  • tomcat的serlvet也是类似的操作,用户线程处理用户的操作,避免用户线程遇到耗时操作阻塞主线程
  • ui中,开线程进行其他操作,避免阻塞ui线程

多线程应用

  • 在单核CPU中,多线程不能实际提高程序的运行效率,只是为了多个任务轮流切换,不同的线程轮流使用CPU,不至于让一个线程占满CPU,让其他任务没有时间运行
  • 多核CPU能否提高效率还需要看业务场景
    • 有些任务,经过精心设计,仔细分析,可以拆分成使用多个线程进行完成,可以很好的提高效率
    • 有些任务目的不同,就不需要刻意的去进行拆分
  • IO操作不占用CPU,只是我们一般拷贝文件的使用使用的是【阻塞IO】,这时虽然线程不需要使用CPU,但要一直等待IO结束,没能充分利用多线程,所以才有后面的【非阻塞IO】和【异步IO】