线程、进程
操作系统、进程、线程的包含关系
操作系统是包含多个进程的容器,而每个进程又是容纳多个线程的容器。
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)
同步异步、阻塞非阻塞
同步与异步: 区别被调用者是否主动告诉调用者
同步: 同步异步这里指的是被调用者(即服务器)的行为,而不是请求方的行为。在没有得到结果前,服务器就不会返回任何结果。
异步: 调用在发出后,服务端会立刻返回,告诉调用者。
同步阻塞:不主动通知 调用方不做其它事一直等待
同步非阻塞:不主动通知调用方可以做其它事
异步阻塞 : 主动通知调用方不做其它事一直等待
异步非阻塞: 主动通知,调用方不用一直等待