操作系统是多个进程的容器,进程是多个线程的容器 。
二者不同之处 :
起源不同:回顾操作系统起源,是现有进程再有线程,后来由于处理器速度比外设要快,所以为了提高cpu的利用率才产生的线程,目的就是提高程序的执行效率。
概念不同:进程是独立运行的一个程序,是一个示例,也是操作系统资源分配的示例(像内存cpu这些都是以进程为单位进程分配的),而线程是cup调度的基本单位 。
内存共享方式不同:不同进程都会被操作系统分配到不同的内存,一般情况下不同进程是不共享的。线程与线程一般服务于同一个进程,所以他们可以一定量的访问共享内存。
拥有资源不同:线程是进程的一部分,所以线程拥有的资源一定是小于进程的,不同线程共享(代码段,进程共有数据,打开的文件描述符,进程id......),线程与线程之前独有的(线程id,现成的堆栈...)
数量不同 : 一个进程至少要拥有一个线程。
开销不同:两个不是同一个数量级的,线程比进程更轻量级,(1)线程的创建和终止比进程时间短(2)进程内线程切换时间比进程切换短(3)通信开销,进程间通信比较难需要借助其他的东西,但是同一进程内线程由于共享内存和文件资源,就可以不用通过内核进行通讯。
相似点 : 生命周期,都有就绪运行等待等。
Java语言与多线程的关系:
1.观察任务管理器会发现,如果我们代码里创建了100个线程,但是任务管理器会显示100多个线程,这是由于jvm会自动启动其他线程(即使代码里不显示的创建线程,在运行main时,jvm也会自动启动其他线程)有其他一下几个java虚拟机帮我们创建的线程:
Signal Dispatcher : 把操作系统发来的新号分发给适当的处理程序 ??
Finalizer : 负责对象的finalize()方法(不再推荐)
Reference Hander : 与GC,会把每个对象的引用记录下来,配合GC进进行垃圾回收。
main : 主线程,用户程序入口
多线程:
什么是多线程:如果一个程序允许两个或者两个以上的线程,那么它就是多线程程序,多线程是指在单个进程中运行多个线程。
为什么要用多线程:为了提高cup的利用率(处理速度),避免无效等待(读取磁盘io的时候可以去做其他的事),提高用户体验:避免卡顿、缩短等待时间(多线程可以同时接受多个用户的http请求,而不是排队等单一线程处理)。。。还有任务裁剪(可以用多线程去执行不同的任务)
阿姆达尔定律:处理器越多,程序执行越快,但有上限,程序一般是由串行部分和并行部分组成(因为有些操作必须串行实现:比如代码必须一行一行执行,可能上下文依赖),并行比例越高处理器效果越明显。
什么场景会用到多线程:需要耗时操作的时候,为了同时做多件不同的事:1)开网页同时听音乐 2)后台定时任务 。为了提高工作效率处理能力:1)tomcat 2)并行下载 3) NIO. 需要同时有很大的并发量的时候:1)压力测试
多线程的局限:上下文切换带来的消耗(保存cpu需要的数据,比如代码执行到哪里了),异构化任务(任务结构不一样)很难高效并行,线程安全:相互配合(i++总数不一致)以及线程带来的的活跃性问题(死锁):线程互相拥有对象需要的资源(饥饿):等待导致一直得不到资源运行
串行,并行,并发
串行:各个线程顺序执行,一个执行结束下一个再执行
并行 :多个线程同时执行
并发: 多个任务逻辑上同时执行
并发是只有一个处理器,逻辑上同时执行,并不是物理上的,并行是多核的物理上的同时执行,真正有多个任务在同时执行。 关键是一个同时执行一个交替执行。
是什么让并行和并发成为可能 :
1.cpu升级 2.caouzo操作系统升级 3.编程语言升级
高并发 : 同时有多个请求发送给服务器,多线程是一种编程方法,为了防止高并发带来的线程安全问题及高并发带来的响应慢等问题,多线程初期是为了解决高并发的一种解决方案 。 但是高并发不一定要通过多线程来解决 (Redies:内部机制单线程)
几个名词:QPS(Query Per Second) 每秒查询数 , 带宽。PV(Page View)综合访问量 ,UV(Unique Visitor)
IP/UV 网线断线,断电重新拨号都会是IP>UV)(同一个局域网内多个用户都会是IP<UV)
并发连接数:某个时刻服务器接收到的请求个数
服务器平均请求等待时间:平均服务器处理一个请求需要的时间
同步异步,阻塞非阻塞 :
同步:被调用者不会主动告诉我们(调用者)执行已经结束,我们需要一直等待直到结束
异步:服务器会主动告诉用户我在帮你准备,你可以去做其他的事情,准备结束会告诉用户执行结束
阻塞: 调用者在被调用方执行的过程中即结果返回之前不能坐任何事,必须一致等待。
非阻塞: 调用者在被调用方法返回结果之前可以去做其他的事情
注意:同步异步指的是被调用者的行为,阻塞非阻塞指的是调用方的行为
单核cpu运行多线程的意义:(意义通常不大的吧)(知乎:https://www.zhihu.com/question/37396742)
单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑,单核CPU时使用多线程,通常是有线程要处于等待状态。