投简历的时候,一道C语言题目

lengwuqin 2011-11-19 11:11:43
cpu和主存之间有cache,一般情况下cache和主存的内容是一致的,但是,在一些情况下会出现cache和主存内容不一致的情况,请举例说明,并给出解决方法。
自己刚听完之后,感觉都要崩溃了,无从下手,希望高手指教!
...全文
3279 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
cp298674954 2011-11-25
  • 打赏
  • 举报
回复

没写清楚

mov eax,ptr byte [ebx]
;<==step 1 第一个线程执行到这里的时候 进行了时间片切换
;这个时候寄存器的状态被
;保存下来,在线程切换的时候用来恢复现场

add ecx,eax ;<== step 3 这个时候本来假设的主存储器里面的内容已经修改 但是寄存器里面的没
;有改变但是线程间何时切换是无法控制的,所以这个会出现问题

mov ptr byte [ebx],eax ;<== step 4 在这里存储的时候结果可能不是期望的结果

mov ebx,ptr byte [ebx] ;<==step 2 这个时候第二个线程启动了 修改了之前用于寻址的 ebx
;然后切回线程1
cp298674954 2011-11-25
  • 打赏
  • 举报
回复
貌似可能说的是这种情况吧


mov eax,ptr byte [ebx]
add ecx,eax ;<==step 1 第一个线程执行到这里的时候 进行了时间片切换
;这个时候寄存器的状态被
;保存下来,在线程切换的时候用来恢复现场

mov ptr byte [ebx],eax ;这个时候本来假设的主存储器里面的内容已经修改 但是寄存器里面的没有改变
;但是线程间合适切换是无法控制的,所以这个会出现问题

mov ebx,ptr byte [ebx] ;<==step 2 这个时候第二个线程启动了 修改了之前用于寻址的 ebx
;然后切回线程1


cp298674954 2011-11-25
  • 打赏
  • 举报
回复
考虑多线程的情况
rsp19801226 2011-11-24
  • 打赏
  • 举报
回复
还有一种方法就是在使用前再调用一次,让它自己等于自己。
rsp19801226 2011-11-24
  • 打赏
  • 举报
回复
volatile c语言中
tubo_true 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 splade 的回复:]

可以使用volatile关键字来解决
[/Quote]

up
百善孝为先 2011-11-24
  • 打赏
  • 举报
回复
不会不会
狂且 2011-11-23
  • 打赏
  • 举报
回复
挺全面的! 学习了!
[Quote=引用 9 楼 etoux 的回复:]

cpu和主存之间有cache,一般情况下cache和主存的内容是一致的,但是,在一些情况下会出现cache和主存内容不一致的情况,请举例说明,并给出解决方法。

1 多cpu,一个cpu修改了本地cache,那么其它cpu的cache全部失效
2 dma访问,修改了内存中的值,cache中仍然为原值,错误
3 写操作后,没有刷洗cache到内存里面,那么cache为脏,跟内存不同步
[/Quote]
  • 打赏
  • 举报
回复
volatile和线程同步
属虎的命硬嘛 2011-11-23
  • 打赏
  • 举报
回复
我举例说明吧,主存和CACHE内容一致是因为同步的原因,所以当他们内容不一致当然就是没同步,这种情况,当然就是CACHE中的数据被修改了,什么时候会出现这种情况呢?当多线程程序时,访问CACHE,也可以当内存时一个线程的修改是会影响另一个线程的操作的。这个应该很简单,百度上有例子,因为线程是共享进程空间的,他们用的是同一块进程的空间。出现这种不同步,解决方法,很简单就是加锁,不过加锁会影响执行效率,采取的办法是当READ的时候不加,WRITE的时候再加。或者采用信号量才解决也可以。忘楼主采纳。
mrjia 2011-11-23
  • 打赏
  • 举报
回复
一个是因为write through和write back的不同

还有一个是因为cache coherence
黑色队长 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 splade 的回复:]

可以使用volatile关键字来解决
[/Quote]
考的应该就是这个。
独舞风 2011-11-22
  • 打赏
  • 举报
回复
硬件中断,编译器优化,都可能会出现数据不一致的问题。
c语言里边用volatile来修饰变量,禁止编译器优化。
薛定谔之死猫 2011-11-22
  • 打赏
  • 举报
回复
基本上,这个问题在大学时候老师讲过,只不过还给学校了
pp25210 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 etoux 的回复:]

cpu和主存之间有cache,一般情况下cache和主存的内容是一致的,但是,在一些情况下会出现cache和主存内容不一致的情况,请举例说明,并给出解决方法。

1 多cpu,一个cpu修改了本地cache,那么其它cpu的cache全部失效
2 dma访问,修改了内存中的值,cache中仍然为原值,错误
3 写操作后,没有刷洗cache到内存里面,那么cache为脏,跟内存不同步
[/Quote]
学习了,虽然我还没有学到那些东西
星爷是我哥 2011-11-22
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 splade 的回复:]
可以使用volatile关键字来解决
[/Quote]

++
folaide 2011-11-22
  • 打赏
  • 举报
回复
回写~~~
fantisGod 2011-11-22
  • 打赏
  • 举报
回复
想想操作系统,例如内存寻址的时候,传入的是逻辑地址,所以首先在CPU的cache中查找,如果没有,然后转去内存中的页表查询,如果你查找的页也不在内存,那么就应该从硬盘上把它换进来,并存入cache,如果你对这个地址上的数据进行了写操作,那么此页就会成为脏页,标志位必然会发生变化,cache中的信息就会有错误。个人理解,不对的地方请高手指出。
self001 2011-11-22
  • 打赏
  • 举报
回复
东在哪个方向?
娃ha哈 2011-11-22
  • 打赏
  • 举报
回复
Volatile修饰的变量就会消除Cache优化的现象

这只是可能性一种吧

1 多cpu,一个cpu修改了本地cache,那么其它cpu的cache全部失效
2 dma访问,修改了内存中的值,cache中仍然为原值,错误
3 写操作后,没有刷洗cache到内存里面,那么cache为脏,跟内存不同步

这位解答的比较全面
加载更多回复(34)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧