1:        建议你好好研究一下操作系统原理教材
在里面会讲到原语操作。在操作系统里,你要建立
一种概念:你所有的操作都在操作系统完全掌握之下
因为你的操作只要超过一个TIMER周期,就会被打断。
    即使在多CPU的环境下,也是一样。其中的一个
CPU总是会被操作系统占用。这也就是为什么2 CPU的
机器达不到两倍速度的原因之一。操作系统要负责用
单一的线程来完成一些内核参数的修改。比如通常
用到的临界区、锁等都是需要操作系统来支持的。
如果有什么不懂的,可以多看看LINUX内核原代码。
    网络协议的实现往往都是操作系统这个级别来实
现的比如IP-TCP(UDP)-STREAM的映射都是需要操作
系统的支持的,否则有些东西会很成问题。2:      看来你的那位前辈还真懂得不少啊。呵呵~~~~
“在帐号里多扣了几次钱”??!!好象没有的事情吧
你见谁发现了这样的事情?我以前在写银行卡软件的
时候从未要处理这样的情况。一般的银行卡软件都是多
层架构的。当服务器端数据库操作完成后,需要几个交互
或者超时确认的,如果任何一个环节失败,数据库都会回滚。
而且银行系统软件特殊的操作方式可以确保任何一笔操作
都能准确发现问题所在。
4: 我觉得你的问题可不可以具体点。因为根本无从下手
讨论。

解决方案 »

  1.   

    我感觉数据库里的事务应该是这样的:在事物开始前对将要操作的部分做个快照事物过程中一旦出现错误rollback的时候,再把快照的内容恢复过来。当然了,实际系统出于效率和性能考虑,可能有别的措施,不过基本思路应该不会差太多吧(主要是我还没有别的思路,大家有别的思路也可以说说)?这样的话我想事务应该没法解决比如写盘到一半时突然掉电之类特殊情况的,有数据保护卡之类的那就是另一种概念了。至于系统级的原子操作,我想应该就没那么复杂了。因为我想一个程序的原子操作只是应用程序级别的,在原子操作过程中,操作系统完全可以收回CPU资源,处理一些系统中断(原子操作用得多了时钟应该不会变慢吧?),然后再继续中断前的原子操作。这样也不会对原子操作有什么负面影响。以上纯属本人臆测,无任何理论依据,有何不妥,请指出并讨论。
      

  2.   

    to rovoboy(雪花满天):
    哈哈~~~~~,好玩,你竟然是个受害者。
    这只能怪那个银行的人愚钝,这种错误都不知道检查。
    即使出现这样的错误,ATM机器上的数据在当天晚上和
    主机上的记录进行总份核对以后也应该给出错误信息的。
    如果真是那样,我看我们的银行都玩完了。
    -------------------------------------------------
    要达到数据完整并非一种措施就可以的。
    当数据写到一半的时候掉电了。程序在启动以后,就会从上次
    记录的日志上进行恢复。这很容易的吧。的确,系统级的原子操作当然简单。只是要注意不能让别人
    和你有相同的权限。要保证始终只有一个操作者,这样才能做到
    原子操作,否则就会比较麻烦了。任何试图修改系统参数的代码
    都应该被禁止。所有操作都有系统完成,这样的限制对于程序员来
    说应该是透明。就不至于弄得很复杂了。
      

  3.   

    本来这个讨论就是比较务虚的,纯理论讨论吗,如果大家有兴趣讨论一下,就轻松的说说自己的观点好了。将“原子操作”依托于应用程序或者操作系统我想是不彻底的,我回去翻了一下操作系统的书,讲MINIX的,讲到同步锁一般就是
    a: 关cpu中断,上锁。
    b: 依托cpu提供的一个原子指令,书上讲的是tsl,该指令将一个数放到register里并置为一,在一个cpu指令周期里完成,不可能被打断。
    我想b可能是真正的解决方法,因为书上说关中断是一种不可取的方法。但是书上没有给出完整的例子,我想如果有这么一段伪代码:wait:   cmp tag,1
            jnz wait 
            tsl register,tag
            //do sth
            // then set tag = 0
    是否仅tsl 这一句是原子的,而如果两个线程同时执行到cmp tag,1这一步,他们可能都会同时往下走到jnz和tsl这两句....那么就是错的了。
    我汇编不太好,操作系统原理记得也不特别清楚,只能举这样的例子了,见笑。关于业务上的原子操作或者说事务完整性,数据库软件做到什么程度我不清楚,因为没有认真看过数据库原理书。象sxbyl讲的加个硬件的保护卡可能是非常安全的方案。
    至于具体的例子,如果真的要的话,我想问:
    如果让你设计我上面讲的qq发消息和回应确认的这个流程,你会怎么设计的尽量安全,完整,无差错呢?在网络质量不是很保证的情况下,你怎么保证“对方如果收到消息,你就一定得到回应”这个逻辑,重试是否唯一的选择?这个讨论有点钻牛角尖的意思:P也是我闲来没事的捣鼓,希望有人感兴趣。
       
       
      

  4.   

    应用程序执行原子操作的目的也就是防止多个线程对一个资源的同时访问,而这对操作系统来说是易如反掌的。关于原子操作,在《核心编程》P.174也有讲。至于业务上实现原子操作,我还没仔细想,大概会参考TCP的实现方案吧。
      

  5.   

    我的意见是,原子操作只是针对一个系统来说的。对于操作系统来说,文件加锁是个原子操作,但是对于CPU来说,则是一大堆操作,而CPU的原子操作,例如一条指令来说,对于CPU的微程序来讲,有时由很多原子操作组成。对于同一个系统来说,只要在它能管到的范围内,一个操作是不可拆分的,那这个操作就是原子操作。
      

  6.   

    感觉FrankZhang123的回答比较的贴近了
      

  7.   

    对于x 8 6家族的C P U来说,互锁函数会对总线发出一个硬件信号,防止另一个C P U访问同一个内存地址。在A l p h a平台上,
    互锁函数能够执行下列操作:
    1) 打开C P U中的一个特殊的位标志,并注明被访问的内存地址。
    2) 将内存的值读入一个寄存器。
    3) 修改该寄存器。
    4) 如果C P U中的特殊位标志是关闭的,则转入第二步。否则,特殊位标志仍然是打开的,
    寄存器的值重新存入内存。
      

  8.   

    qq发消息和回应确认的这个流程
    我的想法是用水印的方式,发出的消息和回应确认中包含相同的水印,
    当qq发出一个消息后等待有相同水印的回应确认包,收到一次后,就不在接受有此水印的包,就行了,
    tcp的原理与这个类似