并发并发,搞IT不管哪一行都是熟耳能详的一个词,多么大的魅力在IT行业占那么高的地位,那么结合我个人以往的学习和感受与大家一起分享一下,不喜勿喷

    首先哈早些年计算机出来程序作业只能一次一次的执行,手动装载纸卡机,效率太低啊,因为人工做这个过程耗费大量的时间与CPU的速率不匹配,资源浪费。后来改进支持一批一批的把程序作业运行,这也就到了单道批处理的年代,单道批处理的好处有很多,如封闭性,可重复性等,效率低啊,I/O与CPU当然不匹配(后面通过三级内存来弥补)。单道批处理越来越满足不了我们的时代需求,当时的工程师开动脑筋就整出来了多道批处理,多道面向的对象是进程引用进程因为程序在多道不可再现性,失去了封闭性,因为程序要共享资源啊,那么失去了程序的意义,进程引入了PCB块概念可控制可描述状态特征。所以多道后面又有分时,实时等系统总之为了满足我们更完善更严格的要求。

    多道多道,并不是说同一时刻就可以处理两个程序,这时候我们引入并发进程并发在同一时间内,但是同一时刻一个处理机准确来说单核CPU运行的是一个程序,与并行一定要区分清楚!并行是同一时刻一起处理,SMP处理器之类的硬件也都越来越成熟,并行处理机制性能越来越好。

    聊到这里咱们大体的把几个概念引入了一下单道、多道、程序、进程、并发、并行,虽然解释不是特别专业的术语,但是大体明白了再去百度看专业术语会轻松很多。今天主要聊的是并发其余概念有兴趣的朋友可以自行学习,那么我们下面仔细描述并发和数据库并发都是什么东西,异曲同工。

    上面咱们已经说了并发的基本概念,那么在进程并发的时候就破坏了封闭性,共享资源,所以会带来什么后果呢?就像我们两个人同时看中了小黄车(只有一辆),都想骑车子,结果一个人跑的快先骑车,我必须等待另一个人归返小车我才能使用,如果他不回来我就一直骑不上!这就叫资源的独占,只能一个进程或者线程来使用,不允许另一个进程,当另一个进程访问时候会查看资源的标志状态是否为真,而且会有资源检查区域(Enter Area)进入的程序检测完整等机制。

    那么并发与锁啥关系呢?独占资源怎样做的呢?为什么会有时候应用卡死,进程卡死呢(部分也是因为锁)下面我们一起来看一看

    我们把两个人比作并发的两个进程或者线程,当同时访问某一个资源,这个资源也叫临界资源,临界资源只能让一个进程进去工作啊,不要说为什么只能允许一个进程使用,请在回过头读上面的内容!这样的话我们就要对这个资源进行一些特殊的手段,手段有很多,也是其中一种非常常用的手段!在编程中有互斥锁概念,Oracle中有悲观乐观锁概念,但是本质都是为了保证资源在某一刻只能被一个process或者Thread去访问。

    对锁我们也有大体的理解,就是保证临界资源一种手段,在同步和通信很锁重要,互斥锁(mutex),statas,条件变量(死锁机制)等等下面简单的把条件变量(死锁机制)做一下代码区介绍

    死锁:当资源相互占用且无法释放,就会出现死锁现象,死锁如A->C,B->D,A->F,B->F,意思为A,B个访问一个不牵连的资源,因为需要访问都去F,那么都想去用它,谁都不给谁妥了那就直接死锁!

    条件变量:

        LOCK Mutex

            check data structures

            while (resource busy)

            wait (condition variable)

            mark resource as busy;

        UNLOCK mutex;

    简单介绍到这里,我们主要说数据库再来谈谈的悲观锁与乐观锁,也就是数据锁定

        悲观锁:

            悲观锁就是破釜沉舟的感觉,直接在更改前锁定行!注意悲观锁是行锁定!

            格式:

                update t set sal = 30000 where name='als' for update;

            解释:

                for update是关键字!用于对于name='als'的行锁定,其余的行可以进行操作,后面可以根参数nowait来返回错误值!

         乐观锁:

            乐观锁其实更类似于多条件删选,那么我们通过where后指定删选条件(多个!)and连接多个删选条件来进行,注意虽然比较效率高但是可能会更新失败!

        两个锁的理念不同,悲观是假定用户一开始就锁定资源,而后知是在执行直接更新未锁定,悲观锁耗费资源会更多,所以我们尽量减少悲观锁的使用,有点当然安全性更好,乐观将会设计更新失败(并非失败提示更新 0 rowa update),虽然已经把悲观锁变为行级别,但是在频繁操作中会极大影响系统性能,乐观锁又有很大的风险,性能较好,悲观锁侧重安全,乐观锁侧重性能,那么到底用哪一种请大家根据实际需求选择

    对于锁咱们就聊到这里其实以上都是本人根据以往的学习和实践的体会,不一定非常正确,不喜勿喷,了解还不是特别深入,后续会持续更新,比如Oracle内核如理处理锁机制,操作系统级别如何更细腻处理!