λ©€ν‹° ν”„λ‘œμ„ΈμŠ€


λ©€ν‹° ν”„λ‘œμ„ΈμŠ€(Multi Process)λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€λ‘œ λ‚˜λˆ„μ–΄ λ™μ‹œμ— μ‹€ν–‰ν•˜λŠ” 방식이닀.

μ•žμ—μ„œ μ„€λͺ…ν–ˆλ“―이 ν”„λ‘œμ„ΈμŠ€λŠ” 각각 λ…λ¦½λœ λ©”λͺ¨λ¦¬ 곡간(Address Space)을 κ°€μ§„λ‹€. λ”°λΌμ„œ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— μ‹€ν–‰λ˜λ”λΌλ„ μ„œλ‘œμ˜ λ©”λͺ¨λ¦¬μ— 직접 μ ‘κ·Όν•  수 μ—†λ‹€.

예λ₯Ό λ“€μ–΄ μ›Ή λΈŒλΌμš°μ €λ₯Ό μƒκ°ν•΄λ³΄μž.

크둬(Chrome)은 각 탭을 ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ‘œ μ‹€ν–‰ν•œλ‹€. μ–΄λ–€ νƒ­μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•΄λ„ λ‹€λ₯Έ 탭이 μ’…λ£Œλ˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ°”λ‘œ 이 λ•Œλ¬Έμ΄λ‹€.

μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§₯λ„λ‚ λ“œλ₯Ό λΉ„μœ λ‘œ λ“€μ–΄λ³΄μž
ν”„λ‘œμ„ΈμŠ€κ°€ λ§₯λ„λ‚ λ“œ κ°€κ²Œ ν•˜λ‚˜λΌλ©΄, λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” λ§₯λ„λ‚ λ“œ 지점을 μ—¬λŸ¬ 개 μ—¬λŠ” 것과 λΉ„μŠ·ν•˜λ‹€.

강남점, ν™λŒ€μ , μ‹ μ΄Œμ μ²˜λŸΌ
각 κ°€κ²ŒλŠ” μ™„μ „νžˆ λ…λ¦½λœ κ³΅κ°„μ—μ„œ μš΄μ˜λœλ‹€.

λ§Œμ•½ ν™λŒ€μ μ—μ„œ λ¬Έμ œκ°€ 생겨 문을 닫더라도 κ°•λ‚¨μ μ΄λ‚˜ μ‹ μ΄Œμ μ€ μ •μƒμ μœΌλ‘œ μš΄μ˜λœλ‹€.

이처럼 λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” 각 ν”„λ‘œμ„ΈμŠ€κ°€ μ„œλ‘œ λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μ•ˆμ •μ„±μ΄ λ†’λ‹€.

ν•˜μ§€λ§Œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ ꡬ쑰가 항상 쒋은 κ²ƒλ§Œμ€ μ•„λ‹ˆλ‹€.

ν”„λ‘œμ„ΈμŠ€λŠ” μ„œλ‘œ μ™„μ „νžˆ λ…λ¦½λœ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒˆλ‘œ μƒμ„±ν•˜λŠ” λ°μ—λŠ” 비ꡐ적 λ§Žμ€ λΉ„μš©μ΄ λ“€μ–΄κ°„λ‹€.
λ˜ν•œ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜λ €λ©΄ μš΄μ˜μ²΄μ œκ°€ CPUλ₯Ό λ²ˆκ°ˆμ•„κ°€λ©° ν• λ‹Ήν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

μ—¬κΈ°μ„œ λ“±μž₯ν•˜λŠ” κ°œλ…μ΄ λ°”λ‘œ Context Switching이닀.

Context Switching은 CPUκ°€ ν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λ‹€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ‘œ μž‘μ—…μ„ λ°”κΎΈλŠ” 과정을 λ§ν•œλ‹€.

쑰금 더 μ‰½κ²Œ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ λ‹€μ‹œ λ§₯λ„λ‚ λ“œ μ˜ˆμ‹œλ₯Ό λ“€μ–΄λ³΄μž.

μ•„κΉŒ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ₯Ό μ—¬λŸ¬ 개의 λ§₯λ„λ‚ λ“œ 지점이라고 μ„€λͺ…ν–ˆλ‹€. μ΄λ²ˆμ—λŠ” 직원 ν•œ λͺ…이 μ—¬λŸ¬ μ†λ‹˜μ„ μƒλŒ€ν•˜λŠ” 상황을 μƒκ°ν•΄λ³΄μž.

μ†λ‹˜ A μ£Όλ¬Έ λ°›κΈ° β†’ 잠깐 멈좀
μ†λ‹˜ B μ£Όλ¬Έ λ°›κΈ° β†’ 잠깐 멈좀
μ†λ‹˜ C 계산 β†’ λ‹€μ‹œ A 햄버거 λ§Œλ“€κΈ°

μ΄λ ‡κ²Œ 직원이 계속 일을 λ°”κΏ”κ°€λ©° μ²˜λ¦¬ν•˜λ©΄ κ²‰μœΌλ‘œ λ³΄κΈ°μ—λŠ” μ—¬λŸ¬ μ†λ‹˜μ„ λ™μ‹œμ— μ‘λŒ€ν•˜λŠ” κ²ƒμ²˜λŸΌ 보인닀.

ν•˜μ§€λ§Œ 일을 λ°”κΏ€ λ•Œλ§ˆλ‹€ 직원은 이전 주문이 μ–΄λ””κΉŒμ§€ μ§„ν–‰λλŠ”μ§€ κΈ°μ–΅ν•΄μ•Ό ν•˜κ³ , λ‹€μŒ μ£Όλ¬Έ λ‚΄μš©μ„ 확인해야 ν•˜κ³ , ν•„μš”ν•œ 재료λ₯Ό λ‹€μ‹œ 확인해야 ν•œλ‹€.

이처럼 μž‘μ—…μ„ λ°”κΏ€ λ•Œλ§ˆλ‹€ μ€€λΉ„ 과정이 ν•„μš”ν•œ 것이 λ°”λ‘œ Context Switching이닀.

μš΄μ˜μ²΄μ œμ—μ„œλ„ λΉ„μŠ·ν•˜λ‹€.

CPUκ°€ ν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λ‹€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ‘œ λ°”λ€” λ•ŒλŠ” CPU λ ˆμ§€μŠ€ν„° μƒνƒœ μ €μž₯, ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μœ„μΉ˜ μ €μž₯, λ‹€μŒ ν”„λ‘œμ„ΈμŠ€ μƒνƒœ λΆˆλŸ¬μ˜€κΈ°μ™€ 같은 μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€.

이 과정이 λ°”λ‘œ Context Switching λΉ„μš©μ΄λ‹€.

κ·Έλž˜μ„œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” μ•ˆμ •μ„±μ΄ 높은 λŒ€μ‹  μ΄λŸ¬ν•œ μ „ν™˜ λΉ„μš©μ΄ λ°œμƒν•œλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ vs λ©€ν‹° ν”„λ‘œμ„Έμ„œ

발음이 λΉ„μŠ·ν•΄μ„œ λ‘˜μ΄ κ·Έλƒ₯ μ–΅μ–‘ 차이라고 생각할 수 μžˆλŠ”λ° μ—„μ—°νžˆ λ‹€λ₯΄λ‹€.
ν”„λ‘œμ„ΈμŠ€(process)λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ μƒνƒœλ₯Ό λ§ν•˜κ³ , ν”„λ‘œμ„Έμ„œ(processer)λŠ” CPU μ½”μ–΄λ₯Ό μΌμ»«λŠ”λ‹€.
λ”°λΌμ„œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œ μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λŠ” 것을 μ˜λ―Έν•˜κ³ , λ©€ν‹° ν”„λ‘œμ„Έμ„œλŠ” μ—¬λŸ¬ 개의 CPU μ½”μ–΄κ°€ ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμ—μ„œ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 것을 μ˜λ―Έν•œλ‹€.


개발자의 κ΄€μ μ—μ„œ λ³Έ Multi Process

이둠적인 μ„€λͺ…은 μΆ©λΆ„νžˆ ν–ˆμœΌλ‹ˆ 이제 개발자의 κ΄€μ μ—μ„œ ν•œ 번 μƒκ°ν•΄λ³΄μž.

β€œκ·Έλž˜μ„œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€κ°€ μš°λ¦¬κ°€ μ½”λ”©ν•˜λŠ” 데 μ‹€μ œλ‘œ 도움이 λ˜λŠ” 걸까?”

γ…‡γ…‡λ‹Ήμ—°ν•˜λ‹€. 특히 CPU 연산이 λ§Žμ€ μž‘μ—…μ—μ„œλŠ” λ©€ν‹° ν”„λ‘œμ„ΈμŠ€κ°€ 큰 도움이 λœλ‹€.

예λ₯Ό λ“€μ–΄ Pythonμ—μ„œλŠ” multiprocessingμ΄λΌλŠ” λͺ¨λ“ˆμ„ μ΄μš©ν•΄ μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성할 수 μžˆλ‹€.

μ½”λ“œλ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ³΄μž.

import multiprocessing

def hello():
    print("ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰")

if __name__ == "__main__":
    p1 = multiprocessing.Process(target=hello)
    p2 = multiprocessing.Process(target=hello)

    p1.start()
    p2.start()

    p1.join()
    p2.join()

이 μ½”λ“œλŠ” hello()λΌλŠ” ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜λŠ” 두 개의 ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•œλ‹€.

start()λ₯Ό ν˜ΈμΆœν•˜λ©΄ μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λ˜λ©΄μ„œ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³ , join()은 ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€κ°€ 끝날 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” 역할을 ν•œλ‹€.

즉 ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨ μ•ˆμ—μ„œ μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” ꡬ쑰가 λ˜λŠ” 것이닀.

μ‹€μ œ κ°œλ°œμ—μ„œλŠ” λŒ€λŸ‰μ˜ 데이터 처리, 이미지 처리, λ¨Έμ‹ λŸ¬λ‹ ν•™μŠ΅, 수치 계산과 같은 CPU μ—°μ‚° μž‘μ—…κ³Ό 같은 μƒν™©μ—μ„œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.

예λ₯Ό λ“€μ–΄ 이미지 1000μž₯을 μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μž.

ν”„λ‘œμ„ΈμŠ€λ₯Ό ν•˜λ‚˜λ§Œ μ‚¬μš©ν•˜λ©΄ 이미지λ₯Ό ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.

ν•˜μ§€λ§Œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄
ν”„λ‘œμ„ΈμŠ€ 1 β†’ 이미지 1~250 처리
ν”„λ‘œμ„ΈμŠ€ 2 β†’ 이미지 251~500 처리
ν”„λ‘œμ„ΈμŠ€ 3 β†’ 이미지 501~750 처리
ν”„λ‘œμ„ΈμŠ€ 4 β†’ 이미지 751~1000 처리

이처럼 ν•˜λ‚˜μ˜ 큰 μž‘μ—…μ„ μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€λ‘œ λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•  수 μžˆλ‹€.

μ΄λ ‡κ²Œ 되면 각 ν”„λ‘œμ„ΈμŠ€κ°€ μ„œλ‘œ λ‹€λ₯Έ CPU μ½”μ–΄μ—μ„œ λ™μ‹œμ— μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있기 λ•Œλ¬Έμ— 전체 처리 속도λ₯Ό 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.

즉 λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” λ‹¨μˆœνžˆ ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ 개 μ‹€ν–‰ν•˜λŠ” κ°œλ…μ΄ μ•„λ‹ˆλΌ, 큰 μž‘μ—…μ„ μ—¬λŸ¬ 개의 μž‘μ€ μž‘μ—…μœΌλ‘œ λ‚˜λˆ„μ–΄ λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 방법이라고 λ³Ό 수 μžˆλ‹€.

특히 데이터 처리, μ˜μƒ 처리, λ¨Έμ‹ λŸ¬λ‹ ν•™μŠ΅μ²˜λŸΌ CPU 연산이 λ§Žμ€ μž‘μ—…μ—μ„œλŠ” μ΄λŸ¬ν•œ ꡬ쑰가 ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚€λŠ” μ€‘μš”ν•œ μš”μ†Œκ°€ λœλ‹€.


λ©€ν‹° μŠ€λ ˆλ“œ


λ©€ν‹° μŠ€λ ˆλ“œ(Multi Thread)λŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œλ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜λŠ” 방식이닀. μ•žμ—μ„œ μ„€λͺ…ν–ˆλ“―이 μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ 할당받은 μžμ›μ„ μ΄μš©ν•˜λŠ” μ‹€ν–‰ νλ¦„μ˜ λ‹¨μœ„μ΄λ‹€.

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€κ°€ μ—¬λŸ¬ 개의 κ°€κ²Œλ₯Ό μš΄μ˜ν•˜λŠ” κ΅¬μ‘°μ˜€λ‹€λ©΄ λ©€ν‹° μŠ€λ ˆλ“œλŠ” κ°€κ²ŒλŠ” ν•˜λ‚˜μ§€λ§Œ 직원이 μ—¬λŸ¬ λͺ…인 ꡬ쑰라고 μƒκ°ν•˜λ©΄ λœλ‹€.

λ§₯λ„λ‚ λ“œ μ˜ˆμ‹œλ‘œ λ‹€μ‹œ μƒκ°ν•΄λ³΄μž.

직원이 ν•œ λͺ…뿐이라면

μ†λ‹˜ A μ£Όλ¬Έ λ°›κΈ° β†’ 햄버거 λ§Œλ“€κΈ° β†’ κ°μžνŠ€κΉ€ νŠ€κΈ°κΈ° β†’ 계산 β†’ μ†λ‹˜ B μ£Όλ¬Έ λ°›κΈ°

μ΄λ ‡κ²Œ λͺ¨λ“  일을 μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.

ν•˜μ§€λ§Œ 직원이 μ—¬λŸ¬ λͺ…이라면 상황이 달라진닀.

직원 1 β†’ μ£Όλ¬Έ λ°›κΈ° 직원 2 β†’ 햄버거 λ§Œλ“€κΈ° 직원 3 β†’ 계산

μ΄λ ‡κ²Œ 같은 κ°€κ²Œ μ•ˆμ—μ„œ μ—¬λŸ¬ μž‘μ—…μ΄ λ™μ‹œμ— 진행될 수 μžˆλ‹€.

이것이 λ°”λ‘œ λ©€ν‹° μŠ€λ ˆλ“œ ꡬ쑰이닀.

λ©€ν‹° μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— Code, Data, Heap μ˜μ—­μ„ μ„œλ‘œ κ³΅μœ ν•œλ‹€.

κ·Έλž˜μ„œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” 과정이 λΉ λ₯΄κ³  ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒˆλ‘œ μƒμ„±ν•˜λŠ” 것보닀 훨씬 가볍닀.

λ©€ν‹° μŠ€λ ˆλ“œμ˜ νŠΉμ§•

β€’	μŠ€λ ˆλ“œ 생성 λΉ„μš©μ΄ μž‘λ‹€
β€’	λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 적닀
β€’	데이터 κ³΅μœ κ°€ 쉽닀
β€’	ν”„λ‘œκ·Έλž¨ 응닡성이 μ’‹μ•„μ§„λ‹€

예λ₯Ό λ“€μ–΄ μ›Ή μ„œλ²„λ₯Ό μƒκ°ν•΄λ³΄μž.

μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μ‹œμ— μ ‘μ†ν•˜λ©΄ 각 μš”μ²­μ„ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ μ²˜λ¦¬ν•  수 μžˆλ‹€.

μš”μ²­ 1 β†’ Thread 1
μš”μ²­ 2 β†’ Thread 2
μš”μ²­ 3 β†’ Thread 3


μ΄λ ‡κ²Œ μ—¬λŸ¬ μš”μ²­μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 있기 λ•Œλ¬Έμ— μ›Ή μ„œλ²„μ˜ 처리 μ„±λŠ₯이 크게 ν–₯μƒλœλ‹€.

ν•˜μ§€λ§Œ λ©€ν‹° μŠ€λ ˆλ“œ ꡬ쑰에도 단점이 μ‘΄μž¬ν•œλ‹€.

μŠ€λ ˆλ“œλŠ” 같은 ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 같은 데이터λ₯Ό μˆ˜μ •ν•˜λ©΄ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

μ΄λ•Œ λ“±μž₯ν•˜λŠ” κ°œλ…μ΄ λ°”λ‘œ Race Condition(경쟁 μƒνƒœ)이닀.


Race Condition


Race Condition은 μ—¬λŸ¬ μ‹€ν–‰ 흐름이 같은 데이터λ₯Ό λ™μ‹œμ— μˆ˜μ •ν•˜λ € ν•  λ•Œ λ°œμƒν•˜λŠ” 문제λ₯Ό λ§ν•œλ‹€.

이름 κ·ΈλŒ€λ‘œ λˆ„κ°€ λ¨Όμ € μ‹€ν–‰λ˜λŠλƒμ— 따라 κ²°κ³Όκ°€ λ‹¬λΌμ§€λŠ” 상황이닀.

λ‹€μ‹œ λ§₯λ„λ‚ λ“œ μ˜ˆμ‹œλ‘œ μƒκ°ν•΄λ³΄μž.

직원 두 λͺ…이 같은 μ£Όλ¬Έμ„œλ₯Ό 보고 μžˆλ‹€κ³  κ°€μ •ν•˜μž. ν˜„μž¬ μ£Όλ¬Έμ„œμ—λŠ” μ΄λ ‡κ²Œ μ ν˜€ μžˆλ‹€.

햄버거 재고 : 10개

μ†λ‹˜ 두 λͺ…이 λ™μ‹œμ— 햄버거λ₯Ό μ£Όλ¬Έν•œλ‹€.

직원 A β†’ 재고 확인 β†’ 10개
직원 B β†’ 재고 확인 β†’ 10개

직원 A β†’ 1개 판맀 β†’ 재고 9개
직원 B β†’ 1개 판맀 β†’ 재고 9개

ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” 햄버거가 2개 νŒ”λ ΈκΈ° λ•Œλ¬Έμ— μž¬κ³ λŠ” 8κ°œκ°€ λ˜μ–΄μ•Ό ν•œλ‹€.

이처럼 μ—¬λŸ¬ μ‹€ν–‰ 흐름이 λ™μ‹œμ— 같은 데이터λ₯Ό μˆ˜μ •ν•˜λ©΄μ„œ 데이터가 κΌ¬μ΄λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

이것이 λ°”λ‘œ Race Condition이닀.

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” 동기화(Synchronization) 기법을 μ‚¬μš©ν•œλ‹€.

λŒ€ν‘œμ μΈ λ°©λ²•μœΌλ‘œλŠ” Mutex, Semaphore, Lock등이 μ‘΄μž¬ν•œλ‹€.

μ΄λŸ¬ν•œ 기법듀은 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μžμ›μ— μ ‘κ·Όν•˜λ„λ‘ μ œν•œν•˜μ—¬ 데이터 μΆ©λŒμ„ λ°©μ§€ν•˜λŠ” 역할을 ν•œλ‹€. 이에 λŒ€ν•΄μ„œλŠ” μΆ”ν›„ μžμ„Ένžˆ μ„€λͺ…을 해보겠닀.


정리


μ§€κΈˆκΉŒμ§€ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œμ˜ κ°œλ…μ„ μ‚΄νŽ΄λ³΄μ•˜λ‹€.

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ λ…λ¦½λœ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ•ˆμ •μ„±μ΄ λ†’μ§€λ§Œ ν”„λ‘œμ„ΈμŠ€ 생성 λΉ„μš©κ³Ό Context Switching λΉ„μš©μ΄ 크닀.

반면 λ©€ν‹° μŠ€λ ˆλ“œλŠ” 같은 ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— 더 λΉ λ₯΄κ³  효율적으둜 μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμ§€λ§Œ Race Conditionκ³Ό 같은 동기화 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

λ”°λΌμ„œ μ‹€μ œ μ‹œμŠ€ν…œμ—μ„œλŠ” ν”„λ‘œκ·Έλž¨μ˜ νŠΉμ„±κ³Ό λͺ©μ μ— 따라 λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό 적절히 μ„ νƒν•˜κ±°λ‚˜ 두 방식을 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” ꡬ쑰λ₯Ό μ‚¬μš©ν•œλ‹€.

μš°λ¦¬κ°€ 아무 생각 없이 λˆ„λ₯΄λŠ” λ²„νŠΌ ν•˜λ‚˜ λ’€μ—λŠ”, μˆ˜λ§Žμ€ ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 움직이고 μžˆλ‹€.

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: