Skip to content

Latest commit

Β 

History

History
201 lines (150 loc) Β· 14.3 KB

File metadata and controls

201 lines (150 loc) Β· 14.3 KB

μœΌμ•… λͺ»μƒκ²Όμ–΄ λ‚˜μ€‘μ— μˆ˜μ •ν• κ²Œμš” 일단 μ—¬κΈ°λ‘œ... https://velog.io/@hgo641/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC

ν”„λ‘œμ„ΈμŠ€ μ‹œμŠ€ν…œ μž‘μ—…μ˜ λ‹¨μœ„ λ©”λͺ¨λ¦¬μ— μ μž¬λ˜μ–΄μžˆλŠ” ν”„λ‘œκ·Έλž¨ ν”„λ‘œμ„ΈμŠ€ κ΅¬μ„±μš”μ†Œ ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬

μŠ€νƒ : μΌμ‹œμ μΈ 데이터듀을 μ €μž₯(ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜, ν•¨μˆ˜ 리턴값 λ“±), 컴파일 νƒ€μž„μ— 크기가 κ²°μ •λΌμ„œ λ¬΄ν•œμœΌλ‘œ ν• λ‹Ήν•  수 μ—†μŒ.(μŠ€νƒμ˜€λ²„ν”Œλ‘œμš°) νž™ : 동적인 데이터 μ €μž₯(동적 λ°°μ—΄ λ“±). λŸ°νƒ€μž„μ— κ²°μ •λΌμ„œ μ •ν•΄μ§„ 크기가 μ—†μŒ. 데이터 : 정적 λ³€μˆ˜ μ €μž₯ ν…μŠ€νŠΈ : μ½”λ“œ μ €μž₯ -> 같은 ν”„λ‘œκ·Έλž¨μœΌλ‘œλΆ€ν„° μƒμ„±λœ ν”„λ‘œμ„ΈμŠ€μ—¬λ„, ν…μŠ€νŠΈ λΆ€λΆ„λ§Œ λ™μΌν•˜κ³  λ‹€λ₯Έ 뢀뢄듀은 λ‹€λ₯Ό 수 μžˆλ‹€.

PCB(Process Control Block) ν”„λ‘œμ„ΈμŠ€ μƒνƒœ, ν”„λ‘œμ„ΈμŠ€ 아이디, μŠ€μΌ€μ€„λ§ 정보, μš°μ„ μˆœμœ„ ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„° : λ‹€μŒμ— μ–΄λŠ μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•  μ§€λ₯Ό μ €μž₯ν•œλ‹€. (ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬μ˜ μ½”λ“œλΆ€λΆ„μ„ κ°€λ¦¬ν‚€λŠ” 포인터가 쑴재!) ν”„λ‘œμ„Έμ„œ λ ˆμ§€μŠ€ν„° : λ ˆμ§€μŠ€ν„°μ— λ³€μˆ˜κ°’λ“±μ„ μ €μž₯! μ—΄κ³ μžˆλŠ” νŒŒμΌλ“€μ˜ 정보 μŠ€λ ˆλ“œ 정보 ν”„λ‘œμ„ΈμŠ€ μƒνƒœ

μ€€λΉ„ : λ©”λͺ¨λ¦¬μ— 적재된 μƒνƒœμ΄λ©°, cpu만 ν• λ‹Ήλ°›μœΌλ©΄ μ–Έμ œλ“  일할 수 μžˆλŠ” μƒνƒœ λŒ€κΈ° : λ©”λͺ¨λ¦¬μ— 적재된 μƒνƒœκ°€ 아닐 μˆ˜λ„ 있으며, cpuλ₯Ό 할당받아도 일할 수 μ—†λŠ” μƒνƒœ ν”„λ‘œμ„ΈμŠ€ μŠ€μΌ€μ€„λ§ 큐

OSμ—λŠ” 쀀비큐와 λŒ€κΈ°νκ°€ μ‘΄μž¬ν•œλ‹€. λ””λ°”μ΄μŠ€λ§ˆλ‹€ 큐듀이 μ‘΄μž¬ν•  수 있으며, 각 큐듀은 PCBλ₯Ό μ—°κ²°λ¦¬μŠ€νŠΈλ‘œ μ €μž₯ν•˜κ³  μžˆλ‹€.

λ¬Έλ§₯ κ΅ν™˜ ν”„λ‘œμ„ΈμŠ€κ°€ μ–΄λ””κΉŒμ§€ μ‹€ν–‰ν–ˆλŠ”μ§€, ν˜„μž¬ μ–΄λ–€ μƒνƒœμΈμ§€λ“± ν”„λ‘œμ„ΈμŠ€ μƒνƒœλ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•œ λͺ¨λ“  정보λ₯Ό λ¬Έλ§₯이라고 ν•œλ‹€. pc, λ ˆμ§€μŠ€ν„°, ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬, PCBκ°€ ν¬ν•¨λœλ‹€. CPUκ°€ μ‹€ν–‰ν•  μž‘μ—…μ„ μœ μ €ν”„λ‘œμ„ΈμŠ€Aμ—μ„œ μœ μ €ν”„λ‘œμ„ΈμŠ€B둜 λ°”κΎΈλŠ” 것을 λ¬Έλ§₯ κ΅ν™˜μ΄λΌκ³  ν•œλ‹€. (μœ μ €ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ»€λ„ν”„λ‘œμ„ΈμŠ€λ‘œ μ „ν™˜ν•˜λŠ” 것은 λ¬Έλ§₯ κ΅ν™˜μ΄λΌκ³  λΆ€λ₯΄μ§€ μ•ŠμŒ! μœ μ €ν”„λ‘œμ„ΈμŠ€->μœ μ €ν”„λ‘œμ„ΈμŠ€λ³΄λ‹€ μ˜€λ²„ν—€λ“œκ°€ 적닀.) λ¬Έλ§₯ κ΅ν™˜μ‹œμ—λŠ” μœ μ €ν”„λ‘œμ„ΈμŠ€A에 λŒ€ν•œ 정보λ₯Ό 이후 볡ꡬ할 수 있게 PCB에 기둝. ν•΄λ‹Ή PCBλ₯Ό μ»€λ„μ˜ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³ , μœ μ €ν”„λ‘œμ„ΈμŠ€B의 정보λ₯Ό λ©”λͺ¨λ¦¬λ‘œ μ μž¬ν•œλ‹€. λ¬Έλ§₯ κ΅ν™˜μ‹œμ—λŠ” μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€λ„ μˆ˜ν–‰ν•  수 없기에 μˆœμˆ˜ν•œ μ˜€λ²„ν—€λ“œκ°€ λœλ‹€. λ•Œλ¬Έμ— λ¬Έλ§₯ κ΅ν™˜μ„ μ μ ˆν•œ μ‹œκ°„μ— ν•˜λŠ” 것이 μ€‘μš”!

ν”„λ‘œμ„ΈμŠ€ 생성 ν”„λ‘œμ„ΈμŠ€λŠ” 트리 ꡬ쑰이며, λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€κ°€ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ” ν˜•νƒœμ΄λ‹€. μ‹œμŠ€ν…œμ΄ λΆ€νŒ…λ  λ•Œ κ°€μž₯ μ΅œμƒμœ„ ν”„λ‘œμ„ΈμŠ€μΈ systemdν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λœλ‹€. (pid = 1)

μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ 데이터λ₯Ό λ³΅μ‚¬ν•΄μ˜¨λ‹€.

μ „λΆ€ λ³΅μ‚¬ν•΄μ˜€μ§€ μ•ŠλŠ” κ²½μš°λ„ μžˆλ‹€. λ¦¬λˆ…μŠ€μ˜ 경우, 일단은 μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ™€ 같은 μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€κ²Œ ν•˜κ³ , μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μƒˆλ‘œμš΄ 데이터λ₯Ό μ¨μ•Όν•˜λŠ” μ‹œμ μ— μ‹€μ œλ‘œ 볡사λ₯Ό μˆ˜ν–‰ν•˜κ²Œ ν•œλ‹€.(copy on write) fork() λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜λŠ” μ‹œμŠ€ν…œ μ½œμ΄λ‹€.

fork()의 λ°˜ν™˜κ°’ 차이 λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λŠ” fork()의 λ°˜ν™˜κ°’μ΄ μžμ‹ μ˜ 아이디이닀. ( pid > 0) μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” 0을 λ°˜ν™˜ν•œλ‹€. exec() μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간을 λ³΅μ‚¬ν•΄μ˜¬ 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ™€ μ™„μ „νžˆ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ„ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹€ν–‰ν•˜κ³  μ‹Άλ‹€λ©΄, exec() μ‹œμŠ€ν…œ μ½œμ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

exec()λ₯Ό μ‹€ν–‰ν•˜λ©΄, ν”„λ‘œμ„ΈμŠ€λŠ” exec()의 λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄μ˜¨ ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ „ν™˜λœλ‹€. λ©”λͺ¨λ¦¬μ— μ €μž₯된 κ°’ μžμ²΄κ°€ μ „λΆ€ μ΄ˆκΈ°ν™”λ˜κ³  μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž¨μ„ κ°€μ Έμ˜¨λ‹€. λ•Œλ¬Έμ— exec()λ₯Ό μˆ˜ν–‰ν•  경우, λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ˜ λͺ¨λ“  μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν•΄μ˜€λŠ” 것은 낭비이닀.

ex. execlp("/bin/ls", "ls", NULL) : μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž¨μΈ bin/ls둜 μ „ν™˜. execlp()의 μ•„λž˜ μ½”λ“œλŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠμŒ.

wait() λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λŠ” μžμ‹ ν”„λ‘œμ„ΈμŠ€μ™€ λ³‘ν–‰ν•΄μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•  μˆ˜λ„ μžˆμ§€λ§Œ, wait()λ₯Ό μ‚¬μš©ν•˜μ—¬ μžμ‹ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•  μˆ˜λ„ μžˆλ‹€.

exit() ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•˜κΈ° μœ„ν•΄ exit()λ₯Ό μ‚¬μš©ν•œλ‹€. μžμ‹ ν”„λ‘œμ„ΈμŠ€ 슀슀둜 일을 λ‹€ 마쳐 exit()될 μˆ˜λ„ 있고, μ™ΈλΆ€μ—μ„œ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό exit()μ‹œν‚¬ μˆ˜λ„ μžˆλ‹€.

μ’€λΉ„ ν”„λ‘œμ„ΈμŠ€μ™€ κ³ μ•„ ν”„λ‘œμ„ΈμŠ€ μ’€λΉ„ ν”„λ‘œμ„ΈμŠ€ : μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” μ’…λ£Œλ˜μ—ˆμ§€λ§Œ, λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€κ°€ 아직 wait()λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šμ€ μƒνƒœ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ™€ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ³‘ν–‰ν•΄μ„œ μ‹€ν–‰ν•˜κ³  μ‹Άλ‹€λ©΄ μ–Έμ œ waitλ₯Ό ν•΄μ•Όν•˜μ§€? -> μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ°±κ·ΈλΌμš΄λ“œλ‘œ μ‹€ν–‰μ‹œν‚€λ©΄, μ’€λΉ„ ν”„λ‘œμ„ΈμŠ€κ°€ λ˜μ§€ μ•ŠλŠ”λ‹€? -> μ‹œκ·Έλ„ 핸듀링 : μžμ‹ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜λ©΄ μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ—κ²Œ μ‹œκ·Έλ„ 전달. μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ—μ„œ waitμˆ˜ν–‰

κ³ μ•„ ν”„λ‘œμ„ΈμŠ€ : μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” μ‹€ν–‰μ€‘μ΄μ§€λ§Œ, λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλœ μƒνƒœ ν”„λ‘œμ„ΈμŠ€κ°„ 톡신(IPC) 곡유 λ©”λͺ¨λ¦¬ 방식 : ν”„λ‘œμ„ΈμŠ€κ°€ 같은 μ£Όμ†Œκ³΅κ°„μ„ 곡유 λ©”μ‹œμ§€ 전달 방식 : 컀널을 톡해 λ©”μ‹œμ§€λ₯Ό 전달 λ©”μ‹œμ§€ 전달 방식은 컀널을 톡해 μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•˜λŠ” λ“± 뢀가적인 μž‘μ—…μ΄ μ‘΄μž¬ν•΄μ„œ 곡유 λ©”λͺ¨λ¦¬ 방식보닀 λŠλ¦¬λ‹€. 곡유 λ©”λͺ¨λ¦¬ 방식은 μ²˜μŒμ— 곡유 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ꡬ좕할 λ•Œλ§Œ μ‹œμŠ€ν…œ 콜 μ‚¬μš©.

λ©”μ‹œμ§€ 전달 λͺ¨λΈμ€ μΆ©λŒμ„ νšŒν”Όν•  ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— 적은 μ–‘μ˜ 데이터λ₯Ό κ΅ν™˜ν•˜λŠ” 데 μœ μš©ν•œλ‹€ λ ˆμ „λ“œ λ―ΈμŠ€ν…Œλ¦¬ -> 곡유 λ©”λͺ¨λ¦¬ 방식은 λ©”λͺ¨λ¦¬μ˜ 전솑 μ†λ„λ‘œ μˆ˜ν–‰ν•  수 μžˆκΈ°μ— λŒ€λŸ‰μ˜ 데이터에 μ ν•©ν•˜μ§€λ§Œ λ©”μ‹œμ§€ 전달 방식은 곡유 λ©”λͺ¨λ¦¬ 방식에 λΉ„ν•΄ 속도가 더 λŠλ¦¬λ‹€. κ·Έλ‹ˆκΉŒ λŒ€λŸ‰μ˜ 데이터λ₯Ό μ „μ†‘ν•˜λ©΄ 손해닀~ λΌλŠ” 의미?... ...??

그럼 곡유 λ©”λͺ¨λ¦¬ 방식은 λ‹€λ₯Έ λ„€νŠΈμ›Œν¬μ— μ†ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λΌλ¦¬λŠ” ν•  수 μ—†λŠ”κ±΄κ°€? ν΄λΌμš°λ“œ μŠ€ν† λ¦¬μ§€ 같은 κ±Έ 곡유 λ©”λͺ¨λ¦¬λΌκ³  μš°κΈ°μ§„ μ•Šκ² μ§€? "톡상 곡유 λ©”λͺ¨λ¦¬ μ˜μ—­μ€ 곡유 λ©”λͺ¨λ¦¬ μ„Έκ·Έλ¨ΌνŠΈλ₯Ό μƒμ„±ν•˜λŠ” 포λ₯΄μ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간에 μœ„μΉ˜ν•œλ‹€"

곡유 λ©”λͺ¨λ¦¬ μ‹œμŠ€ν…œ 일반적으둜 ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•˜λŠ” 것을 κΈˆμ§€ν•˜μ§€λ§Œ, 곡유 λ©”λͺ¨λ¦¬λŠ” μ˜ˆμ™Έμ μΈ μΌ€μ΄μŠ€. λ™μ‹œμ— λ™μΌν•œ μœ„μΉ˜μ— 데이터λ₯Ό μ“°μ§€ μ•Šλ„λ‘ μ±…μž„μ Έμ•Ό 함. (μ–΄λ–»κ²Œ μ±…μž„μ Έμ•Ό ν•  μ§€λŠ” λ‚˜μ€‘μ— μ•Œλ €μ£Όκ² μ§€ ...)

버퍼도 곡유 λ©”λͺ¨λ¦¬ 방식이넫, μƒμ‚°μž-μ†ŒλΉ„μž λͺ¨λΈμ—μ„œ μƒμ‚°μžμ™€ μ†ŒλΉ„μž ν”„λ‘œμ„ΈμŠ€λ“€μ„ λ³‘ν–‰μœΌλ‘œ μ‹€ν–‰ν•˜λ €λ©΄ 버퍼가 μžˆμ–΄μ•Όν•œλ‹€. μƒμ‚°μžλŠ” 버퍼에 데이터λ₯Ό μ—΄μ‹¬νžˆ μŒ“μ•„λ‘κ³ , μ†ŒλΉ„μžλŠ” λ²„νΌμ—μ„œ 데이터λ₯Ό κΊΌλ‚΄κ°€μ•Ό λ‘˜μ΄ λ³‘ν–‰μœΌλ‘œ μ‹€ν–‰ κ°€λŠ₯.

λ©”μ‹œμ§€ 전달 μ‹œμŠ€ν…œ 같은 μ£Όμ†Œ 곡간을 κ³΅μœ ν•˜μ§€ μ•Šκ³ λ„ ν”„λ‘œμ„ΈμŠ€κ°„ 톡신이 κ°€λŠ₯ν•œ 기법. send()와 receive() μ‹œμŠ€ν…œ 콜 μ‚¬μš©

λͺ‡ κ°€μ§€ νŠΉμ„±λ“€μ΄ 쑴재.

직접 톡신 vs κ°„μ ‘ 톡신 동기식 vs 비동기식 μžλ™ 버퍼링 vs λͺ…μ‹œμ  버퍼링 직접 톡신 직접 톡신은 νŠΉμ • ν”„λ‘œμ„ΈμŠ€λ₯Ό μ§€λͺ©ν•΄μ„œ λ³΄λ‚΄λŠ” 방식(ex. ν”„λ‘œμ„ΈμŠ€P와 Qκ°€ 톡신쀑일 λ•Œ, send(P, message), receive(Q, message) )

두 ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—μ„œλ§Œ 톡신이 μΌμ–΄λ‚œλ‹€.

ν”„λ‘œμ„ΈμŠ€ 이름이 λ°”λ€Œλ©΄, μ½”λ“œ μˆ˜μ •ν•΄μ•Όν•¨ (ν”„λ‘œμ„ΈμŠ€ 이름 : μ‹€ν–‰ 파일 μ΄λ¦„μ΄λ‚˜ ν”„λ‘œμ„ΈμŠ€ 생성 μ‹œμ˜ 인자 등에 μ˜ν•΄ κ²°μ •)

κ°„μ ‘ 톡신 νŠΉμ • ν”„λ‘œμ„ΈμŠ€λ₯Ό μ§€λͺ©ν•΄μ„œ ν†΅μ‹ ν•˜μ§€ μ•Šκ³ , 메일 λ°•μŠ€λ‚˜ 포트λ₯Ό 톡해 톡신.

ν”„λ‘œμ„ΈμŠ€ 사이에 λ©”μΌλ°•μŠ€λΌλŠ” 쀑간 μ €μž₯μ†Œκ°€ 쑴재

λ©”μΌλ°•μŠ€μ˜ 아이디가 쑴재. λ©”μΌλ°•μŠ€ Aκ°€ μžˆμ„ λ•Œ, send(A, message), receive(A, message)μ‹μœΌλ‘œ 톡신.

λ©”μΌλ°•μŠ€λŠ” ν•œ ν”„λ‘œμ„ΈμŠ€ λ˜λŠ” μš΄μ˜μ²΄μ œμ— μ˜ν•΄ μ†Œμœ λ  수 μžˆλ‹€.

ν”„λ‘œμ„ΈμŠ€μ— μ˜ν•΄ μ†Œμœ λλ‹€λ©΄, κ·Έ λ©”μΌλ°•μŠ€λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간 일뢀. 즉, ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ  λ•Œ λ©”μΌλ°•μŠ€λ„ 사라진닀. μžλ™ 버퍼링 & λͺ…μ‹œμ  버퍼링 ν”„λ‘œμ„ΈμŠ€λ“€κ°„ κ΅ν™˜λ˜λŠ” λ©”μ‹œμ§€λ“€μ€ μž„μ‹œ 큐에 λ“€μ–΄κ°„λ‹€. 큐λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방식은 μ„Έ κ°€μ§€κ°€ μžˆλ‹€.

λ¬΄μš©λŸ‰ : 큐의 길이가 0. λŒ€κΈ° λΆˆκ°€λŠ₯. μ†‘μ‹ μžλŠ” μˆ˜μ‹ μžκ°€ λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•  λ•ŒκΉŒμ§€ 기닀렀야함. μœ ν•œ μš©λŸ‰ : 큐의 길이가 μœ ν•œ. μ΅œλŒ€ κ°œμˆ˜κΉŒμ§€ μ°¨λ©΄ μ†‘μ‹ μžλŠ” 기닀렀야함. λ¬΄ν•œ μš©λŸ‰ : 큐의 길이가 λ¬΄ν•œ. λ¬΄μš©λŸ‰μ€ 버퍼가 μ—†λŠ” λ©”μ‹œμ§€ μ‹œμŠ€ν…œμ΄λΌκ³  λΆ€λ₯Έλ‹€. μœ ν•œ μš©λŸ‰κ³Ό λ¬΄ν•œ μš©λŸ‰μ€ μžλ™ 버퍼링이라고 λΆ€λ₯Έλ‹€.

큐가 λ‹€ 찼을 λ•Œ μ „λž΅.

λ¬΄κΈ°ν•œ κΈ°λ‹€λ¦Ό μ΅œλŒ€ nλ°€λ¦¬μ΄ˆλ™μ•ˆ κΈ°λ‹€λ¦Ό 기닀리지 μ•Šκ³  μ¦‰μ‹œ 볡귀 λ©”μ‹œμ§€λ₯Ό μΌμ‹œμ μœΌλ‘œ μΊμ‹œ - μš΄μ˜μ²΄μ œμ— μ „λ‹¬ν•˜μ—¬ 보쑴. λ©”μ‹œμ§€ 전달 μ‹œμŠ€ν…œ μ˜ˆμ‹œ1 - νŒŒμ΄ν”„ νŒŒμ΄ν”„λŠ” 보톡 단방ν–₯ 톡신을 μ§€μ›ν•˜λ©°, λΆ€λͺ¨μ™€ μžμ‹ ν”„λ‘œμ„ΈμŠ€ 사이에 μ‚¬μš©λ˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€.

νŒŒμ΄ν”„ μ„€κ³„μ‹œ κ³ λ €ν•΄μ•Όν•  것 단방ν–₯ vs μ–‘λ°©ν–₯ λ°˜μ΄μ€‘ vs 전이쀑 (λ°˜μ΄μ€‘μ€ ν•œ μˆœκ°„μ— ν•œ λ°©ν–₯으둜만 전솑 κ°€λŠ₯, 전이쀑은 λ™μ‹œμ— μ–‘λ°©ν–₯으둜 전솑 κ°€λŠ₯) ν”„λ‘œμ„ΈμŠ€κ°„ λΆ€λͺ¨-μžμ‹κ°™μ€ 관계가 μ‘΄μž¬ν•˜λŠ” κ°€ 같은 μ»΄ν“¨ν„°μ•ˆμ˜ ν”„λ‘œμ„ΈμŠ€μΈκ°€? λΆ„μ‚° ν™˜κ²½μ˜ ν”„λ‘œμ„ΈμŠ€μΈκ°€? 일반 νŒŒμ΄ν”„(읡λͺ… νŒŒμ΄ν”„) μƒμ‚°μž-μ†ŒλΉ„μž ν˜•νƒœμ˜ νŒŒμ΄ν”„. μƒμ‚°μžλŠ” νŒŒμ΄ν”„μ˜ ν•œ 쒅단에 데이터λ₯Ό μ“°κ³ , μ†ŒλΉ„μžλŠ” λ°˜λŒ€ μ’…λ‹¨μ—μ„œ μ½λŠ”λ‹€. 일반 νŒŒμ΄ν”„λŠ” ν•œμͺ½μœΌλ‘œλ§Œ 데이터λ₯Ό 전솑할 수 있으며, 단방ν–₯ ν†΅μ‹ λ§Œ κ°€λŠ₯ν•˜λ‹€. (μ–‘λ°©ν–₯ ν†΅μ‹ ν•˜κ³  μ‹ΆμœΌλ©΄ νŒŒμ΄ν”„ 두 개 λ§Œλ“œμ…ˆ)

일반 νŒŒμ΄ν”„λŠ” νŒŒμ΄ν”„λ₯Ό μƒμ„±ν•œ ν”„λ‘œμ„ΈμŠ€μ™Έμ—λŠ” μ ‘κ·Όν•  수 μ—†λ‹€. κ·Έλž˜μ„œ λΆ€λͺ¨-μžμ‹ ν”„λ‘œμ„ΈμŠ€λ“€λΌλ¦¬ ν†΅μ‹ ν•˜λŠ” 데 μ“°μž„. (μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ‘œλΆ€ν„° μ—΄λ¦° νŒŒμΌμ„ μƒμ†λ°›λŠ”λ‹€.)

(μ˜ˆμ‹œμ—μ„œ μ„€λͺ…ν•΄μ£ΌλŠ” νŒŒμ΄ν”„λŠ” 파일인데, 파일 ν˜•νƒœλ§Œ μžˆλŠ”μ§€λŠ” λͺ¨λ₯΄κ² μŒ)

μ§€λͺ… νŒŒμ΄ν”„ 일반 νŒŒμ΄ν”„λŠ” ν”„λ‘œμ„ΈμŠ€λ“€μ΄ ν†΅μ‹ ν•˜λŠ” λ™μ•ˆμ—λ§Œ 쑴재. (ν†΅μ‹ ν•˜λŠ” 두 ν”„λ‘œμ„ΈμŠ€λ“€μ΄ μ •ν•΄μ ΈμžˆμŒ) μ§€λͺ… νŒŒμ΄ν”„λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ˜μ–΄λ„ 계속 μ‘΄μž¬ν•¨. μ§€λͺ… νŒŒμ΄ν”„λŠ” μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ μ‚¬μš©ν•  수 μžˆλŠ” νŒŒμ΄ν”„μž„. (λΆ€λͺ¨-μžμ‹ 관계 ν•„μš” μ—†μŒ)

λ©”μ‹œμ§€ 전달 μ‹œμŠ€ν…œ μ˜ˆμ‹œ1 - μ†ŒμΌ“ μ†ŒμΌ“μ€ λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 주둜 μ‚¬μš©λ˜λŠ” IPC방법.(λ‘œμ»¬μ—μ„œλ„ μ“Έ 수 μžˆκΈ΄ν•¨) μ†ŒμΌ“μ€ ν†΅μ‹ μ˜ 극점을 μ˜λ―Έν•¨. 두 ν”„λ‘œμ„ΈμŠ€κ°€ λ„€νŠΈμ›Œν¬μƒμ—μ„œ ν†΅μ‹ ν•˜λ €λ©΄ 두 개의 μ†ŒμΌ“μ΄ ν•„μš”. μ†ŒμΌ“μ€ IPμ£Όμ†Œμ™€ 포트번호 두 κ°€μ§€λ‘œ ꡬ별함.

ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œμ„ΈμŠ€κ°€ 연결을 μš”μ²­ν•˜λ©΄, 호슀트 ν”„λ‘œμ„ΈμŠ€κ°€ 포트 번호λ₯Ό λΆ€μ—¬. (μ΄λ•Œ 포트 λ²ˆν˜ΈλŠ” 1024보닀 큰 μ •μˆ˜μΈλ° μ†ŒμΌ“μš©μœΌλ‘œ μ •ν•΄λ‘”λ“―)

μ†ŒμΌ“μ€ λΆ„μ‚° ν™˜κ²½μ—μ„œ 널리 μ‚¬μš©λ˜μ§€λ§Œ, μ €μˆ˜μ€€ 톡신 방법이닀. μŠ€λ ˆλ“œκ°„μ— κ΅¬μ‘°ν™”λ˜μ§€ μ•Šμ€ λ°”μ΄νŠΈ μŠ€νŠΈλ¦Όλ§Œμ„ ν†΅μ‹ ν•˜κΈ° λ•Œλ¬Έ! (κ·Έλž˜λ„ μ±„νŒ…μ—μ„  κ°œκΏ€μ΄μ£ ?) λŒ€μ•ˆμœΌλ‘œ 더 높은 μˆ˜μ€€μ˜ 톡신 기법인 RPCκ°€ μ‘΄μž¬ν•¨.

RPC(원격 ν”„λ‘œμ‹œμ € 호좜) ν”„λ‘œμ‹œμ € : 걍 μ½”λ“œ μ§‘ν•©. ν•¨μˆ˜λΌκ³  보면 됨. λ„€νŠΈμ›Œν¬λ₯Ό ν†΅ν•΄μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 방법.

IPC λ°©μ‹κ³ΌλŠ” 달리 RPC ν†΅μ‹ μ—μ„œ μ „λ‹¬λ˜λŠ” λ©”μ‹œμ§€λŠ” ꡬ쑰화 λ˜μ–΄μžˆλ‹€. λ©”μ‹œμ§€ κ΅¬μ„±μš”μ†Œ

헀더 : λ©”μ‹œμ§€ 길이, λ©”μ‹œμ§€ μœ ν˜•, 인증정보 λ“± 원격지 ν¬νŠΈμ—μ„œ listen쀑인 RPC demon의 μ£Όμ†Œκ°€ μ§€μ • μ‹€ν–‰ν•  ν•¨μˆ˜μ˜ μ‹λ³„μž ν•¨μˆ˜μ— λ“€μ–΄κ°ˆ λ§€κ°œλ³€μˆ˜ RPC vs REST API by μ±—μ§€ν”Όν‹°λ‹˜

RPC (Remote Procedure Call) νŠΉμ§•: Procedure-Centric: RPCλŠ” ν”„λ‘œμ‹œμ € μ€‘μ‹¬μ μž…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ˜ νŠΉμ • ν•¨μˆ˜ λ˜λŠ” ν”„λ‘œμ‹œμ €λ₯Ό μ›κ²©μœΌλ‘œ ν˜ΈμΆœν•˜κ³ , κ²°κ³Όλ₯Ό λ°›λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

데이터 전솑 포맷: 주둜 Protocol Buffers, Thrift, gRPC λ“±κ³Ό 같은 이진 데이터 포맷을 μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŠ” 데이터λ₯Ό 효율적으둜 μ§λ ¬ν™”ν•˜μ—¬ μ „μ†‘ν•©λ‹ˆλ‹€. μƒνƒœλ₯Ό κ°€μ§ˆ 수 있음: RPCλŠ” μƒνƒœλ₯Ό κ°€μ§ˆ 수 있으며, 일뢀 ν”„λ ˆμž„μ›Œν¬λŠ” 연결을 ν†΅ν•œ μƒνƒœ μœ μ§€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€: μ„±λŠ₯이 μ€‘μš”ν•œ 상황: RPCλŠ” λ°μ΄ν„°μ˜ 효율적인 전솑과 λΉ λ₯Έ 응닡 μ‹œκ°„μ„ κ°•μ‘°ν•˜λ―€λ‘œ, μ„±λŠ₯이 μ€‘μš”ν•œ μƒν™©μ—μ„œ μ ν•©ν•©λ‹ˆλ‹€. λ‚΄λΆ€ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 톡신: λ‚΄λΆ€ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ°„μ˜ 톡신에 많이 μ‚¬μš©λ©λ‹ˆλ‹€. 이진 데이터 전솑이 ν•„μš”ν•œ 경우: 이미지, λΉ„λ””μ˜€ λ“±κ³Ό 같은 λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό 효과적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. REST API (Representational State Transfer API) νŠΉμ§•: Resource-Centric: REST APIλŠ” μžμ› μ€‘μ‹¬μ μž…λ‹ˆλ‹€. 각 μžμ›μ€ κ³ μœ ν•œ URIλ₯Ό κ°€μ§€λ©°, HTTP λ©”μ†Œλ“œ(GET, POST, PUT, DELETE)λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒνƒœλ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€. 데이터 전솑 포맷: 주둜 JSON ν˜•μ‹μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŠ” μ‚¬λžŒμ΄ 읽고 μ“°κΈ° 쉽고, λΈŒλΌμš°μ €μ—μ„œλ„ μ²˜λ¦¬ν•˜κΈ° νŽΈλ¦¬ν•©λ‹ˆλ‹€. λ¬΄μƒνƒœ(Stateless): RESTλŠ” μƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•ŠλŠ” λ¬΄μƒνƒœ μ•„ν‚€ν…μ²˜λ₯Ό κ°€μ§€λ©°, 각 μš”μ²­μ€ λͺ¨λ“  ν•„μš”ν•œ 정보λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€: μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발: RESTλŠ” 주둜 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ—μ„œ μ‚¬μš©λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ κ°„μ˜ 톡신을 κ°„λ‹¨ν•˜κ²Œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” 경우: RESTλŠ” λ¬΄μƒνƒœ μ•„ν‚€ν…μ²˜μ΄λ―€λ‘œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μƒνƒœλ₯Ό 관리해야 ν•˜λŠ” κ²½μš°μ— μ ν•©ν•©λ‹ˆλ‹€. HTTP λ©”μ†Œλ“œ ν™œμš©: RESTλŠ” HTTP λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°„λ‹¨ν•˜κ²Œ CRUD(Create, Read, Update, Delete) κΈ°λŠ₯을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ–Έμ œ μ–΄λ–€ 것을 선택해야 ν• κΉŒμš”? λ³΅μž‘μ„± 및 νš¨μœ¨μ„±: RPCλŠ” μ„±λŠ₯이 μ€‘μš”ν•˜κ³ , μ§λ ¬ν™”λœ 이진 데이터λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. RESTλŠ” κ°„λ‹¨ν•˜κ³  μœ μ—°ν•˜μ§€λ§Œ, λ°μ΄ν„°λŠ” 주둜 ν…μŠ€νŠΈ ν˜•μ‹μΈ JSON을 μ‚¬μš©ν•˜λ―€λ‘œ 직렬화 및 νŒŒμ‹± μ˜€λ²„ν—€λ“œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μƒνƒœ 유무: RPCλŠ” μƒνƒœλ₯Ό κ°€μ§ˆ 수 μžˆμ§€λ§Œ, RESTλŠ” λ¬΄μƒνƒœμž…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•˜λŠ”μ§€ 여뢀에 따라 선택할 수 μžˆμŠ΅λ‹ˆλ‹€. ν‘œμ€€ν™”λœ ν”„λ‘œν† μ½œ: RPCλŠ” ν”„λ ˆμž„μ›Œν¬μ— 따라 λ‹€λ₯Έ ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, RESTλŠ” HTTPλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ ν‘œμ€€ν™”λœ ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.