Skip to content

Latest commit

Β 

History

History
165 lines (117 loc) Β· 8.92 KB

Process&Thread.md

File metadata and controls

165 lines (117 loc) Β· 8.92 KB

Process & Thread

Process

Thread

μž‘μ„±μž : μ „μ°¬λ―Ό

ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ 차이 (Process vs Thread)

ν”„λ‘œκ·Έλž¨(Program) μ΄λž€?

μ–΄λ–€ μž‘μ—…μ„ μœ„ν•΄ μ‹€ν–‰ν•  수 μžˆλŠ” 파일

ν”„λ‘œμ„ΈμŠ€(Process)λž€?

  • μ»΄ν“¨ν„°μ—μ„œ μ—°μ†μ μœΌλ‘œ μ‹€ν–‰λ˜κ³  μžˆλŠ” 컴퓨터 ν”„λ‘œκ·Έλž¨
  • λ©”λͺ¨λ¦¬μ— μ˜¬λΌμ™€ μ‹€ν–‰λ˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨μ˜ μΈμŠ€ν„΄μŠ€(독립적인 개체)
  • μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° μ‹œμŠ€ν…œ μžμ›μ„ ν• λ‹Ήλ°›λŠ” μž‘μ—…μ˜ λ‹¨μœ„
  • 즉, 동적인 κ°œλ…μœΌλ‘œλŠ” μ‹€ν–‰λœ ν”„λ‘œκ·Έλž¨μ„ μ˜λ―Έν•œλ‹€.

ν• λ‹Ήλ°›λŠ” μ‹œμŠ€ν…œ μžμ›μ˜ 예

  • CPU μ‹œκ°„
  • 운영되기 μœ„ν•΄ ν•„μš”ν•œ μ£Όμ†Œ 곡간
  • Code, Data, Stack, Heap의 ꡬ쑰둜 λ˜μ–΄μžˆλŠ” λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­
    • CodeλŠ” μ‹€ν–‰ λͺ…령을 ν¬ν•¨ν•˜λŠ” μ½”λ“œλ“€
    • Static은 λ³€μˆ˜ ν˜Ήμ€ Global λ³€μˆ˜
    • Heap은 동적 λ©”λͺ¨λ¦¬ μ˜μ—­
    • Stack은 μ§€μ—­λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ κ°’ λ“± μΌμ‹œμ μΈ 데이터

Process

  • ν”„λ‘œμ„ΈμŠ€λŠ” 각각 λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­(Code, Data, Stack, Heap)을 ν• λ‹Ήλ°›λŠ”λ‹€.
  • 기본적으둜 ν”„λ‘œμ„ΈμŠ€λ‹Ή μ΅œμ†Œ1개의 μŠ€λ ˆλ“œ(λ©”μΈμŠ€λ ˆλ“œ)λ₯Ό 가지고 μžˆλ‹€.
  • 각 ν”„λ‘œμ„ΈμŠ€λŠ” λ³„λ„μ˜ μ£Όμ†Œ κ³΅κ°„μ—μ„œ μ‹€ν–‰λ˜λ©°, ν•œ ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ³€μˆ˜λ‚˜ μžλ£Œκ΅¬μ‘°μ— μ ‘κ·Ό ν•  수 μ—†λ‹€.
  • ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ— μ ‘κ·Όν•˜λ €λ©΄ ν”„λ‘œμ„ΈμŠ€κ°„μ˜ 톡신을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • Ex, νŒŒμ΄ν”„, 파일, μ†ŒμΌ“ 등을 μ΄μš©ν•œ 톡신 방법 이용

μŠ€λ ˆλ“œ(Thread)λž€?

  • ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” μ—¬λŸ¬ νλ¦„μ˜ λ‹¨μœ„
  • ν”„λ‘œμ„ΈμŠ€μ˜ νŠΉμ •ν•œ μˆ˜ν–‰ 경둜
  • ν”„λ‘œμ„ΈμŠ€κ°€ 할당받은 μžμ›μ„ μ΄μš©ν•˜λŠ” μ‹€ν–‰μ˜ λ‹¨μœ„

Thread

  • μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ 각각 Stack만 λ”°λ‘œ ν• λ‹Ήλ°›κ³  Code, Data, Heap μ˜μ—­μ€ κ³΅μœ ν•œλ‹€.
  • μŠ€λ ˆλ“œλŠ” ν•œ ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ λ™μž‘λ˜λŠ” μ—¬λŸ¬ μ‹€ν–‰μ˜ νλ¦„μœΌλ‘œ, ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ μ£Όμ†Œ κ³΅κ°„μ΄λ‚˜ μžμ›λ“€(Heap 곡간 λ“±)을 같은 ν”„λ‘œμ„ΈμŠ€ 내에 μŠ€λ ˆλ“œλΌλ¦¬ κ³΅μœ ν•˜λ©΄μ„œ μ‹€ν–‰λœλ‹€.
  • 같은 ν”„λ‘œμ„ΈμŠ€ μ•ˆμ— μžˆλŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œλ“€μ€ 같은 νž™ 곡간을 κ³΅μœ ν•œλ‹€. λ°˜λ©΄μ— ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬μ— 직접 μ ‘κ·Όν•  수 μ—†λ‹€.
  • 각각의 μŠ€λ ˆλ“œλŠ” λ³„λ„μ˜ λ ˆμ§€μŠ€ν„°μ™€ μŠ€νƒμ„ κ°–κ³  μžˆμ§€λ§Œ, νž™ λ©”λͺ¨λ¦¬λŠ” μ„œλ‘œ 읽고 μ“Έ 수 μžˆλ‹€.
  • ν•œ μŠ€λ ˆλ“œκ°€ ν”„λ‘œμ„ΈμŠ€ μžμ›μ„ λ³€κ²½ν•˜λ©΄, λ‹€λ₯Έ 이웃 μŠ€λ ˆλ“œλ„ κ·Έ λ³€κ²½ κ²°κ³Όλ₯Ό μ¦‰μ‹œ λ³Ό 수 μžˆλ‹€.

μžλ°” μŠ€λ ˆλ“œ (Java Thread)λž€?

  • 일반 μŠ€λ ˆλ“œμ™€ 거의 차이가 μ—†μœΌλ©°, JVMκ°€ 운영체제의 역할을 ν•œλ‹€.
  • μžλ°”μ—λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šκ³  μŠ€λ ˆλ“œλ§Œ μ‘΄μž¬ν•˜λ©°, μžλ°” μŠ€λ ˆλ“œλŠ” JVM에 μ˜ν•΄ μŠ€μΌ€μ€„λ˜λŠ” μ‹€ν–‰ λ‹¨μœ„ μ½”λ“œ 블둝이닀.
  • μžλ°”μ—μ„œ μŠ€λ ˆλ“œ μŠ€μΌ€μ€„λ§μ€ μ „μ μœΌλ‘œ JVM에 μ˜ν•΄ 이루어진닀.
  • μ•„λž˜μ™€ 같은 μŠ€λ ˆλ“œμ™€ κ΄€λ ¨λœ λ§Žμ€ 정보듀도 JVM이 관리 ν•œλ‹€.
    • μŠ€λ ˆλ“œκ°€ λͺ‡κ°œ μ‘΄μž¬ν•˜λŠ”μ§€
    • μŠ€λ ˆλ“œλ‘œ μ‹€ν–‰λ˜λŠ” ν”„λ‘œκ·Έλž¨ μ½”λ“œμ˜ λ©”λͺ¨λ¦¬ μœ„μΉ˜λŠ” 어디인지
    • μŠ€λ ˆλ“œμ˜ μƒνƒœλŠ” 무엇인지
    • μŠ€λ ˆλ“œ μš°μ„ μˆœμœ„λŠ” μ–Όλ§ˆμΈμ§€
  • 즉, κ°œλ°œμžλŠ” μžλ°” μŠ€λ ˆλ“œλ‘œ μž‘λ™ν•  μŠ€λ ˆλ“œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³ , μŠ€λ ˆλ“œ μ½”λ“œκ°€ 생λͺ…을 가지고 싀행을 μ‹œμž‘ν•˜λ„λ‘ JVM에 μš”μ²­ν•˜λŠ” 일 뿐이닀.

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œμ˜ 차이

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

Multi_Process

λ©€ν‹° ν”„λ‘œμ„Έμ‹±μ΄λž€

  • ν•˜λ‚˜μ˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬κ°œμ˜ ν”„λ‘œμ„ΈμŠ€λ‘œ κ΅¬μ„±ν•˜μ—¬ 각 ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ„λ‘ ν•˜λŠ” 것이닀.

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

  • μ—¬λŸ¬κ°œμ˜ μžμ‹ ν”„λ‘œμ„ΈμŠ€ 쀑 ν•˜λ‚˜μ— λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ κ·Έ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ§Œ μ£½λŠ” 것 μ΄μƒμœΌλ‘œ λ‹€λ₯Έ 영ν–₯이 ν™•μ‚°λ˜μ§€ μ•ŠλŠ”λ‹€.

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

  • Context Switchingμ—μ„œμ˜ μ˜€λ²„ν—€λ“œ

    • Context Switching κ³Όμ •μ—μ„œ 캐쉬 λ©”λͺ¨λ¦¬ μ΄ˆκΈ°ν™” λ“± 무거운 μž‘μ—…μ΄ μ§„ν–‰λ˜κ³  λ§Žμ€ μ‹œκ°„μ΄ μ†Œλͺ¨λ˜λŠ” λ“±μ˜ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜κ²Œ λœλ‹€.
    • ν”„λ‘œμ„ΈμŠ€λŠ” 각각의 λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήλ°›μ•˜κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—μ„œ κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬κ°€ μ—†μ–΄, Context Switchingκ°€ λ°œμƒν•˜λ©΄ 캐쉬에 μžˆλŠ” λͺ¨λ“  데이터λ₯Ό λͺ¨λ‘ λ¦¬μ…‹ν•˜κ³  λ‹€μ‹œ 캐쉬 정보λ₯Ό λΆˆλŸ¬μ™€μ•Ό ν•œλ‹€.
  • ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ˜ μ–΄λ ΅κ³  λ³΅μž‘ν•œ 톡신기법(IPC)

    • ν”„λ‘œμ„ΈμŠ€λŠ” 각각의 λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ ν• λ‹Ήλ°›μ•˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ— μ†ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ“€ μ‚¬μ΄μ˜ λ³€μˆ˜λ₯Ό κ³΅μœ ν•  수 μ—†λ‹€.
  • Context Switchingλž€?

    • CPUμ—μ„œ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό λŒμ•„κ°€λ©΄μ„œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ”λ° 이 과정을 Context Switching라 ν•œλ‹€.
    • ꡬ체적으둜, λ™μž‘ 쀑인 ν”„λ‘œμ„ΈμŠ€κ°€ λŒ€κΈ°λ₯Ό ν•˜λ©΄μ„œ ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœ(Context)λ₯Ό λ³΄κ΄€ν•˜κ³ , λŒ€κΈ°ν•˜κ³ μžˆλ˜ λ‹€μŒ μˆœμ„œμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μž‘ν•˜λ©΄μ„œ 이전에 λ³΄κ΄€ν–ˆλ˜ ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœλ₯Ό λ³΅κ΅¬ν•˜λŠ” μž‘μ—…μ„ λ§ν•œλ‹€.

Context_Switching
μ—¬κΈ° λ™μ‹œμ— μ‹€ν–‰μ‹œν‚€κ³  싢은 ν”„λ‘œμ„ΈμŠ€ λ‘κ°œκ°€ μžˆλ‹€. 이거λ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œ 짧은 ν…€μœΌλ‘œ λ°˜λ³΅λ˜μ–΄μ•Ό ν•œλ‹€.
λ¨Όμ € ν”„λ‘œμ„ΈμŠ€ 1이 μ‹€ν–‰μƒνƒœμ— 있고 CPU에 μ μž¬λ˜μ–΄ μžˆλ‹€. μ΄λ•Œ ν”„λ‘œμ„ΈμŠ€2λŠ” μ€€λΉ„μƒνƒœμ— μžˆμŠ΅λ‹ˆλ‹€.
그리고 ν”„λ‘œμ„ΈμŠ€2λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν”„λ‘œμ„ΈμŠ€1이 μ€€λΉ„μƒνƒœλ‘œ λ‚΄λ €κ°€κ³  ν”„λ‘œμ„ΈμŠ€2κ°€ CPU에 μ μž¬κ°€ 되고,
λ‹€μ‹œ 1둜 μ „ν™˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” 2κ°€ μ€€λΉ„μƒνƒœλ‘œ λ‚΄λ €κ°€κ³  1이 CPU에 μ˜¬λΌμ™€μ•Ό ν•œλ‹€. 이게 μ»¨ν…ŒμŠ€νŠΈ μŠ€μœ„μΉ­μž…λ‹ˆλ‹€.

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

Multi_Thread

λ©€ν‹° μŠ€λ ˆλ”©μ΄λž€

  • ν•˜λ‚˜μ˜ μ‘μš©ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œλ‘œ κ΅¬μ„±ν•˜κ³  각 μŠ€λ ˆλ“œλ‘œ ν•˜μ—¬κΈˆ ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λ„λ‘ ν•˜λŠ”κ²ƒ 이닀.
  • μœˆλ„μš°, λ¦¬λˆ…μŠ€ λ“± λ§Žμ€ μš΄μ˜μ²΄μ œλ“€μ΄ λ©€ν‹° ν”„λ‘œμ„Έμ‹±μ„ μ§€μ›ν•˜κ³  μžˆμ§€λ§Œ λ©€ν‹° μŠ€λ ˆλ”©μ„ 기본으둜 ν•˜κ³  μžˆλ‹€.
  • μ›Ή μ„œλ²„λŠ” λŒ€ν‘œμ μΈ λ©€ν‹° μŠ€λ ˆλ“œ μ‘μš© ν”„λ‘œκ·Έλž¨μ΄λ‹€.

λ©€ν‹°μŠ€λ ˆλ“œ μž₯점

  • μ‹œμŠ€ν…œ μžμ› μ†Œλͺ¨ κ°μ†Œ (μžμ›μ˜ νš¨μœ¨μ„± μ¦λŒ€)
    • ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒμ„±ν•˜μ—¬ μžμ›μ„ ν• λ‹Ήν•˜λŠ” μ‹œμŠ€ν…œ 콜이 쀄어듀어 μžμ›μ„ 효율적으둜 관리할 수 μžˆλ‹€.
  • μ‹œμŠ€ν…œ μ²˜λ¦¬λŸ‰ 증가 (처리 λΉ„μš© κ°μ†Œ)
    • μŠ€λ ˆλ“œ κ°„ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” 것이 간단해지고 μ‹œμŠ€ν…œ μžμ› μ†Œλͺ¨κ°€ μ€„μ–΄λ“€κ²Œ λœλ‹€.
    • μŠ€λ ˆλ“œ μ‚¬μ΄μ˜ μž‘μ—…λŸ‰μ΄ μž‘μ•„ Context Switching이 λΉ λ₯΄λ‹€.
  • κ°„λ‹¨ν•œ 톡신 λ°©λ²•μœΌλ‘œ μΈν•œ ν”„λ‘œκ·Έλž¨ 응닡 μ‹œκ°„ 단좕
    • μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ Stack μ˜μ—­μ„ μ œμ™Έν•œ λͺ¨λ“  λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— ν†΅μ‹ μ˜ 뢀담이 적닀

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

  • 주의 κΉŠμ€ 섀계가 ν•„μš”ν•˜λ‹€.
  • 디버깅이 κΉŒλ‹€λ‘­λ‹€.
  • 단일 ν”„λ‘œμ„ΈμŠ€ μ‹œμŠ€ν…œμ˜ 경우 효과λ₯Ό κΈ°λŒ€ν•˜κΈ° μ–΄λ ΅λ‹€.
  • λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μŠ€λ ˆλ“œλ₯Ό μ œμ–΄ν•  수 μ—†λ‹€. (ν”„λ‘œμ„ΈμŠ€ λ°–μ—μ„œ μŠ€λ ˆλ“œλ₯Ό 각각 μ œμ–΄ν•  수 μ—†λ‹€.)
  • λ©€ν‹° μŠ€λ ˆλ“œμ˜ 경우 μžμ› 곡유의 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€, (동기화 문제)
  • ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ— λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ 전체 ν”„λ‘œμ„ΈμŠ€κ°€ 영ν–₯을 λ°›λŠ”λ‹€.

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ ? λ©€ν‹° μŠ€λ ˆλ“œ ? 무엇을 μ‚¬μš©ν•΄μ•Ό ν•˜λ‚˜

explore

μ˜ˆμ „μ— 인터넷 μ΅μŠ€ν”Œλ‘œλŸ¬λ₯Ό μ‚¬μš©ν•˜λ‹€κ°€ 이런 창을 κ²½ν—˜ν•΄ λ³Έ 적이 μžˆμ„ 것이닀.
이것은 λ©€ν‹° μŠ€λ ˆλ“œλ₯Ό μ΄μš©ν–ˆκΈ° λ•Œλ¬ΈμΈλ° κΈ΄λ°€ν•˜κ²Œ μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ— ν•œ μŠ€λ ˆλ“œ, ν•œ 탭에 λ¬Έμ œκ°€ 생기면,
전체 ν”„λ‘œμ„ΈμŠ€μ— 영ν–₯을 λ―ΈμΉ˜λŠ” 것이닀.
λ°˜λ©΄μ— ꡬ글 크둬은 λ‹€μ†Œ λΉ„νš¨μœ¨μ μΈ 뢀뢄이 μžˆμ„μˆ˜ μžˆμ§€λ§Œ λ©€ν‹° ν”„λ‘œμ„ΈμŠ€λ₯Ό μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ— λ©€ν‹°νƒ­ κ°„μ˜ 영ν–₯을 덜 λ°›λŠ”λ‹€.
λ‹€ μž₯단점이 있기 λ§ˆλ ¨μ΄λ‹€.

Multi-Core (λ©€ν‹°μ½”μ–΄)

μ•žμ„œ μ†Œκ°œν•œ λ©€ν‹°ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹°μŠ€λ ˆλ“œλŠ” 'μ²˜λ¦¬λ°©μ‹'의 일쒅이기 λ•Œλ¬Έμ— μ†Œν”„νŠΈμ›¨μ–΄μ˜ 뢄야에 가깝고
λ©€ν‹°μ½”μ–΄λŠ” μ‘°κΈˆλ” ν•˜λ“œμ›¨μ–΄ 츑면에 가깝닀 λ³Ό 수 μžˆλ‹€. 멀티코어와 κ΄€λ ¨λœ ν‚€μ›Œλ“œλŠ” λ™μ‹œμ„±κ³Ό λ³‘λ ¬μ²˜λ¦¬μ΄λ‹€.

Multi_Core


  • λ™μ‹œμ„± : ν•˜λ‚˜μ˜ μ½”μ–΄μ—μ„œ ν•˜λ‚˜ μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€(μŠ€λ ˆλ“œ)κ°€ λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ μ§„ν–‰λ˜μ§€λ§Œ λ™μ‹œμ— μ§„ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” 것
  • λ³‘λ ¬μ²˜λ¦¬ : λ‘˜ μ΄μƒμ˜ μ½”μ–΄μ—μ„œ λ™μ‹œμ— ν•˜λ‚˜ μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€(μŠ€λ ˆλ“œ)κ°€ ν•œκΊΌλ²ˆμ— μ§„ν–‰λ˜λŠ” 것