mooni
[OS] 프로세스와 스레드 본문
프로세스와 컴파일 과정
프로세스란?
- 프로그램이 메모리에 올라가 인스턴스화된 실행 단위
컴파일 과정

- 전처리: 소스 코드의 주석을 제거하고 #include 등 헤더 파일을 병합하여 매크로를 치환
- 컴파일러: 오류 처리 및 코드 최적화 작업을 수행하고 어셈블리어로 변환
- 어셈블러: 어셈블리어를 목적 코드로 변환
- 링커: 라이브러리 함수 또는 다른 목적 코드와 결합하여 실행 파일 생성
라이브러리
- 정적 라이브러리: 프로그램 빌드 시 코드에 통합되며 외부 의존성이 적지만 메모리 사용량 증가
- 동적 라이브러리: 실행 시 필요할 때 DLL 파일을 참조하며 메모리 효율은 높지만 외부 의존성이 큼
프로세스의 상태

- 생성: 프로세스가 생성된 상태로, PCB가 할당됨. fork() 함수는 부모 프로세스를 복사해 자식 프로세스를 생성하며, exec() 함수는 새로운 프로세스를 실행함
- 대기: CPU 소유권을 기다리는 상태. 메모리가 충분하면 할당받음
- 대기 중단: 메모리 부족 등으로 일시적으로 실행되지 않음
- 실행: CPU 소유권과 메모리를 할당받아 인스트럭션을 수행. 이때 CPU burst가 발생
- 중단: 이벤트 발생으로 프로세스가 대기 상태로 전환. 보통 I/O 인터럽트로 발생
- 일시 중단: 실행 준비는 되었으나 메모리 부족으로 인해 잠시 멈춤
- 종료: 모든 작업이 완료되어 자원을 반환하며 종료. 비자발적 종료(abort)도 가능
프로세스의 메모리 구조

스택과 힙 (런타임 할당)
- 스택: 함수 호출 시 매개변수, 지역 변수 등이 저장되는 영역. 재귀 호출 시에도 각 인스턴스마다 분리된 스택 프레임 생성
- 힙: 동적으로 할당된 메모리가 위치. malloc(), free() 등으로 관리
데이터 영역과 코드 영역 (정적 할당)
- BSS Segment: 0 또는 초기화되지 않은 전역/static 변수 저장
- Data Segment: 0이 아닌 값으로 초기화된 전역/static 변수 저장
- Code/Text Segment: 실행 코드가 저장됨
PCB (Process Control Block)
- 운영체제가 프로세스를 관리하기 위한 메타데이터 집합
PCB 구성 요소
- 프로세스 스케줄링 상태: 준비, 일시중단 등의 상태 정보
- 프로세스 ID: 고유 식별자 및 부모/자식 관계
- 프로세스 권한: 자원 및 디바이스 접근 권한
- 프로그램 카운터(PC): 다음 명령어 주소
- CPU 레지스터: 현재 레지스터 상태
- CPU 스케줄링 정보: 우선순위, 스케줄링 히스토리 등
- 계정 정보: 사용자 정보 및 CPU 사용량
- I/O 상태 정보: 관련 장치 목록 및 상태
컨텍스트 스위칭
- PCB를 저장/로드함으로써 프로세스 간 전환 수행

멀티프로세싱과 IPC
멀티프로세싱
- 여러 프로세스가 동시에 실행 가능
- 병렬 처리 가능, 안정성과 신뢰성 증가
웹 브라우저에서의 멀티프로세싱
- 브라우저 프로세스: UI와 권한 처리 담당
- 렌더러 프로세스: 웹 콘텐츠 렌더링
- 플러그인 프로세스: 외부 플러그인 동작 담당
- GPU 프로세스: GPU 기반 화면 출력 처리
IPC (Inter-Process Communication)
- 공유 메모리: 같은 메모리 블록을 여러 프로세스가 공유
- 파일: 디스크에 기록된 파일을 기반으로 통신
- 소켓: 네트워크 또는 동일 호스트의 다른 프로세스와 통신 (TCP/UDP)
- 익명 파이프: 부모-자식 프로세스 간 단방향 통신
- 명명된 파이프: 이름을 가진 파이프, 양방향 통신 가능
- 메시지 큐: 큐 형태로 메시지를 전송/수신
스레드와 멀티스레딩
스레드
- 프로세스 내 실행 단위. 스레드 간 메모리 공간 공유

멀티스레딩
- 하나의 프로세스 내에서 여러 작업을 동시에 처리함으로써 효율성 증가
공유 자원과 임계 영역
공유 자원
- 둘 이상의 프로세스 또는 스레드가 접근 가능한 변수나 구조
임계 영역
- 동시에 접근 시 오류가 발생할 수 있는 코드 영역
해결 조건
- 상호배제: 동시에 둘 이상 접근 불가
- 한정대기: 무한 대기 금지
- 융통성: 필요 없을 때는 자유롭게 접근 허용
동기화 기법
- 뮤텍스(Mutex): lock()과 unlock()으로 임계 영역 보호

- 세마포어(Semaphore): 정수 값 기반, wait()과 signal()로 접근 제어
- 바이너리 세마포어: 0 또는 1
- 카운팅 세마포어: 여러 자원 제어

- 모니터(Monitor): 공유 자원을 캡슐화, 인터페이스로 접근 제어

교착상태 (Deadlock)
- 두 개 이상의 프로세스가 서로가 가진 자원을 기다리며 중단된 상태
발생 조건
- 상호배제: 자원은 독점되어야 함
- 점유대기: 자원을 가진 채로 다른 자원 요청
- 비선점: 다른 프로세스의 자원을 강제 획득 불가
- 환형 대기: 서로의 자원을 요청하며 순환
해결 방법
- 조건 회피: 설계 단계에서 원인 차단
- 은행원 알고리즘: 자원 요청 최대치를 기반으로 안전성 판단
- 사후 회복: 교착 상태 발생 시 탐지 후 해당 프로세스 종료
- 수동 개입: 사용자가 직접 종료. 비용이 낮아 현대 OS에서 자주 사용
'OS' 카테고리의 다른 글
[OS] CPU 스케줄링 알고리즘 (0) | 2025.05.20 |
---|---|
[OS] 메모리 (0) | 2025.05.07 |
[OS] 운영체제와 컴퓨터 (0) | 2025.05.07 |