프로세스 기초
프로그램은 저장장치에 저장된 명령문의 집합체를 의미한다.
프로세스는 메모리에 적재되어 실행중인 프로그램을 의미하고, 다음 구조로 이루어진다.
- Code 영역
- 자신을 실행하는 코드가 저장되어 있다.
- Data 영역
- 전역 변수와 정적(static) 변수가 저장되어 있다.
- Heap 영역
- 프로그래머가 런타임 시 동적으로 메모리를 할당하는 데에 쓰인다.
- Stack 영역
- 지역 변수와, 함수 호출을 했을 때 필요한 정보들이 저장된다.
멀티프로그래밍 & 멀티프로세싱
- 유니프로그래밍 (Uniprogramming)
- 메모리에 오직 하나의 프로세스가 올라온 것을 의미한다.
- 멀티프로그래밍 (Multiprogramming)
- 메모리에 여러 개의 프로세스가 올라온 것을 의미한다.
- 멀티프로세싱 (Multiprocessing)
- CPU관점에서, 실행할 여러 개의 프로세스를 동시에 처리하는 것이다.
- 유니프로그래밍으로도 멀티프로세싱이 가능한데, 이때는 Swapping을 이용한다.
PCB (Process Control Block)
운영체제가 프로세스를 관리하기 위해 개별 프로세스별로 해당 프로세스의 정보를 저장해놓은 데이터 블럭이다.
PCB는 연결리스트 형태로 저장된다.
- 포인터
- 부모와 자식 프로세스에 대한 포인터
- 할당된 자원에 대한 포인터
- 프로세스 상태
- 생성 / 준비 / 실행 / 대기 / 완료
- 프로세스 ID
- 프로그램 카운터
- 다음에 실행될 명령어의 주소를 저장
- 레지스터 정보
- 프로세스가 실행될 때 사용했던 레지스터 값
- 메모리 관련 정보
- 프로세스가 메모리에 있는 위치 정보, 경계레지스터 값 등
- CPU 스케줄링 정보
- CPU 스케줄링 우선순위, 최종실행시간, CPU점유시간 등
프로세스 상태
- 생성 New
- PCB를 생성하고 메모리에 프로그램 적재를 요청한다. 승인 시, 준비상태가 된다.
- 준비 Ready
- CPU 사용을 위해 대기중인 상태.
- 실행 Running
- 준비 상태의 프로세스가 CPU를 할당받아 실행중인 상태
- 실행단계의 프로세스 수는 CPU의 개수와 같다.
- 스케줄러에 의해 CPU를 뺏기면 다시 준비상태로 돌아가게 된다.
- 대기 Waiting
- 프로세스가 입출력 요청을 했을 때 기다리는 상태
- 완료 Terminated
- 메모리에서 프로세스의 데이터와, PCB를 제거한다.
컨텍스트 스위칭
프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해, 실행중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 교체하는 작업이다.
이러한 컨텍스트 스위칭이 일어날 때, PCB의 내용 또한 변경된다.
실행중이었던 프로세스의 작업내역을 PCB에 저장하고, 불러올 프로세스의 PCB 데이터를 읽어 와 예전 상태를 복구한다.
프로세스의 생성과 종료
프로그램의 코드영역과 데이터영역을 메모리에 로드하고, 빈 스택과 힙을 만들어 공간을 확보하게 된다.
이후, 이 프로세스를 관리하기 위한 PCB를 만들어서 값을 초기화한다.
이후 추가적인 프로세스 생성은 fork()
함수를 통해서 이루어지는데, 이렇게 하면 새로 만드는 것보다 더 빠르게 생성이 가능하다.
이러한 자식 프로세스들에 다른 작업을 지시하기 위해서는, exec()
함수를 통해 구현된다.
쓰레드
운영체제가 작업을 처리하는 단위는 프로세스이다.
thread는 프로세스 내에 존재하는 것으로서, 프로세스당 1개 이상이 존재할 수 있다.
또한, 이러한 쓰레드는 프로세스 내부의 코드, 데이터, 힙 영역을 공유하고, 개별적인 스택 영역을 가진다.
PCB와 마찬가지로 쓰레드도 관리를 위해 TCB (Thread Control Block) 으로 관리된다.
프로세스는 서로 독립적이므로 어떠한 프로세스에 문제가 발생했을 때 이를 처리하고 재실행할 수 있는데,
쓰레드는 문제가 생기면 해당 프로세스 내의 모든 쓰레드에 문제가 생기게 된다.
속도와 자원 면에서는, 프로세스는 자원을 개별적으로 가지고 있고, 프로세스간 통신은 IPC를 이용하여 오버헤드가 큰 반면,
쓰레드는 자원을 스택을 제외하고 공유하며, 통신은 이러한 특성 덕에 매우 오버헤드가 적다.
'공부한 이야기 > 윈도우 OS' 카테고리의 다른 글
IV : 컴퓨터 구조에 대한 두번째 이야기 (0) | 2023.04.29 |
---|---|
III : 64비트 기반 프로그래밍 (0) | 2023.04.29 |
II : 아스키코드 VS 유니코드 (0) | 2023.04.29 |
I : 컴퓨터 구조에 대한 첫번째 이야기 (0) | 2023.04.29 |
운영체제 기초 (0) | 2022.08.12 |