进程:进程指正在运行的程序。确切的说当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且有一定独立功能。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
简言之,一个程序运行后至少有一个进程,一个进程中可以包含多个线程。
多线程:一个程序中有多个线程在同时执行。
每个线程初始大小为1M,比如控制最大线程数不超过300,指的是同一时刻内存中同时存在的线程数不超过300,若同时访问用户达到了700,就要延迟执行,直接放到消息队列里,由队列一波一波的往网站里分发。
由for循环创建300个线程,每个线程都要自己的内存空间,线程的申请销毁开销非常大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务。
线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。线程池主要用来解决线程生命周期开销问题和资源不足问题,通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在了,所以消除了线程创建所带来的延迟。这样就可以立即对请求服务,使应用程序响应更快。另外通过适当的调整线程中的线程数目可以防止出现资源不足的情况。
在线程池中,有个最小线程数是一直存活的,比如最小线程数为30。即同一时刻可以执行30个线程,若每个线程存活时间为100ms,则1s可以处理的线程数为300。
同一时刻可以执行30个线程,但是若请求量达到70,则放到消息队列中,这30个任意一个处理完都去消息队列里领下一个任务。对响应要求不高的话可以给队列里东西放的多点儿。
消息队列满了才会触发最大线程数,消息队列不满的时候都是最小线程数。
当请求量越来越大,最大线程数也满足不了的时候无法优化,只能加集群。
集群:同一个任务部署在多个服务器上(即n台服务器干一样的事)
分布式:一个业务分拆成多个子任务,或者本身就是不同的任务,部署在不同的服务器上。
一个任务包含3个步骤。每台服务器都处理 1 2 3 叫做集群 ,若不同服务器分别处理1、2、3 叫分布式。
还有一个分布式集群概念
简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个均衡服务器,后面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载不是很重,就将给哪一台去完成,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,一个节点垮了,那这个业务可能就失败了。
负载均衡:负载均衡最重要的一个应用是利用多台服务器提供单一服务。
当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。https://blog.csdn.net/github_37515779/article/details/79953788
并发和并行:并行是两个任务同时运行互不干扰。并发是指有相同资源的竞争。多线程称之为并发编程 是因为有相同资源的竞争。
锁:锁是一套约定一个协议,锁 的本质是让一块内存不可以访问。
关于框架:框架开了很多线程,减慢了速度,jdbc最快但是最麻烦。
tomcat做请求分发 每秒钟3到4万个。nginx和tomcat本质上是一样的,nginx也可以直接访问数据库。不能运行Java网站,但是可以运行别的语言比如c语言写的网站。nginx不能直接识别war包 可以通过c或shell脚本去执行。
消息队列 : controller先不做处理 放到消息队列里 在队列里重新写回调方法或者由service抓取。
redix远程缓存
redix集群
rpc架构属于内部通信 (rpc 远程过程调用) https://www.jianshu.com/p/2accc2840a1b