[운영체제] 프로세스와 스레드
프로세스와 스레드
✅ 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위
컴퓨터에서 실행되고 있는 프로그램, CPU 스케줄링의 대상이 되는 작업(task)이라는 용어와 같은 의미로 쓰인다.
✅ 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로세스와 컴파일 과정
✅ 전처리 :
소스코드의 주석을 제거 및 헤더 파일을 병합하여 매크로를 전환
✅ 컴파일러 :
오류처리, 코드 최적화 작업을 하며 어셈블러로 변환
✅ 어셈블러 :
어셈블러는 목적 코드로 변환된다.
✅ 링커 :
프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적코드를 결합하여 실행파일을 만든다
✅ 정적 라이브러리 동적 라이브러리
3. 프로세스의 상태
- 여러가지 상태 값을 가진다.
- 프로세스가 생성되고 끝날 때까지 계속해서 바뀌는데, 그 이유로는 I/O요청, ISR, 프로세스 스케쥴링 알고리즘 등이 있다.
✅ 생성(new/crete**) :** fork() exec() 함수를 통해 프로세스 생성
fork() : 부모 프로세스의 주소 공간을 그대로 복사→ 새로운 자식 프로세스 생성
exec() : 새로운 프로세스를 생성함
✅ 대기 (waiting) : 보류상태, 프로세스 입출력 완료, 시그널 수신 등 어떤 사건을 기다리는 상태
✅ 대기중단(ready suspended) : 메모리 부족으로 일시중단 상태
✅ 실행(running) : 프로세스가 CPU를 차지하여 명령어 실행상태
✅ 중단(blocked) : 프로세스가 차단된 상태
✅ 일시 중단(blocked suspended) : 대기상태처럼 메모리 부족으로 일시중단상태
✅ 종료(terminated) : 프로세스의 실행 종료
프로세스의 메모리 구조
✅ Code 영역
: 실행할 프로그램의 코드가 저장, CPU는 코드 영역에서 명령어를 하나씩 가져와 처리한다.
✅ Data 영역
: 전역변수와 정적변수가 저장된다. 프로그램 종료 시 소멸된다.
✅ Stack 영역
: 지연변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역,
함수 호출시 할당되고 함수 반환 시 소멸된다.
✅ Heap 영역
: 동적 데이터 영역, 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.
프로그램 동작 시(런타임)에 크기가 결정된다.
예시) stack에서 pointer 변수를 할당하면 pointer가 가리키는 heap영역의 임의의 공간부터 원하는 크기만큼 할당해 사용한다.
PCB (Process Control Block)
- 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터 = 프로세스 제어 블록
- 프로세스가 한번 생성되면 운영체제는 해당 PCB에 생성한다.
- 프로그램이 실행되면 프로세스가 생성되고 프로세스 주소 값들에 스탭, 힙 구조를 기반으로 메모리가 할당된다.
- 할당된 프로세스의 메타데이터들이 PCB에 저장되어 관리된다.
** 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리된다.
💡 메타데이터란?
데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터, 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터이다.
✅ 컨텍스트 스위칭 = PCB를 교환하는 과정
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생한다.
- 컴퓨터는 어떠한 시점에서 실행되고 있는 프로세스는 단 한 개이다.(싱글코어기준)
📌 컴퓨터는 많은 프로세스가 동시에 구동되는 것처럼 보이는 이유는 무엇??
→ 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문
✅ 캐시미스
- 컨텍스트 스위칭이 일어날 때 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생기므로 캐시클리어 과정을 겪게 되며 캐시미스가 발생한다.
✅ 스레드 컨텍스트 스위칭
:스레드 스택 영역을 제외한 모든 메모리를 공유하기 때문에 비용이 더 적고 시간도 더 적게 걸린다