[Computer Science][Operating System] πŸš€ ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œ: λ©€ν‹° ν”„λ‘œμ„Έμ‹± & λ©€ν‹° μŠ€λ ˆλ”©μ˜ 이해

κΉ€μƒμš±Β·2024λ…„ 8μ›” 11일
post-thumbnail

ν”„λ‘œμ„ΈμŠ€ & μŠ€λ ˆλ“œ πŸ–₯️

ν”„λ‘œμ„ΈμŠ€: ν”„λ‘œκ·Έλž¨μ„ λ©”λͺ¨λ¦¬ μƒμ—μ„œ μ‹€ν–‰ 쀑인 μž‘μ—…
μŠ€λ ˆλ“œ: ν”„λ‘œμ„ΈμŠ€ μ•ˆμ—μ„œ μ‹€ν–‰λ˜λŠ” μ—¬λŸ¬ 흐름 λ‹¨μœ„

기본적으둜 ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ μ΅œμ†Œ 1개의 μŠ€λ ˆλ“œ(메인 μŠ€λ ˆλ“œ 포함)λ₯Ό μ†Œμœ ν•©λ‹ˆλ‹€. ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λ˜λ©΄ λ©”λͺ¨λ¦¬μ— 각각 λ³„λ„μ˜ 'ν”„λ‘œμ„ΈμŠ€ μ£Όμ†Œ 곡간'이 ν• λ‹Ήλ©λ‹ˆλ‹€(독립적).

  • Code Segment: μ½”λ“œ 자체λ₯Ό κ΅¬μ„±ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­(ν”„λ‘œκ·Έλž¨ λͺ…λ Ή)
  • Data Segment: μ „μ—­ λ³€μˆ˜, 정적 λ³€μˆ˜, λ°°μ—΄ λ“±
    • μ΄ˆκΈ°ν™”λœ λ°μ΄ν„°λŠ” data μ˜μ—­μ— μ €μž₯
    • μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ λ°μ΄ν„°λŠ” bss(Block Started by Symbol) μ˜μ—­μ— μ €μž₯
  • Heap: 동적 ν• λ‹Ή μ‹œ μ‚¬μš© (new(), malloc() λ“±)
  • Stack Segment: ν•¨μˆ˜, μ§€μ—­ λ³€μˆ˜, 맀개 λ³€μˆ˜, 리턴 κ°’ (μž„μ‹œ λ©”λͺ¨λ¦¬ μ˜μ—­)
public class MemoryExample {
    // μ „μ—­ λ³€μˆ˜ (정적 λ³€μˆ˜)
    static int globalVar = 10; // Data Segment (μ΄ˆκΈ°ν™”λœ 데이터)

    public static void main(String[] args) {
        // μ§€μ—­ λ³€μˆ˜
        int localVar = 20; // Stack Segment

        // 객체 생성 (동적 ν• λ‹Ή)
        MemoryExample example = new MemoryExample(); // Heap Segment

        // λ©”μ†Œλ“œ 호좜
        example.method(localVar); // Stack Segment (λ§€κ°œλ³€μˆ˜)
    }

    public void method(int param) {
        // μ§€μ—­ λ³€μˆ˜
        int result = param + globalVar; // Stack Segment (μ§€μ—­ λ³€μˆ˜)
        System.out.println("Result: " + result);
    }
}

μ™œ μ΄λ ‡κ²Œ ꡬ역을 λ‚˜λˆˆ κ±΄κ°€μš”? πŸ€”

λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ 쀄이기 μœ„ν•΄ 데이터λ₯Ό μ΅œλŒ€ν•œ κ³΅μœ ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ½”λ“œ μ˜μ—­μ€ 같은 ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ λ™μΌν•œ λ‚΄μš©μ„ κ°€μ§€λ―€λ‘œ 곡유 관리가 κ°€λŠ₯ν•©λ‹ˆλ‹€. μŠ€νƒκ³Ό 데이터 μ˜μ—­μ„ λ‚˜λˆˆ μ΄μœ λŠ” μŠ€νƒ ꡬ쑰의 νŠΉμ„±κ³Ό μ „μ—­ λ³€μˆ˜μ˜ ν™œμš©μ„±μ„ κ·ΉλŒ€ν™”ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

즉, ν”„λ‘œκ·Έλž¨μ˜ ν•¨μˆ˜μ™€ μ§€μ—­ λ³€μˆ˜λŠ” LIFO(Last In, First Out) νŠΉμ„±μ„ κ°€μ§„ μŠ€νƒμ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ, μ „μ—­ λ³€μˆ˜λ₯Ό λ”°λ‘œ μ§€μ •ν•˜λ©΄ λ©”λͺ¨λ¦¬λ₯Ό μ•„λ‚„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€λ ˆλ“œλŠ” Stack만 λ”°λ‘œ ν• λ‹Ήλ°›κ³  λ‚˜λ¨Έμ§€ μ˜μ—­μ€ μ„œλ‘œ κ³΅μœ ν•©λ‹ˆλ‹€.

  • Stack μ˜μ—­λ§Œ λ”°λ‘œ ν• λ‹Ήλ°›λŠ” 이유:
    • μŠ€λ ˆλ“œλŠ” λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜κΈ° μœ„ν•΄ μ‘΄μž¬ν•˜λ―€λ‘œ, λ…λ¦½μ μœΌλ‘œ Code μ˜μ—­μ— μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ™€ μ§€μ—­ λ³€μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒ λ©”λͺ¨λ¦¬ μ˜μ—­μ€ λ…λ¦½μ μœΌλ‘œ ν• λ‹Ήλ°›μ•„μ•Ό ν•˜λ©°, 이λ₯Ό 톡해 ν•¨μˆ˜ 처리 μ‹œ λ³„κ°œμ˜ κ°’μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 생성될 λ•Œ 기본적으둜 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ μƒμ„±λ©λ‹ˆλ‹€.

ν”„λ‘œμ„ΈμŠ€λŠ” 고유 곡간과 μžμ›μ„ ν• λ‹Ήλ°›μ•„ μ‚¬μš©ν•˜λŠ” 반면, μŠ€λ ˆλ“œλŠ” λ‹€λ₯Έ μŠ€λ ˆλ“œμ™€ 곡간, μžμ›μ„ κ³΅μœ ν•˜λ©΄μ„œ μ‚¬μš©ν•˜λŠ” 차이가 μžˆμŠ΅λ‹ˆλ‹€.

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

ν•˜λ‚˜μ˜ ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ 개의 ν”„λ‘œμ„ΈμŠ€λ‘œ κ΅¬μ„±ν•˜μ—¬ 각 ν”„λ‘œμ„ΈμŠ€κ°€ λ³‘λ ¬μ μœΌλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것.

μž₯점: OSκ°€ 독립적인 λ©”λͺ¨λ¦¬λ₯Ό 톡해 체계λ₯Ό 관리해 μ£ΌκΈ° λ•Œλ¬Έμ— μ•ˆμ •μ μž…λ‹ˆλ‹€.
단점: 각각 λ…λ¦½λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ κ°–κ³  μžˆμ–΄ μž‘μ—…λŸ‰μ΄ λ§Žμ„μˆ˜λ‘ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•˜κ³ , Context Switching으둜 μΈν•œ μ„±λŠ₯ μ €ν•˜κ°€ μš°λ €λ©λ‹ˆλ‹€.

μ˜€λ²„ν—€λ“œ: μ‹œμŠ€ν…œ μ„±λŠ₯에 뢀정적인 영ν–₯을 λ―ΈμΉ˜λŠ” 좔가적인 μž‘μ—…μ΄λ‚˜ μžμ› μ†Œλͺ¨λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€(μ£Όμš” 원인은 Context Switching λ“±μž…λ‹ˆλ‹€).

λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ—μ„œμ˜ μ˜€λ²„ν—€λ“œ 원인

  1. λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 쀑볡 μ‚¬μš©: ν”„λ‘œμ„ΈμŠ€λŠ” μžμ‹ λ§Œμ˜ μ½”λ“œ, 데이터, μŠ€νƒ, νž™ μ˜μ—­μ„ κ°€μ§€λ©°, μœ μ‚¬ν•œ λ°μ΄ν„°λ‚˜ μ½”λ“œκ°€ ν•„μš”ν•  경우 μžμ›μ„ κ³΅μœ ν•˜μ§€ μ•Šκ³  μ€‘λ³΅μœΌλ‘œ λ³΅μ‚¬ν•˜μ—¬ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ μ†Œλͺ¨κ°€ μ»€μ§‘λ‹ˆλ‹€.

  2. ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신 λΉ„μš©(IPC: Inter-Process Communication): 각 ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€μ–‘ν•œ IPC 방법(μ†ŒμΌ“, νŒŒμ΄ν”„, 곡유 λ©”λͺ¨λ¦¬, λ©”μ‹œμ§€ 큐 λ“±)을 μ‚¬μš©ν•˜μ§€λ§Œ, 이 과정이 λ³΅μž‘ν•˜κ³  μž‘μ—…λŸ‰μ΄ 많기 λ•Œλ¬Έμ— μ˜€λ²„ν—€λ“œ λ°œμƒ κ°€λŠ₯성이 μ»€μ§‘λ‹ˆλ‹€.

  3. ν”„λ‘œμ„ΈμŠ€ 생성 및 관리: μƒˆλ‘œμš΄ μžμ›μ„ ν• λ‹Ήν•΄μ•Ό ν•˜λ―€λ‘œ μ†ŒλΉ„κ°€ 크며, Context Switching은 μ΄λŸ¬ν•œ λŒ€κ·œλͺ¨ μž‘μ—…μ„ μ €μž₯ν•˜κ³  λ³΅μ›ν•˜λŠ” μž‘μ—…μ΄ 반볡되기 λ•Œλ¬Έμ— μžμ› μ†Œλͺ¨κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

  4. μΊμ‹œ νš¨μœ¨μ„± μ €ν•˜: 독립적인 λ©”λͺ¨λ¦¬ μ‚¬μš©μœΌλ‘œ 인해 μƒˆλ‘œμš΄ λ‚΄μš©μ„ λ‹€λ£¨λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ λ§Žμ•„μ§€λ©΄ μΊμ‹œ λ˜ν•œ κ³„μ†ν•΄μ„œ λ‘œλ“œν•˜κ³  μ €μž₯ν•˜λŠ” 것을 λ°˜λ³΅ν•˜κ²Œ λ˜μ–΄ ν™œμš©λ„κ°€ λ–¨μ–΄μ§‘λ‹ˆλ‹€.

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

ν•˜λ‚˜μ˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œλ₯Ό ꡬ성해 각 μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜μ˜ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ” 것.

μŠ€λ ˆλ“œλ“€μ€ 곡유 λ©”λͺ¨λ¦¬λ₯Ό 톡해 μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.

μž₯점: 독립적인 ν”„λ‘œμ„ΈμŠ€μ— λΉ„ν•΄ 곡유 λ©”λͺ¨λ¦¬λ‘œ 인해 μ‹œκ°„κ³Ό μžμ› 손싀이 κ°μ†Œν•˜λ©°, μ „μ—­ λ³€μˆ˜μ™€ 정적 λ³€μˆ˜μ— λŒ€ν•œ 자료 κ³΅μœ κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

단점: μ•ˆμ •μ„± 문제. ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ 데이터 곡간을 λ§κ°€λœ¨λ¦¬λ©΄ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ μž‘λ™ 뢈λŠ₯ μƒνƒœκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€(곡유 λ©”λͺ¨λ¦¬ λ•Œλ¬Έ).

  • λ©€ν‹°μŠ€λ ˆλ“œμ˜ μ•ˆμ •μ„±μ— λŒ€ν•œ 단점은 Critical Section 기법을 톡해 λŒ€λΉ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ 곡유 데이터 값을 λ³€κ²½ν•˜λŠ” μ‹œμ μ— λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ κ·Έ 값을 읽으렀 ν•  λ•Œ λ°œμƒν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 동기화 κ³Όμ •μž…λ‹ˆλ‹€.

    • μƒν˜Έ 배제(Mutual Exclusion): Critical Section에 λ‘˜ μ΄μƒμ˜ μŠ€λ ˆλ“œ 접근을 μ œν•œν•©λ‹ˆλ‹€.
    • μ§„ν–‰(Progress): λŒ€κΈ° μƒνƒœμΈ μŠ€λ ˆλ“œλ“€μ΄ μ–Έμ œκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν• μ§€ κ²°μ •ν•©λ‹ˆλ‹€.
    • ν•œμ •λœ λŒ€κΈ°(Bounded Waiting): λ¬΄ν•œ λŒ€κΈ° μƒνƒœμΈ κΈ°μ•„(starvation)λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν•œμ •λœ μ‹œκ°„ 내에 λŒ€κΈ°λ₯Ό ν’€κ³  μ§„μž…ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ™μ‹œμ„± & 병렬성 ⏳

  • λ™μ‹œμ„±: ν”„λ‘œκ·Έλž¨μ΄ μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•˜λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•˜λŠ” λŠ₯λ ₯μž…λ‹ˆλ‹€. λΉ λ₯΄κ²Œ μ „ν™˜λ˜λ©΄μ„œ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ 보이도둝 ν•˜λ©°, μ£Όμš” λͺ©ν‘œλŠ” 응닡성을 높이고 μžμ›μ„ 효율적으둜 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 단일 CPUμ—μ„œλ„ λ¬Έλ§₯ μ „ν™˜μ„ 톡해 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 병렬성: μ—¬λŸ¬ μž‘μ—…μ΄ μ‹€μ œλ‘œ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 것. μ£Όμš” λͺ©ν‘œλŠ” μž‘μ—…μ„ λΉ λ₯΄κ²Œ μ™„λ£Œν•˜λŠ” 것이며, 닀쀑 μ½”μ–΄ λ˜λŠ” 닀쀑 ν”„λ‘œμ„Έμ„œ μ‹œμŠ€ν…œμ—μ„œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.


이 글을 톡해 ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œμ˜ 차이, λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œμ˜ μž₯단점, 그리고 λ™μ‹œμ„±κ³Ό 병렬성을 μ΄ν•΄ν•˜λŠ” 데 도움이 되길 λ°”λžλ‹ˆλ‹€! 😊

[1] Inpa Dev πŸ‘¨β€πŸ’» - πŸ‘©β€πŸ’» λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ vs λ©€ν‹° μŠ€λ ˆλ“œ 비ꡐ πŸ’― μ™„μ „ 총정리 (https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-multi-process-multi-thread)
[2] GitHub - λ©€ν‹° ν”„λ‘œμ„ΈμŠ€(Multi Process)와 λ©€ν‹° μŠ€λ ˆλ“œ(Multi Thread) (https://wooody92.github.io/os/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C/)
[3] F-Lab - λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œμ˜ 차이점과 적용 사둀 (https://f-lab.kr/insight/multi-process-vs-multi-thread)
[4] velog - [OS] λ©€ν‹° ν”„λ‘œμ„ΈμŠ€μ™€ λ©€ν‹° μŠ€λ ˆλ“œ (Multi Process & ... (https://velog.io/@kurtyoon/OS-%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C-Multi-Process-Multi-Thread)

0개의 λŒ“κΈ€