V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sodapanda
V2EX  ›  程序员

异步,同步,阻塞,非阻塞这些概念不太懂,哪些书能系统的介绍下?

  •  
  •   sodapanda ·
    sodapanda · 2013-02-04 22:33:11 +08:00 · 5767 次点击
    这是一个创建于 4299 天前的主题,其中的信息可能已经有所发展或是发生改变。
    经常看到这些术语,似懂非懂的。知道个大概但是说不清。哪些书能比较系统的从概念和实践上都介绍一下的?
    24 条回复    1970-01-01 08:00:00 +08:00
    yuelang85
        1
    yuelang85  
       2013-02-04 22:46:10 +08:00   ❤️ 1
    其他的不知道,《MUD游戏编程》一书的前几章关于这里的介绍觉得挺不错的。如果楼主能等半个小时左右,这里可以下到:

    http://la-onger.long-er.name/files/Books/programming/Game/
    ayang23
        2
    ayang23  
       2013-02-04 22:57:46 +08:00   ❤️ 1
    UNIX网络编程 http://book.douban.com/subject/1500149/
    前几天同样不明白这个问题查到的问题的最根源的答案,不过这本书我没看,只是看到别人的答案都是从这里来的。
    wang2191195
        3
    wang2191195  
       2013-02-05 00:05:21 +08:00 via iPhone
    楼上+1
    fofoone
        4
    fofoone  
       2013-02-05 00:47:14 +08:00
    同步就是你追一个姑娘,晚上给她发我爱你,她一直没有搭理你,你就一直等,一直等,一直等,一直等,直到姑娘终于答复了你,我也爱你,于是你们在一起了;异步就是你追一个姑娘,晚上给她发我爱你,没等她搭理你,你就又给另一个姑娘发我爱你,没等她搭理你,你就又给第三个姑娘发我爱你,姑娘一、姑娘二、姑娘三都以为你是专心致志的对自己,最后可能有的答复了我爱你,有的答复了对不起
    http://elya.cc/2012/01/18/technique-useful/
    这个应该算通俗点
    sodapanda
        5
    sodapanda  
    OP
       2013-02-05 01:04:44 +08:00
    @yuelang85 已经下载了,看一下前六章内容好棒。


    @fofoone 好通俗,看懂了这个,以前用 XMPP 协议写东西的时候用到过这两种。


    @ayang23 大部头~有机会慢慢看~
    for4
        6
    for4  
       2013-02-05 01:37:18 +08:00
    人生苦短 学golang吧
    qq286735628
        7
    qq286735628  
       2013-02-05 02:02:44 +08:00
    这些都离不开一个背景,当年的电脑只有一颗CPU,同一时刻只能执行一条指令。

    假如一段程序A,需要10分钟才能完成,一段程序B,需要5分钟才能完成。
    如果是同步,那等B执行完,最糟糕的情况是15分钟,最好的情况是5分钟。
    如果是异步,CPU会在这一个时钟周期执行A,下一个时钟周期执行B,如此轮询下去。所以异步时候完成B的时间介于5~15分钟。

    假如一段程序C和一段程序D,都是对同一个内存地址的值进行自加。
    在非阻塞的情况下,C给该值+1了,D没等C把结果放回的时候,也给该值+1了,那么,这时候该值只+1。
    在阻塞的情况下,C给地址+1后,因为是阻塞,所以D必须等C把新值放回该地址后,才能对新值进行+1,所以结果是+2
    darklowly
        8
    darklowly  
       2013-02-05 02:15:15 +08:00 via iPhone   ❤️ 1
    @qq286735628 你搞错了
    notedit
        9
    notedit  
       2013-02-05 02:20:02 +08:00
    @for4 golang只是用同步的概念实现了异步 底层的东西还是那些
    qq286735628
        10
    qq286735628  
       2013-02-05 02:25:25 +08:00
    @darklowly (ㄒoㄒ)//
    刚才看了一下前面几个人的答案,你们都是在拿网络做例子说...
    话说我还是觉得,同步异步就是个时间上的调度管理,阻塞非阻塞是个空间上的调度管理...
    本质还是计算机一个时刻只能做一件事,一个地方只能放一个东西...

    明天再来看答案,先睡觉(~﹃~)~zZ
    darklowly
        11
    darklowly  
       2013-02-05 02:31:18 +08:00 via iPhone
    @qq286735628 你又继续错了
    qsun
        12
    qsun  
       2013-02-05 05:29:08 +08:00   ❤️ 1
    异步非阻塞主要是为了解决一个叫做c10k的问题。因为这个东西还是比较新的,成书的资料不多。最重要的被引用做多的是这一篇文章。
    http://www.kegel.com/c10k.html

    nodejs/c(libevent,libev)/ruby(em)使用的就是这种模式。同时,nginx/varnish等服务器也都是使用了异步非阻塞达到了很高的速度。

    常规语言如果使用异步非阻塞会使得开发工作相对复杂,很多callback揉在一起,所以erlang/go/clojure之类的就像当占有优势。

    特别提一下GHC新的IOManager允许程序使用同步阻塞的方式达到异步非阻塞的效果,显示了Haskell的威力。
    zhouhua97
        13
    zhouhua97  
       2013-02-05 07:51:49 +08:00
    一看以为是说硬件电路的概念,一直搞FGPA,这些东西倒是数字电路里面的基本概念来着。
    qq286735628
        14
    qq286735628  
       2013-02-05 10:00:40 +08:00
    @darklowly 好吧,原来说的C10K的问题,你们的同步异步是对CPU等待IO响应做的定义。

    找了一篇12L的中文翻译看了下
    http://www.cnblogs.com/fll/archive/2008/05/17/1201540.html
    继续关注此话题,貌似挺有意思。
    zava
        15
    zava  
       2013-02-05 11:24:00 +08:00   ❤️ 1
    楼主可以看下我的这篇博客:http://www.zavakid.com/2011/07/30/unix-io-model/
    microget
        16
    microget  
       2013-02-05 11:39:03 +08:00
    crossmaya
        17
    crossmaya  
       2013-02-05 11:51:37 +08:00
    mark 迫切需要了解网络编程知识。
    leavic
        18
    leavic  
       2013-02-05 16:04:52 +08:00
    做应用的程序员需要对任务调度、资源互斥这些东西有基本概念
    sodapanda
        19
    sodapanda  
    OP
       2013-02-05 20:03:08 +08:00
    谢谢各位,这个基本概念我去读 unix网络编程 来解决。
    darklowly
        20
    darklowly  
       2013-02-05 21:15:46 +08:00
    @qsun 不新吧?几十年了。
    darklowly
        21
    darklowly  
       2013-02-05 21:16:37 +08:00
    @qq286735628 坐观你继续以点盖面。
    qq286735628
        22
    qq286735628  
       2013-02-05 22:57:40 +08:00
    @darklowly 等你讲解呀...
    darklowly
        23
    darklowly  
       2013-02-07 23:35:07 +08:00 via iPhone
    @qq286735628 翻我之前的回复。好像讲过
    tioover
        24
    tioover  
       2013-02-09 12:22:49 +08:00
    泡面的例子
    同步就是烧水的时候什么都不做,等水烧开再继续
    异步就是烧水的时候你可以拆包装,拿碗,倒调料面饼……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5628 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:45 · PVG 14:45 · LAX 22:45 · JFK 01:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.