ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Thread] Program, Process, Thread, Multi-Threadλž€? - ꡬ체적인 μž‘λ™ 방식에 λŒ€ν•œ 곡뢀 기둝
    개발/Java 2022. 4. 23. 17:35

    πŸ’‘Program, Process, Threadλž€?

     

     

    ν”„λ‘œκ·Έλž¨(Program)μ΄λž€,
    파일이 μ €μž₯ μž₯μΉ˜μ— μ €μž₯λ˜μ–΄ μžˆμ§€λ§Œ λ©”λͺ¨λ¦¬μ—λŠ” μ˜¬λΌκ°€ μžˆμ§€ μ•Šμ€ 정적인 μƒνƒœλ₯Ό λ§ν•œλ‹€.



    - λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€ μžˆμ§€ μ•Šμ€: μ•„직 μš΄μ˜μ²΄μ œκ°€ ν”„λ‘œκ·Έλž¨μ—κ²Œ 독립적인 λ©”λͺ¨λ¦¬ 곡간을 할당해주지 μ•Šμ•˜λ‹€λŠ” λœ»μ΄λ‹€. λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ€ μš΄μ˜μ²΄μ œκ°€ μ‹€ν–‰λ˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간을 ν• λ‹Ήν•΄ μ€˜μ•Ό 싀행될 수 μžˆλ‹€.

     

    - 정적인 μƒνƒœ: μ •μ (ιœηš„)μ΄λΌλŠ” 단어 κ·ΈλŒ€λ‘œ, 움직이지 μ•ŠλŠ” μƒνƒœλΌλŠ” λœ»μ΄λ‹€. ν•œ λ§ˆλ””λ‘œ 아직 μ‹€ν–‰λ˜μ§€ μ•Šκ³  κ°€λ§Œνžˆ μžˆλ‹€λŠ” λœ»μ΄λ‹€.

     

    즉, ν”„λ‘œκ·Έλž¨(Program)μ΄λΌλŠ” λ‹¨μ–΄λŠ” 아직 μ‹€ν–‰λ˜μ§€ μ•Šμ€ 파일 κ·Έ 자체, μ½”λ“œ 덩어리λ₯Ό κ°€λ¦¬ν‚€λŠ” 말이닀. 예λ₯Ό λ“€λ©΄, μœˆλ„μš°μ˜ *.exe νŒŒμΌμ΄λ‚˜ MacOS의 *.dmg 파일 λ“±λ“± μ‚¬μš©μžκ°€ λˆŒλŸ¬μ„œ μ‹€ν–‰ν•˜κΈ° μ „μ˜ νŒŒμΌμ„ λ§ν•œλ‹€.

     

    ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” μˆœκ°„ ν•΄λ‹Ή νŒŒμΌμ€ 컴퓨터 λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€κ²Œ 되고, 이 μƒνƒœλ₯Ό λ™μ (ε‹•ηš„)인 μƒνƒœλΌκ³  ν•˜λ©°, 이 μƒνƒœμ˜ ν”„λ‘œκ·Έλž¨μ„ ν”„λ‘œμ„ΈμŠ€(Process)라고 ν•œλ‹€.

     

    μœ„ν‚€ν”Όλ””μ•„μ—μ„œλŠ” ν”„λ‘œμ„ΈμŠ€μ— λŒ€ν•΄ μ •μ˜λ₯Ό 내릴 λ•Œ, κ·Έλƒ₯ μ‹€ν–‰λ˜κ³  μžˆλŠ” 컴퓨터 ν”„λ‘œκ·Έλž¨μ΄λΌκ³  μ •μ˜λ₯Ό 내리고 있으며, μŠ€μΌ€μ€„λ§ λ‹¨κ³„μ—μ„œμ˜ "μž‘μ—…"κ³Ό 같은 단어라고 봐도 λ¬΄λ°©ν•˜λ‹€κ³  ν•˜κ³  μžˆλ‹€. μ‹€μ œλ‘œ ν”„λ‘œμ„ΈμŠ€λΌλŠ” 단어가 μž‘μ—… 쀑인 ν”„λ‘œκ·Έλž¨μ„ μ˜λ―Έν•˜λŠ” 단어이기 λ•Œλ¬Έμ΄λ‹€.

     

    κ·Έλ ‡λ‹€λ©΄ ThreadλŠ” λ¬΄μ—‡μΌκΉŒ?

     

    κ³Όκ±°μ—λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ, μ‹€ν–‰ μ‹œμž‘λΆ€ν„° λκΉŒμ§€ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œμ„ μ‚¬μš©ν•΄μ„œ μ§„ν–‰ν–ˆλ‹€. ν•˜μ§€λ§Œ, μ‹œκ°„μ΄ 흐λ₯Όμˆ˜λ‘ ν”„λ‘œκ·Έλž¨μ΄ λ³΅μž‘ν•΄μ§€λ‹€λ³΄λ‹ˆ ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€λ§Œ μ‚¬μš©ν•΄μ„œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ°μ—λŠ” λ²…μ°¨κ²Œ λ˜μ—ˆλ‹€. μ‹€μ œλ‘œ μ΄μ œλŠ” ν”„λ‘œκ·Έλž¨ ν•˜λ‚˜κ°€ λ‹¨μˆœνžˆ ν•œκ°€μ§€ μž‘μ—…λ§Œμ„ ν•˜λŠ” κ²½μš°λŠ” μ—†λ‹€.

     

    예λ₯Ό λ“€μ–΄, 인터넷 λΈŒλΌμš°μ €λΌλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ μžˆμ„ λ•Œ, μ§€κΈˆμ²˜λŸΌ λ™μ˜μƒμ„ μž¬μƒλ„ ν•˜κ³ , μŠ€ν¬λ‘€λ„ 내리고, κ²€μƒ‰λ„ν•˜κ³  이런 μž‘μ—…μ„ ν•œλ²ˆμ— ν•˜λ‚˜λ§Œ μ²˜λ¦¬ν•˜μ§€μ•Šκ³  λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλŠ” 방법이 ν•„μš”ν•΄μ§„ 것이닀. 

     

    그럼 ν•œ ν”„λ‘œκ·Έλž¨μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ—¬λŸ¬κ°œ λ§Œλ“€λ©΄ μ–΄λ–¨κΉŒ? 이것은 λΆˆκ°€λŠ₯ν•˜λ‹€. μ™œλƒν•˜λ©΄ μš΄μ˜μ²΄μ œλŠ” μ•ˆμ „μ„±μ„ μœ„ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ μžμ‹ μ—κ²Œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ λ‚΄μ˜ μ •λ³΄μ—λ§Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ œμ•½μ„ 두고 있고, 이λ₯Ό λ²—μ–΄λ‚˜λŠ” 정보에 μ ‘κ·Όν•˜λ €λ©΄ 였λ₯˜κ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

     

    μ΄λ ‡κ²Œ ν•΄μ„œ μƒκ²¨λ‚œ, 더 μž‘μ€ μ‹€ν–‰ λ‹¨μœ„μ˜ κ°œλ…μ΄ Threadλ‹€.

     

     

    πŸ’‘μžλ°”μ—μ„œ Process와 ThreadλŠ” μ–΄λ–»κ²Œ μƒκ°ν•˜λ©΄ 될까?

     

    Java Process

    μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•˜μ—¬ 뒀에 클래슀 이름을 뢙이고, μ—”ν„°λ₯Ό 치면 적어도 ν•˜λ‚˜μ˜ JVM이 μ‹œμž‘λœλ‹€. 보톡 μ΄λ ‡κ²Œ JVM이 μ‹œμž‘λ˜λ©΄ μžλ°” ν”„λ‘œμ„ΈμŠ€(Process)κ°€ μ‹œμž‘ν•œλ‹€.

    java λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀λ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” μˆœκ°„ μžλ°” ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λœλ‹€.

     

     

    Thread

    이 ν”„λ‘œμ„ΈμŠ€λΌλŠ” μšΈνƒ€λ¦¬ μ•ˆμ—μ„œ μ—¬λŸ¬ 개의 μ“°λ ˆλ“œλΌλŠ” 것이 μ•„λ‘₯λ°”λ‘₯ μ‚΄κ²Œ λœλ‹€. 즉, ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€ 내에 μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ μˆ˜ν–‰λœλ‹€. ν•˜μ§€λ§Œ, 거꾸둜 μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ κ³΅μœ ν•˜λŠ” ν•˜λ‚˜μ˜ μ“°λ ˆλ“œκ°€ μˆ˜ν–‰λ˜λŠ” 일은 μ ˆλŒ€ μ—†λ‹€. μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€λ“  간에 μ“°λ ˆλ“œκ°€ ν•˜λ‚˜ 이상 μˆ˜ν–‰λœλ‹€.

     

    main() λ©”μ†Œλ“œκ°€ μˆ˜ν–‰λ˜λ©΄μ„œ ν•˜λ‚˜μ˜ μ“°λ ˆλ“œκ°€ μ‹œμž‘λœλ‹€. λ§Œμ•½ λ§Žμ€ μ“°λ ˆλ“œκ°€ ν•„μš”ν•˜λ‹€λ©΄, 이 main() λ©”μ†Œλ“œμ—μ„œ μ“°λ ˆλ“œλ₯Ό 생성해 μ£Όλ©΄ λœλ‹€. μžλ°”λ₯Ό μ‚¬μš©ν•˜μ—¬ 웹을 μ œκ³΅ν•  λ•Œμ—λŠ” Tomcatκ³Ό 같은 WAS(Web Application Server)λ₯Ό μ‚¬μš©ν•œλ‹€. 이 WAS도 λ˜‘κ°™μ΄ main() λ©”μ†Œλ“œμ—μ„œ μƒμ„±ν•œ μ“°λ ˆλ“œλ“€μ΄ μˆ˜ν–‰λ˜λŠ” 것이닀.

     

    cf) μ•„λ¬΄λŸ° μ“°λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ JVM을 κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ μ—¬λŸ¬ μ“°λ ˆλ“œκ°€ μ‘΄μž¬ν•œλ‹€. 예λ₯Ό λ“€λ©΄, μžλ°”μ˜ μ“°λ ˆκΈ° 객체λ₯Ό μ²­μ†Œν•˜λŠ” GC κ΄€λ ¨ μ“°λ ˆλ“œκ°€ 여기에 μ†ν•œλ‹€.

     

     

    Process & Thread (좜처 : μžλ°”μ˜μ‹ )

     

     

    πŸ’‘Process와 Thread의 μž‘λ™λ°©μ‹μ€ μ–΄λ–»κ²Œ 될까?

    ν”„λ‘œμ„ΈμŠ€κ°€ λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ, μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° μ‹œμŠ€ν…œ μžμ›μ„ ν• λ‹Ήλ°›λŠ”λ‹€κ³  ν–ˆμ—ˆλ‹€. 이 λ•Œ μš΄μ˜μ²΄μ œλŠ” 각 Processλ§ˆλ‹€ λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 ν• λ‹Ήν•΄μ€€λ‹€. λ‹€μ‹œ λ§ν•΄μ„œ, ProcessλŠ” μ™„λ²½νžˆ 독립적이기 λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ˜μ—­(Code, Data, Heap, Stack)을 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ κ³΅μœ ν•˜μ§€ μ•ŠλŠ”λ‹€.

     

    Operation System (좜처:  Heee's Development Blog )

     

    Process λ©”λͺ¨λ¦¬ μ˜μ—­

    Code : Program 의 μ½”λ“œ
    Data : μ „μ—­ λ³€μˆ˜
    Stack : λ§€κ°œλ³€μˆ˜, μ§€μ—­λ³€μˆ˜ λ“± μž„μ‹œμ μΈ 자료
    Heap : λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” λ©”λͺ¨λ¦¬

     

    이와 달리, Process νŠΉμ„±μ˜ ν•œκ³„λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ κ°œλ…μΈ ThreadλŠ” Thread간에 λ©”λͺ¨λ¦¬λ₯Ό μ„œλ‘œ κ³΅μœ ν•œλ‹€. μ“°λ ˆλ“œλŠ” ν•΄λ‹Ή μ“°λ ˆλ“œλ₯Ό μœ„ν•œ Stack을 생성할 뿐, 이 μ™Έμ˜ Code, Data, Heapμ˜μ—­μ„ κ³΅μœ ν•œλ‹€. μ΄λ ‡κ²Œ μ„œλ‘œ ν”„λ‘œμ„ΈμŠ€μ˜ μžμ›μ„ κ³΅μœ ν•˜λ©΄μ„œ, ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ νλ¦„μ˜ 일뢀가 λ˜λŠ” 것이닀. 

     

    Thread의 κ³΅μœ μžμ› (좜처:  Heee's Development Blog )

     

    +) μŠ€νƒμ„ λ…λ¦½μ μœΌλ‘œ ν• λ‹Ήν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

    • μŠ€νƒμ€ ν•¨μˆ˜ 호좜 μ‹œ μ „λ‹¬λ˜λŠ” λ§€κ°œλ³€μˆ˜, λ˜λŒμ•„κ°ˆ μ£Όμ†Œκ°’ 및 ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•˜λŠ” μ§€μ—­λ³€μˆ˜ 등을 μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간이닀. λ”°λΌμ„œ μŠ€νƒ λ©”λͺ¨λ¦¬ 곡간이 λ…λ¦½μ μ΄λΌλŠ” 것은 독립적인 ν•¨μˆ˜ 호좜이 κ°€λŠ₯ν•˜λ‹€λŠ” 것이고, μ΄λŠ” 독립적인 μ‹€ν–‰ 흐름이 μΆ”κ°€λ˜λŠ” 것이닀. κ²°κ³Όμ μœΌλ‘œ μ‹€ν–‰ νλ¦„μ˜ μΆ”κ°€λ₯Ό μœ„ν•œ μ΅œμ†Œ 쑰건이 λ…λ¦½λœ μŠ€νƒμ„ μ œκ³΅ν•˜λŠ” 것이닀. 

    +) μ½”λ“œ μ˜μ—­μ„ 곡유

    • ν”„λ‘œμ„ΈμŠ€λŠ” 독립적인 ꡬ쑰이기 λ•Œλ¬Έμ— λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ Codeμ˜μ—­μ— μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μ—†λ‹€.
    • μ“°λ ˆλ“œλŠ” Codeμ˜μ—­μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— 두 개 μ΄μƒμ˜ μ“°λ ˆλ“œκ°€ μžμ‹ μ΄ ν¬ν•¨λœ ν”„λ‘œμ„ΈμŠ€μ˜ Codeμ˜μ—­μ— μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.

    +) 데이터 μ˜μ—­κ³Ό νž™ μ˜μ—­μ„ 곡유

    • μ „μ—­ λ³€μˆ˜μ™€ 동적 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ 곡간을 κ³΅μœ ν•  수 있고, 이λ₯Ό 톡해 μ“°λ ˆλ“œ κ°„ 톡신을 ν•  수 μžˆμ§€λ§Œ, λ™μ‹œμ— λ©”λͺ¨λ¦¬μ— μ ‘κ·Όν•˜κΈ° λ•Œλ¬Έμ— μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

    +) 였λ₯˜ λ°œμƒ μ‹œ

    • ν”„λ‘œμ„ΈμŠ€λŠ” μ‹€ν–‰ν•˜λ‹€κ°€ 였λ₯˜κ°€ λ°œμƒν•΄μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ κ°•μ œλ‘œ μ’…λ£Œλœλ‹€λ©΄, κ³΅μœ ν•˜κ³  μžˆλŠ” νŒŒμΌμ„ μ†μƒμ‹œν‚€λŠ” κ²½μš°κ°€ μ•„λ‹Œ 이상 μ•„λ¬΄λŸ° 영ν–₯을 주지 μ•ŠλŠ”λ‹€. 
    • μ“°λ ˆλ“œλŠ” Code/Data/Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ˜ λ‚΄μš©μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ—, μ–΄λ–€ μŠ€λ ˆλ“œ ν•˜λ‚˜μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€λ©΄, 같은 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ λͺ¨λ‘ κ°•μ œλ‘œ μ’…λ£Œλœλ‹€.

     

    πŸ’‘CPU μ½”μ–΄ κ°œμˆ˜μ™€ Thread 개수의 상관 κ΄€κ³„λŠ”?

    기초 κ°œλ…λΆ€ν„° ν›‘κ³  κ°€μž. CPU의 μ„±λŠ₯κ³Ό κ΄€λ ¨ μžˆλŠ” 것은 크게 μ½”μ–΄, μ“°λ ˆλ“œ, 그리고 ν΄λŸ­μ΄λ‹€.

     

    ν΄λŸ­μ΄λž€ CPU의 속도λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λŒ€ν‘œμ μΈ λ‹¨μœ„λ‘œμ¨, 1μ΄ˆλ‹Ή λ‚΄λΆ€μ—μ„œ μ–΄λŠμ •λ„μ˜ μž‘μ—…μ΄ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•œμ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μˆ˜μΉ˜μ΄λ‹€. 이의 μˆ˜μΉ˜λŠ” 주파수 λ‹¨μœ„μΈ ν—€λ₯΄μΈ (Hz)둜 ν‘œκΈ°ν•œλ‹€. λ”°λΌμ„œ 이 ν—€λ₯΄μΈ κ°€ λ†’μœΌλ©΄ λ†’μ„μˆ˜λ‘ 보닀 더 λΉ λ₯Έ μ„±λŠ₯을 λ³΄μ—¬μ£Όμ—ˆλ‹€. 1GHzν•˜λ©΄ μ΄ˆλ‹Ή 10μ–΅νšŒλ₯Ό μ˜λ―Έν•œλ‹€. μ˜›λ‚ κ³Όκ°™μ΄ 코어와 μ“°λ ˆλ“œμ˜ κ°œλ…μ΄ μ—†λ˜ μ‹œμ ˆμ—λŠ” CPUλ₯Ό ꡬ맀함에 μžˆμ–΄ μ„±λŠ₯을 μ’Œμš°ν•˜λŠ”κ²ƒμ€ 클럭이 μ ˆλŒ€μ μΈ κΈ°μ€€μΉ˜μ˜€μ§€λ§Œ, κ·Όλž˜μ™€ 같이 ν•œκ°œμ˜ CPU λ‚΄λΆ€μ—μ„œ 2개 λ˜λŠ” 4개, 6개, 8개 λ“± 의 μ½”μ–΄λ₯Ό μ—¬λŸ¬κ°œ 집어넣은 λ©€ν‹°μ½”μ–΄ μ œν’ˆκ΅°λ“€μ΄ μΆœμ‹œλ¨μœΌλ‘œμ¨ 이전과 같은 κΈ°μ€€μ μœΌλ‘œ μ„±λŠ₯을 λΉ„κ΅ν•˜κΈ°μ—λŠ” λ¬Έμ œκ°€ μžˆλ‹€.

     

    그럼 μ½”μ–΄λŠ” 무엇인가?

    CPU의 핡심적인 역할을 μˆ˜ν–‰ν•΄λ‚΄λŠ” 쀑심뢀 역할을 λ§ν•˜λ©° 이 μ½”μ–΄μ—μ„œ μ‹œμŠ€ν…œμ˜ λͺ¨λ“  연산을 μ²˜λ¦¬ν•œλ‹€κ³  보면 λ˜κ² λ‹€, 즉 CPUμ—μ„œμ˜ μ½”μ–΄κ°€ λ§Žμ€ 경우 μ»΄ν“¨ν„°μ˜ μ„±λŠ₯을 κ°€μž₯ μ’Œμš°ν•œλ‹€κ³  λ³Όμˆ˜λ„ μžˆκ² λ‹€, μ½”μ–΄μ˜ κ°―μˆ˜κ°€ λŠ˜μ–΄λ‚¨μ— 따라 λͺ…칭은 μ•„λž˜μ™€κ°™μ΄ μ‚¬μš©λœλ‹€.

    μ½”μ–΄ 갯수 λͺ…μΉ­
    μ½”μ–΄ 1개 μ‹±κΈ€μ½”μ–΄
    μ½”μ–΄ 2개 λ“€μ–Όμ½”μ–΄ 
    μ½”μ–΄ 4개 μΏΌλ“œμ½”μ–΄
    μ½”μ–΄ 6개 ν—₯사코어
    μ½”μ–΄ 8개 μ˜₯타코어
    μ½”μ–΄ 10개 데카코어

    CPU의 μ„±λŠ₯이 λ§€λ…„λ§ˆλ‹€ μ—…κ·Έλ ˆμ΄λ“œ λ˜λ©΄μ„œ λΆ€μ—¬ν•  수 μžˆλŠ” ν΄λŸ­μ€ ν•œκ³„μΉ˜κ°€ 있고, λƒ‰κ°λ˜ν•œ ν•œκ³„μ μ΄ μžˆμ–΄ 이 ν•œκ³„μ μ„ λ›°μ–΄λ„˜κΈ° μœ„ν•΄ λ©€ν‹° μ½”μ–΄λΌλŠ” κ°œλ… λ§Œλ“€μ–΄ μ΄μ „μ˜ 단일코어(μ‹±κΈ€μ½”μ–΄) μ—μ„œμ˜ λ³΄μ—¬μ£Όμ—ˆλ˜ μ„±λŠ₯을 μ½”μ–΄λ₯Ό 늘림으둜써 더 λ§Žμ€ μ—°μ‚°μ²˜λ¦¬λ₯Ό ν•  수 μžˆκ²Œλœκ²ƒμ΄λ‹€.

     

    λ‹€μ‹œ 질문으둜 λŒμ•„κ°€, κ·Έλ ‡λ‹€λ©΄ CPU의 μ½”μ–΄ κ°œμˆ˜μ™€ Thread 개수의 μƒκ΄€κ΄€κ³„λŠ” λ¬΄μ—‡μΌκΉŒ?

    CPU Threadλž€ CPUκ°€ 업무λ₯Ό μˆ˜ν–‰ν•˜λŠ” λ‹¨μœ„λ₯Ό μ˜λ―Έν•œλ‹€. μ—¬μ „νžˆ μ „μ‚°μ²˜λ¦¬λŠ” μ½”μ–΄κ°€ λ‹΄λ‹Ήν•˜μ§€λ§Œ, μ½”μ–΄κ°€ μ²˜λ¦¬ν•˜λŠ” 데이터가 μ“°λ ˆλ“œλΌλŠ” ν•˜λ‚˜μ˜ 경둜λ₯Ό 톡해 μ΄λ™ν•œλ‹€λŠ” λœ»μ΄λ‹€.

     

    기본적으둜 ν•œ 개의 μ½”μ–΄ λ‹Ή ν•˜λ‚˜μ˜ μ“°λ ˆλ“œλ₯Ό κ°€μ§€λŠ” 것이 원칙이닀. 그런데, μ½”μ–΄μ˜ μ„±λŠ₯이 ν–₯상 될 수둝, 병λͺ©ν˜„상이 λ°œμƒν•˜κ²Œ λœλ‹€. 

     

    μ‰½κ²Œ 예λ₯Ό 듀어보면, μž‘μ—…μž ν•œ λͺ…이 1뢄에 μ²˜λ¦¬ν•  수 μžˆλŠ” μ—…λ¬΄λŸ‰μ€ 10인데 λΉ„ν•΄, 1λΆ„ λ™μ•ˆ 기계에 νˆ¬μž…ν•  수 μžˆλŠ” μ²˜λ¦¬λŸ‰μ΄ 5밖에 μ•ˆλœλ‹€λ©΄, 기계가 μ•žμ„  μž‘μ—…λ¬Όλ“€μ„ μ²˜λ¦¬ν•  λ™μ•ˆ κΈ°λ‹€λ €μ•Ό ν•˜κ³  μ΄λŠ” μž‘μ—… 효율의 μ €ν•˜λ₯Ό κ°€μ Έμ˜¬ 것이닀.

     

    κ·Έλ ‡λ‹€λ©΄, λ§Œμ•½ 이 기계가 2κ°œκ°€ μžˆλ‹€λ©΄? μž‘μ—…μžλŠ” 기닀릴 ν•„μš” 없이 μž‘μ—…μ„ μ™„λ£Œν•  수 μžˆμ„ 것이닀.

     

    이처럼 μ½”μ–΄μ˜ μ„±λŠ₯이 μ’‹μ•„μ§ˆ 수둝, μ΄λŸ¬ν•œ 병λͺ©ν˜„상이 λ°œμƒν•  수 밖에 μ—†κ³ , 이λ₯Ό ν•΄κ²° ν•˜κΈ° μœ„ν•΄ λ©€ν‹°μ“°λ ˆλ”©μ΄λΌλŠ” 기술이 개발 된 것이닀. μΈν…”μ˜ κ²½μš°μ—λŠ” 'ν•˜μ΄νΌμ“°λ ˆλ”©', AMDμ—μ„œλŠ” 'SMT'라고도 λΆ€λ₯΄λŠ” 이 κΈ°μˆ μ„ ν†΅ν•΄μ„œ 단일 코어에 ν• λ‹Ήλ˜λŠ” μ“°λ ˆλ“œλ₯Ό μ΄λ“±λΆ„ν•˜μ—¬ 병렬 μ „μ‚° 처리λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

     

     

    πŸ’‘λ©€ν‹°νƒœμŠ€ν‚Ή, λ©€ν‹°μ“°λ ˆλ“œλŠ” λ¬΄μ—‡μΌκΉŒ?

    λ©€ν‹°νƒœμŠ€ν‚Ήμ΄ ν•˜λ‚˜μ˜ 운영 체제 μ•ˆμ—μ„œ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€κ°€ μ‹€ν–‰λ˜λŠ” 것이라면, λ©€ν‹°μŠ€λ ˆλ“œλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ μ—¬λŸ¬ μž‘μ—…μ„ μ—¬λŸ¬ μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ™μ‹œμ— μ²˜λ¦¬ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

     

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

    1. Context-Switchingν•  λ•Œ κ³΅μœ ν•˜κ³  μžˆλŠ” λ©”λͺ¨λ¦¬λ§ŒνΌμ˜ λ©”λͺ¨λ¦¬ μžμ›μ„ μ•„λ‚„ 수 μžˆλ‹€.
    2. μŠ€λ ˆλ“œλŠ” ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ Stack μ˜μ—­μ„ μ œμ™Έν•œ λͺ¨λ“  λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— ν†΅μ‹ μ˜ 뢀담이 μ μ–΄μ„œ 응닡 μ‹œκ°„μ΄ λΉ λ₯΄λ‹€.

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

    1. μŠ€λ ˆλ“œ ν•˜λ‚˜κ°€ ν”„λ‘œμ„ΈμŠ€ λ‚΄ μžμ›μ„ 망쳐버린닀면 λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€κ°€ μ’…λ£Œλ  수 μžˆλ‹€.
    2. μžμ›μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— ν•„μ—°μ μœΌλ‘œ λ™κΈ°ν™” λ¬Έμ œκ°€ λ°œμƒν•  μˆ˜λ°–μ— μ—†λ‹€.

     

    βœ…ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ Context-Switching μ‹œμ—λŠ” λ§Žμ€ μžμ› 손싀이 λ°œμƒν•œλ‹€. κ·ΈλŸ¬λ‚˜ μŠ€λ ˆλ“œ κ°„μ˜ Context-Switchingμ—μ„œλŠ” λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κ³  μžˆλŠ” 만큼 뢀담을 덜 수 μžˆλ‹€. (μ•„λž˜ μ§ˆλ¬Έμ—μ„œ 쒀더 μ•Œμ•„λ³΄μž.)

     

    λ©€ν‹°μŠ€λ ˆλ“œμ˜ μž₯λ‹¨μ μ—μ„œ κΌ­ 짚고 λ„˜μ–΄κ°€μ•Ό ν•  점이 λ°”λ‘œ λ™κΈ°ν™” λ¬Έμ œλ‹€. 주둜 Synchronization Issue라고 ν•˜λŠ”λ°, 이에 λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

     

    λ©€ν‹°μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 각각의 μŠ€λ ˆλ“œ 쀑 μ–΄λ–€ 것이 μ–΄λ–€ μˆœμ„œλ‘œ 싀행될 지 κ·Έ μˆœμ„œλ₯Ό μ•Œ 수 μ—†λ‹€. λ§Œμ•½ A μŠ€λ ˆλ“œκ°€ μ–΄λ–€ μžμ›μ„ μ‚¬μš©ν•˜λ‹€κ°€ B μŠ€λ ˆλ“œλ‘œ μ œμ–΄κΆŒμ΄ λ„˜μ–΄κ°„ ν›„, B μŠ€λ ˆλ“œκ°€ ν•΄λ‹Ή μžμ›μ„ μˆ˜μ •ν–ˆμ„ λ•Œ, λ‹€μ‹œ μ œμ–΄κΆŒμ„ 받은 A μŠ€λ ˆλ“œκ°€ ν•΄λ‹Ή μžμ›μ— μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ±°λ‚˜ 바뀐 μžμ›μ— μ ‘κ·Όν•˜κ²Œ λ˜λŠ” 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

     

    이처럼 μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ ν•¨κ»˜ μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  경우 λ°œμƒν•  수 μžˆλŠ” μΆ©λŒμ„ 동기화 문제라고 ν•œλ‹€. μŠ€μΌ€μ€„λ§μ€ μš΄μ˜μ²΄μ œκ°€ μžλ™μœΌλ‘œ 해주지 μ•ŠκΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ μ ˆν•œ 기법을 직접 κ΅¬ν˜„ν•΄μ•Ό ν•˜λ―€λ‘œ ν”„λ‘œκ·Έλž˜λ°ν•  λ•Œ λ©€ν‹°μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 신쀑해야 ν•œλ‹€.(βœ…Thread Safeν•˜κ²Œ μ„€κ³„ν•΄μ•Όν•œλ‹€.) λ””버깅 과정도 κΉŒλ‹€λ‘œμ›Œμ§€κΈ° λ•Œλ¬Έμ΄λ‹€.

     

    λ™μ‹œμ„± μ΄μŠˆμ— λŒ€ν•΄μ„œλŠ” λ‚΄μš©μ΄ λ§Žμ•„ λ”°λ‘œ 글을 μž‘μ„±ν•˜κ² λ‹€. (링크 첨뢀 μ˜ˆμ •)

     

     

    πŸ’‘Threadκ°€ Process 보닀 Context-Switching이 더 λΉ λ₯Έ μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

    ν•œλ§ˆλ””λ‘œ λ§ν•˜μžλ©΄, λ©”λͺ¨λ¦¬ μ˜μ—­μ„ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. μ‹€μ œλ‘œ κ³΅μœ λ˜λŠ” 데이터가 있고 μ•„λ‹Œ 데이터가 μžˆλ‹€. 이 뢀뢄은 μœ„μ—μ„œ Stack을 κ³΅μœ ν•˜μ§€ μ•ŠλŠ” μ΄μœ μ™€ 일λ§₯μƒν†΅ν•œ 이야기닀. λ‹€λ§Œ μΆ”κ°€μ μœΌλ‘œ ν•œκ°€μ§€ μ‚΄νŽ΄λ³΄μ•„μ•Ό ν•  것은 μΊμ‹œλ©”λͺ¨λ¦¬μ΄λ‹€.

    μΊμ‹œλ©”λͺ¨λ¦¬

    • μΊμ‹œ λ©”λͺ¨λ¦¬λŠ” CPUμ—μ„œ ν•œλ²ˆ 이상 읽어 듀인 메인 λ©”λͺ¨λ¦¬μ˜ 데이터λ₯Ό μ €μž₯ν•˜κ³  μžˆλ‹€κ°€ CPUκ°€ λ‹€μ‹œ κ·Έ λ©”λͺ¨λ¦¬μ— μ €μž₯된 데이터λ₯Ό μš”κ΅¬ν•  λ•Œ 메인 λ©”λͺ¨λ¦¬λ₯Ό ν†΅ν•˜μ§€ μ•Šκ³  λ°”λ‘œ 값을 μ „λ‹¬ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λœλ‹€.
    • ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—μ„œ κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬κ°€ ν•˜λ‚˜λ„ μ—†κΈ° λ•Œλ¬Έμ—, μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄ λ°œμƒν•˜λ©΄ 캐쉬에 μžˆλŠ” λͺ¨λ“  데이터λ₯Ό λͺ¨λ‘ λ¦¬μ…‹ν•˜κ³  λ‹€μ‹œ 캐쉬 정보λ₯Ό λΆˆλŸ¬μ™€μ•Ό ν•œλ‹€.
    • βœ…μ“°λ ˆλ“œλŠ” 캐쉬 정보λ₯Ό λΉ„μšΈ ν•„μš”κ°€ μ—†κΈ° λ•Œλ¬Έμ— ν”„λ‘œμ„ΈμŠ€μ™€ μ“°λ ˆλ“œμ˜ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­ μ†λ„μ˜ μ°¨μ΄λŠ” μ΄λ•Œ λ°œμƒν•œλ‹€.

     

    cf) Windowsμ—μ„œμ˜ Process와 Thread

    Windows μž…μž₯μ—μ„œ ν”„λ‘œμ„ΈμŠ€λŠ” μ“°λ ˆλ“œλ₯Ό λ‹΄λŠ” μƒμžμ— μ§€λ‚˜μ§€ μ•ŠλŠ”λ‹€. λ˜ν•œ Windowsμ—μ„œ ν”„λ‘œμ„ΈμŠ€λŠ” μƒνƒœ(Running, Ready, Blocked)을 μ§€λ‹ˆμ§€ μ•ŠλŠ”λ‹€. μƒνƒœλ₯Ό μ§€λ‹ˆλŠ” 것은 μŠ€λ ˆλ“œμ΄λ‹€. μŠ€μΌ€μ€„λŸ¬κ°€ μ‹€ν–‰μ˜ λ‹¨μœ„λ‘œ μ„ νƒν•˜λŠ” 것도 ν”„λ‘œμ„ΈμŠ€κ°€ μ•„λ‹Œ μŠ€λ ˆλ“œμ΄λ‹€. ν”„λ‘œμ„ΈμŠ€ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­ μ—­μ‹œ μ‹€μ œλ‘œ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜λŠ” 뢀뢄은 μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ— ν¬ν•¨λœ μŠ€λ ˆλ“œ κ°„μ˜ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ‹œ λ°œμƒν•œλ‹€.

     

     

    πŸ“—Reference

    https://brownbears.tistory.com/39
    https://techvu.dev/87
    https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
    https://militstory.com/2
    https://crone.tistory.com/423

    λŒ“κΈ€

Designed by Tistory.