ν¨μ€νΈμΊ νΌμ€ μ΄μ체μ κ°μμ μ½κ² λ°°μ°λ μ΄μ체μ κ΅μ¬μ λν TILμ λλ€.
νλ‘μΈμ€ κ° ν΅μ (IPC)
νλ‘μΈμ€ νΉμ μ€λ λλ λ 립μ μΌλ‘ μ€νλλ€. λ 립μ μΌλ‘ μ€νλλ€λ κ²μ νλ‘μΈμ€/μ€λ λλ λ€λ₯Έ νλ‘μΈμ€/μ€λ λμ 곡κ°μ μ κ·Όν μ μλ€. μλνλ©΄, λ΄ νλ‘μΈμ€μ λ°μ΄ν°λ μ½λλ₯Ό λ€λ₯Έ νλ‘μΈμ€κ° λ°κΏ μ μκ² νλ κ²μ μνν μΌμ΄κΈ° λλ¬Έμ΄λ€. νλμ μ»΄ν¨ν° μμ€ν μ μ±λ₯μ λμ΄κΈ° μν΄ μ¬λ¬ νλ‘μΈμ€/μ€λ λλ₯Ό λμμ μ€ννλλ° μ΄λ, νλ‘μΈμ€/μ€λ λ κ° μν νμΈ λ° λ°μ΄ν° μ‘μμ μ κΌ νμνλ€.
λ°λΌμ, νλ‘μΈμ€ κ° ν΅μ λ°©λ²μ μ 곡νλλ°, μ΄λ₯Ό Inter Process Communication(IPC)λΌκ³ νλ€. λλΆλΆμ IPC κΈ°λ²μ 컀λ 곡κ°μ νμ©νλ κ²μ΄λ€. μλνλ©΄, 컀λ 곡κ°μ λͺ¨λ νλ‘μΈμ€κ° 곡μ νκΈ° λλ¬Έμ΄λ€.
IPC κΈ°λ² μ’ λ₯
- 곡μ νμΌ μ¬μ©
- 곡μ λ©λͺ¨λ¦¬ μ¬μ©
- Pipe
- Message Queue
- Signal
- Socket
곡μ νμΌ μ¬μ©
μ μ₯ 맀체μ μμ μλ 곡μ νμΌμ μ¬μ©νλ κ²μ΄λ€.
곡μ νμΌμ μ΄μ©ν ν΅μ μ νλ‘μΈμ€ 1μμ μ λ¬νκ³ μΆμ λ΄μ©μ 곡μ νμΌμ μ κ³ νλ‘μΈμ€ 2κ° κ³΅μ νμΌμ μ ν λ΄μ©μ μ½λ λ¨λ°©ν₯ ν΅μ μ΄λ€. νμ§λ§, 곡μ νμΌμ μ΄μ©ν ν΅μ μ μ€μκ°μΌλ‘ ν΅μ μ μ£Όκ³ λ°λ κ²μ μ΄λ €μμ΄ λ°λ₯Έλ€. μλνλ©΄, νλ‘μΈμ€ 2μμ νλ‘μΈμ€ 1μ΄ κ³΅μ νμΌμ λκ°λ₯Ό μ μλ€λ κ²μ νμΈν μκ° μμΌλ κ³μν΄μ μ½μ΄μΌ νκΈ° λλ¬Έμ΄λ€. λν, μ μ₯ 맀체μ I/O μμ μ λν μ€λ²ν€λκ° ν¬κΈ° λλ¬Έμ ν¨κ³Όμ μΈ ν΅μ λ°©λ²μ μλλ€.
λ°λΌμ, μ΄νμ λμ€λ IPC κΈ°λ²λ€μ μ μ₯ 맀체λ₯Ό μ¬μ©νλ κ²μ΄ μλλΌ I/O μμ μ λν μ€λ²ν€λκ° μ μ λ©λͺ¨λ¦¬μ 컀λ μμμ μ¬μ©ν΄μ ν΅μ νλ€.
곡μ λ©λͺ¨λ¦¬ μ¬μ©
곡μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ ν΅μ μ shmget()μ΄λΌλ μμ€ν νΈμΆμ μ¬μ©ν΄ λ©λͺ¨λ¦¬μ 컀λ μμμ 곡μ λ©λͺ¨λ¦¬λ₯Ό μν 곡κ°μ λ§λ€μ΄ λκ³ shmat μμ€ν νΈμΆμ μ¬μ©ν΄ ν΄λΉ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό λ§μΉ λ³μμ²λΌ μ κ·Όνλ λ°©μμ΄λ€. 곡μ λ©λͺ¨λ¦¬μ keyλ₯Ό κ°μ§κ³ , μ¬λ¬ νλ‘μΈμ€κ° μ κ·Όν μ μλ€. μ΄λ, 곡μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ ν΅μ μ λ¨λ°©ν₯ ν΅μ μ΄λ€.
곡μ νμΌμ μ¬μ©νλ ν΅μ μ λ¨μ μ€ νλμΈ I/O μμ μ λν μ€λ²ν€λ λ¬Έμ λ ν΄κ²°μ νμμ§λ§ μ¬μ ν μλλ°©μ΄ λ°μ΄ν°λ₯Ό μΈμ λ³΄λΌ μ§ λ°λ μͺ½μμ λͺ¨λ₯Έλ€λ λ¨μ μ ν΄κ²°νμ§ λͺ»νμλ€. λ°λΌμ, λ°μ΄ν°λ₯Ό λ°λ μͺ½μμ λ°λ³΅λ¬Έμ 무ν μ€ννλ©΄μ 곡μ λ©λͺ¨λ¦¬λ₯Ό νμΈν΄μΌ νλλ° μ΄κ²μ λ°μ λκΈ°(Busy Waiting)μ΄λΌκ³ νλ€.
μ½κ² λ°°μ°λ μ΄μ체μ κ΅μ¬μμλ μ΄λ κ² λ°μ λκΈ° μνλ₯Ό κ°μ§λ ν΅μ μ λκΈ°κ° μλ ν΅μ (Non-Blocking Communication)μ΄λΌκ³ νλλ° μ΄ λΆλΆμ΄ κ΅μ₯ν ν·κ°λ¦΄ μ μλ€. μλνλ©΄, λ ΌλΈλ‘νΉμ λ°μ λκΈ° μνλ₯Ό κ°μ§μ§ μλ κ²μ΄κΈ° λλ¬Έμ΄λ€. λμ κ°μΈμ μΈ μκ°μΌλ‘λ λκΈ°κ° μκ³ μκ³ μ 주체λ₯Ό μΌλ° νλ‘μΈμ€κ° μλ μ΄μ체μ νλ‘μΈμ€λ‘ λ°κΎΈλ©΄ μ½κ² μ΄ν΄κ° λλ€.
μ½κ² λ§ν΄, 곡μ νμΌμ΄λ 곡μ λ©λͺ¨λ¦¬λ₯Ό μ΄μ©ν ν΅μ μ νκ³ μλ νλ‘μΈμ€ μ체μμ λ°μ λκΈ° μνλ₯Ό κ°μ§μΌλ‘μ¨ λΈλ‘νΉμ΄ λλ―λ‘ μ΄μ체μ νλ‘μΈμ€μμ ν΄λΉ νλ‘μΈμ€λ₯Ό μν λκΈ° μνλ₯Ό μ 곡 μ ν΄λ λλ€λ μλ―Έμ΄λ€. λ°λΌμ, 곡μ νμΌμ΄λ 곡μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νλ ν΅μ μ μ΄μ체μ μ μ₯μμλ λκΈ°κ° μλ ν΅μ , μ¦ λΉλκΈ°ν ν΅μ μ΄λΌκ³ ν μ μλ€.
νμ΄ν(Pipe) ν΅μ
νμ΄νλ₯Ό μ΄μ©ν ν΅μ μ λ©λͺ¨λ¦¬μ 컀λ 곡κ°μ λ§λ€μ΄μ§ νμ΄νλ₯Ό μ¬μ©ν΄μ ν΅μ μ΄ μ΄λ£¨μ΄μ§λ€. μ΄μ체μ κ° μ 곡νλ λκΈ°ν ν΅μ λ°©μ, μ¦ λκΈ°κ° μλ ν΅μ μ΄κ³ λ¨λ°©ν₯ ν΅μ μ΄λ€. νμ΄νλ‘ μλ°©ν₯ ν΅μ μ νλ €λ©΄ νμ΄ν 2κ°λ₯Ό μ¬μ©ν΄μΌ νλ€. νμ΄νλ₯Ό μ΄μ©ν ν΅μ μ fork() μμ€ν νΈμΆμ μ¬μ©ν΄ μμ νλ‘μΈμ€λ₯Ό λ§λ€μμ λ, λΆλͺ¨μ μμ νλ‘μΈμ€ κ°μ ν΅μ λ°©λ²μ΄λ€.
char* msg = "Hello Child Process!";
int main()
{
char buf[255];
int fd[2], pid, nbytes;
if (pipe(fd) < 0) // pipe(fd)λ‘ νμ΄ν μμ±
exit(1);
pid = fork(); // μ΄ ν¨μ μ€ν λ€μ μ½λλΆν° λΆλͺ¨/μμ νλ‘μΈμ€λ‘ λλμ΄μ§
if (pid > 0) { // λΆλͺ¨ νλ‘μΈμ€λ pidμ μ€μ νλ‘μΈμ€ IDκ° λ€μ΄κ°
write(fd[1], msg, MSGSIZE); //fd[1]μ μ°κΈ°.
exit(0);
}
else { // μμ νλ‘μΈμ€λ pidμ 0μ΄ λ€μ΄κ°
nbytes = read(fd[0], buf, MSGSIZE); // fd[0]μΌλ‘ μ½κΈ°
printf("%d %s\n", nbytes, buf);
exit(0);
}
return 0;
}
μ μ½λλ νμ΄νλ₯Ό μ¬μ©ν ν΅μ μ ꡬνν μ½λ μμ μ΄λ€. μ μ½λμμλ λΆλͺ¨ νλ‘μΈμ€μ μ°κΈ° λμμ΄ λ¨Όμ μΌμ΄λκΈ° λλ¬Έμ μμ νλ‘μΈμ€μμ μ½μ λ λκΈ°κ° νμνμ§ μλ€. λ§μ½, μμ νλ‘μΈμ€κ° νμ΄νμ λν μ½κΈ° μ°μ°μ μννλλ° λΆλͺ¨ νλ‘μΈμ€κ° μμ§ νμ΄νμ λν΄ μ°κΈ° μ°μ°μ μννμ§ μμλ€λ©΄ μμ νλ‘μΈμ€λ λκΈ° μνκ° λλ€. μ΄λ¬ν λκΈ° μνλ λΆλͺ¨ νλ‘μΈμ€κ° νμ΄νμ μ°κΈ° μ°μ°μ μννλ μκ° μλμΌλ‘ νλ € λκΈ°νκ° μ΄λ£¨μ΄μ§λ€. λ°λΌμ, μμ νλ‘μΈμ€λ λ°μ λκΈ°λ₯Ό νμ§ μμλ λλ€.
λ©μμ§ ν(Message Queue)
νμ΄ν ν΅μ κ³Ό λ§μ°¬κ°μ§λ‘ λ©λͺ¨λ¦¬μ 컀λ 곡κ°μ ν μλ£κ΅¬μ‘°λ₯Ό μ¬μ©ν΄μ λ§λ λ©μμ§ νλ₯Ό μ¬μ©ν΄ ν΅μ μ΄ μ΄λ£¨μ΄μ§λ€. νμ΄ν ν΅μ μ²λΌ λΆλͺ¨-μμ νλ‘μΈμ€ κ°μ ν΅μ λ§μ μν κ²μ΄ μλλΌ μ΄λ νλ‘μΈμ€ κ°μλΌλ λ°μ΄ν° μ‘μμ μ΄ κ°λ₯ν λ°©μμ΄λ€. λν, νμ΄ν ν΅μ μ²λΌ λ¨λ°©ν₯ ν΅μ μ΄ μλ μλ°©ν₯ ν΅μ μ΄λ€.
msgget(), msgsnd(), msgrcv()λΌλ μμ€ν νΈμΆμ μ¬μ©ν΄ λ©μμ§ νλ₯Ό μμ±, λ°μ΄ν° μ‘μ , μμ μ ν μ μλ€.
λ€μμΌλ‘ λμ¬ λ κ°μ§ κΈ°λ²μ IPCμ©μΌλ‘ λ§λ κΈ°λ²μ μλλ€. νμ§λ§, IPCμ©μΌλ‘λ μ¬μ©λκΈ° λλ¬Έμ μ€λͺ νκ² λ€.
μκ·Έλ(Signal)
μκ·Έλμ΄λ νΉμ μ΄λ²€νΈκ° λ°μλμμ λ μ νΈλ₯Ό 보λ΄μ μλ €μ£Όλ κ²μ μλ―Ένλ€. μ΄λ¬ν μκ·Έλμ μ΄μ©νλ©΄ 컀λ λλ νλ‘μΈμ€μμ λ€λ₯Έ νλ‘μΈμ€λ‘ μ΄λ€ μ΄λ²€νΈκ° λ°μλμλμ§ μλ €μ€ μ μκΈ° λλ¬Έμ IPCμ μ¬μ©λ μ μλ€.
μκ·Έλμ λͺ¨λ μ’ λ₯λ₯Ό μκ³ μΆμΌλ©΄ μλ λͺ λ Ήμ΄λ₯Ό μΉλ©΄ λ³Ό μ μλ€.
kill -l
λλΆλΆμ μκ·Έλμ 컀λμμ κΈ°λ³Έ λμ μνμ νλ€. λ€μμ λͺ κ°μ§ κΈ°λ³Έ λμ μμμ΄λ€.
- SIGKILL: νλ‘μΈμ€λ₯Ό μ£½μ
- SIGALARM: μλμ λ°μμν΄
- SIGSTOP: νλ‘μΈμ€λ₯Ό λ©μΆ€(Ctrl + z)
- SIGCONT: λ©μΆ°μ§ νλ‘μΈμ€λ₯Ό μ€νμν΄
- SIGINT: νλ‘μΈμ€μ μΈν°λ½νΈλ₯Ό 보λ΄μ νλ‘μΈμ€λ₯Ό μ£½μ(Ctrl + c)
- SIGSEGV: νλ‘μΈμ€κ° λ€λ₯Έ λ©λͺ¨λ¦¬ μμμ μΉ¨λ²νμμ μλ¦Ό
νλ‘μΈμ€ ν΅μ κ΄λ ¨ μ½λμ κ΄λ ¨ μκ·Έλ νΈλ€λ¬λ₯Ό λ±λ‘νλ©΄ ν΄λΉ μκ·Έλμ λν κΈ°λ³Έ λμμ 무μνκ³ μκ·Έλ νΈλ€λ¬μ λ±λ‘λ λμμ μννλ€. 보ν΅μ 컀λμ κΈ°λ³Έ λμμ΄ μλ SIGUSR1, SIGUSR2λΌλ λ κ°μ μκ·Έλμ μ¬μ©ν΄μ νλ‘μΈμ€ κ° ν΅μ μ νλ€.
PCBμ ν΄λΉ νλ‘μΈμ€κ° μ²λ¦¬ ν΄μΌνλ μκ·Έλ κ΄λ ¨ μ 보λ₯Ό λ΄λ 곡κ°μ΄ μμ΄ νλ‘μΈμ€ κ° ν΅μ μ΄ κ°λ₯νλ€.
μμΌ(socket)
μμΌμ κΈ°λ³Έμ μΌλ‘ ν΄λΌμ΄μΈνΈμ μλ² κ°μ μλ‘ λ€λ₯Έ μ»΄ν¨ν°κ°μ λ€νΈμν¬ κΈ°λ° ν΅μ μ μν κΈ°μ μ΄λ€. μ΄λ¬ν μμΌμ μ΄μ©νλ©΄ μ¬λ¬ μ»΄ν¨ν°μ μλ νλ‘μΈμ€λΌλ¦¬λ ν΅μ μ ν μ μλ€. λν, 127.0.0.1 루νλ°± μ£Όμλ₯Ό μ¬μ©νλ©΄ λμΌ μ»΄ν¨ν°μ νλ‘μΈμ€λΌλ¦¬λ ν΅μ ν μ μλ€.
μμΌμ νλ‘μΈμ€ λκΈ°νλ₯Ό μ§μνλ―λ‘ λ°μ΄ν°λ₯Ό λ°λ μͺ½μ νλ‘μΈμ€κ° λ°μ λκΈ°λ₯Ό νμ§ μμλ λλ λκΈ°ν ν΅μ λ°©μμ΄κ³ , μμΌμ 1κ°λ§ μ¬μ©ν΄λ μλ°©ν₯ ν΅μ μ΄ κ°λ₯νλ€.
'CS > μ΄μ체μ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ΄μ체μ ] κ΅μ°© μν(Deadlock) (1) | 2023.04.23 |
---|---|
[μ΄μ체μ ] λκΈ°ν(Synchronization) (0) | 2023.04.23 |
[μ΄μ체μ ] CPU μ€μΌμ€λ§ (0) | 2023.04.23 |
[μ΄μ체μ ] μ€λ λ (0) | 2023.04.14 |
[μ΄μ체μ ] νλ‘μΈμ€ (0) | 2023.04.13 |
λκΈ