์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- css
- ์ฝ๋ฉ
- ํ์ฒ์ ๋ฆฌํธ๋ฆฌํธ
- Java
- ์ค๋ผํด
- ์ํ์ฃผ
- database
- ์๋ฐ
- ๊ฐ๋ฐ
- ์นดํ๋๊ฐ
- ์ฑ
- ์ค๋ธ์
- html
- ๋ฐ์ํ
- ๋ ์
- ์ํ
- ๊น๋ฏธ๊ฒฝ์๋งํ์์
- JavaScript
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๊ฐ์ดํ ์ข ๋ญ๊ฐ๋น
- Python
- ํ์ด์ฌ
- ์นํผ๋ธ๋ฆฌ์ฑ
- ๋ฐฐ์์ ๋ฐฐ์
- ์ ๋ฆฌํธ๋ฆฌํธ
- ํ๋ก๊ทธ๋๋ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ๋๊ฐ
- K๋ฐฐํฐ๋ฆฌ๋ ๋ณผ๋ฃจ์
- Today
- Total
JiYoung Dev ๐ฅ
Linux ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ (spawn, fork, exec) ๋ณธ๋ฌธ
Linux ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ (spawn, fork, exec)
Shinjio 2025. 3. 3. 15:28ํ์ด์ฌ์ GIL ํน์ฑ ๋๋ฌธ์ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ๋ณ๋ ฌ ์ฒ๋ฆฌ์์ ์ ํ์ ๋ฐ๋๋ค. ๋ฐ๋ผ์ ํ์ด์ฌ์ ๋ฉํฐ ํ๋ก์ธ์ฑ์ ํ์ฉํ์ฌ ๋ณ๋ น ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ์ ๋๋ก ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
** GIL(Global Interpreter Lock) : ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๊ฐ ์ค๋ ๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์ ์ค ํ๋๋ก, ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง์ด ํ์ด์ฌ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๋๋ก ์ ํํ๋ค. ์ด๋ฅผ ํตํด ๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์ ํ์ด์ฌ ํ๋ก๊ทธ๋จ์ ์คํ์ ์์ ํ๊ฒ ๋ง๋ค์ด์ฃผ์ง๋ง, ๋์์ ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋๊ธฐ๋ ํ๋ค.
๐ fork()
fork()๋ ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค(๋ถ๋ชจ ํ๋ก์ธ์ค)๋ฅผ ๋ณต์ ํ์ฌ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ค. ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ ํ๋ก์ธ์ค(child process)๋ผ๊ณ ํ๋ฉฐ, ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์ ๊ทธ๋๋ก ๋ณต์ฌํ์ง๋ง, ๋ณ๊ฐ์ ํ๋ก์ธ์ค๋ก ๋์ํ๋ค.
- ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋์ผํ ์ฝ๋ ๋ฐ ๋ฐ์ดํฐ ์์ญ์ ๊ฐ์ง
- Linux์ ๊ฐ์ ์ผ๋ถ ์ด์์ฒด์ ์์๋ Copy-On-Write(COW, ์ง์ฐ ๋ณต์ฌ)๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ฐ์ดํฐ๊ฐ ์์ ๋๊ธฐ ์ ๊น์ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์
- ๋ฆฌํด ๊ฐ:
- ๋ถ๋ชจ ํ๋ก์ธ์ค: fork() ํธ์ถ ์ ์์ ํ๋ก์ธ์ค์ PID ๋ฐํ
- ์์ ํ๋ก์ธ์ค: 0 ๋ฐํ
- ์คํจ ์ -1 ๋ฐํ
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid = fork(); //fork() ํธ์ถ ํ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ ๊ฑฐ์ ๋์์ ์คํ๋จ
if (pid > 0) {
printf("๋ถ๋ชจ ํ๋ก์ธ์ค: ์์ PID = %d\n", pid); //๋ถ๋ชจ ํ๋ก์ธ์ค์์๋ง ์คํ๋จ
} else if (pid == 0) {
printf("์์ ํ๋ก์ธ์ค ์คํ ์ค\n"); //์์ ํ๋ก์ธ์ค์์๋ง ์คํ๋จ
} else {
perror("fork ์คํจ");
}
return 0;
}
fork() ์ดํ, ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฉฐ, ๋ฉํฐ์ฝ์ด ํ๊ฒฝ์์๋ ๋ถ๋ชจ์ ์์์ด ๋์์ ์คํ๋ ์๋ ์์ผ๋ ์คํ ์์๋ ์ด์์ฒด์ ์ ํ๋ก์ธ์ค ์ค์ผ์ค๋ง ์ ์ฑ ๊ณผ ์์คํ ์ ๋ถํ, ์ฐ์ ์์ ๋ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค. ๋ฐ๋ผ์ ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค์ ์คํ ์์๋ ํญ์ ์ผ์ ํ ๊ฒ์ ์๋๋ฉฐ wait()๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ๊ฐ ์์ ํ๋ก์ธ์ค๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋๋ก ๊ฐ์ ํ ์ ์๋ค.
Copy-On-Write(COW)
์ฐ๊ธฐ ์ ๋ณต์ฌํ๋ค๋ ๋ป์ผ๋ก ๋ถ๋ชจ์ ์์์ด ๋์ผํ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ฌ ์ฝ๊ธฐ๋ง ํ ๋์๋ ๋ณต์ฌํ์ง ์๊ณ , ์ด๋ ํ ์ชฝ์์ ์ฐ๊ธฐ ์ฐ์ฐ์ด ๋ฐ์ํ๋ฉด ๊ทธ ์์ ์ ํด๋น ํ์ด์ง๋ง ์ค์ ๋ก ๋ณต์ฌํ๋ค.
Copy-On-Write ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด fork() ํธ์ถ ์งํ ๋ฐ๋ก exec()๋ฅผ ์งํํ๋ ๊ฒฝ์ฐ, ๋๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณต์ฌํ ํ์๊ฐ ์์ด ์์คํ ๊ณผ ์์์ ์ ์ฝํ ์ ์๋ค.
[ fork() ์งํ ์ํ ]
- ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๋ ๋์ผํ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํด
- ์ฝ๊ธฐ(read)๋ง ์ํํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๊ฐ ๋ฐ์ํ์ง ์์
โโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง โ ← ๋ถ๋ชจ์ ์์์ด ๋์ผํ ํ์ด์ง๋ฅผ ๊ณต์
โโโโโโโโโโโโโโโโโโโโโโโโโ
[ ์์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํ ๋ (์ฐ๊ธฐ ์ฐ์ฐ) ]
- ์์ ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ฉด ์ด์์ฒด์ ๋ ๋ณต์ฌ๋ฅผ ์ํ
- ๋ณ๊ฒฝํ๋ ค๋ **ํ์ด์ง๋ง ๋ณต์ฌํ๊ณ , ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น
- ๋ณ๊ฒฝ๋์ง ์์ ๋ค๋ฅธ ํ์ด์ง๋ ๊ณ์ ๋ถ๋ชจ์ ์์์ด ๊ณต์
โโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๋ถ๋ชจ์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง โ โ ์์์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง โ ← ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ ๋น
โโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโ
๐ ๋ฉ๋ชจ๋ฆฌ์์ "ํ์ด์ง(Page)"๋?
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ ์ ๋ ํฌ๊ธฐ(์ผ๋ฐ์ ์ผ๋ก 4KB)๋ก ๋๋ ์์ ๋ธ๋ก
์ด์์ฒด์ (OS)๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ด์ง(Page) ๋จ์๋ก ๊ด๋ฆฌํ๋ค. ์ฆ, ๋ฉ๋ชจ๋ฆฌ๋ ์์ ๋จ์(ํ์ด์ง)๋ก ๋๋์ด ์์ผ๋ฉฐ, ํ๋ก์ธ์ค๊ฐ ํ์๋ก ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ ํ์ด์ง๋ก ๊ตฌ์ฑ๋๋ค.
(1) fork() ํธ์ถ ์งํ (๋ถ๋ชจ์ ์์์ด ๊ฐ์ ํ์ด์ง ๊ณต์ )
๋ถ๋ชจ ํ๋ก์ธ์ค ์์ ํ๋ก์ธ์ค
โโโโโโโโโโโโโ โโโโโโโโโโโโโ
โ ํ์ด์ง 1 โ ← ๊ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์
โโโโโโโโโโโโโค โโโโโโโโโโโโโค
โ ํ์ด์ง 2 โ ← ๊ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์
โโโโโโโโโโโโโค โโโโโโโโโโโโโค
โ ํ์ด์ง 3 โ ← ๊ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์
โโโโโโโโโโโโโค โโโโโโโโโโโโโค
โ ํ์ด์ง 4 โ ← ๊ฐ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์
โโโโโโโโโโโโโ โโโโโโโโโโโโโ
(2) ์์ ํ๋ก์ธ์ค๊ฐ "ํ์ด์ง 3"์ ์์ (์ฐ๊ธฐ ์ฐ์ฐ) ํ๋ ค๊ณ ํจ
๋ถ๋ชจ ํ๋ก์ธ์ค ์์ ํ๋ก์ธ์ค
โโโโโโโโโโโโโ โโโโโโโโโโโโโ
โ ํ์ด์ง 1 โ ← ๊ณต์ ๋จ
โโโโโโโโโโโโโค โโโโโโโโโโโโโค
โ ํ์ด์ง 2 โ ← ๊ณต์ ๋จ
โโโโโโโโโโโโโค โโโโโโโโโโโโโค
โ ํ์ด์ง 3 โ โ ์ฐ๊ธฐ ๋ฐ์ → ์๋ก์ด ํ์ด์ง 3์ด ๋ณต์ฌ๋จ!
โโโโโโโโโโโโโค โโโโโโโโโโโโโค
โ ํ์ด์ง 4 โ ← ๊ณต์ ๋จ
โโโโโโโโโโโโโ โโโโโโโโโโโโโ
fork๋ก ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ํ๋ ๋ชฉ์ ์ผ๋ก 2๊ฐ์ง๊ฐ ์๋ค. ์ฒซ ๋ฒ์งธ๋ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค์ ์ด๋ค ์์ ์ ์์ํ๋ ๊ฒฝ์ฐ์ด๋ค. ๋ํ์ ์ธ ์น ์๋ฒ์ธ Apache๋ ์ฒ์ ๊ธฐ๋๋ ๋ถ๋ชจ ๋ถ๋ก์ธ์ค๊ฐ fork๋ฅผ ํตํด ๋ช ๊ฐ์ ์์ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ํด๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ์ ์์ ์์ ํ๋ก์ธ์ค๋ค์ด ๋ฐ์์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณํด๋์๋ฐ. ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์์ ํ๋ก์ธ์ค์ ๊ฐ์๋ฅผ ์กฐ์ ํ๋ ์ผ๋ง ๋ด๋นํ๋ค. ๋ ๋ฒ์งธ๋ ์(shell)์ฒ๋ผ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์คํ์ํค๋ ๊ฒฝ์ฐ์ด๋ค. ์ด ๊ฒฝ์ฐ fork ํ exec ๋ช ๋ น์ ์คํํ๋ค.
๐ exec()
exec() ๊ณ์ด ํจ์(execl, execp, execv, execve ๋ฑ)๋ ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์๋ก์ด ํ๋ก๊ทธ๋จ์ผ๋ก ๊ต์ฒดํ๋ ์ญํ ์ ํ๋ค. ์ฆ, ๊ธฐ์กด ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์๋ก์ด ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฎ์ด์์ฐ๊ณ ์คํ๋๋ค.
**POSIX์์๋ ์๋์ ๊ฐ์ด ๋ค์ํ exec ๊ณ์ด ํจ์๋ฅผ ์ ๊ณตํ๋ค.
POSIX(Portable Operationg System Interface)๋ ์ ๋์ค ๊ณ์ด ์ด์์ฒด์ ์์ ํ์คํ๋ API, ๋ช ๋ น์ด, ์ ํธ๋ฆฌํฐ๋ฅผ ์ ์ํ ๊ท๊ฒฉ์ด๋ค. ์ฆ, ๋ค์ํ ์ด์์ฒด์ (OS)๊ฐ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํ ํ์ค์ ๋งํ๋ค.
#include<stdio.h>
#include<unistd.h>
int main(int argc, char* argv[]){
execl("/bin/ls", "/bin/ls", "-al", "/tmp", NULL);
printf("hello world:\n");
}
[์ถ์ฒ] [Linux] ํ๋ก์ธ์ค ์์ฑ๋ฐฉ๋ฒ(fork, exec, spawn, posix-spawn) - ํ์ด์ฌ๊ณผ ๋
ธ๋์์ ํ๋ก์ธ์ค ๊ด๋ฆฌ|์์ฑ์ ๋ฉ๊ฐ
main ํ๋ก์ธ์ค ์คํํ๋ฉด execl() ์คํ์ ํตํด main() ํ๋ก์ธ์ค๊ฐ bin/ls ํ๋ก์ธ์ค๋ก ๊ต์ฒด๋๋ฏ๋ก printf๋ฅผ ์ํํ์ง ๋ชปํด hello world๋ฅผ ์ถ๋ ฅํ์ง ๋ชปํ๊ฒ ๋๋ค.
ํจ์ | ์ค๋ช |
execl() | ์ธ์๋ฅผ ๋ฆฌ์คํธ ํํ๋ก ์ ๋ฌ |
execle() | ํ๊ฒฝ ๋ณ์๋ ์ถ๊ฐ๋ก ์ ๋ฌ |
execlp() | ์คํ ํ์ผ์ PATH ํ๊ฒฝ ๋ณ์์์ ๊ฒ์ |
execv() | ์ธ์๋ฅผ ๋ฐฐ์ด ํํ๋ก ์ ๋ฌ |
execvp() | execv() + PATH ํ๊ฒฝ ๋ณ์์์ ๊ฒ์ |
execve() | ์คํ ํ์ผ์ ์ ๋ ๊ฒฝ๋ก ์ง์ + ํ๊ฒฝ ๋ณ์ ์ ๋ฌ ๊ฐ๋ฅ (๊ฐ์ฅ ์ ์์ค ํจ์) |
- ์๋ก์ด ํ๋ก๊ทธ๋จ์ ์คํํ์ง๋ง PID๋ ๊ทธ๋๋ก ์ ์ง
- ๊ธฐ์กด ์ฝ๋, ๋ฐ์ดํฐ, ์คํ, ํ ๋ฑ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ก์ด ํ๋ก๊ทธ๋จ์ผ๋ก ๊ต์ฒด๋จ
- exec() ํธ์ถ ์ดํ์๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์คํ๋์ง ์์
1๏ธโฃ execl()
์ ๋๊ฒฝ๋ก๋ก ์คํ ํ์ผ์ ์ง์ ํด์ผ ํ๋ฉฐ, ์คํํ ํ๋ก๊ทธ๋จ์ ์ธ์๋ฅผ ํ๋์ฉ ์ง์ ๋์ดํ์ฌ ์ ๋ฌํ๋ค.
execl("/bin/ls", "ls", "-l", "-a", NULL);
2๏ธโฃ execle()
execl()๊ณผ ๋์ผํ์ง๋ง, ๋ง์ง๋ง์ ํ๊ฒฝ ๋ณ์ ๋ฐฐ์ด์ ์ถ๊ฐํ ์ ์๋ค.
char *env[] = { "MY_ENV=hello", NULL };
// ํ๊ฒฝ ๋ณ์ ์ ๋ฌ ๊ฐ๋ฅ
execle("/bin/ls", "ls", "-l", NULL, env);
3๏ธโฃ execlp()
execl()์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ผ ํ์ง๋ง, execlp()๋ ํ๊ฒฝ ๋ณ์ PATH์์ ์๋ ๊ฒ์ํ๋ค.
// "ls" ์คํ (์ ๋๊ฒฝ๋ก ์์ด ์คํ ๊ฐ๋ฅ)
execlp("ls", "ls", "-l", NULL);
4๏ธโฃ execv()
execl()์ ์ธ์๋ฅผ ๋ฆฌ์คํธ๋ก ์ง์ ๋์ดํด์ผ ํ์ง๋ง, execv()๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ค.
char *args[] = { "ls", "-l", NULL };
// "/bin/ls" ์คํ, ์ธ์๋ ๋ฐฐ์ด๋ก ์ ๋ฌ
execv("/bin/ls", args);
5๏ธโฃ execve()
execv()์ ๋์ผํ์ง๋ง ํ๊ฒฝ ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
char *args[] = { "ls", "-l", NULL };
char *env[] = { "MY_ENV=hello", NULL };
execve("/bin/ls", args, env);
6๏ธโฃ execvp()
execv()๋ ์ ๋ ๊ฒฝ๋ก๊ฐ ํ์ํ์ง๋ง, execvp()๋ ์คํ ํ์ผ์ PATH์์ ๊ฒ์ํ๋ค.
char *args[] = { "ls", "-l", NULL };
execvp("ls", args); // "ls" ์คํ (PATH์์ ๊ฒ์)
๐ spawn()
spawn()์ fork()์ exec()๋ฅผ ์กฐํฉํ์ฌ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ๋ฐฉ์์ด๋ค. posix_spawn() ๋๋ spawn() ๊ณ์ด ํจ์(spawnl, spawnv ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ฉฐ, Windows์ Unix ๊ณ์ด ์์คํ ์์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- fork() ํ exec()๋ฅผ ํธ์ถํ๋ ๊ฒ๊ณผ ์ ์ฌํ์ง๋ง, ์ด์์ฒด์ ๊ฐ ์ต์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์คํ
- ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ์ต์ ์ ์ง์ ํ ์ ์์(P_NOWAIT, P_WAIT ๋ฑ)
- fork()์ exec()์ ๋ช ์์ ์ผ๋ก ํธ์ถํ๋ ๊ฒ๋ณด๋ค ์ฑ๋ฅ์ด ๋ ์ฐ์ํ ์ ์์
๐ spawn() vs fork() + exec()
fork-exec์ spawn์ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ์์ด๋ค. ๋ ๋ฐฉ์์ ๋์ผํ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ ๊ทธ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์๋ ์ฐจ์ด๊ฐ ์๋ค.
1๏ธโฃ fork-exec ๋์ ์๋ฆฌ
fork(): ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋ณต์ ๋ณธ์ธ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ค. ์ด ๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ, ํ์ผ ๋์คํฌ๋ฆฝํฐ, ํ๊ฒฝ ๋ณ์ ๋ฑ์ ๋ณต์ฌํ๋ค.
exec(): ์์ฑ๋ ์์ ํ๋ก์ธ์ค๊ฐ ์์ ์ ์ํ ํ๋ก๊ทธ๋จ์ ๋ก๋ํ๋๋ก ํ๋ค. ์์ ํ๋ก์ธ์ค๋ exec() ํธ์ถ ํ ๋ถ๋ชจ์๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค.
2๏ธโฃ spawn ๋์ ์๋ฆฌ
์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ , ์ง์ ๋ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋จ์ผ ํจ์์ด๋ค. fork()์ exec()์ ๊ธฐ๋ฅ์ ํฉ์น ํํ๋ก ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ์ฆ์ ์คํํ ์ ์๋ค.
3๏ธโฃ fork-exec์ ๋ฌธ์ ์
fork-exec๋ ๊ธฐ์กด ์์คํ ์์ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด์ง๋ง, ์ฑ๋ฅ๊ณผ ๋ฆฌ์์ค ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๋ค. ํนํ ์๋ฒ ๋๋ ์์คํ ์ด๋ ์ค์๊ฐ ์์คํ ์์ ๊ทธ ๋ฌธ์ ๊ฐ ๋ ๋๋๋ฌ์ง ์ ์๋ค. ์ฃผ์ ๋ฌธ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋, ์ค์ผ์ค๋ง ์ค๋ฒํค๋, ํ์ผ ๋์คํฌ๋ฆฝํฐ ์์ ๋ฌธ์ ์ด๋ค.
โ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋(์ค์ ์์ญ ๋ฌธ์ )
- ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ๋น์ฉ: fork()๋ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํ๋๋ฐ, ์ด๋ ๋ณต์ฌ๋๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ๋ฐ์๋๋ค. ํน์ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๊ฐ ๋ง์ด ๋ณต์ฌ๋๋ฉด ์ค์ ์์ญ์์ ๋ฐ์ดํฐ ์ด๋ํ ์ ์๋ค.
- ์ค์ ์์ญ์ ์์คํ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ํ๋๋์คํฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋์ํค๋ ๊ณต๊ฐ์ด๋ค. ๋์คํฌ I/O๋ ๋งค์ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๋ก ์ธํ ์ค์ ์์ญ ์ฌ์ฉ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค.
- ์๋ฅผ ๋ค์ด, ์์ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋ ๋ ๋ถ๋ชจ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ณต์ฌ๋๋ฉด, ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ ธ ์ค์ ์์ญ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ์๋ฒ ๋๋ ์์คํ ์์ ๋ฉ๋ชจ๋ฆฌ ์์์ด ์ ํ์ ์ผ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ๋ค.
spawn()์ ์์ ํ๋ก์ธ์ค๊ฐ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ฌํ๋ ๋์ ํ์ํ ์์๋ง ํ ๋นํ๊ณ , ์ฆ์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ค. ์ด๋ก ์ธํด ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ๋น์ฉ์ด ์ค์ด๋ ๋ค.
โ ์ค์ผ์ค๋ง ์ค๋ฒํค๋
- fork()๋ฅผ ํธ์ถํ๋ฉด ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค. ์ด๋ ๋ ํ๋ก์ธ์ค๋ฅผ ๋์์ ์คํํ๊ธฐ ์ํด ์ด์์ฒด์ ์ ์ค์ผ์ค๋ฌ๊ฐ ๊ฐ์ ํ์ฌ ์ปจํ ์คํธ ์ค์์นญ์ ํด์ผ ํ๋ค.
- fork() ํ ๋ถ๋ชจ์ ์์์ด ๋์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ค์ผ์ค๋ง ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด ์ค๋ฒํค๋๋ ๋ถํ์ํ ์ปจํ ์คํธ ์ค์์นญ์ ๋ฐ์์์ผ ์์คํ ์ ์ ์ฒด ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆด ์ ์๋ค.
spawn()์ ๋จ์ผ ํจ์ ํธ์ถ๋ก ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ํ๋ก๊ทธ๋จ์ ์คํํ์ฌ ๋ถํ์ํ ์ปจํ ์คํธ ์ค์์นญ์ ์ค์ฌ ์ค์ผ์ค๋ง ์ค๋ฒํค๋๊ฐ ์ค์ด๋ ๋ค.
โ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์์
- fork() ํธ์ถ ํ ์์ ํ๋ก์ธ์ค๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์์์ ๋ฐ๋๋ค. ์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ ํ์ผ, ์์ผ, ํ์ดํ ๋ฑ์ ์์คํ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐํ๋ ํธ๋ค์ด๋ค.
- ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๊ฐ ๋์์ ๋์ผํ ํ์ผ์ ์ด๊ณ ์์ ํ ๋ ํ์ผ์ ๋ํ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฆฌ์์ค ์ถฉ๋์ด ๋ฐ์ํ ์ ์๋ค.
spawn()์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์์์ ๋ณด๋ค ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๋ค. ํ์์ ๋ฐ๋ผ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฆฌ๋๋ ์ ํ๊ฑฐ๋ ์๋ก ์ค์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ํจ์จ์ ์ธ ํ์ผ ์์ ์ด ๊ฐ๋ฅํ๋ค.
โ ์์ฝ
1. ๋ฆฌ๋ ์ค ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์๋ ๋ํ์ ์ผ๋ก fork, exec, spawn์ด ์๋ค.
2. fork๋ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ํ์ฌ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ค.
3. exec๋ ํ์ฌ ํ๋ก์ธ์ค์์ PID์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ณ๊ฒฝ ์์ด ๊ธฐ์กด์ ํ๋ก์ธ์ค๋ฅผ ์๋ก์ด ํ๋ก์ธ์ค๋ก ๋ฎ์ด ์์ด ๊ต์ฒดํ๋ ๋ฐฉ์์ด๋ค.
4. spawn์ fork-exec ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ค.
5. ์ฐจ์ด์ ์ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ์์ ํ๋ก์ธ์ค๋ก ๋ณต์ ์ ์ ์ฒด๋ฅผ ๋ณต์ ํ์ง ์๊ณ ํ์ํ ๋ถ๋ถ๋ง ๋ณต์ ํ๋ฉฐ, ํ๋ก์ธ์ค ์์ฑ๊ณผ ์คํ์ ํ๋์ ํจ์๋ก ํธ์ถํ์ฌ ๋ถํ์ํ ์ปจํ ์คํธ ์ค์์นญ์ ์ ๊ฑฐํ๋ค.
๐ ์ฐธ๊ณ ์๋ฃ
https://myungsun-e.tistory.com/21
ํ๋ก์ธ์ค ์์ฑ ๊ธฐ๋ฒ
ํ๋ก์ธ์ค ์์ฑ ๊ธฐ๋ฒ์ด์์ฒด์ ๋ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ณดํต ๋ ๊ฐ์ง ์ฃผ์ ์์คํ ํธ์ถ์ ์ฌ์ฉํ๋ค. ํ๋๋ fork() ๋ก ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๋ณต์ ํ์ฌ ์์์ ๋ง๋ค๊ณ , ๋ค๋ฅธ ํ๋๋ exec() ๋ก ์
myungsun-e.tistory.com
https://blog.naver.com/PostView.naver?blogId=pjt3591oo&logNo=222774338068
[Linux] ํ๋ก์ธ์ค ์์ฑ๋ฐฉ๋ฒ(fork, exec, spawn, posix-spawn) - ํ์ด์ฌ๊ณผ ๋ ธ๋์์ ํ๋ก์ธ์ค ๊ด๋ฆฌ
์๋ ํ์ธ์ ๋ฉ๊ฐ์ ๋๋ค. ์ด๋ฒ ์๊ฐ์ ํ๋ก์ธ์ค ์์ฑ๋ฐฉ๋ฒ์ ๋ค๋ค๋ณด๊ณ ์ ํฉ๋๋ค. ์๊ฐํด๋ณด๋ ์ง๋๋ฒ์ ํ๋ก์ธ...
blog.naver.com
https://sunyzero.tistory.com/191
fork, vfork ๊ทธ๋ฆฌ๊ณ posix_spawn ์ด์ผ๊ธฐ
* TOC๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค์ ๊ด๊ณfork์ fork-execvfork์ ๋ฌธ์ ์ posix_spawn์ ๋ฑ์ฅ2์ค ๊ฒฐ๋ก fork๋?fork๋ ์ ๋์ค/๋ฆฌ๋ ์ค ๊ณ์ด์์ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ๋ง๋๋ ํ์ค ํจ์์ด๋ค. ๊ทธ๋ฐ๋ฐ fork๋ ์๋ก์ด ํ๋ก์ธ
sunyzero.tistory.com
'Study > Back-End' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ด์ฌ ๋ฉํฐํ๋ก์ธ์ฑ์ ํ์ฉํ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ (0) | 2025.03.03 |
---|---|
DBCP ValidationQuery ์ดํด ๋ฐ ์ค์ ํ๊ธฐ (0) | 2024.11.25 |
ํ๊ฒฝ๋ณ์(PATH) ์ดํดํ๊ธฐ (1) | 2024.11.20 |
๋ก๊ทธ ๋ ๋ฒจ ๋ฐ ๋ก๊ทธ ์์ฑ ๊ธฐ์ค (0) | 2024.11.11 |
[Node.js] Express์ listen ๋ฐ Cors ์ค์ (1) | 2024.11.07 |