인프런의 개발자를 위한 컴퓨터 공학1 : 혼자 공부하는 컴퓨터 구조 + 운영체제 강의를 듣고, 학습 및 요약
실행 중인 프로그램
프로세스는 실행되기 전까지는 보조기억장치에 있는 데이터 덩어리지만 실행했을 때 메모리에 적재하고 실행하는 순간에 프로세스가 된다.
- 포그라운드 프로세스(foreground process)
- 사용자가 볼 수 있는 공간에서 실행되는 프로세스
- 백그라운드 프로세스 (background process)
- 사용자가 볼 수 없는 공간에서 실행되는 프로세스
- 사용자와 직접 상호작용이 가능한 백그라운드 프로세스
- 사용자와 상호작용하지 않고 정해진 일만 수행하는 프로세스 : 데몬(daemon) or 서비스(service)
- 사용자가 볼 수 없는 공간에서 실행되는 프로세스
프로세스 제어 블록
- 모든 프로세스는 실행을 위해 CPU가 필요하지만 CPU의 자원은 한정되어 있다.
- 프로세스들은 돌아가며 한정된 시간 만큼만 CPU 사용
- 자신의 차례에 정해진 시간만큼 CPU 이용
- 타이머 인터럽트가 발생하면 차례 양보
타이머 인터럽트(타임아웃 인터럽트) : 클럭 신호를 발생시키는 장치에 의해서 주기적으로 발생하는 하드웨어 인터럽트의 한 종류
빠르게 번갈아 수행되는 프로세스들을 관리해야 하는데 이를 위해 사용하는 자료구조가 프로세스 제어 블록(PCB)이다.
프로세스 제어 블록(PCB)
- 프로세스 관련 정보를 저장하는 자료 구조(마치 상품에 달린 태그와 같은 정보)
- 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기
PCB에 담기는 대표적인 정보(운영체제마다 차이가 있을 수 있음)
- 프로세스 ID(PID), 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 정보, 사용한 파일과 입출력장치 정보
- 운영체제는 커널 영역에 적재된 PCB를 보고 프로세스를 관리한다.
프로세스 ID(PID) | 특정 프로세스를 식별하기 위해 부여하는 고유한 번호레지스터 값 |
레지스터 값 | 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 => 실행 재개 |
프로그램 카운터, 스택 포인터 | |
프로세스 상태 | 입출력 장치를 사용하기 위해 기다리는 상태, CPU를 사용하기 위해 기다리는 상태, CPU 이용 중인 상태 |
생성상태, 대기상태, 준비상태, 실행상태 등 | |
CPU 스케줄링 정보 | 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보 |
메모리 정보 | 프로세스가 어느 주소에 저장되어 있는지에 대한 정보 |
페이지 테이블 정보(일단 메모리의 현재 주소를 알 수 있는 정보가 담긴다 정도만) | |
사용한 파일과 입출력장치 정보 | 할당된 입출력장치, 사용 중인(열린) 파일 정보 |
문맥 교환(context switch)
- 한 프로세스에서 다른 프로세스로 실행 순서가 넘어가면?
- 기존에 실행되던 프로세스는 지금까지의 중간 정보를 백업
- 프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력장치 등
- 이러한 중간 정보를 문맥(context)라고 한다.
- 다음 차례가 왔을 때 실행을 재개하기 위한 정보
- "실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다."
- 자연스럽게 실행 중인 프로세스가 바뀜
- 기존에 실행되던 프로세스는 지금까지의 중간 정보를 백업
이처럼 기존의 실행 중인 프로세스 문맥을 백업하고 새로운 프로세스 실행을 위해 문맥을 복구하는 과정을 문맥 교환(context switching)이라고 한다.(여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리)
프로세스의 메모리 영역
- 사용자영역은 크게 코드 영역(=텍스트 영역), 데이터 영역, 힙 영역, 스택 영역으로 나뉜다.
코드 영역(=텍스트 영역) | 실행할 수 있는 코드, 기계어로 이루어진 명령어 저장 |
데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역(read-only) | |
데이터 영역 | 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장 ex) 전역 변수 |
힙 영역 | 프로그래머가 직접 할당할 수 있는 저장공간 |
힙 영역을 사용하면 메모리 공간을 반환해 줘야 하는데 이것을 자동으로 해주는게 가비지 컬렉션! C언어의 경우는 자동으로 반환해주지 않기 때문에 수동으로 해줘야 하는데 만약, 공간을 반환하지 않는다면 메모리 낭비가 된다. (=메모리 누수: Memory Leak) |
|
스택 영역 | 데이터가 일시적으로 저장되는 공간 |
(데이터 영역에 담기는 값 과는 달리) 임시로 저장되는 값들이 저장되는 공간 | |
ex) 매개 변수, 지역 변수 |
정적 할당 영역 : 코드 영역, 데이터 영역 | 동적 할당 영역 : 힙 영역, 스택 영역 |
- 힙 영역과 스택 영역의 크기는 가변적
- 일반적으로 힙 영역은 낮은 주소 => 높은 주소로 할당
- 일반적으로 스택 영역은 높은 주소 => 낮은 주소로 할당
프로세스 상태와 계층 구조
- 운영체제는 프로세스 상태를 PCB에 기록해서 관리한다!!
- 많은 운영체제는 동시에 실행하는 수많은 프로세스들을 계층적으로 관리한다!!
프로세스 상태
생성 상태(New State) | 이제 막 메모리에 적재되어 PCB를 할당 받은 상태 |
준비가 완료되었다면 준비 상태로 | |
준비 상태(Ready State) | 당장이라도 CPU를 할당 받아 실행할 수 있지만 자신의 차례가 아니기에 기다리는 상태 |
자신의 차례가 된다면 실행 상태로 (=디스패치) | |
실행 상태(Running State) | CPU를 할당 받아 실행 중인 상태 |
할당된 시간 모두 사용 시(타이머 인터럽트 발생 시) 준비 상태로 | |
실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로 | |
대기 상태(Block State) | 프로세스가 실행 도중 입출력장치를 사용하는 경우(입출력 작업이 끝나면 대기 상태도 끝남) |
입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬 | |
입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비 상태로 | |
종료 상태 | 프로세스가 종료된 상태 |
PCB를 폐기하고, 프로세스가 차지하고 있던 메모리 영역을 정리 |
프로세스 계층 구조
- 프로세스 실행 도중 (시스템 호출을 당해) 다른 프로세스 생성 가능
부모 프로세스 | 자식 프로세스 |
새 프로세스를 생성한 프로세스 | 부모 프로세스에 의해 생성된 프로세스 |
- 부모 프로세스와 자식 프로세스는 별개의 프로세스이기에 각기 다른 PID를 가진다.
- 일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(PPID)를 명시하기도 한다.
- 자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있다. => 그렇게 프로세스의 계층적인 구조 형성
프로세스 생성 기법
- 부모 프로세스는 자식 프로세스를 어떻게 만들어 내고, 자식 프로세스는 어떻게 자신만의 코드를 실행할까?
- Windows 운영체제와는 큰 관련이 없음(Windows 운영체제는 계층적인 구조는 아님)
부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체
fork 시스템 호출
- fork는 자기 자신 프로세스의 복사본을 자식 프로세스로 생성하는 시스템 호출
- 복사본(=자식 프로세스 생성)
- 부모 프로세스의 자원 상속
exec 시스템 호출
- 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
- 코드/데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화
'cs' 카테고리의 다른 글
리눅스란 뭐지..? + 리눅스 주요 디렉토리 및 리눅스 명령어 (0) | 2023.05.15 |
---|---|
[혼공운영체제] 스레드 (0) | 2023.05.05 |
[혼공운영체제] 운영체제를 알아야 하는 이유와 운영체제의 큰 그림 (0) | 2023.05.01 |
[혼공운영체제] 입출력장치 (0) | 2023.05.01 |
[혼공운영체제] 보조기억장치(하드디스크, 플래시 메모리, RAID) (0) | 2023.04.30 |