概述
第二遍看APUE,打算把知识点总结一下。
问题提出:当两个独立进程A、B同时对一个文件进行追加写操作时(假设这里打开时没有使用O_APPEND参数,即没有从文件尾打开),如果此时进程A调用lseek对该文件偏移量设为100(文件尾),同时内核切换为进程B,B将偏移量也设为100,然后B调用write函数使得B偏移量增加到110。之后内核切换为A,此时如果A调用write的话,还是会从100处开始写入,那么A之前写入的数据会被清除。
这里又涉及到打开文件的内核数据结构:
每个进程在进程表中都有一个记录项,其中含有一张文件描述符表,内容如上图。如果两个独立进程各自打开同一个文件,则有下图关系,分别有自己的文件表项(包含文件状态、偏移量等),APUE里讲的比较详细。
解决问题的方法是将这两个操作相对于其他进程而言成为原子操作,原子操作是不可分割的操作,在执行完毕时它不会被任何事件中断。
下面介绍一下原子操作:
- 对于单处理器原子操作
- 操作可以在一条指令内完成。因为进程的上下文切换是在总是在一条指令执行完成后,所以不会出现上述的并发问题。对于单处理器来说,一条处理器指令就是一个原子操作。
对于多
最后
以上就是妩媚汽车为你收集整理的由unix文件I/O引出的原子操作的全部内容,希望文章能够帮你解决由unix文件I/O引出的原子操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复