并发编程0 基本概念

基本概念和原理

进程和线程

进程和线程需要从操作系统层面理解

进程包括:

唯一的进程标识
可执行代码
安全的上下文
环境变量
虚拟(内存)地址空间
系统对象的引用,文件,设备,socket,窗口
至少一个线程,这个线程称为主线程

线程包括

唯一的线程标识
共享进程的虚拟(内存)地址空间
共享进程的系统资源
线程上下文
本地线程存储

总结

  • 进程是资源分配的最小单位,线程是CPU调度的最小单位。
  • 进程是对正在运行的程序的抽象,注意:一个程序可以有多个进程
  • 进程是线程的容器,一个进程包括一个或多个线程
  • 线程共享进程的系统资源:内存空间,文件,设备等
  • 线程拥有
    • 程序计数器,记录下一条执行指令
    • 寄存器,保存线程正在使用的变量
    • 堆栈,记录程序的执行路径

java中的进程和线程

我们使用java命令启动一个java程序,这个java程序的运行时就是一个进程。
比如我们将项目打成jar包,使用java -jar命令启动项目,产生了一个进程,这个进程里有许多线程,一些线程是JVM创建的,比如GC线程,程序的入口main函数必然需要启动一个线程执行,我们还可以在程序中启动新的线程执行任务。

java的线程实现

java线程实现是使用的内核线程的实现:https://blog.csdn.net/aajjw/article/details/115713556

并发和并行

cpu一个核心同一时间只能执行一个线程,因此多核处理器同一时间可以执行多个线程,这个就是并行。
并行是同一时刻不同的任务(线程)同时执行。
并发的则是多个任务交替进行。

方法调用中的同步和异步

同步和异步是形容方法调用的。
同步方法需要等到方法调用结束,才能继续执行
异步方法像是消息传递,调用后立即返回,调用者继续后续的工作,通常调用方法会在其他的线程中真正的执行。

线程中的阻塞和非阻塞

阻塞和非阻塞多线程间的相互影响。
比如一个线程占用了临界区的资源,其他线程如果要使用这个资源就必须在临界区等待,这个就是阻塞。

同步和异步,阻塞和非阻塞也出现在IO模型中

为什么我们需要线程

早期的操作系统中没有线程,进程就是cpu执行的最小单位。
操作系统采用调度策略调度不同的进程轮流执行。
如果采用多进程的方式提高程序的运行效率,会有以下问题:

  • 进程资源不共享
  • 进程间通信效率低
  • 进程创建,销毁,进程间切换开销大
    所以我们需要线程
  • 线程共享进程的系统资源
  • 线程间通信效率高,通过信号量等方式
  • 线程创建更快,比进程快10到100倍,线程间切换开销小

多线程

多线程为啥效率高?一定效率高吗?
cpu一个核心同一时间只能执行一个线程,操作系统调度线程,
如果是计算密集型的程序,它已经可以将cpu性能塞满,
假设操作系统将固定的时间比例分配给我们,我们使用多线程,反而会造成性能将低,因为涉及到线程切换的代价,任务拆分和合并代价。
如果是IO密集型的程序,cpu大部分时间空闲,需要等待IO
假设操作系统将固定的时间比例分配给我们,我们使用多线程,操作系统可以在cpu空闲时切换线程,处理其他线程的任务,就提高了效率。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值