⛳️ 인프런 - cs 지식의 정석 강의를 듣고 학습한 내용입니다.
프로세스와 스레드, 메모리 관리 및 IPC
1. 프로세스와 스레드의 차이
프로세스는 메모리에 올라와 실행되는 프로그램을 의미하며, 스레드는 프로세스 내 작업의 흐름을 뜻한다.

위 그림처럼, 프로세스는 코드, 데이터, 스택, 힙 메모리를 독립적으로 가지며, 스레드는 스택을 제외한 메모리 영역을 공유한다.
이하의 차이들은 주로 위의 차이에 대한 결과이다.
- 프로세스 간 통신은 IPC를 사용해야 하지만, 스레드는 동일 프로세스 내에서 직접 통신 가능.
- 프로세스는 한 프로세스의 문제가 다른 프로세스에 영향을 주지 않으나, 스레드는 한 스레드의 문제가 전체 프로세스에 영향을 줄 수 있음.
- 프로세스 생성과 종료가 스레드보다 시간이 더 오래 걸림.
2. 프로그램의 컴파일 과정
프로그램은 컴파일러를 통해 소스코드를 기계어로 번역하여 실행파일로 변환된다.
컴파일 과정
- 전처리: 소스코드 주석 제거, 헤더파일 병합 및 매크로 치환 (c++의 경우 .ii 파일)
- 컴파일러: 오류 처리 및 코드 최적화를 수행하여 어셈블리어로 변환 (.s 파일)
- 어셈블러: 어셈블리어를 목적코드(.o 파일)로 변환
- 링커: 목적코드를 라이브러리와 결합하여 실행파일(.exe, .out)을 생성

3. 프로세스의 메모리 구조
프로세스 메모리는 스택, 힙, 데이터영역(BSS/Data), 코드영역으로 구성됨.
다른 게시물에서 하도 많이해서 대충..

스택은 위에서 아래로, 힙은 아래에서 위로 저장된다는 그 그림
-
스택(stack) - 동적: 지역변수, 매개변수, 함수가 저장되며 컴파일시 크기가 결정된다. 런타임 시 크기가 동적으로 변하기도 함.
-
힙(heap) - 동적: 동적 메모리 할당 시 사용되며 런타임 시 크기가 결정됨.
-
데이터 영역 - 정적
BSS: 전역변수, static, const 변수 중 0 또는 초기화되지 않은 변수 저장
Data: 0이 아닌 값으로 초기화된 전역변수, static, const 변수 저장
-
코드 영역 - 정적: 프로그램의 소스코드 저장
4. 정적 할당과 동적 할당
메모리 할당은 정적(컴파일 시)과 동적(런타임 시)으로 구분됨.
정적할당: 컴파일 단계에서 메모리를 할당
- BSS, Data, 코드 영역으로 나눠서 저장
동적할당: 런타임 단계에서 메모리를 할당
- Stack(지역변수, 함수호출)과 Heap(malloc, free, 동적 자료구조 관리)으로 나눠짐
5. PCB와 컨텍스트 스위칭
PCB
: 프로세스 관리 메타데이터로, 프로세스 상태, PID, 프로그램 카운터(PC), 레지스터, 메모리 제한, 열린 파일 정보 등으로 이루어진다.
커널 스택에 저장되며, 각 프로세스가 생성될 때마다 고유의 PCB가 생성되고 프로세스 종료시 PCB도 종료된다.
컨텍스트 스위칭
: PCB를 기반으로 프로세스의 상태를 저장하고 복원하는 과정이다. 프로세스의 종료나 인터럽트에 의해 발생된다.

컨텍스트 스위칭의 비용
- 유휴시간 발생, 캐시 미스, CPU 상태 저장·복원으로 인한 오버헤드 발생
- 스레드는 스택만 독립적이고 나머지 메모리를 공유하기 때문에 프로세스보다 컨텍스트 스위칭 비용이 적음.
6. 프로세스의 상태
프로세스는 다음과 같은 상태를 가진다.
-
생성(create/new): 프로세스 생성 상태, PCB 할당
프로세스 생성 함수: 프로세스를 생성하여 PCB 할당
fork()
: 부모 프로세스의 주소공간을 그대로 복사하여 자식 프로세스를 생성. 주소 공간만 복사할뿐, 부모 프로세스의 비동기 작업 등을 상속하지는 않는다.
exec()
: 새롭게 프로세스를 생성
-
대기(ready): 준비 큐에서 CPU 할당 대기.
-
대기 중단(ready suspended): 준비 큐가 꽉찬 상태, 즉 메모리 부족으로 일시 중단된 상태이다.
-
실행(running): CPU 소유권과 메모리 할당받고 수행중
-
중단(blocked): 특정 이벤트(IO 등)를 기다리며 프로세스 중단/차단
-
일시 중단(blocked suspended): 중단 상태에서 메모리 부족으로 일시 중단
-
종료(terminated/exit): 프로세스 종료, 자원 반납 및 PCB 제거됨. 자연스럽게 종료되는 경우도 있지만 부모 프로세스에 의해 강제로 종료되는 경우도 있음, 또는 그냥 사용자가 강제종료
+ ready suspended, blocked suspended를 묶어서 waiting
상태라고 하기도 한다.
7. 멀티프로세싱과 멀티스레딩
멀티프로세싱과 멀티스레딩은 동시 작업 처리를 위한 구조이다.
웹 브라우저는 멀티프로세싱과 멀티스레딩을 모두 사용함.
멀티프로세싱
- 여러 프로세스를 통해 동시에 여러 작업 처리
- 프로세스 간 격리성이 강하여 문제가 다른 프로세스에 영향 주지 않음
멀티스레딩
- 스레드끼리 자원을 공유하고 프로세스보다 가볍기에 효율성이 높다.
- 하나의 스레드 문제가 다른 스레드로 이어져 스레드로 이루어져 있는 프로세스 전체에 영향을 줄 수 있음

8. IPC (Inter-Process Communication)
: 프로세스 간 데이터 통신을 의미하며 종류로는 공유 메모리, 파일, 소켓, 파이프, 메시지 큐 등이 있다.
- 공유 메모리: 데이터를 주고받는 게 아니라 프로세스 간 메모리 직접 공유 (가장 빠름, 동기화 필요). 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르고, 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화 필요.
- 파일: 디스크 파일을 이용한 통신
- 소켓: TCP, UDP, HTTP 등 네트워크 기반 통신
- 파이프
- 익명 파이프: 부모-자식 프로세스 간에만 사용 가능한 FIFO 기반 단방향 통신채널, 다른 네트워크상 사용 불가
- 명명 파이프(named pipe): 부모-자식뿐 아니라 외부 네트워크를 통해서도 통신할 수 있는 파이프이다.
- 메시지 큐: 큐 자료구조 기반 메시지 버퍼를 통한 통신
9. 공유자원과 경쟁상태 및 임계영역
- 공유 자원: 여러 프로세스·스레드가 접근 가능한 자원
- 경쟁상태(race condition): 공유 자원 접근 시 순서에 따라 결과가 달라지는 상황
- 임계영역(critical section): 동시에 접근하면 결과가 달라질 수 있는 코드 영역 (한 번에 하나의 프로세스만 접근 가능하도록 관리 필요)
경쟁 상태 관리의 중요성
- 데이터 정합성: 예상 값과 다른 데이터 방지
- 데이터 무결성: 규칙을 위반하는 데이터 방지
10. 뮤텍스, 세마포어, 모니터
공유 자원 접근 시 경쟁 상태 해결 방법으로, 상호배제, 한정대기, 진행의 융통성을 만족시키며 경쟁상태 해결
- 상호 배제: 한 프로세스가 임계영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
- 한정 대기: 특정 프로세스가 임계영역 진입후 해당요청이 승인 전까지 다른 프로세스가 임계영역 진입하는 것을 제한
- 진행의 융통성: 어떤 프로세스도 임계영역 사용하지 않는다면, 임계영역의 어떤 프로세스도 들어갈 수 있으며 이 때 프로세스끼리 서로 방해하지 않는 것.
경쟁 상태 해결 방법
- 뮤텍스(mutex): 잠금 메커니즘, 한 번에 하나의 프로세스만 접근

- 세마포어(semaphore): 일반화된 뮤텍스로, 상수 S와 두 가지 함수,
wait()
과 signal()
로 공유자원에 대한 접근을 처리한다. 여러 프로세스가 동시 접근 가능.
S: 현재 쓸 수 있는 공유자원의 수로, 음수가 되면 프로세스가 차단되며 대기열에 프로세스를 집어넣는다.
wait()
또는 P()
: S를 1씩 감소시킨다.
signal()
또는 V()
: S를 1씩 증가시킨다. 만약 s.value가 -5 라면 5개의 프로세스가 자원을 기다리며 대기중인 것으로, s가 증가한다면 이 중 하나를 깨워 작업을 하게 한다.
- 바이너리 세마포어: 값이 0과 1로 제한. 뮤텍스와 유사하다고 할 수 있으나, 뮤텍스는 잠금을 기반으로 상호 배제가 일어나는 '잠금 메커니즘' 이고, 세마포어는 신호를 기반으로 일어나는 '신호 메커니즘' 이다.
- 카운팅 세마포어: 여러 값을 가질 수 있음
- 모니터(monitor): 둘 이상의 스레드나 프로세스가 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 공유자원에 대한 접근 인터페이스 제공한다. 이를 통해 한 번에 하나의 프로세스가 접근 가능하다. (상호배제 자동 처리)

11. 교착상태(deadlock)
: 둘 이상의 프로세스가 각자의 자원을 유지한 채 서로의 자원을 기다리며 중단된 상태.

교착상태 발생 조건
- 상호배제: 주어진 시간 안에 하나의 프로세스만 자원 독점 가능
- 점유대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하여 대기하는 상태
- 비선점: 다른 프로세스의 자원을 강제로 가져올 수 없음
- 환형대기: 서로가 서로의 자원을 요구하는 상황
-> 위의 4가지 조건은 교착상태에 대한 필요조건은 맞지만 충분조건은 아니다.
교착상태 해결 방법
- 애초에 교착상태 발생조건 성립 방지하도록 설계
- 교착상태 가능성이 없을때만 자원을 할당하는 은행원 알고리즘으로 교착상태 회피
- 교착상태 발생시 사이클 탐지하여 프로세스 제거
- 교착 상태는매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서, 교착 상태가 발생하면 사용자가 작업을 종료한다. 현대 운영체제는 이 방법을 채택.
은행원 알고리즘(banker’s algorithm)
자원의 안정적 할당을 통해 교착상태를 예방하는 알고리즘이며, 프로세스 자원요구량과 사용 가능 자원을 기준으로 안정상태를 유지함.
- 프로세스 최대 요구량, 현재 할당량, 추가 요구량 등을 기반으로 자원을 할당하여 교착상태 방지
- 최대 요구 자원 예측이 어렵고, 자원 소모량 증가로 사용이 어려운 단점 있음
12. CPU 스케줄링 알고리즘 (페이지교체 알고리즘)
정처기 할때 계산하면서 다뤄서 패스...
종류만 적어놓고 가자.
- 비선점형(FCFS, SJF, 우선순위)
- 선점형(라운드로빈, SRF, 다단계큐)