为什么这个VForked装配会顺序发生?

问题描述 投票:0回答:1

我正在 WSL 上运行 NASM x86_64 位程序集。我本来期望 syscall_vfork 并行执行进程,但它只是运行子进程,然后运行父进程。

bits 64
default rel

%include "stringfns.asm" ; basic print functionality

section .data
count: dw 0

section .text
global main

main:
    mov r15, 0
    spawner:
                mov rax, 58
            syscall

        cmp rax, 0
        je child

        call debug ; prints 0\n, occurs after child has finished

        inc r15
        cmp r15, 16 
        jne spawner

        jmp exit

    child:
        mov r15, 0
        .loop:
            inc r15
            cmp r15, 1000 ; execute child for some amount of time
            jne .loop   
        inc word [count]

        xor rsi, rsi
        mov si, [count]
        call iprintln ; prints integer in rsi

    exit:
        mov rax, 60
        mov rdi, 0
        syscall

我还将最大并行线程设置为十六,但没有效果

assembly fork windows-subsystem-for-linux nasm
1个回答
3
投票

参见 手册页 -

vfork()
系统调用的描述是“创建子进程并阻止父进程”。 所以您看到的是预期的、记录在案的行为。

曾几何时,

vfork()
会在共享地址空间的同时同时运行父进程和子进程,但这会导致很多问题,因此Linux对其进行了更改以阻止父进程。 如果您读到的内容告诉您不同的信息,那么它已经过时,您可能不想再使用该资源。

如果您想复制地址空间而不是共享它,请使用

fork()
。 如果您想共享地址空间并并发运行,以便创建线程而不是进程,则需要使用
clone()
,或者更好的是,更高级别和更可移植的
pthread_*
函数。

© www.soinside.com 2019 - 2024. All rights reserved.