작업 관리자에서 현재 프로세스를 직접 확인할 수 있다.
포그라운드 프로세스(Foreground Process)
사용자가 볼 수 있는 공간에서 실행되는 프로세스이다. 일반적으로 사용자가 실행한 응용프로그램이 해당된다. 사용자는 회면에서 해당 프로세스의 실행 상태를 볼 수 있다.
백그라운드 프로세스(Background Process)
사용자가 볼 수 없는 공간에서 실행되는 프로세스이다. 사용자와 직접 상호작용이 가능한 백그라운드 프로세스와 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스로 나눠진다.
ex) 데몬(Daemon), 서비스(service)
작업 관리자에서 서비스를 확인할 수 있다.
모든 프로세스는 실행을 위해 CPU가 필요하다. But CPU 자원은 한정되어 있다.
즉 모든 프로세스가 CPU를 동시에 사용할 수 없다. 그렇기에 프로세스들은 차례대로 돌아가며 한정된 시간만큼 CPU를 이용한다. 자신의 차례가 되면 정해진 시간만 CPU를 이용하고 타이머 인터럽트가 발생하면 차례를 양보한다.
타이머 인터럽트
주기적으로 발생하는 하드웨어 인터럽트로 클럭 신호를 발생시키는 타이머 장치에 의해 생성된다. 이 인터럽트는 시스템 내에서 정해진 시간 간격으로 발생하여 프로세서의 실행을 중단하고 미리 정의된 태스크나 처리를 수행하도록 한다.
운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고 프로세스에 CPU를 비롯한 자원을 배분한다.
이를 위해 운영체제는 프로세스 제어 블록(PCB, Process Control Block)을 이용한다.
프로세스 제어 블록(PCB, Process Control Block)
프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료 구조이다. 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장된다.
커널 영역에 생성되며 운영체제도 수 많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는데 필요한 정보를 판단한다. PCB는 프로세스 생성시에 만들어지고 실행이 끝나면 폐기된다.
따라서 새로운 프로세스가 생성되었다는 말은 운영체제가 PCB를 생성했다는 말과 같고 프로세스가 종료되었다는 말은 운영체제가 해당 PCB를 폐기했다는 말과 같다.
PCB 구성요소
01 프로세스 ID(= PID)
특정 프로세스를 식별하기 위해 부여하는 고유한 번호이다. 마치 학교의 학번 회사의 사번과도 같은 존재이다.
같은 일을 수행하는 프로그램이라 할지라도 두 번 실행하면 각각 다른 PID를 부여 받는다.
02 레지스터 값
프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원한다. 그래야만 이전까지 진행했던 작업들을 그대로 이어 실행할 수 있다. 그래서 PCB안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
03 프로세스 상태
현재 프로세스가 어떤 상태인지 PCB에 기록한다. 예를 들어 입출력 대기 상태, CPU 사용 대기 상태 등
04 CPU스케줄링 정보
PCB에 프로세스가 CPU를 언제 어떤 순서로 할당받을지에 대한 정보
05 메모리 관리 정보
프로세스마다 메모리에 저장된 위치가 다르다. 그러므로 PCB는 프로세스의 메모리 위치와 크기에 대한 정보를 포함한다. 베이스 레지스터, 한계 레지스터 값 등이 PCB에 저장되며 페이지 테이블 정보도 메모리 관리에 필요한 정보 중 하나이다.
06 사용한 파일과 입출력장치 목록
프로세스가 파일이나 입출력 장치를 사용하는 경우 이 정보들이 PCB에 기록된다. 어떤 파일이나 입출력 장치를 열었는지 할당된 것이 있는지에 대하 목록이 PCB에 저장되어 있다 .
한 프로세스 A에서 다른 프로세스 B로 실행 순서가 넘어가면 어떤 일이 일어날까?
기존에 실행되던 프로세스 A는 프로그램 카운터를 비롯한 각종 레지스터값, 메모리 정보, 열었던 파일, 사용한 입출력 장치 등 지금까지의 중간 정보를 백업한다.
문맥(Context)
이러한 중간 정보 즉 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥이라고 한다. 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어있다. 그러므로 PCB에 기록되는 정보들을 문맥이라고 봐도 된다.
그러므로 실행 문맥을 잘 기억해 두면 언제든 해당 프로세스의 실행을 재개할 수 있다.
문맥 교환(Context Switch)
이처럼 기존의 실행 중인 프로세스 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥교환이라고 한다.
여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리이다.
프로세스의 메모리 영역
프로세스가 사용자 영역에서는 어떻게 저장이 될까?
01 코드 영역
코드 영역(code segment)은 텍스트 영역(text segment)이라고도 부른다. 이곳에는 말 그대로 실행할 수 있는 코드 즉 기계어로 이루어진 명령어가 저장된다. 코드 영역에는 데이터가 아닌 CPU가 실행할 명령어가 담기기때문에 쓰기가 금지되어있다. 다시 말해 코드 영역은 읽기 전용(read-only) 공간이다.
02 데이터 영역
데이터 영역(data-segment)은 프로그램이 실행되는 동안 유지되어야 하는 데이터가 저장되는 공간이다. 대표적으로 전역변수(global variable)와 정적 변수 등이 이 영역에 해당된다.
코드 영역과 데이터 영역은 크기가 고정된 영역이라는 점에서 정적할당영역이라고 한다.
03 힙 영역
프로그램을 만드는 사용자 즉 프로그래머가 직접 할당할 수 있는 저장공간이다. 힙 영역에서 할당된 메모리는 프로그래머가 명시적으로 반환해주어야 하며 반환하지 않을 경우 메모리 누수가 발생할 수 있다.
메모리 누수(Memory Leak)
메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래한다. 이런 문제를 메모리 누수라고한다.
04 스택 영역
데이터가 일시적으로 저장되는 공간이다. 데이터 영역에 담기는 값과는 달리 잠깐 쓰다가 말 값들이 저장되는 공간이다.
함수가 호출될때마다 스택 프레임에 생성되고 함수가 종료될 때 스택 프레임이 제거된다.
힙영역과 스택영역은 실시간으로 그 크기가 변할 수 있기 때문에 동적 할당 영역이라고 부른다.
일반적으로 힙 영역은 낮은 주소 -> 높은 주소로 할당
일반적으로 스택 영역은 높은 주소 -> 낮은 주소로 할당
그러므로 힙 영역과 스택 영역에 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠일이 없다.
참고 : 본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다. https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard
'책 > 혼공 컴퓨터구조+운영체제' 카테고리의 다른 글
운영체제 - 스레드, 단일 스레드 프로세스와 멀티 스레드 프로세스, 스레드의 구성요소, 멀티프로세스와 멀티 스레드 (0) | 2023.12.20 |
---|---|
운영체제 - 프로세스 상태, 프로세스 계층 구조(부모 프로세스, 자식 프로세스), 프로세스 생성 기법(fork,exec) (0) | 2023.12.15 |
운영체제 - 운영체제의 큰 그림(커널,이중모드(사용자모드,커널모드),시스템호출) (0) | 2023.12.07 |
운영체제 - 운영체제(커널 영역, 사용자 영역) (2) | 2023.12.07 |
컴퓨터 구조 - 프로그램 입출력, 인터럽트 기반 입출력, DMA 입출력, 메모리 맵 입출력, 고립형 입출력, 입출력 버스 (1) | 2023.12.06 |
댓글