프로세스
- 보조기억장치에 있는 프로그램을 메모리에 적제해 실행하면 이를 프로세서라고 함
- 사용자가 볼 수 있는 공간에서 실행되는 프로세스를 foreground process, 사용자가 볼 수 없는 공간에서 실행되는 프로세스를 background process로 나뉨
백그라운드 프로세스는 사용자와의 사용여부에 따라 구분할 수 있으며, 사용자와 상호작용하지 않는 프로세스를 데몬(daemon) 또는 서비스(service)라고 부름
프로세스 제어 블록
- 프로세스는 실행을 위해 CPU가 필요하지만 CPU자원은 한정되어 있음
- 프로세스들은 돌아가면서 한정된 시간 만큼만 CPU를 이용해야함
자신에게 할당된 시간만큼만 CPU를 이용하고, 타이머 인터럽트가 발생하면 차례를 넘겨줘야함
- 프로세스들을 관리하기 위해 사용되는 자료구조를 프로세스 제어 블럭(PCB)이라고 함
- PCB에는 프로세스 관련 정보를 저장하며, 프로세스 생성 시 커널 영역에 생성, 종료시 폐기됨
PCB에 담기는 값으로 프로세스 ID(PID), 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 정보, 사용한 파일이나 입출력장치 정보 등이 있음
PID: 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
CPU 스케줄링 정보: 프로세스가 언제, 어떻게 CPU를 할당받을지에 대한 정보
문맥 교환 (context switch)
- 한 프로세스에서 다른 프로레스로 실행 순서가 넘어가면, 기존에 실행되던 프로세스는 지금까지의 정보인 문맥(context)를 백업하게 됨
- context를 백업하면 언제든 해당 프로세스의 실행을 재개할 수 있게 됨
- context 백업이 완료되면 뒤이어 실행할 프로세스의 context를 복구하게 됨
- 이렇게 context를 백업하고 복구하는 과정을 context switch라고 함
프로세스의 메모리 영역
- 프로세스는 크게 코드 영역(=텍스트 영역), 데이터 영역, 힙 영역, 스택 영역으로 사용자 영역에 저장됨
코드 영역
- 데이터가 아닌 CPU가 실행할 수 있는 기계어로 된 명령어를 저장하는 영역
- CPU가 실행할 명령어가 담기기 때문에 쓰기가 금지됨
데이터 영역
- 프로그램이 실행되는 동안 계속해서 유지할 데이터들을 저장하는 영역
- 전역 변수와 같은 데이터가 이곳에 저장됨
- 코드 영역과 데이터 영역을 하나로 묶어서 정적 할당 영역으로 부르기도 함
힙 영역
- 프로그래머가 직접 할당할 수 있는 저장공간
- 일반적으로 낮은 주소에서 높은 주소로 할당함
스택 영역
- 데이터가 일시적으로 저장되는 공간
- 지역 변수와 같은 데이터들이 이곳에 저장됨
- 일반적으로 높은 주소에서 낮은 주소로 할당됨
- 힙 영역, 스택 영역을 하나로 묶어서 동적 할당 영역으로 부르기도 함
프로세스의 상태
- 일반적으로 생성 상태, 준비 상태, 실행 상태, 대기 상태, 종료 상태로 나뉨
- 생성 상태: 메모리에 적재되 PCB를 막 할당받은 상태로 실행 준비가 완료되면 준비 상태로 넘어감
- 준비 상태: CPU를 할당받기 위해 대기하는 상태, 준비 상태에서 실행상태로 넘어가는 것을 dispach라고 함
- 실행 상태: CPU를 할당받아 실행중인 상태, 타이머 인터럽트 발생 시 준비 상태, 실행중 입출력장치를 쓰면 입출력 작업이 끝날 때까지 대기 상태가 됨
- 대기 상태: 프로세스가 실행 도중 입출력 장치를 사용하는 경우의 상태, 입출력 완료 인터럽트를 받으면 준비 상태가 됨
- 종료 상태: 프로세스가 종료된 상태로, 메모리와 PCB 데이터를 정리하게 됨
프로세스 계층 구조
- 프로세스의 실행 도중에 시스템 호출을 통해 다른 프로세스를 생성 가능
윈도우는 프로세스를 계층구조로 관리하지 않음
- 새 프로세스를 생성한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 함
- 부모 프로세스와 자식 프로세스는 별개의 프로세스임으로 각기 다른 PID를 가짐
일부 운영체제는 자식 프로세스 PCB에 부모 프로세스 PID를 명시하기도 함
프로세스 생성 기법
※ 윈도우는 해당 없음!
- 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성삼
fork 시스템 호출은 자신의 복사본을 생성하고, 부모 프로세스의 자원을 상속하는 것
- 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램을 교체함
exec 시스템 호출은 메모리 공간의 정적 할당 영역은 실행할 프로그램 내용으로 만들고, 나머지 영역은 초기화 하는 것
- fork, exec 시스템 호출이 반복되며 프로세스 계층이 만들어지게 됨
스레드
- 소프트웨어에서 스레드는 프로세스를 구성하는 실행 흐름의 단위
- 하나의 프로세스는 하나 이상의 스레드를 가질 수 있음
- 스레드에는 스레드의 ID, 프로그램 카운터 등의 레지스터 값, 스택 등의 실행에 필요한 최소한의 정보를 가짐
- 스레들들은 프로세스의 자원을 공유할수 있음
- 리눅스에서 둘을 따로 구분하지 않으며, 요즘 운영체제에서는 CPU에 실행할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달하기도 함
멀티 프로세스와 멀티 스레드
- 멀티 프로세스 : 동일한 작업을 수행하는 단일 스레드 프로세스를 여러개 실행하는 것
- 멀티 스레드: 하나의 프로세스를 여러 스레드로 실행하는 것
- 멀티 프로세스 방식을 사용하면 각각은 자원을 공유하지 않고 메모리를 각각 차지하며, 별개로 실행됨
copy on write 기법을 사용해 프로세스끼리 자원을 공유하고 메모리에 중복 저장하지 않는 방법이 있음
프로세스 간 통신(IPC) 를 사용해 프로세스 간 자원을 주고받을 수 있음
- 멀티 스레드 방식에서는 각각의 스레드의 ID, 프로그램 카운터 등의 레지스터 값, 스택값을 가지지만, 프로세스가 가지는 자원을 공유하게 됨
출처:
https://www.youtube.com/watch?v=Jjfah3t_xWk&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=28
혼자 공부하는 컴퓨터 구조+운영체제, 강민철, 한빛미디어