프로세스
*프로그램의 인스턴스가 메모리에 올라와있는 것 프로그램: 디스크에 실행파일 형식으로 저장되어 있음
프로세스 분류
- 포그라운드 프로세스화면에서 사용자와 상호작용 함
- 사용자가 볼 수 있는 공간에서 실행됨
- 백그라운드 프로세스
- 사용자가 볼 수 없는 공간, 화면 뒤에서 실행되는 데몬이 대표적 예시
프로세스 메모리 구조
스택과 힙
- 동적 할당
- 스택과 힙은 동적 할당 됨 (런타임 단계에서 메모리를 할당받는 것)
- 스택
- 지역변수, 함수 파라미터.. 등등 늘어나거나 줄어드는 메모리 영역
- 함수 호출 시마다 환경 등 특정 정보가 스택에 계속 저장됨
- 재귀 함수가 호출될 때 새로운 스택 프레임이 매번 사용됨
- 단점: 반복적 호출 또는 함수가 메모리 초과할 정도로 지역 변수를 많이 가질 경우 Stack Overflow 발생
- 힙
- 프로그래머가 필요할 때마다 사용하는 메모리 영역
- 힙 영역은 런타임에 결정됨
- arc에 의해 레퍼런스 카운팅으로 관리된다.
데이터 영역과 코드 영역
- 정적 할당
- 두 영역은 정적 할당 됨 (컴파일 단계에서 메모리 할당)
- 데이터 영역
- 전역변수 혹은 정적 변수 등 프로그램이 사용하는 데이터를 저장하는 공간
- 코드 영역
- 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간
프로세스 생성 과정
- 프로그램 코드를 메모리로 적재한다. - Load
- 게으른 방식으로 필요할 때마다 가져옴
- 실행시간 스택 할당
- 힙 생성
- 실행 도중 동적으로 요구되는 공간 할당을 위한 영역
- 입출력 초기화 작업
- stdin, stdout, stderr 장치와 연결 설정
- I/O 또는 시그널 관련 자료구조 초기화
- 프로그램 시작점으로 분기하여 실행 시작
- 주로 main()
프로세스 상태
프로세스는 3가지의 기본 상태를 갖는다.
- 실행
- CPU가 프로세스에 포함된 명령을 실행 중인 상태
- CPU는 한 번에 하나의 작업밖에 하지 못함
- 준비
- 실행 준비는 되어 있으나, CPU 사용이 불가능한 상태
- e.g. 다른 프로세스가 실행중인 경우
- 대기
- 프로세스가 다른 사건을 기다리는 동안 프로세스의 실행이 중단되어 있는 상태
- e.g. 입출력 요청 발생
PCB (Process Control Block)
- 운영체제에서 프로세스에 대한 메타데이터를 저장하는 자료구조
- 프로세스가 생성될 때 운영체제는 PCB를 생성함
- PCB에 들어가는 것
- PID
- 프로세스 상태
- 프로세스 권한
- 프로세스 우선순위
- PC
- CPU 레지스터
컨텍스트 스위칭
개념
- PCB를 기반으로 기존 실행중인 프로세스의 상태를 저장하고, 새로운 프로세스의 실행을 위해 상태를 로드시키는 과정
- 한 프로세스에 할당된 시간이 끝나거나, 인터럽트에 의해 발생됨
발생과정
- 현재 실행중인 프로세스 정보를 PCB에 업데이트 후 메인 메모리에 저장
- 다음 실행할 프로세스 정보를 메인 메모리에서 가져와 CPU 레지스터에 넣고 실행
- 컨텍스트 스위칭이 발생할 때마다 유휴 시간이 생김
스레드
하나의 프로세스 내에 독립된 실행 흐름 프로세스 주소 공간을 공유함 → 추후 동시성 문제 가능성
멀티 스레드
하나의 프로세스 내에서 작업을 여러 개의 스레드로 처리
- 프로세스는 여러 스레드를 가질 수 있음
- 프로세스: 코드, 데이터, 스택, 힙을 각각 생성 스레드: 코드, 데이터, 힙은 스레드끼리 서로 공유하고 그외의 영역만 각각 생성
- 하나의 CPU에서는 한 번에 하나의 스레드 씩 실행함
- PC 및 레지스터를 독자적으로 유지 (= 별도의 Context)
- TCB에 관리 정보 유지 (스레드 단위로 스케줄링)
- OS가 실행 스레드 교체 시 컨텍스트 스위칭
장점
- 빠른 생성 가능
- 스레드끼리 서로 자원을 공유하므로 적은 리소스로 효율성 증대
- 한 스레드가 중단돼도, 다른 실행중인 스레드가 있기에 빠른 처리 가능
단점
- 한 스레드에 문제 발생 시, 다른 스레드에 영향을 끼쳐 프로세스 자체에 영향을 줄 수 있음
'📱 iOS > Swift Concurrency' 카테고리의 다른 글
[Swift Concurrency 6편] Swift Concurrency 등장 배경 (1) | 2025.02.26 |
---|---|
[Swift Concurrency 5편] 동시성 프로그래밍 with GCD (0) | 2025.02.25 |
[Swift Concurrency 4편] 직렬-동시, 동기-비동기 (0) | 2025.02.24 |
[Swift Concurrency 3편] 공유자원과 임계영역 (0) | 2025.02.23 |
[Swift Concurrency 1편] OT (0) | 2025.02.21 |