V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
supman
V2EX  ›  问与答

fork()可以把 linux 系统资源占完么?

  •  
  •   supman · 2015-08-08 20:11:43 +08:00 · 2665 次点击
    这是一个创建于 3394 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大概在自己服务器上循环了10分钟, 但是没什么反应啊。。
    while(2==0)
    {
    fork();
    }
    14 条回复    2015-08-09 15:31:22 +08:00
    echo1937
        1
    echo1937  
       2015-08-08 20:18:43 +08:00
    你试试fork炸弹就知道了。
    Strikeactor
        2
    Strikeactor  
       2015-08-08 20:19:06 +08:00
    while false什么鬼
    wy315700
        3
    wy315700  
       2015-08-08 20:24:44 +08:00
    while(false) 你跑10年都不会有效果
    rrfeng
        4
    rrfeng  
       2015-08-08 20:25:04 +08:00
    你敢贴上这个么
    :(){:|:&};:
    jasontse
        5
    jasontse  
       2015-08-08 20:35:14 +08:00 via Android
    会把 PID 号码吃完
    supman
        6
    supman  
    OP
       2015-08-08 20:38:08 +08:00
    @echo1937
    @Strikeactor
    @wy315700
    @rrfeng
    @jasontse


    错了错了。。。是while true。。。。 但是服务器还是好好的。。
    ihciah
        7
    ihciah  
       2015-08-08 20:51:22 +08:00
    上次出去玩,逛到一家苹果专卖店,扔了一个炸弹也是没反应,差评
    echo1937
        8
    echo1937  
       2015-08-08 20:58:43 +08:00
    @supman 把你的脚本写成递归调用再说。
    xierch
        9
    xierch  
       2015-08-08 21:11:26 +08:00
    最坑的是 fork() 失败后还要 kill()
    xl2tpd 里就有这个 bug,kill(-1, TERM),呵呵呵,不知道修好了没有
    mind3x
        10
    mind3x  
       2015-08-09 00:14:51 +08:00
    fork()是copy on write的好吗...你单纯跑fork,能占的资源很有限。

    Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
    sleeperqp
        11
    sleeperqp  
       2015-08-09 00:23:45 +08:00
    fork会占完linux的进程管理资源 而不是整个内存的资源 (进程管理资源在内存中)
    因为linux管理进程是用一个结构体(task_struct)数组来管理进程的 这个数组是固定的 也就说系统所管理的进程数一定 因此不断fork是会耗尽这个结构体的
    pid是一个unsiged int数 是循环使用的 因此首先耗尽的应该是结构体数组 而不是pid
    上面说的copy on write是对的 当你不对新fork的进程进行写操作时 这些进程所管理的内存页实际是一样的 新增的进程只需要让内存页的计数加一 然后管理的页表项指向内存也即可 因此内存消耗较小
    tracyone
        12
    tracyone  
       2015-08-09 00:25:30 +08:00 via Android
    似乎有限制一个程序里面进程数的…
    q5we66fg
        13
    q5we66fg  
       2015-08-09 11:16:04 +08:00
    每个进程好像又现在最大内存,不知道会不会swap
    binyuJ
        14
    binyuJ  
       2015-08-09 15:31:22 +08:00
    我在.bashrc 里加了个diff() { diff -u "$@" }
    结果只要一打diff直接就不响应了,只能按电源
    看kenerl log 里面就是出了无限循环内存耗尽
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2820 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:41 · PVG 15:41 · LAX 23:41 · JFK 02:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.