2025-12-11
오늘 배운 것
10-1 프로세스 개요
프로세스 직접 확인하기
- 포그라운드 프로세스 : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스 : 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
- 사용자와 상호작용할 수 있는 백그라운드 프로세스가 있고
- 사용자와 상호작용 하지 않고 정해진 일만 수행하는 백그라운드 프로세스도 있음
프로세스 제어 블록
- 운영체제는 프로세스 제어 블록(PCB)를 이용하여 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분
- PCB : 프로세스와 관련된 정보를 저장하는 자료 구조
- 커널 영역에 생성
- PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단
- 프로세스 생성 시 만들어지고 실행이 끝나면 폐기됨
PCB에 담기는 정보
- 프로세스 ID : 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
- 레지스터 값 : 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값
- 자신의 실행 차례로 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원
- 프로세스 상태
- 입출력 장치를 사용하기 위해 기다리고 있는지, CPU를 사용하기 위해 기다리고 있는지 등등 프로세스 상태 정보가 저장
- CPU 스케줄링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당 받을지
- 메모리 관리 정보
- 프로세스가 어느 주소에 저장되어 있는지
- 베이스 레제스터, 한계 레지스터 값
- 페이지 테이블 정보 → 프로세스 주소를 알기 위한 또다른 중요 정보 중 하나
- 사용한 파일과 입출력 장치 목록
- 프로세스가 실행과정에서 사용한 특정 입출력 장치나 파일 정보
문맥 교환
- 문맥 : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
- 문맥 교환 : 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 복구하여 새로운 프로세스를 실행하는 것
프로세스의 메모리 영역
코드 영역
- 텍스트 영역이라고도 부름
- 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장
- 읽기 전용 공간임
데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터기 저장되는 공간
- 코드와 데이터 영역은 크기가 고정된 영역 → 정적 할당 영역
힙 영역
- 프로그래머가 직접 할당할 수 있는 저장 공간
- 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 함
- 메모리 누수 : 메모리 공간을 반환하지 않아 메모리 낭비를 초래하는 것
스택 영역
- 데이터를 일시적으로 저장하는 공간
- 힙과 스택 영역은 실시간으로 크기가 변할 수 있음 → 동적 할당 영역
- 힙 영역은 메모리 낮은 주소에서 높은 주소
- 스택 영역은 높은 주소에서 낮은 주소로 할당
10-2 프로세스 상태와 계층 구조
프로세스 상태
생성 상태
- 프로세스를 생성 중인 상태
- 막 메모리에 적재되어 PCB를 할당 받은 상태
- 곧바로 실행되지 않고 준비 상태가 되어 CPU의 할당을 기다림
준비 상태
- CPU를 할당 받기 위해 대기하는 상태
- 할당 받으면 실행상태가 됨
- 디스패치 : 준비 상태 → 실행상태 전환
실행 상태
- CPU를 할당 받아 실행 중인 상태
- 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용 가능
- 할당된 시간을 모두 사용 → 준비상태로 전환
- 실행 도중 입출력 장치 사용 → 대기상태로 전환
대기 상태
- 입출력 장치의 작업을 기다리는 상태
- 입출력 작업 완료 → 준비상태로 전환
- 입출력 외에도 특정 이벤트가 기다릴 때 프로세스는 대기 상태가 됨
종료 상태
- 프로세스가 종료된 상태
- 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리 정리
프로세스 계층 구조
- 부모 프로세스 : 새프로세스를 생성한 프로세스
- 자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스
- 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록됨
- 자식 프로세스도 실행과정에서 또다른 자식 프로세스 생성 가능
- 많은 운영체제는 이처럼 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리
- 컴퓨터 부팅시 최초의 프로세스 실행됨
- 유닉스 → init
- 리눅스 → systemd
- macOS → launchd
- 최초의 프로세스 PID는 항상 1번
- 모든 프로세스의 최상단에 있음
프로세스 생성 기법
- 부모프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성
- 메모리 내용, 열린 파일의 목록 등이 자식 프로세스에 상속
- 복사된 자식 프로세스라 할지라도 PID값이나 저장된 메모리 위치는 다름
- 만들어진 복사본은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체
- exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역 초기화
- 부모 프로세스가 자식 프로세스를 fork한 뒤에 부모 프로세스와 자식프로세스 누구도 exec를 호출하지 않는 경우
10-3 스레드
- 스레드 : 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
- 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행
프로세스와 스레드
- 단일 스레드 프로세스 : 실행 흐름 단위가 하나인 프로세스
- 스레드의 구성요소
- 각기 다른 스레드 ID
- 프로그램 카운터 값을 비롯한 레지스터 값
- 스택
- 이를 통해 스레드마다 각기 다른 코드 실행 가능
- 스레드는 실행에 필요한 최소한 정보만을 유지한 채 프로세스 자원을 공유하며 실행
멀티 프로세스와 멀티 스레드
- 멀티 프로세스 : 여러 프로세스를 동시에 실행하는 것
- 멀티 프로세스 : 여러 스레드로 프로세스를 동시에 실행하는 것
- 장점
- 프로세스끼리는 기본적으로 자원을 공유하지 않고, 스레드 끼리는 같은 프로세스 내의 자원을 공유
- 따라서 같은 작업을 하는 동일한 프로세스를 동시에 실행하면 동일한 내용들이 중복해서 존재하는 낭비가 발생
- 스레드를 활용하면 메모리를 더 효율적으로 사용할 수 있음
- 단점
- 멀티 프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에 지장이 적거나 없음
- 멀티 스레드 환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있음