1: 建议你好好研究一下操作系统原理教材
在里面会讲到原语操作。在操作系统里,你要建立
一种概念:你所有的操作都在操作系统完全掌握之下
因为你的操作只要超过一个TIMER周期,就会被打断。
即使在多CPU的环境下,也是一样。其中的一个
CPU总是会被操作系统占用。这也就是为什么2 CPU的
机器达不到两倍速度的原因之一。操作系统要负责用
单一的线程来完成一些内核参数的修改。比如通常
用到的临界区、锁等都是需要操作系统来支持的。
如果有什么不懂的,可以多看看LINUX内核原代码。
网络协议的实现往往都是操作系统这个级别来实
现的比如IP-TCP(UDP)-STREAM的映射都是需要操作
系统的支持的,否则有些东西会很成问题。2: 看来你的那位前辈还真懂得不少啊。呵呵~~~~
“在帐号里多扣了几次钱”??!!好象没有的事情吧
你见谁发现了这样的事情?我以前在写银行卡软件的
时候从未要处理这样的情况。一般的银行卡软件都是多
层架构的。当服务器端数据库操作完成后,需要几个交互
或者超时确认的,如果任何一个环节失败,数据库都会回滚。
而且银行系统软件特殊的操作方式可以确保任何一笔操作
都能准确发现问题所在。
4: 我觉得你的问题可不可以具体点。因为根本无从下手
讨论。
哈哈~~~~~,好玩,你竟然是个受害者。
这只能怪那个银行的人愚钝,这种错误都不知道检查。
即使出现这样的错误,ATM机器上的数据在当天晚上和
主机上的记录进行总份核对以后也应该给出错误信息的。
如果真是那样,我看我们的银行都玩完了。
-------------------------------------------------
要达到数据完整并非一种措施就可以的。
当数据写到一半的时候掉电了。程序在启动以后,就会从上次
记录的日志上进行恢复。这很容易的吧。的确,系统级的原子操作当然简单。只是要注意不能让别人
和你有相同的权限。要保证始终只有一个操作者,这样才能做到
原子操作,否则就会比较麻烦了。任何试图修改系统参数的代码
都应该被禁止。所有操作都有系统完成,这样的限制对于程序员来
说应该是透明。就不至于弄得很复杂了。
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也是我闲来没事的捣鼓,希望有人感兴趣。
互锁函数能够执行下列操作:
1) 打开C P U中的一个特殊的位标志,并注明被访问的内存地址。
2) 将内存的值读入一个寄存器。
3) 修改该寄存器。
4) 如果C P U中的特殊位标志是关闭的,则转入第二步。否则,特殊位标志仍然是打开的,
寄存器的值重新存入内存。
我的想法是用水印的方式,发出的消息和回应确认中包含相同的水印,
当qq发出一个消息后等待有相同水印的回应确认包,收到一次后,就不在接受有此水印的包,就行了,
tcp的原理与这个类似