操作系统 进程 线程之间的关系
操作系统是包含多个进程的容器 每个进程容纳多个线程的容器
什么是进程
Process 指的是程序的一次执行。在用户下达运行程序的命令后,就会产生进程
进程是程序的真正运行实例,是资源分配的基本单位
什么是线程
线程是CPU的基本调度单位,每个线程执行的都是进程代码的某个片段
进程和线程的不同
起源不同
先有的进程 后有的线程
线程的诞生是为了提高程序的运行效率
概念不同
进程 一个程序运行的实例 是资源分配的基本单位
线程 是CPU调度的基本单位
内存共享方式不同
不同的进程 都会被分配到一定的内存
不同进程间的内存不共享
同一个进程内的不同线程,可以共享定量的内存,方便于线程之间的合作;
拥有的资源不同
线程的拥有的资源一定少于进程 但是线程也拥有自己独有内容
共享的内容
进程的代码段(最典型)
进程的公有数据
进程打开的文件描述符
信号处理器
进程当前目录
进程用户ID与进程组ID
线程独有的内容
线程之间也不共享 有如下:
线程ID
寄存器组的值
线程的堆栈
错误返回码
线程的信号屏蔽码
数量不同
一个进程可以有很多很多个线程
开销不同
线程的创建,终止时间比进程短
同一进程内的线程切换时间比进程切换短
同一进程的各个线程间共享内存和文件资源,可以不通过内核进行通信(进程间需要通过内核通信)
相似点
生命周期 状态上面
一些JVM自动启动的线程
Signal Dispatcher 把操作系统发来的信号分发给适当的处理程序
Finalizer 执行finalize方法
Reference Handler 和GC 有关
main 主线程
什么是多线程
当个进程中使用两个或者两个以上的线程
为什么需要多线程
1 提高CPU利用率
提高处理速度 避免无效等待
2 提高用户体验 避免卡顿
并行处理 提高性能 通常是服务器领域(Tomcat) 用多个线程去接受Http请求
3 便于编程建模
4 计算机性能定律
摩尔定律
阿姆达尔定律 处理器越多 程序执行越快 但有上限 取决于程序中串行部分的比例 并行的比例越高多处理器效果越明显
多线程的局限
性能问题:上下文切换带来的消耗
异构化任务(任务结构不一样) 很难高效并行
线程安全问题 死锁等
串行 并行 并发
串行 一个一个处理
并行 一起发送出去
并发
Concurrency 单个处理器 逻辑上的同时执行
并行
Parallelism 多个处理器 事实上的同时执行
并发的两种概念
形容多个任务的执行状态
两个或多个任务可以在重叠时间段(一段时间内)内启动,运行和完成
并行(两个线程同时执行)一定是并发 并发不一定是并行
对并发性的简称
不同的部分可以无序或者同时进行,且不影响最终的执行结果
什么是高并发
同一个时间内有很多请求给服务器并行处理。(一种状态)
高并发和多线程联系和不同
多线程是一种高并发的解决方案
高并发不意味着多线程 redis
高并发有哪些指标
QBS 每秒查询数
带宽
PV 一天之内的点击量
UV 在PV基础上去重 一个人的访问
IP和UV 不同 同一个局域网内 多个人 IP一直 Cookie不同 UV更多等等
并发连接数 每个时刻服务器接收请求的数目
服务器平均请求时间
同步与异步
同步 发送请求一直等服务器响应才继续执行 响应端不会提醒你
异步 发送请求后可以继续执行其他的 响应端可以主动提醒你
阻塞非阻塞
通常是站在Http请求的角度
同步阻塞 发送请求以后什么都不做 就是阻塞
同步非阻塞 发送请求以后 每隔几分钟看看有没有好 同时干别的事情
异步阻塞 响应端可以主动提醒你 但是自己还是什么都不做
异步非阻塞 响应端可以主动提醒你 自己去做别的事情
单核CPU运行多线程有意义吗
有 执行并行虽然是不可能的 因为程序未来的运行平台不确定 单CPU多线程,是尽力在压榨CPU的使用率