전처리
소스 코드의 주석을 제거하고 #include 등 헤더 파일을 병합하여 매크로를 치환한다.
컴파일러
오류 처리, 코드최적화 작업을 하며 어셈블리어로 변환
어셉블러
목적 코드(object code)[ 컴퓨터가 처리할수 있는 코드 ] 로 반환 한다. 확장자는 운영체제마다 다른데 리눅스에서는 .o이다.
링커
라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일을 만든다. 실행 파일의 확장자는 .exe 또는 .out이라는 확장자를 갖는다.
프로세스의 메모리 구조
스택
지역변수,매개변수, 리턴값을 저장 한다. 컴파일 시에 크기가 결정되며 '동적'인 특징을 갖는다.
힙
동적 할당할 때 사용 되며 런타임 시 크기가 결정된다.
데이터 영역
전역변수(Static), 정적변수(상수)가 저장되고, 정적인 특징을 갖는 프로그램이 종료되면 사라지는 변수가 들어 있는 영역이다.
코드 영역
전역변수, 정적변수가 저장되고, 정적인 특징을 갖는 프로그램이 종료되면 사라지는 변수가 들어 있는 영역이다.
PCB의 구조 (process Control Block)
프로세스 스케줄링 상태 : '준비', '일시중단' 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태
프로세스 ID : 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
프로세스 권한 : 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
프로그램 카운터 : 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터
CPU 레지스터 : 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
CPU 스케줄링 정보 : CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
계정 정보 : 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
I/O 상태 정보 : 프로세스에 할당된 I/O 디바이스 목록
컨텍스트 스위칭(context switching)
한 개의 프로세스 A가 실행하다 멈추고, 프로세스 A의 PCB를 저장하고 다시 프로세스 B를 로드하여 실행한다. 그리고 다시 프로세스 B의 PCB가 저장하고 프로세스A의 PCB를 로드한다. 컨텍스트 스위칭이 일어날 때 앞의 그림 처럼 유효 시간(idletime)이 발생할수 있다.
IPC(Inter Process Communication)
IPC가 가능하면 IPC는 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘을 뜻한다.
공유 메모리
메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 버퍼를 생성
익명 파이프
FIFO 방식으로 이미 공간인 파이프를 기반으로 데이터를 주고 받는다. 단방향 방식의 읽기 전용, 쓰기 정용 파이프를 만든다.
메시지 큐
커널의 전역변수 형태 등 커널에서 전역적으로 관리되며 다른 IPC 방식에 비해서 사용 방법이 매우 직관적이고 간단하며 다른 코드의 수정 없이 단지 몇 줄의 코드를 추가시켜 간단하게 메시지 큐에 접근할 수 있는 장점이있다.
스레드
프로세스 내에서 실행되는 흐름의 단위이다. 모든 프로그램은 자신을 실행하기 위한 하나 이상의 스레드를 가지고 있다. 스레드가 두 개 이상일 때 멀티 스레드라고 한다. 하나의 프로세스 안에 멀티스레드가 작동한다면, 병렬적으로 작업을 처리할 수 있다는 장점이 있다. 이 장점에 따르는 단점도 있다. 하나의 작업을 나누어서 처리한다는 것은 자원을 공유한다는 것과 같다. 따라서 동기화 문제가 발생할 수 있다.
총 정리
---------------------------------------------------------------------------------------
프로세스
컴퓨터에서 실행되고 있는 프로그램 (메모리에 올라간 프로그램)
스레드
프로세스 내 작업 흐름
프로세스의 상태
- 생성 상태 : 프로세스 생성 단계
- 대기 상태 : CPU를 할당받기전 상태
- 실행 상태: 메모리를 할당 받아서, CPU 가 작업하는 상태
- 중단 상태: I/O 작업 등으로 인해, CPU 가 작업하지 않는 상태
- 일시 중단 상태: 메모리 부족으로 일시적으로 중단한 상태
- 종료 : 메모리와 CPU 의 소유권을 모두 놓고 가는 상태
프로세스의 메모리 구조
- 코드 영역 : 프로그램의 코드가 저장되는 곳
- 데이터 영역 : 전역 변수와 정적 변수가 저장되는 곳
- 힙 영역 : 동적 메모리가 저장되는 곳
- 스택 영역 : 함수 호출 시 지역 변수와 호출 정보(매개변수, 반환값)가 저장되는 곳
PCB (Process Control Block)
프로세스의 메타데이터이다.
PCB 에 있는 정보
- 프로세스 ID (Process ID, PID):
- 각 프로세스를 고유하게 식별하는 번호
- 예시: 프로세스 A의 PID가 1234라면, 운영체제는 1234번 프로세스를 특정할 수 있다.
- 프로세스 상태 (Process State):
- 프로세스가 현재 어떤 상태에 있는지를 나타낸다.
- 상태 예시: 실행 중 (Running), 준비 상태 (Ready), 대기 상태 (Waiting), 종료 (Terminated) 등.
- 프로그램 카운터 (Program Counter):
- 프로세스가 다음에 실행할 명령어의 주소를 저장한다.
- 예시: 프로그램이 현재 10번째 명령어를 실행 중이라면, 프로그램 카운터는 11번째 명령어의 주소를 가리킨다.
- 레지스터 (Registers):
- 프로세스가 사용하는 CPU 레지스터의 값들을 저장한다
- 예시: 연산 결과나 함수 매개변수 등이 레지스터에 저장
- 메모리 관리 정보 (Memory Management Information):
- 프로세스가 사용하는 메모리 영역에 대한 정보를 저장
- 예시: 프로세스의 코드, 데이터, 힙, 스택 영역의 시작 주소와 크기 등.
- 입출력 상태 정보 (I/O Status Information):
- 프로세스가 사용하는 입출력 장치와 파일에 대한 정보를 저장
- 예시: 프로세스가 사용하는 파일 디스크립터나 입출력 장치의 상태.
- 계정 정보 (Accounting Information):
- 프로세스의 CPU 사용 시간, 메모리 사용량, 우선순위 등의 정보를 저장
- 예시: 프로세스가 실행된 시간이나 자원 사용량.
컨텍스트 스위칭
- PCB 기반으로 프로세스의 상태를 저장하고, 로드 시키는 과정을 말함
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생됨
- 컨텍스트 스위칭 과정에서 유휴시간 발생(idle time)
- 캐시미스도 발생함 ( 기존 프로세스에서 사용중이던 캐시는, 새로운 프로세스에서는 소용없음 )
참고!
스레드에서도 컨텍스트 스위칭이 발생하는데, 스레드는 스택을 제외한 모든 메모리 영역을 공유하기 때문에,
컨텍스트 스위칭 비용이 적게듬.
IPC 란?
사전적 의미로 IPC 는 inter Process Communication 의 약자로 프로세스간 통신이다
- 프로세스간 데이터를 주고 받고 서로 상호작용할 수 있게 하는 메커니즘임
- 사전적 의미로는 프로세스간 통신의 의미만 있지만, 프로세스끼리 자원을 어떻게 사용할지의 의미도 함께 내포되어 있다
IPC 의 주요 측면
- 데이터 주고 받기 : 프로세스간 데이터를 주고 받음
- 메시지 큐, 파이프 라인, 소켓
- 자원관리 (동기화 ) : 프로세스간 자원을 공유하는데 있어, 여러 프로세스가 동시에 자원을 사용하지 않도록 관리함
- 공유 메모리
메시지 큐랑 파이프라인의 차이점
- 파이프라인은 단순히 데이터 흐름을 제공함
- 메시지 큐는 데이터 흐름과, 데이터를 저장함
메시지 큐의 장점
- 비동기 처리: 프로듀서와 컨슈머가 동시에 실행되지 않더라도 메시지를 주고받을 수 있다. 프로듀서는 메시지를 큐에 넣기만 하면 되고, 컨슈머는 필요할 때 메시지를 꺼내 처리하면 된다.
- 유연성: 시스템 간의 결합도가 낮아져 독립적으로 개발, 배포, 유지보수가 가능하다. 프로듀서와 컨슈머는 서로의 존재를 알 필요 없이 메시지 큐를 통해 간접적으로 통신한다.
- 확장성: 메시지 큐는 여러 프로듀서와 여러 컨슈머를 지원할 수 있어, 시스템의 부하를 분산시키고 확장성을 높일 수 있다.
- 안정성: 메시지가 큐에 저장되므로, 일시적인 시스템 장애가 발생하더라도 메시지가 손실되지 않는다. 컨슈머가 다시 가동되면 큐에 저장된 메시지를 계속 처리할 수 있다.
스레드와 멀티스레딩
스레드 : 프로세스가 작업을 수행하는 작은 실행단위
- 프로세스가 동시에 여러 작업을 처리할 수 있게 해준다.
- 웹브라우저(프로세스)를 예로 들면 웹 페이지를 로드하고 (실행1-스레드), 사용자가 입력하는 내용을 처리하고 (실행2-스레드), 다운로드를 진행할 수 있음 (실행3-스레드)
- 즉 , 여러 작업을 도잇에 수행할 수 있다
각각의 스레드는 코드, 데이터, 힙 영역을 공유하여 쓰고, 스택 영역만 독립적으로 가질수 있다.