免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: qq948299114
打印 上一主题 下一主题

[进程管理] 单处理器的自旋锁问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-04-25 17:25 |只看该作者
本帖最后由 uliux 于 2013-04-25 17:26 编辑

回复 8# qq948299114

不是产生矛盾的问题,是你在用户空间写的程序根本就没办法去使用内核的函数,除非内核用系统调用接口提供给你的。请问你在用户空间怎么使用自旋锁呢?我也想学学!
   

论坛徽章:
0
12 [报告]
发表于 2013-04-25 17:31 |只看该作者
回复 9# skychgg


兄弟  请你贴出源代码  我很想知道单处理器使用自旋锁是怎么实现的,以及是怎样的一个机制?也好长长见识!另外单处理器永远都不可能存在实质上的并行执行,它只是用分时来造成并行的错觉,所以不可能在同一时间cpu在临界区,还能在同一时刻自旋,cpu不是神!!!

   

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
13 [报告]
发表于 2013-04-25 17:42 |只看该作者
回复 11# uliux


   
这个我已经知道了  ,刚刚8楼用手机回复的是乱码。我又编辑了一遍。单处理器关闭了内核抢占功能,为什么关闭呢?可不可以利用多处理器的方法,为内核数据提供锁保护,真并发 伪并发都可以这样做吧。
      刚刚你回付的我想再问一下linux的代码中的函数都是在内核态被调用吧应该。

论坛徽章:
0
14 [报告]
发表于 2013-04-25 17:52 |只看该作者
回复 13# qq948299114

单处理器为什么要关闭内核抢占????这个是谁跟你说的,内核抢占跟处理器个数有关系吗?
可以为数据区提供别的锁保护,不见得非得自旋锁,自旋锁只是在时间很短的情况下使用最佳,否则太浪费cpu性能了。
linux的代码和数据都只能在内核态访问,除非是内核给你提供了合法接口。否则用户态还是自己干自己的吧,别惹内核啦!  

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
15 [报告]
发表于 2013-04-25 19:08 |只看该作者
回复 14# uliux

我说的不够详细,申请自旋锁spin_lock_irq()会调用preempt_disable().单处理器没有实现自旋锁,它采用的是进入临界区前关闭抢占,退出临界区后再启动抢占,来避免竞争的情况。
正想你所说的可以采用别的锁机制来保护内核数据,我想还是性能的因素吧.
谢谢你的回答



   

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
16 [报告]
发表于 2013-04-25 19:13 |只看该作者
回复 9# skychgg
谢谢回答,你正好解决了我的疑问!


   

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
17 [报告]
发表于 2013-04-25 19:15 |只看该作者
回复 12# uliux
这个你可以看看9楼的回答


   

论坛徽章:
2
巨蟹座
日期:2014-03-09 21:37:25射手座
日期:2014-04-16 16:23:03
18 [报告]
发表于 2013-04-25 22:03 |只看该作者
uliux 发表于 2013-04-25 11:49
回复 4# qq948299114

用户态进程时刻都在被抢占,不存在用户态抢占一说;内核抢占这个功能是因为在2.4内 ...

说得很好,留个名占个位,好久都没到CU顶贴了!

论坛徽章:
0
19 [报告]
发表于 2013-04-26 08:39 |只看该作者
回复 12# uliux
  1. static inline void UtilLock(lock_t* pstLock)
  2. {
  3.         uint32_t uiTmp;

  4.         __asm__ __volatile__(
  5. "1:        ldrex        %0, [%1]\n"
  6. "        teq        %0, #0\n"
  7. "        bne        1b\n"
  8. "        strexeq        %0, %2, [%1]\n"
  9. "        teqeq        %0, #0\n"
  10. "        bne        1b\n"
  11. "   dmb\n"
  12.         : "=&r" (uiTmp)
  13.         : "r" (&pstLock->uiLock), "r" (1)
  14.         : "cc");

  15.     return;
  16. }
复制代码
上述代码是ARM的汇编指令,还有我说的是可以通过spinlock这段代码可以实现在单CPU中实现锁机制。
主要原理就是通过CPU支持的特殊原子操作指令(在ARM中ldrex/strex),再加上进程按时间片调度。

还有Linux自己中的互斥量也是采用这些来实现的。只不过不是死查询,还有切换进程机制。

还有下面代码,比如内核中的提供的原子加法操作、原子设置bit位等,都是基于这样的原理。

注,以上都是基于ARM cortex a9的指令写的。其它的我不能保证正确。但认为原理应该类似。
  1. static inline void UtilAtomicAdd(int32_t iCounter, atomic_t* pstAtomic)
  2. {
  3.         uint32_t uiTmp;
  4.         int32_t iRet;

  5.         __asm__ __volatile__("@ atomic_add\n"
  6. "1:        ldrex        %0, [%3]\n"
  7. "        add        %0, %0, %4\n"
  8. "        strex        %1, %0, [%3]\n"
  9. "        teq        %1, #0\n"
  10. "        bne        1b\n"
  11. "   dmb\n"
  12.         : "=&r" (iRet), "=&r" (uiTmp), "+Qo" (pstAtomic->iCounter)
  13.         : "r" (&pstAtomic->iCounter), "Ir" (iCounter)
  14.         : "cc");

  15.     return;
  16. }
复制代码

论坛徽章:
0
20 [报告]
发表于 2013-04-26 09:11 |只看该作者
回复 16# qq948299114

能否说说他如何解决了你的疑问,因为我还没懂他说的意思!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP