๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ์šด์˜์ฒด์ œ

[Linux] Process์— ๋Œ€ํ•œ ์ดํ•ด + ์‹ค์Šต (์šด์˜์ฒด์ œ๐Ÿฆ– ๊ฐ•์˜2-Chpater3. Process)

by ๋ถˆํƒ€๋Š” ์ฐธ์ƒˆ 2025. 2. 22.

์‹ค์Šต ์ „ ํ•„์š”ํ•œ Process ๊ด€๋ จ ๋ฐฐ๊ฒฝ์ง€์‹

โ€‹

Process์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๊ด€๋ จ ์‹ค์Šต์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

โ€‹

์‹ค์Šต์— ํ•„์š”ํ•œ ๋ฐฐ๊ฒฝ์ง€์‹์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๋ฉด,

โ€‹

  • Process: RAM์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด CPU์— load ๋œ ์ƒํƒœ
  • PCB(Process Counter Block): ๋ ˆ์ง€์Šคํ„ฐ ์ •๋ณด, ํ˜„์žฌ process ์ •๋ณด ๋“ฑ์ด ๋‹ด๊ธด ๊ณณ
  • Context-switch(๋ฌธ๋งฅ ๊ตํ™˜): ํ•˜๋‚˜์˜ PCB loadํ•˜๊ณ  ๋‹ค์Œ PCB๋ฅผ store. ์ด๋ ‡๊ฒŒ PCB ๋‹ค์Œ ๋‹ค์Œ ํ•ด์ฃผ๋Š” ๋ฌธ๋งฅ ๊ตํ™˜์„ ํ†ตํ•ด time sharing ํ•˜๋ฉฐ concurrent ํ•˜๊ฒŒ ์‹คํ–‰๋จ

โ€‹

UNIX์™€ ๊ฐ™์€ O/S์—์„œ ์ƒˆ๋กœ์šด process๋Š” fork( )๋ผ๋Š” ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ด๋•Œ ํ˜„์žฌ process์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๋ณต์‚ฌํ•ด์„œ child process ๋งŒ๋“ ๋‹ค.

โ€‹

๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‹ค์Šต์„ ํ†ตํ•ด process์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.

 


์‹ค์Šต1.

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    pid = fork();
    printf("Hello, Process!\n");

    return 0;
}
๋”๋ณด๊ธฐ

Hello, Process!

Hello, Process!

๐Ÿ”น fork()๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹

โ€‹

  1. fork()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์ œํ•œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค(์ž์‹ ํ”„๋กœ์„ธ์Šค)๊ฐ€ ์ƒ์„ฑ๋จ
  2. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค(P0)์˜ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ๊ฐ€์ง.์ฆ‰, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ฝ”๋“œ, ๋ณ€์ˆ˜ ๊ฐ’, ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ ๋“ฑ์ด ๋˜‘๊ฐ™์ด ๋ณต์‚ฌ๋œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค(P1)๊ฐ€ ๋งŒ๋“ค์–ด์ง
  3. ํ•˜์ง€๋งŒ! ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ณ„๊ฐœ๋กœ ์‹คํ–‰๋จ.์ฆ‰, fork() ์ดํ›„๋ถ€ํ„ฐ ๋ถ€๋ชจ์™€ ์ž์‹์ด ๊ฐ์ž ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋จ

โ€‹

๐Ÿ”น fork() ์ดํ›„์˜ ์‹คํ–‰ ํ๋ฆ„

#include <stdio.h>#include <unistd.h>int main()
{
    pid_t pid;
    pid = fork();  // ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค(P1) ์ƒ์„ฑ

    printf("Hello, Process!\n");

    return 0;
}

 

๐Ÿ“Œ fork() ์ดํ›„์˜ ํ๋ฆ„:

โ€‹

  • fork()๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค(P0)๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์ œํ•œ ์ž์‹ ํ”„๋กœ์„ธ์Šค(P1)๊ฐ€ ์ƒ์„ฑ๋จ.
  • ๊ทธ ํ›„ fork() ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ๋ถ€๋ชจ(P0)์™€ ์ž์‹(P1) ๋ชจ๋‘ ์‹คํ–‰์„ ๊ณ„์†ํ•จ.
  • ์ฆ‰, printf("Hello, Process!\n"); ์ด ์ฝ”๋“œ๋Š” ๋ถ€๋ชจ(P0)์—์„œ๋„ ์‹คํ–‰๋˜๊ณ , ์ž์‹(P1)์—์„œ๋„ ์‹คํ–‰๋จ. ๊ทธ ๊ฒฐ๊ณผ, "Hello, Process!\\n"๊ฐ€ ๋‘ ๋ฒˆ ์ถœ๋ ฅ๋จ

๐Ÿ”น fork() ๋ฐ˜ํ™˜๊ฐ’์ด ์ค‘์š”ํ•œ ์ด์œ 

โ€‹

fork() ํ•จ์ˆ˜๋Š” ์‹คํ–‰๋  ๋•Œ ๋ถ€๋ชจ์™€ ์ž์‹์—์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ

์‹คํ–‰ ์œ„์น˜
fork( ) ๋ฐ˜ํ™˜๊ฐ’
๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค (P0)
์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID (์–‘์˜ ์ •์ˆ˜)
์ž์‹ ํ”„๋กœ์„ธ์Šค (P1)
0

์ฆ‰,

  • ๋ถ€๋ชจ(P0)์—์„œ๋Š” pid = fork(); ์‹คํ–‰ ํ›„ pid์—๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID(์–‘์ˆ˜) ๊ฐ€ ์ €์žฅ๋จ.
  • ์ž์‹(P1)์—์„œ๋Š” pid = fork(); ์‹คํ–‰ ํ›„ pid์—๋Š” 0์ด ์ €์žฅ๋จ.

โ€‹

์ด๋ฅผ ์ด์šฉํ•ด์„œ ๋ถ€๋ชจ์™€ ์ž์‹์„ ๋ถ„๋ฆฌ๋œ ์‹คํ–‰ ํ๋ฆ„์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

โ€‹

์˜ˆ๋ฅผ ๋“ค์–ด:

#include <stdio.h>#include <unistd.h>int main()
{
    pid_t pid;
    pid = fork();

    if (pid > 0)
    {
        printf("๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค: PID = %d\n", getpid());
    }
    else if (pid == 0)
    {
        printf("์ž์‹ ํ”„๋กœ์„ธ์Šค: PID = %d\n", getpid());
    }

    return 0;
}
๋”๋ณด๊ธฐ

๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค: PID = 1234

์ž์‹ ํ”„๋กœ์„ธ์Šค: PID = 5678

์ฒ˜๋Ÿผ ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Œ

 

๐Ÿ”น ๊ฒฐ๋ก 

โ€‹

  • fork()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค(P0)๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•œ ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค(P1)๊ฐ€ ์ƒ์„ฑ๋จ.
  • fork() ์ดํ›„์—๋Š” ๋ถ€๋ชจ(P0)์™€ ์ž์‹(P1)์ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ printf("Hello, Process!\n");๋„ ๋‘ ๋ฒˆ ์‹คํ–‰๋จ.
  • fork()์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Œ.

์‹ค์Šต2.

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    pid = fork();
    printf("Hello, Process! %d\n", pid);
}
๋”๋ณด๊ธฐ

Hello, Process! 140755

Hello, Process! 0

โ€‹

์ฆ‰, ์ •๋ฆฌํ•˜๋ฉด fork( ) system call ์ดํ›„,

  • parent process์˜ address space๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์ œ
  • parent process๋Š” ๊ณ„์† ์‹คํ–‰๋จ
  • ๋˜๋Š” child process๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ wait( ) system call์„ ํ•  ์ˆ˜ ์žˆ์Œ. ready queue์—์„œ wait queue๋กœ ๋น ์ ธ์„œ child๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ.

์‹ค์Šต3.

#include <unistd.h>

int main()
{
    pid_t pid;
    pid = fork();
    if (pid > 0)
        wait(NULL);
    printf("Hello, Process! %d\n", pid);
}
๋”๋ณด๊ธฐ

Hello, Process! 0

Hello, Process! 141055

(์ˆœ์„œ๊ฐ€ ๋ฐ”๋€œ)

parent๊ฐ€ wait queue์— ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค๊ฐ€ child ์‹คํ–‰ ์ดํ›„ parent๊ฐ€ ์‹คํ–‰๋จ

์ฐธ๊ณ : fork ๋œ ์ดํ›„ parent์™€ child๋Š” ๋…๋ฆฝ์ . ์ฆ‰ ๊ฐ์ž๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์„œ๋กœ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ.


์‹ค์Šต4.

#include <stdio.h>
#include <unistd.h>

int main()
{
    fork();
    fork();
    fork();
    fork();
    printf("Hello, fork\n");
    return 0;
}
๋”๋ณด๊ธฐ

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

Hello, fork

hello fork 16๋ฒˆ ์ถœ๋ ฅ. forkํ•˜๋ฉด ๋งŒ๋“ค์–ด์ง„ ์ž์‹๋„ ์ž์‹์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— 2์˜ 4์Šน์ด ๋จ

 


์‹ค์Šต5

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    pid = fork();

    if(pid == 0) {
        execlp("/bin/ls", "ls", NULL);
        printf("LINE J\n");
    }
    else if (pid > 0) {
        wait(NULL);
        printf("Child Complete\n");
    }

    return 0;
}

execlp๋Š” fork๋กœ ๋ณต์‚ฌ๋œ child process์˜ ๋‚ด์šฉ์ด ์•„์˜ˆ ๋‹ค๋ฅธ ๋‚ด์šฉ์œผ๋กœ ๋ฎ์–ด์ง€๋Š” ๊ฒƒ. ์œ„ ์˜ˆ์ œ์—์„œ “Line J”๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Œ. execlp๋กœ ๋ฎ์–ด์ ธ execlp ๊ทธ ๋‹ค์Œ ๋‚ด์šฉ์€ child process์— ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.


์‹ค์Šต6

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid, pid1;
    pid = fork();

    if(pid == 0) { //child process
        pid1 = getpid();
        printf("child: pid = %d\n", pid);
        printf("child: pid1 = %d\n", pid1);
    }
    else if (pid > 0) { //parent process
        pid1 = getpid();
        printf("parent: pid = %d\n", pid);
        printf("parent: pid1 = %d\n", pid1);
        wait(NULL);
    }

    return 0;
}
๋”๋ณด๊ธฐ

parent: pid = 142323

parent: pid1 = 142322

child: pid = 0

child: pid1 = 142323


์‹ค์Šต7.

#include <stdio.h>
#include <unistd.h>
#define SIZE 5

int nums[SIZE] = {0, 1, 2, 3, 4};

int main()
{
    pid_t pid;
    int i;
    pid = fork();

    if(pid == 0) { //child process
        for ( i = 0 ; i < SIZE ; i++) {
            nums[i] *= i;
            printf("CHILD: %d \n", nums[i]);
        }
    }
    else if (pid > 0) { //parent process
        wait(NULL);
        for( i = 0 ; i < SIZE ; i++) {
            printf("PARENT: %d \n", nums[i]);
        }
    }

    return 0;
}
๋”๋ณด๊ธฐ

CHILD: 0

CHILD: 1

CHILD: 4

CHILD: 9

CHILD: 16

PARENT: 0

PARENT: 1

PARENT: 2

PARENT: 3

PARENT: 4

๐Ÿ˜–๐Ÿ˜– ๋จธ๋ฆฌ๊ฐ€ ์•„ํŒŒ๋„ ์‹ค์Šต์„ ํ•ด๋ณด๋ฉด ํ™•์‹คํžˆ ์›๋ฆฌ๊ฐ€ ์™€๋‹ฟ๊ธด ํ•œ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค๋„ ๋„์ „ํ•ด๋ณด์‹œ๊ธธ...!

โ€‹

์œ„์— ์˜ˆ์ œ๊ฐ€ ๋ชจ๋‘ ์ดํ•ด๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋Š” ๊ฒƒ๋„ ๋„์›€์ด ๋งŽ์ด ๋๋‹ค.