在如今这样一个互联网产品横行的时代,一款成功的产品,自然要面对巨大的用户量访问、高并发、大流量的情况,比如即将到来的光棍节。可如果没有并发的概念,秒杀抢购等活动统统免谈,永远感受不到下单我第一的快感,快要哭了。
并发简述
早期计算机没操作系统,从头到尾只执行一个程序,且整个计算机资源均为此程序使用,拿这种姿势使用计算机,无疑是对计算机资源的浪费。后来,OS(操作系统)出世后,OS能够使得计算机运行多个程序,每个程序在独立的进程中,OS给每个进程分配着资源。当然,各个进程间也可以进行数据交换。
注意:并发和并行是两个概念。简单举个例子,你和你对象吃鸡腿,每人一个鸡腿,这个叫并行;假如只有一个鸡腿,你和对象你一口我一口轮流着吃,叫并发。不知道理解滴对不对。
进程和线程
进程是系统进行资源分配的基本单位,线程也被称为轻量级进程,现在大多数操作系统都以线程为基本的调度单位,同一个进程内的全部线程共享进程的内存地址空间,所以能够访问相同的数据对象,需要有明确的同步机制进行共享数据的访问控制。它两出现的意义在于:
1、资源利用率
一些情况下,程序需等待某个外部操作执行完成,如输入输出,而等待时无法执行其他工作,如果能够在等待的时间里运行别的程序,那利用率肯定得到提高。
2、公平性
不同的用户和程序对计算机资源有相同的使用权,高效的方式是通过时间分片使程序共享计算机资源,而不是等一个程序执行完后,再执行另一个。
3、便利性
计算机在进行多个计算任务时,不是一个程序将所有任务包了,应该是一个任务对应着一个程序,易于实现,程序间也能通信。
线程优点
优点是能够发挥多处理器的作用。因为基本的调度单位是线程,如果程序只有一个进程,最多只能在一个处理器上运行,在双核上,单线程只能使用一半的处理器,使用率为50%,而当计算机拥有100核时,使用率仅为1%。而多线程可以同时在多个处理器上执行,如线程使用得当,多线程可提高资源使用率来提升系统吞吐率。
线程风险
1、安全性
记得听原来一位朋友说过,一个公司给西安某景点开发一卖票系统,因为线程安全性考虑不周全,导致一张票卖给了两个人,晚上看演出时两位兄弟拿着同一个座位的票,最后一个在座位上坐着看,另一个被工作人员准备了小板凳。
在没同步的情况下,多线程的执行顺序不可预测,所以各线程对于共享数据的操作也会产生各种意料之外的结果,有时候会有点小尴尬。(后期会有同步控制策略的介绍:synchronized、volatile等)
2、活跃性问题
安全性含义是“永远不发生糟糕事情”,活跃性则是“正确的事一定会发生”。而当这个事情一直没发生时,就会产生活跃性问题,比如线程A等线程B释放其持有资源,而B就是不放,A就一直干等着,具体如死锁等。
3、性能
使用线程目的是为了让程序运行地更快,但不是启动的线程越多,速度就越快。一是在多线程中,必须要有同步机制,这些机制有时会抑制某些编译器优化,二是多线程可能当线程调度器挂起活跃线程并转而运行另一个线程,就会频繁地出现上下文切换,这些都将带来额外的性能开销。
小结
这节主要简单介绍了下并发、并行、进程、线程的基本概念,并发与并行的区别,进程与线程的区别及意义,以及线程使用的优势和风险。并发程序写得不严谨,会出现很多让人感到无从下手的问题。
网友评论