欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java高并发之基础认知

程序员文章站 2024-02-09 17:42:34
...

在进入高并发学习之前,先了解一些计算机基础知识:

我们知道计算机基于二进制建立只能识别0和1,可以想象一下用0和1编写代码是何其繁琐易错还有不人性,为了更好让人类使用计算机,于是出现了低级语言,低级语言是对0和1编制成的代码片段进行封装,这样就可以仅写几个字符就能代替N个0和1通过规律编译的代码段,想想都是极好的。

低级语言在处理人与计算机“交流”上起到了不可忽视的作用,但是对处理功能需求上就显得不那么给力,例如现在 1+1需要相加100次的需求上,使用低级语言编写就显得特别笨拙,在这种基础上为了人类便于交互计算机,高级语言出现了。

高级语言的出现,才使得计算机进入蓬勃发展时期,类似C语言等优秀语言被人们广泛运用,各种各样的嵌入式产品出现在生活中惠及每个人,最最最有名的还是当属计算机,通过与操作系统(c、c++和汇编(低级)语言编写而成)的结合,发展成为当今时代集成 办公、娱乐、学习等等于一体的庞然大物

秀了一波计算机基础知识,感觉相当nice。

这跟高并发粘不到边,属于知识拓展,既然进入状态了那下面聊聊于高并发有关的基础知识!

 

什么是进程?什么是线程?

进程是指在操作系统中正在运行的一个应用程序,是程序执行时的一个实例(程序一旦运行就是进程)

进程是系统进行资源分配的独立实体, 且每个进程拥有独立的地址空间。一个进程无法直接访问另一个进程的变量和数据结构, 如果希望让一个进程访问另一个进程的资源,需要使用进程间通信,比如:管道,文件, 套接字等。

一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。 线程与进程的一个主要区别是,同一进程内的多个线程会共享部分状态, 多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时, 每个线程还拥有自己的寄存器和栈,其它线程可以读写这些栈内存。

线程是进程的一个实体,是进程的一条执行路径

线程是进程的一个特定执行路径。当一个线程修改了进程中的资源, 它的兄弟线程可以立即看到这种变化

 

线程进程的区别体现在几个方面:

1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

2)通信:进程间通信IPC(管道,信号量,共享内存,消息队列),线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

3)调度和切换:线程上下文切换比进程上下文切换要快得多。

4)在多线程OS中,进程不是一个可执行的实体。

 

进程与线程的选择取决以下几点:

1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。

2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应

3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;

4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;

5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。

 

1 什么是高并发:

1.1 场景一

高并发的产生

对于web项目,随着用户量的增加就有可能产生高并发的问题。高并发简单的来说就是在同一时刻不同用户访问同一资源的问题,专业一点的说法就是在同一时刻有多个线程访问了同一个数据资源。

解决方案

目前对于高并发大部分的解决方案都是通过锁机制,锁机制有两个层面。 一种是代码层次上的,如java中的同步锁,典型的就是同步关键字synchronized,这里我不在做过多的讲解,感兴趣的可以参考:http://www.cnblogs.com/xiohao/p/4151408.html另外一种是数据库层次上的,比较典型的就是悲观锁和乐观锁。这里我们重点讲解的就是悲观锁(传统的物理锁)和乐观锁。乐观锁机制,通过‘version’版本字段来控制并发问题,原理我贴一段SQL就清楚了

update t_order set qty=1 and version=version+1 where version=:version

这里就是在更新操作时验证当前订单的版本号时候被其它事务改变否则就已报错的方式,引导用户重新查询然后编辑。这样讲来比较简单,但是就是这么简单就可以处理高并发的问题,对于数据库和系统性能也不会有什么影响。以外一种悲观锁机制,一般都是通过数据库的特性来解决,数据库的四大特性中有一个隔离性,意思就是说在同一个事物内操作的数据会被加上锁,其它操作不能够访问。通过数据库加锁这种方式并不好,第一大量的锁会给数据库带来很大的开销,而且对于用户而言没有获取锁就不能操作数据,陷入等待的状态,非常不友好。

 

1.2 场景二

那么很多请求,具体达到多少请求才算是高并发系统呢?这个也没有明确数量上的定义,根据网上很多大型互联网公司的相关高并发博客,一般PV(page view)在千万级别以上的公司才会涉及到这个概念,所以如果某个系统的日PV在千万级别以上,可能是一个高并发系统.这里根据具体业务不同,这个数字可能高或者低一些。

高并发的概念

这里我引用一篇推文究竟啥才是互联网架构高并发中的一段话来描述:

高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求

并发与并行的区别

这里涉及到一个问题,很多同学搞不清楚并发与并行的区别,这里我根据我根据知乎上这个问题某位网友的例子,我觉得很好

           你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行

并发:你有处理多个任务的能力,不一定同时(一个CPU轮流)

并行:有同时处理多个任务的能力(多个CPU同时)

并发和并行都可以是很多个线程,就看这些线程能不能同时被(多个)CPU执行,可以说明是并行,并发是多个线程被一个CPU随机切换着执行

高并发的相关指标

高并发相关指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等

响应时间:系统对某个请求做出相应的时间.例如处理一个HTTP请求,从HTTP发出到收到响应需要200ms,则200ms就是系统的响应时间.

吞吐量:单位时间内处理的请求数量

QPS:每秒响应请求数,这个感觉和吞吐量区分不大

并发用户数:同时承载正常使用系统功能的用户数量. 例如微信,同时可以x亿人在线,一定程度代表了系统的并发用户数

提高并发能力有以下途径:

  • 增加机器:读写分离,分布式部署(不同模块),集群(相同服务)
  • 增强单机性能:数据库优化,优化代码(如算法),硬件升级(CPU,内存,SSD等)

 

参考资料:

https://blog.csdn.net/qq_19004627/article/details/79804562

https://blog.csdn.net/AlbenXie/article/details/78507361

 

 

相关标签: i