프로세스
실행 중인 프로그램은 프로세스라 불리며, 보조 기억 장치에 있는 데이터가 메모리에 로드되고 실행되는 순간 프로세스가 된다.
프로세스는 사용자의 눈으로 확인이 가능한 포그라운드 프로세스와 확인이 불가능한 백그라운드 프로세스로 나뉜다.
데몬 VS 서비스
리눅스, 유닉스 운영체제에서 실행되는 백그라운드 프로세스는 데몬이라 불리고, 윈도우 운영체제에서 실행되는 백그라운드 프로세스는 서비스라 불린다.
둘은 공통적으로 부팅과 동시에 백그라운드에서 계속 실행되는 프로세스를 의미하고, 실질적으로 윈도우에서는 서비스,
리눅스/유닉스에서는 데몬이라고 불리는 것 외에는 거의 차이점이 없어 데몬을 서비스라고 부르기도 한다.
하지만 100% 동일한 것은 아니고 몇 가지 차이점이 존재한다.
1. 목적과 실행 환경
데몬은 특정한 역할을 수행하고 사용자와 상호 작용하지 않는다. 대표적인 데몬의 예시로는 웹서버, 데이터베이스, 로그인 관리자 등이 해당된다.
서비스 또한 시스템에서 특정 기능을 제공하는 소프트웨어의 일종으로, 시스템 부팅 시 자동으로 시작되고 시스템 사용 중에는
사용자의 요청에 의해 실행된다. 대표적인 예로는 DNS,
DHCP(Dynamic Host Configuration Protocol, 동적 호스트 구성 프로토콜), 웹 서버 등이 있다.
서비스는 사용자와 상호작용할 수 있지만, 데몬은 상호작용하지 않는다는 차이가 있다.
2. 작동 방식
서비스는 프로세스와 1:1 관계가 아니다. 즉 윈도우 운영체제에서 한 프로세스는 둘 이상의 서비스를 실행할 수 있다.
또한 실행 파일뿐만 아니라 DLL(Dynamic Link Library)도 서비스로 구동된다.
반면, 둘 이상의 데몬이 한 프로세스 밑에 동작하는 경우는 없으며 데몬은 실행 파일만 구동한다.
프로세스 제어 블록(PCB, Process Control Block)
모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU 자원은 한정되어 있어 항상 점유하고 있을 순 없다.
그래서 프로세스는 정해진 시간만큼 돌아가면서 CPU를 사용하고, 이 때 프로세스를 식별하기 위해 운영체제는
프로세스 제어 블록 PCB를 이용한다. 운영체제마다 차이가 있지만, PCB에는 아래와 같은 정보가 담긴다.
1. 포인터
프로세스가 준비상태나 대기 상태 일 경우에 큐로 운영이 되는데, 프로세스 제어 블록을 연결 시 큐로 구현하기 위해 포인터를 사용한다.
2. 프로세스 상태
프로세스가 현재 어떤 상태인지에 대한 정보 저장
3. 프로세스 ID
여러 프로세스로부터 구분할 수 있는 프로세스 ID(PID)를 저장
4. 프로그램 카운터
다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터 값을 저장함.
5. 레지스터 정보
프로세스가 실행 중에 사용했던 레지스터 정보(누산기, 인덱스 레지스터, 스택 포인터 등등)들이 저장된다.
6. 입출력상태 정보
프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등의 정보 저장
7. 메모리 관리 정보
프로세스가 저장된 메모리 주소 공간 위치 값과 메모리 보호를 위해 사용되는 경계 레지스터, 한계 레지스터 값 등을 포함하며
세그먼테이션 테이블, 페이지 테이블 등의 정보도 포함된다.
8. PPID와 CPID
부모 프로세스 구분자(PPID, Parent PID)와 자식 프로세스 구분자(CPID, Child PID) 정보도 저장한다.
프로세스의 메모리 영역
프로세스가 수행하던 정보를 문맥이라고 하고, 문맥 정보는 PCB에 저장되고 문맥 교환으로 인해
메모리가 실행하는 프로세스가 전환되고, PCB는 메모리의 커널 영역에 저장된다.
프로세스는 사용자 영역에 배치되는데, 코드 영역, 데이터 영역, 힙 영역, 스택 영역에 나뉘어 저장된다.
1)코드 영역
코드 영역은 텍스트 영역이라고도 부르며, 실행 명령을 포함하는 코드들이 들어가는 부분이다.
데이터가 아닌 CPU가 실행할 명령어가 들어있기 때문에 쓰기는 불가능하고 읽기만 가능한 읽기 전용 공간이며,
프로세스가 함부로 변경할 수 없고 변경이 오류를 발생시킨다.
코드 자체를 구성하는 메모리 영역으로 Hex 파일이나 Bin 파일이 저장된다.
프로그램을 구성하는 명령어들을 저장하는 영역이기 때문에 정적 할당 영역이라고도 한다.
2)데이터 영역
데이터 영역은 프로그램이 실행되는 동안 유지될 데이터가 저장되는 공간이다.
전역변수, 정적변수, 배열, 구조체 등이 저장되며 프로그램이 종료되면 시스템에 반환되고,
BSS 영역과 Data(GVAR)영역으로 나뉘어진다.
BSS 영역은 block started by symbol 영역으로, 초기화되지 않은 전역 데이터를 위한 영역이다.
GVAR 영역은 초기값이 있는 전역 데이터를 위한 영역이다.
BSS 영역과 GVAR 영역을 구분하는 이유는 초기화된 데이터는 초기값까지 저장되어 ROM에 저장되고,
초기화되지 않은 데이터까지 ROM에 저장하면 큰 사이즈의 ROM이 필요로 하기 때문에 구분한다.
(초기화되지 않은 데이터는 RAM에 저장된다)
프로그램이 실행되는 동안만 유지될 영역이기 때문에 그 크기가 변하지 않아
코드 영역과 마찬가지로 정적 할당 영역이라고도 한다.
3)힙 영역
프로그래밍을 통해 직접 할당할 수 있는 저장 공간으로, 힙 영역에 메모리 공간을 할당받으면 나중에 반환해야 한다.
반환을 하지 않으면 메모리 누수가 발생한다.
힙 영역은 실시간으로 그 크기가 변할 수 있기 때문에 동적 할당 영역이라고도 한다.
스택 영역과 힙 영역은 같은 공간을 공유하고, 힙 영역은 메모리의 낮은 주소부터 높은 주소 방향으로 할당된다.
이때 힙 영역의 값이 스택 영역을 침범하는 경우가 heap overflow가 된다.
4)스택 영역
데이터를 일시적으로 저장하는 공간으로, 함수 호출로 사용되고 함수가 끝나면 소멸되는 매개 변수, 지역 변수가 저장되는 공간이다.
스택 영역도 힙 영역과 마찬 가지로 크기가 변할 수 있기 때문에 동적 할당 영역이라고도 한다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당되고,
스택 영역에 들어가는 값이 힙 영역을 침범하는 경우 stack overflow가 된다.
스레드
스레드는 프로세스 안에서의 실행 흐름 단위이다. 이러한 스레드를 하나만 사용하는 프로세스는 단일 스레드 프로세스,
여러 개의 스레드를 사용하는 경우 멀티 스레드 프로세스라고 불린다.
반면 여러 개의 프로세스를 동시에 실행하는 것은 멀티 프로세스라고 한다.
하나의 스레드만을 갖고 있는 프로세스를 멀티 프로세스 방식으로 사용하는 것과,
멀티 스레드를 가지는 프로세스 하나를 사용하는 것을 비교하면 멀티 스레드를 가진 프로세스 하나를 사용하는 것이 효율적이다.
그 이유는 스레드는 하나의 프로세스 안에서 프로세스를 실행하는 데 필요한 자원을 공유하지만,
프로세스끼리는 기본적으로 자원을 공유하지 않기 때문이다. 하지만 프로세스끼리 무조건 자원을 공유하지 않는 것은 아니다.
프로세스 간 자원을 공유하고 데이터를 주고 받는 것을 프로세스 간 통신(IPC, Inter Process Communication)이라고 한다.
프로세스 간 통신(IPC)
프로세스는 독립된 실행 객체이다. 그렇게 때문에 다른 프로세스의 영향을 받지 않지만, 여러 프로세스가 동시에
실행되는 환경에서는 프로세스 간 통신이 필요하고, IPC 설비를 이용하여 프로세스 간 통신을 하게 되고,
그 방법에는 아래와 같은 방법들이 있다.
- 익명 PIPE(Anonymous PIPE)
- Named PIPE(FIFO)
- Message Queue
- 공유 메모리(Shared Memory)
- Memory Map
- 소켓
- 세마포어
1) 익명 PIPE(Anonymous PIPE)
두 개의 프로세스를 연결하는 파이프를 두는 방식이다. 하나의 프로세스는 데이터를 쓰기만, 나머지 하나는 데이터를
읽기만 가능한 형태이다. 단방향 통신이 가능 하기 때문에 반이중(Half-Duplex) 통신이라고도 한다.
단방향만 가능하기 때문에 송수신을 통해 읽기와 쓰기를 둘 다 하고자 하는 경우 파이프를 두 개를 만들어야 한다.
2) Named PIPE
익명 파이프는 통신할 프로세스를 서로 명확하게 알 수 있는 경우, 예를 들어 부모 프로세스와 자식 프로세스 간의 통신인
경우에만 사용할 수 있다. Named 파이프는 익명 파이프를 확장한 형태로, 전혀 모르는 프로세스 간의 통신도 가능하다.
linux 명령어인 mkfifo 명령어를 통해 pathname을 가지는 FIFO 파일을 만들어 해당 파일을 참고하여 통신을 한다.
Named 파이프 또한 익명 파이프와 마찬가지로 단방향만 가능하기 때문에, 두 개의 FIFO 파일을 통해 양방향 통신을 할 수 있다.
3) Message Queue
메시지 큐는 익명 파이프 방식이나 Named 파이프 방식과 입출력 방식은 거의 동일하지만, 파이프 방식은 프로세스 간
연결해주는 통로의 역할이었다면, 메시지 큐는 여러 프로세스가 사용할 데이터가 담긴 메모리 공간이라는 것이 큰 차이점이다.
메시지 큐는 메시지 지향 미들웨어를 구현한 시스템을 의미하며, 즉각적이고 빠른 응답을 필요로 하지 않는 비동기 방식이다.
예를 들면 이메일 전송, 블로그 포스팅의 경우 메시지 큐 전송 방식을 사용할 수 있다.
4) 공유 메모리(Shared Memory)
파이프 방식과 메시지 큐가 통신을 통해 데이터를 주고 받는 방식이었다면, 공유 메모리는 데이터를 아예 공유하는 방식이다.
다수의 프로세스가 동시에 작동하는 운영체제에서 프로세스 메모리 영역은 반드시 보호되어야 한다. 하지만 커널 영역에
공유 메모리 할당을 요청하면, 커널은 해당 프로세스에게 공유 메모리를 할당해주고 어떤 프로세스 건 해당 메모리 공간에
접근할 수 있는 상태가 되는 방식이다.
공유 메모리 방식은 파이프나 큐와 같은 중간 다리 역할이 없어 모든 IPC 중 가장 빠른 작동을 보장한다.
5) Memory Map
메모리 맵 또한 공유 메모리와 마찬가지로 메모리를 공유한다는 점은 비슷하지만, 메모리 맵의 경우
파일을 메모리에 맵핑시켜 공유한다. 즉 공유 매개체는 파일과 메모리가 되고, 주로 대용량 데이터를 공유해야 할 때 사용된다.
6) 소켓
소켓은 네트워크를 경유하는 프로세스 간 통신의 종착점이다. 서버와 클라이언트로 지정된 프로세스 간 특정 포트를 통해
실시간으로 패킷 단위로 양방향 통신을 하는 방식이다.
7) 세마포어
세마포어는 공유 자원에 대한 접근을 제한하여 교착 상태를 해결하고자 하는 방식 중 하나로, 다른 IPC 방식들과는 달리
프로세스 간 데이터를 동기화하고 보호하는 목적으로 사용된다. 여러 프로세스가 동시에 공유된 자원에 접근하는 것을 막아
원자성을 만족시키기 위해 사용된다.
References
[Operating System] 프로세스 제어 블록과 문맥 교환
혼자 공부하는 컴퓨터 구조+운영체제(강민철 저, 한빛미디어)
'Dev > CS' 카테고리의 다른 글
[운영체제] 가상 메모리, 파일 시스템 (1) | 2023.10.31 |
---|---|
[운영체제] 프로세스 동기화, 교착 상태 (0) | 2023.10.31 |
[컴퓨터 구조, 운영체제] 입출력장치, 운영체제 시작하기 (1) | 2023.10.10 |
[컴퓨터 구조] 메모리와 캐시메모리, 보조기억장치 (0) | 2023.09.29 |
[컴퓨터 구조] CPU의 작동 원리, 성능 향상 기법 (0) | 2023.09.26 |
댓글