프로세스
프로세스란 실행중인 프로그램으로 같은 프로그램도 별도의 프로세스가 될 수 있다.
$ ps 명령어를 통해서 프로세스를 확인할 수 있다.
- 프로그라운드 프로세스 : 사용자와 직접적으로 상호작용하고 있는 프로세스
- 백그라운드 프로세스 : 사용자와 직접적으로 상호작용하고 있지 않은 프로세스
- 서비스 : 백그라운드 프로세스의 일종으로 사용자와 직접적으로 상호작용하지 않지만 묵묵히 자신의 일을 수행하는 프로세스
$ systemctl list-units --type service : 현재 시스템에서 실행 중인 서비스를 확인 가능
프로세스제어블록(PCB)
모든 프로세스마다 PCB(프로세스제어블록)라고 하는 자료가 할당되어 있고 운영체제는 PCB를 통해 프로세스를 식별한다.
PCB는 운영체제의 커널 영역 내에 할당되어 있다. 프로세스가 실행되었다면 PCB가 생성되고 종료되었다면 PCB가 폐기되는 것이다.
같은 프로그램이 별도의 프로세스가 될 수 있다고 했는데 그렇다면 이것들은 PCB가 각각 할당되어 있을까?
→ 그렇다. 각각 할당되어있다. 왜냐하면 운영체제는 PCB를 통해서 프로세스를 식별할 수 있기 때문이다.
PCB에 표기되어 있는 정보
- PID(process id) : 프로세스에 할당되는 고유한 번호(PPID는 프로세스를 생성해낸 부모프로세스의 PID)
- 레지스터
- 스케줄링 정보 : 프로세스의 스케줄링 우선 순위, 실행 우선 순위 또는 스케줄링 알고리즘에 필요한 다른 정보가 여기에 포함
- 메모리 정보
- 사용한 파일 정보
- 입출력장치 정보
문맥교환(컨텍스트 스위칭)
자원의 개수(CPU의 개수)보다 실행되는 프로세스의 개수가 훨씬 더 많다. 그렇기 때문에 일반적으로 다양한 프로세스들은 번갈아가면서 한정된 자원을 이용하는데 이 과정에서 '문맥 교환'이라는 개념이 사용된다.
- 문맥 : 실행을 재개하기 위해서 기억해야할 정보
- 문맥교환 : 여러 프로세스들이 번갈아가며 실행되는 원리
문맥교환이란 운영 체제에서 여러 프로세스를 동시에 실행하기 위한 기술로 다수의 프로세스가 하나의 CPU를 공유하는 다중 프로세스 환경에서 문맥 교환은 각 프로세스가 CPU를 사용하고 프로세스 간에 전환하는 작업이다.
각 프로세스가 CPU를 사용하고 전환할 때 실행을 재개하기 위한 정보를 교환해야하는데 정보를 교환하기 전에 스택에서 현재 프로세스가 어디까지 진행했는지에 대한 정보(문맥)를 백업하고 교환 할 프로세스가 어디까지 진행 했었는지에 대한 정보(문맥)를 복구하게 된다.
즉, 현재 프로세스 문맥을 백업하고 다음 프로세스 문맥을 복구하는것을 반복하면서 번갈아가며 실행되는 것이다.
그렇다면 문맥교환이 빠르게 된다면 어떻게 될까?
빠르면 빠를 수록 다양한 프로그램들이 동시에 실행되는 것 처럼 보일 것 이다. 하지만 문맥교환에도 비용이 있기 때문에 자주 발생할 수록 좋은 것은 아니다.
사용자 영역에 저장되는 정보
프로세스가 실행되면 메모리 내 커널영역에서 PCB가 할당되어 정보를 저장하지만 사용자 영역에서는 메모리 내 스택영역, 힙 영역, 데이터 영역, 코드 영역에 저장이 된다.
스택영역
매개변수, 지역변수와 같이 임시로 데이터를 저장하는 영역이다. 스코프를 벗어나면 자동으로 해제된다.
힙 영역
개발자가 직접 할당 가능한 공간으로 메모리 누수를 방지하기 위해 할당했다면 해제해야한다. C언어에서는 free()로 해제 해야하고 java에서는 가비지컬렉션을 통해 자동으로 해제된다.
데이터 영역
전역변수와 같은 프로그램이 실행되는 동안 유지할 데이터를 저장하는 영역이다.
단, 초기화 되지 않는 전역 변수는 BSS 영역에 할당된다.
$ size <파일명> : 프로그램이 어떻게 메모리에 로드되는지를 확인
$ top : CPU 사용률, 메모리 사용률, 프로세스 목록, 로드 평균 등 다양한 시스템 성능 및 작업 정보를 모니터링
코드 영역(텍스트 영역) : 실행가능한 코드. 기계어로 이루어진 명령어를 저장하는 영역. read-only
CPU는 기계어로 이루어진 명령어를 해석해서 실행한다. 이 때 기계어로 이루어진 명령어를 저장하는 영역이 코드 영역이다.
CPU 입장에서 정해진 프로세스를 읽고와서 실행하면 되기 때문에 읽기 전용 영역이다.
코드영역과 데이터 영역은 크기가 변하지 않기 때문에 정적 할당 영역이라고도 한다.
스택과 힙 영역은 언제든지 크기가 변할 수 있기 때문에 동적 할당 영역이라고 한다.
그렇기 때문에 주소의 중복을 방지하기 위해 힙 영역은 낮은 주소에서 높은 주소로 할당되고, 스택영역은 높은 주소에서 낮은 할당된다.
정리
- 프로세스란 실행중인 프로그램으로 같은 프로그램도 별도의 프로세스가 될 수 있다.
- 사용자와 직접적으로 상호작용한다면 프로그라운드 프로세스, 하지 않는다면 백그라운드 프로세스 라고한다.
- 운영체제는 커널영역 내 PCB를 통해서 프로세스를 식별하며 PCB는 현재 실행 중인 프로세스와 관련된 정보만을 포함한다. PCB는 프로세스가 실행되면 동적으로 생성되고 종료되면 폐기된다.
- 같은 프로그램이 별도의 프로세스가 되어도 각각 PCB가 할당된다.
- PCB에는 PID, 레지스터, 스케줄링, 메모리, 사용한 파일, 입출력장치 등의 정보가 저장된다.
- 문맥교환(컨텍스트 스위칭) 이란 운영체제에서 다수의 프로세스가 하나의 CPU를 공유하는 다중 프로세스 환경에서 CPU를 사용하고 프로세스 간의 실행 정보를 전환하는 작업이다.
- 문맥교환이 빠르게 되면서 프로그램들이 동시에 실행되는 것 처럼 보이지만 문맥교환에도 비용이 있기 때문에 자주 발생한다면 성능저하, 자원소모 등 문제를 초래할 수 있다.
- 사용자 영역 중 스택영역은 매개변수, 지역변수와 같이 스코프를 벗어나면 해제되는 임시로 데이터를 저장하는 영역이다.
- 사용자 영역 중 힙 영역은 개발자가 직접 할당 가능한 영역으로 메모리 누수를 방지하기위해 사용을 다 했다면 해제 해야한다.
- 사용자 영역 중 데이터 영역은 전역변수와 같이 프로그램이 실행되는 동안 유지할 초기화 된 데이터를 저장하는 영역이다. 단 초기화되지 않았다면 BSS영역에 할당된다.
- 사용자 영역 중 코드 영역은 기계어로된 명령어들이 저장되는 공간으로 CPU가 명령어를 읽어서 실행만 하면 되기에 read-only 다.
- 코드영역과 데이터 영역은 정적 할당 영역이며 스택 영역과 힙 영역은 동적 할당 영역이다.
- 주소 중복 방지를 위해서 힙 영역은 낮은 주소부터 높은 주소 순으로, 스택 영역은 높은 주소부터 낮은 주소 순으로 할당된다.
'CS > 운영체제' 카테고리의 다른 글
[OS] CPU 스케줄링 (0) | 2023.09.08 |
---|---|
[OS] 스레드 (0) | 2023.09.08 |
[OS] 프로세스 생성과 상태 (0) | 2023.09.07 |
[OS] strace기반 시스템 콜 관찰하기 (0) | 2023.09.07 |
[OS] 운영체제 거시적으로 보기 (0) | 2023.09.07 |
댓글