多线程基础

线程、进程

操作系统、进程、线程的包含关系

操作系统是包含多个进程的容器,而每个进程又是容纳多个线程的容器。

Oracle文档的官方定义

进程:使用fork(2)调用创建的Unix环境(例如文件描述符,用户ID等),它被设置为运行程序。
线程: 在进程上下文中执行的一系列指令

什么是进程

进程的英文是Process ,指的是程序的一次执行,在用户下达运行程序的命令后,就会产生进程。
总结:进程是程序的真正运行实例,是资源分配的基本单位。

什么是线程

定义: 线程是CPU的基本调度单位,每个线程执行的都是进程代码的某个片段。

进程和线程的不同

不同

  • 起源不同: 因为处理器的速度要比外设快,为了提高cpu的利用效率,从而提高代码的执行效率
  • 概念不同:进程是一个具有独立功能的程序运行起来的活动,是一个实例,也是系统分配资源和调度的单位,而线程是CPU的基本调度单位。
  • 内存共享方式不同:不同进程之间的内存通常是不共享的,可以使用进程间通信ipc。而线程间可以直接访问一定量的内存而不需要任何额外操作。
  • 拥有资源不同:线程本身是进程的一部分所以其拥有的资源是少于进程的。
  • 线程共享的内容:1、进程代码段2、进程的公有数据(利用这些共享的数据,线程很容易的实现相互的通讯)3.进程打开的文件描述符4、信号处理器,5、进程的当前目录 6、进程用户ID与进程组ID
  • 线程独有的内容: 1线程ID 、2寄存器组的值、3线程的堆栈、4错误返回码、5、线程的信号屏蔽码
  • 数量不同:一个进程可以有多个线程,但是至少有一个线程
  • 开销不同
    线程的创建,终止时间比进程短
    同一进程内的线程切换时间比进程切换短
    同一进程的各个线程间共享内存和文件资源,可以不通过内核进行通信
    相似点: 生命周期
Java语言和多线程的渊源和关系

Java设计之初-支持多线程
Java语言在服务端开发语言中的地位-常年高居前三
一对一映射到操作系统的内核线程
JVM自动启动线程:即使代码中不显示创建线程,在运行main时,JVM也会自动启动其它的线程,可以用debugger观察
Signal Dispatcher //把操作系统发来的信号分发给适当的处理程序
Finalizer //负责对象的finalize()方法
Reference Handler //和GC 引用相关的线程。
main //主线程,用户程序的入口

多线程

多线程的概念:如果一个程序允许两个或以上的线程,那么他就是多线程程序,多线程是指在单个进程中运行多个线程。
主要目的是提高CPU利用率
提高处理速度
避免无效等待(IO的时候可以做别的事)
提高用户体验:避免卡顿,缩短等待时间
并行处理,提高性能,通常是服务器领域(例如 Tomcat) ,用多个线程去接收进来的HTTP请求,而不是排队等待单一的线程处理
在android 开发中,主线程的重要任务之一是绘制屏幕界面,该线程中不允许进行IO操作或网络请求,目的就是避免卡顿,影响用户的交互。
便于编程建模
计算机性能定律
摩尔定律失效
阿姆达尔定律
处理器越多,程序执行越快,但有上限,取决于程序中串行部分的比例,并行的比例越高,多处理器的效果越明显。
使用多线程场景:
什么时候开启线程。
为了同时做多件不同的事情: 1)打开网页同时听英语2)后台定时任务
为了提高工作效率、处理能力:1)tomcat 2)并行下载 3)NIO
需要同时有很大并发量的时候(例如压测)

多线程的局限

性能问题:上下文切换带来的消耗
异构化任务(任务结构不一样):很难高效并行
线程安全问题:包括数据安全问题(例如i++总数不一致)以及线程带来的活跃性问题(线程饥饿、死锁)。

串行、并行、并发

在这里插入图片描述

串行和并行

在这里插入图片描述

并行、并发

并行
真正的“同时运行–在同一时刻,有多个任务同时执行
例如,在多核处理器上,有两个线程同时执行同一行代码
可见,单核处理器是无法实现并行的,因为单核处理器无法在同一时刻执行多个任务
在这里插入图片描述
并行且并发
在这里插入图片描述
例子
在这里插入图片描述

并发

1)形容多个任务的执行状态
两个或多个任务可以在重叠的时间段内(不一定指重叠的同一时刻,指在一段时间内交替运行)启动,运行和完成。
并行(两个线程同时执行 )一定是并发,但是并发不一定是并行。
在这里插入图片描述
在这里插入图片描述

例子
在这里插入图片描述
2)对并发性的简称
不同的部分可以无序或者同时执行,且不影响最终的执行结果
在不同核心数的计算机上的不同表现
此时,并行和并发的概念并不在同一维度上

并发和并行的关系
在这里插入图片描述
在这里插入图片描述

多线程、高并发
什么是高并发

指大量的请求同时到达服务器所带来的结果,服务器需要同时处理众多请求,

多线程和高并发的关系

多线程主要是为了解决高并发所带来的问题,提高硬件的利用率,从而解决服务器死机或响应慢的问题,多线程是解决高并发问题的一种解决方案。
高并发并不意味着多线程: Redis

高并发有哪些指标

QPS(Queries Per Second) 每秒查询数
带宽
PV(Page View)
UV(Unique Vistor)
IP和UV的区别
并发连接数(The number of concurrent connections)
服务器平均请求等待时间(Time per request: across all concurrent requests)

同步异步、阻塞非阻塞

同步与异步: 区别被调用者是否主动告诉调用者
同步: 同步异步这里指的是被调用者(即服务器)的行为,而不是请求方的行为。在没有得到结果前,服务器就不会返回任何结果。
异步: 调用在发出后,服务端会立刻返回,告诉调用者。
在这里插入图片描述
同步阻塞:不主动通知 调用方不做其它事一直等待
同步非阻塞:不主动通知调用方可以做其它事
异步阻塞 : 主动通知调用方不做其它事一直等待
异步非阻塞: 主动通知,调用方不用一直等待

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值