什么是进程
概念:
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。
显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进
程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态
下的操作系统本身;用户进程就是所有由你启动的进程。进程是操作系统进行资源分
配的单位。
状态
1.新建:
进程正在被创建生成
2.运行:
进程正在被执行
3.等待:
进程正在等待某个事物发生
4.就绪:
进程不是等待状态(因为所有需要的事务已经发生过了),但是还没有来得及被
分配处理器,而没有被执行的状态
5.终止:
进程已经执行完毕
控制块
1.进程状态:
标志进程的活动状态,如上文提到的新建、就绪和运行等
2.程序计数器:
表示进程要执行的下一条指令的地址
3.CPU寄存器:
储存这个进程在累加器、索引寄存器、通用寄存器等里的寄存器信息。在进程中
断时,就需要保存在寄存器里的数据。通常计算机体系和指令集不同,寄存器的
具体数量、种类也不同。
4.CPU调度信息:
包括优先级、调度队列指针等,以及其他调度的参考数据。
5.内存管理信息:
包括所分配的内存区域的基址界限、页段和页表等等。
6.记账信息:
包括进程使用CPU和其他数据的执行记录等
7.IO状态信息:
分配给进程的IO设备表、文件操作表等等。
什么是线程
概念:
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在引入线
程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行
和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调
度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
属性
轻型实体:
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行
的资源,比如,在每个线程中都应具有一个用于控制线程运行的线程控制块TCB,
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地
址等的一组寄存器和堆栈。
独立调度和分派的基本单位:
在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本
单位。由于线程很“轻”,故线程的切换非常迅速且开销小。
可并发执行:
在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程
都能并发执行;同样,不同进程中的线程也能并发执行。
共享进程资源:
在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所
有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该
地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时
器、信号量机构等。
状态:
1.新建:
新创建了一个线程对象
2.就绪:
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态
的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权
3.运行:
可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
4.阻塞:
阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂
时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu
timeslice 转到运行(running)状态。阻塞的情况分三种:
等待阻塞:
运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队
列(waitting queue)中。
同步阻塞:
运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线
程占用,则JVM会把该线程放入锁池(lock pool)中。
其他阻塞:
运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或
者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、
join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行
(runnable)状态。
5.死亡:
线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生
命周期。死亡的线程不可再次复生。
高并发
定义:
高并发是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计
保证系统能够同时并行处理很多请求。
常用指标:
1.响应时间:
系统对事件的时间。例如系统处理一个socket请求需要50ms,这个50ms就是系统
的响应时间。
2.吞吐量:
单位时间内处理的请求数量。
3.QPS:
每秒响应请求数。
4.并发用户数:
同时承载正常使用系统功能的用户数量。
如何提升系统的并发能力
垂直扩展
1.增强单机硬件性能:
例如:升级网卡,升阶硬盘等。
2.提升单机架构性能:
例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使
用无锁数据结构来减少响应时间。
水平扩展
1.反向代理层的水平扩展:
反向代理层的水平扩展,是通过“DNS轮询”实现的:dns-server对于一个域名配
置了多个解析ip,每次DNS解析请求来访问dns-server,会轮询返回这些ip。
当nginx成为瓶颈的时候,只要增加服务器数量,新增nginx服务的部署,增加
一个外网ip,就能扩展反向代理层的性能,做到理论上的无限高并发。
2.站点层的水平扩展:
站点层的水平扩展,是通过“nginx”实现的。通过修改nginx.conf,可以设置多
个web后端。
当web后端成为瓶颈的时候,只要增加服务器数量,新增web服务的部署,在
nginx配置中配置上新的web后端,就能扩展站点层的性能,做到理论上的无限
高并发。
3服务层的水平扩展:
服务层的水平扩展,是通过“服务连接池”实现的。
站点层通过RPC-client调用下游的服务层RPC-server时,RPC-client中的连接池
会建立与下游服务多个连接,当服务成为瓶颈的时候,只要增加服务器数量,
新增服务部署,在RPC-client处建立新的下游服务连接,就能扩展服务层性
能,做到理论上的无限高并发。如果需要优雅的进行服务层自动扩容,这里可
能需要配置中心里服务自动发现功能的支持。
4数据层的水平扩展:
在数据量很大的情况下,数据层(缓存,数据库)涉及数据的水平扩展,将原
本存储在一台服务器上的数据(缓存,数据库)水平拆分到不同服务器上去,
以达到扩充系统性能的目的。 欢迎使用Markdown编辑器