프로세스 - 실행중인 프로그램!
OS 입장에서 보면 프로세스는 일의 한 단위!
프로세스는 일을 하는 동안 다음과 같은 자원들을 충족을 해야 한다.
1. CPU 점유 시간
2. 메모리
3. 파일들
4. I/O
프로세스는 메모리를 4가지의 레이아웃으로 나눠서 점유를 한다.
1. 텍스트 : 실행 가능한 코드에 대해 저장을 한다.
2. 데이터 : 전역 변수 static
3. 힙 : 동적으로 프로그램이 런타임동안 할당받아서 사용하는 섹션
4. 스택 : 함수가 실행되었을 때 임시 데이터 공간, 함수이 파라미터, 리턴 주소, 지역변수
프로세스 상태
New : 프로세스가 생성이 되었다.
Ready : 프로세스가 프로세서에 배정받을 준비가 되었습니다.
Running : 명령어 실행중이다!
Waiting : 이벤트 발생(IO 그 외 등등의 시그널)이 발생한 후 이를 처리한 다음에 기다리는 상태
Terminated : 프로셋가 실행을 종료한 상태
PCB(Process Control Block) or TCB(Tack Control Block)
각각의 프로세스가 OS 차원에서 어떤 상태를 가지고 있는 가를 저장하기 위한 자료형
그럼 PCB에서는 무엇을 저장합니까?
1. Process State
2. Process Counter
3. CPU 레지스터
4. CPU-스케쥴링 정보
5. 메모리 관리 정보
6. 유저 관련 정보
7. IO 상태 정보 등등
다시 프로세스
(하나의 실행 스레드로 돌아가는) 실행중인 프로그램
하나의 컨트롤 중인 스레드는 하나의 프로세스가 실행될 수 있게 한다. (한번에 하나의 태스크만 실행할 수 있다.)
현대의 OS에는 하나의 프로세스에서 멀티스레드를 실행할 수 있게 해주는 것을 원칙을 하면서,
동시에 하나의 프로세스로도 여러개의 일을 한 번에 처리할 수 있다.
그래서 스레드는 무엇이냐?
경량화된 프로세스를 말하는 것이다! (Later~)
멀티프로그래밍의 목적!
항상 어떤 프로세스는 돌아가고 있어야 하고, 동시에 CPU의 활용이 MAX를 찍고 있어야 한다!
타임 슬라이싱(time slicing)
CPU 코어들이 프로세스를 처리하기 위해 바뀌는 과정
유저들은 프로세스 돌아가는 동인 각 프로그램에 상호작용이 가능하다.
스케쥴링 큐(대기열)
시스템 위에서 돌아가는 프로세스가 자신의 CPU Burst time을 기다리는 동안 ready queue라는 곳에 들어가 있는다.
즉 Process state가 ready 상태로 기다리고 있는다. 만약 프로세스가 waiting 상태였다면 waiting queue로 돌아간다!
이 말은 즉 이러한 정보들은 PCB가 관리를 한다.
context(문맥, 현재 상태) switch - PCB는 프로세스의 context를 표현한다.
인터럽트 발생!
시스템 현재 돌아가고 있는 프로세스의 문맥 상태를 보존을 해둔다.
그렇기 때문에 나중에 이 문맥 상태를 복원을 해서 다시 재개를 할 수 있게 해준다.
context switch가 결국은 하나의 일!
CPU의 코어가 다른 프로세스로 변환한다. (다른 일을 한다!)
그럼 현재까지 실행했던 프로세스의 상태를 저장하거나 지금까지 저장된 상태를 실행한다!
지금까지 실행한 프로세스가 아닌 다른 프로세스의 상태를 복원할 때도 PCB를 사용한다!
OS차원에는 이러한 매커니즘을 제공을 해줘야 한다.
New, Terminated
즉 프로세스의 생성과 종료의 과정도 제공을 해야한다.
몇몇의 프로세스를 생성할 때는 다음과 같은 과정도 있을 것이다.
2. 프로그램이 자기의 자식을 낳는 방식
2.1. 프로세스를 실행시켜주는 주체 : a parent process(부모 프로세스)
2.2. 새로이 생겨난 프로세스 : a child process(자식 프로세스)
이렇게 자식은 자식을 낳고, 이런 식으로 진행하다보니 OS의 실행 프로세스 자료구조는 Tree방식이다.
실행을 함에 있어서 두가지 방식이 있다.
1. 부모, 자식 프로세스가 동시에 작동을 하는 것
2. 자식 프로세스가 실행되는 동안 (즉 끝날 때까지) 부모 프로세스는 기다리고 잇는 것
자식 프로세스의 address space(주소 공간)을 어떻게 표현할까?
1. 자식 프로세스가 부모 프로세스의 주소를 복사해서 실행
2. 자식 프로세스가 새로 메모리에 로딩되서(즉 새로운 주소값을 가지고) 실행하는 것
프로세스가 끝난 경우
이 경우가 무슨 뜻인가? 코드의 마지막 선언까지 전부 실행 완료를 한 것!
이런 경우 OS의 차원에서 exit() 라는 시스템 콜을 사용한다.(Windows에서는 exit(int n) == return n)
OS는 이 프로세스가 사용하고 있던 자원(file, memory, IO buffer 등등)을 반환한다!
제대로 끝나지 않는 상태
1. 좀비 프로세스 : 자식은 끝났어 exit() 근데 부모 프로세스는 wait()를 안 했다.
예로 들어서 자식 프로세스가 끝났어! 부모 프로세스는 여전히 기다려.....
2. 고아 프로세스 : 부모 프로세스를 잃어버린 자식 프로세스
자식 프로세스가 있음에도 불구하고 wait()를 호출하지 않고 이미 프로세스가 끝났다.
UNIX 계열의 OS같은 경우에는
시스템 콜 fork() - 새로운 프로세스를 생성하는 시스템 콜
이렇게 만든 자식 프로세스는 부모 프로세스의 주소 공간을 copy를 한 프로세스
자식과 부모의 다른 점이 있다면
fork를 했을 때 return 값이 0인 경우는 child process고, 0이 아닌 경우는 부모 프로세스이다.
fork() 시스템 콜 이후에 부모 프로세스는 실행을 계속할 수 있다.
하지만 이 경우는 잘못하면 위에서 말한 고아 프로세스를 만들어 낼 수 있다.
그렇기 때문에 wait()라는 시스템 콜을 이용해서 이를 방지한다.
wait()???? 자식 프로세스 실행 중인 경우 자신은 알아서 ready queue로 들어가게 만들어 주는 시스템 콜이다.
'Operating System' 카테고리의 다른 글
[OS] CPU 스케쥴링 (0) | 2022.02.08 |
---|---|
[C#, OS] Monitor (0) | 2022.02.08 |
[OS] 쓰레드 (0) | 2022.01.20 |
[OS] 프로세스 간 통신 (0) | 2022.01.11 |
[Operating System] 1. OS란 무엇인가 (0) | 2021.12.21 |