1) 프로그램(Program)
- 하드디스크 등의 저장매체에 저장된 실행 파일 상태
2) 프로세스(Process)
- 프로그램이 메모리에 적재되어 실행중인 상태
3) 프로세스의 특징
- 운영체제는 프로세스에게 필요한 메모리를 할당하여 코드와 데이터등을 적재함
- 프로세스들은 서로 독립적인 메모리 공간을 가지며 다른 프로세스 영역에 접근할
수 없음
- 프로세스마다 고유한 번호(프로세스 ID)가 할당됨
- 프로세스에 대한 모든 정보는 운영체제 커널에 의해 관리됨
1) 커널에 의한 프로세스 관리
- 커널 영역에 프로세스 테이블을 생성함
- 테이블을 통해 프로세스 목록을 관리함
2) 프로세스 관리 내용
- 프로세스 생성, 실행, 일시중단, 재개, 중단
- 프로세스의 각종 정보
- 프로세스 통신
- 프로세스 동기화
- 프로세스 컨텍스트 스위칭
다중 인스턴스란?
- 한 프로그램을 여러 번 실행시켜 독립된 여러개의 프로세스를 생성한 것
- 각 프로세스에게 독립된 메모리 공간을 할당함
1. 코드(Code) 영역
- 실행될 프로그램 코드가 적재되는 영역
> 사용자가 작성한 모든 함수의 코드. 사용자가 호출한 라이브러리 함수 코드
2. 데이터(Data) 영역
- 프로그램의 고정 변수 공간
> 전역 변수, 정적 데이터를 저장
3. 힙(Heap) 영역
- 프로세스 실행 도중 동적으로 사용할 수 있도록 할당된 공간
> malloc() 등으로 할당
> 아래 번지로 내려가면서 할당
4. 스택(Stack) 영역
- 함수가 사용할 데이터를 위해 할당된 공간
> 매개변수(Parameter), 지역변수(Local Variable), 함수 종료 후 돌아갈 주소
> 위 번지로 올라가면서 할당
> 함수가 종료(return)되면 공간을 반납함
프로세스 사용자 공간과 커널 공간
프로세스 주소 공간 = 사용자 공간 + 커널 공간
1. 사용자 공간(User Space)
- 프로세스의 코드, 데이터, 힙, 스택 영역이 순서대로 할당되는 공간
2. 커널 공간(Kernel Space)
- 프로세스가 System Call을 통해 이용하는 공간
- 커널 코드, 커널 데이터, 커널 스택(커널 코드가 실행될 때 할당)이 존재함
커널 공간의 의미
- 각 프로세스는 독립된 사용자 공간을 소유함
- 시스템 전체에는 하나의 커널 공간이 존재함
- 각 프로세스는 커널 공간을 공유함
커널 공간 사용
- 커널 코드를 실행하는 것은 사용자 프로세스
("사용자 프로세스가 커널 모드에서 실행되고 있다"로 표현함)
- 프로세스의 주소 공간은 가상 공간이므로 사용자 프로세스의 매핑 테이블 이용하여 커널 코드가 적재된 물리 메모리의 위치를 검색함
프로세스 주소 공간
- 프로세스가 실행 중에 접근할 수 있도록 허용된 주소의 최대 범위
> 0번지에서 시작하여 연속된 주소로 구성됨
- 물리 공간이 아닌 논리 공간! (즉 가상 공간)
프로세스 주소 공간의 크기
- CPU가 접근할 수 있는 전체 크기
> 32비트 CPU 라면 4GB
> 프로세스의 주소 공간 크기 ≠ 프로세스가 현재 사용하는 실 공간 크기
가상 공간으로서의 프로세스 주소 공간
- 프로세스의 주소 공간이란 사용자 혹은 개발자가 보는 관점에서 보여주는 것임
- 프로그램의 시작번지는 항상 0번지이며,
- 연속적인 메모리 공간에 형성되며,
- CPU가 접근할 수 있는 최대 크기의 메모리를 전부 할당 받았다고 간주 함
물리 공간으로서의 프로세스 주소 공간
- 할당된 물리 메모리의 크기는 가상 공간보다 작을 수 있고,
- 프로세스의 코드, 데이터, 힙, 스택 영역은 물리 메모리에 흩어져 저장됨
(즉 연속적인 메모리 공간에 형성되지 않음)
☆Process Control Block (PCB)
프로세스 테이블(Process Table)
- 시스템의 모든 프로세스들을 관리하기 위한 표
- 시스템에 단 한개가 존재함
프로세스 제어 블록(Process Control Block, PCB)
- 프로세스에 관한 정보를 저장하는 구조체(Struct)
- 프로세스당 하나씩 존재함
- 프로세스가 생성될 때 만들어지고, 종료되면 삭제됨
프로세스 테이블과 PCB는 커널 공간에 존재하며 커널 코드만이 접근 가능함
1. 프로세스 번호(PID, Process ID): 0및 양의 정수, 유일한 번호, 프로세스를 구분함
2. 부모 프로세스 번호(PPID, Parent Process ID) (0번 프로세스를 제외한 모든 프로세스는 부모 프로세스가 있다.)
3. 프로세스 상태(Process State): 준비, 실행, 블록
4. CPU 컨텍스트
- PC(Program Counter): 프로세스가 선택되면 실행을 시작할 코드 주소
- SP(Stack Pointer)
- 기타 레지스터 정보
5. 스케쥴링 관련 정보: 우선순위, 스케쥴 큐의 포인터
6. 프로세스 종료 코드(0~255): exit() System Call의 매개변수 값, main() 함수의 return 값
7. 프로세스의 오픈 파일 테이블: 열어놓은 파일 디스크립터를 저장한 배열
8. 메모리 관리 정보: 페이지 테이블의 물리 메모리 주소
9. 프로세스 사이의 통신 정보
10. 회계 정보: CPU 사용 시간, 제한 시간, 프로세스 총 경과 시간
11. 프로세스 소유자 정보: 프로세스를 생성한 사용자의 계정 이름 및 ID
프로세스 번호 출력 프로그램
getpid(), getppid() System Call 함수를 이용한 pinfo.c 소스코드
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t pid, ppid;
pid = getpid(); // 현재 프로세스의 PID 알아내기
ppid = getppid(); // 부모 프로세스의 PID 알아내기
printf("프로세스 PID = %d, 부모 프로세스 PID = %d\n", pid, ppid);
}
$ gcc -o pinfo pinfo.c
$ ./pinfo
프로세스 PID = 31006, 부모 프로세스 PID = 30861
$
프로세스 생명 주기(Life Cycle)
- 프로세스는 생성에서 종료까지 여러 상태로 바뀌면서 실행됨
- 상태 정보는 PCB에 기록되며 상태가 바뀔때마다 갱신(Update)됨
프로세스 상태
1. New(생성 상태)
- 프로세스가 생성되어 메모리가 할당되고 필요한 자원이 적재된 상태
- PCB에 New 상태로 등록됨. 실행 준비를 마치면 Ready 상태로 바뀜
2. Ready(준비 상태)
- 프로세스가 스케쥴링을 기다리는 상태
- 프로세스는 Ready Queue(준비 큐)에서 대기함
- 스케쥴링을 통해 Running 상태가 되고 CPU에 의해 실행됨
3. Blocked/Wait(블록 상태)
- 프로세스가 자원을 요청하거나, 입출력을 요청하고 완료를 기다리는 상태
- 요청 처리 후 Ready 상태로 바뀌고 Ready Queue에 삽입됨
4. Terminated/Zombie 상태
- 프로세스가 종료되긴 했는데 불완전한 상태
> 프로세스의 종료 코드를 부모 프로세스가 아직 읽지 않은 상태
- 프로세스에 할당된 자원과 메모리가 모두 커널에 의해 반납됨
- 프로세스 테이블의 항목과 PCB는 시스템에서 제거되지 않음
5. Terminated/Out 상태
- 프로세스의 종료 코드를 부모 프로세스가 읽어서 처리한 상태
- 프로세스 테이블의 항목과 PCB는 시스템에서 제거되었음
'운영체제' 카테고리의 다른 글
4. 스레드와 멀티스레딩 (2) | 2023.04.10 |
---|---|
3. 프로세스와 프로세스 관리 (2) (0) | 2023.04.07 |
2. 컴퓨터 시스템과 운영체제 (0) | 2023.04.01 |
1. 운영체제의 시작과 발전 (2) | 2023.04.01 |