Process 란?
Process란 실행중인 프로그램이다. 하드디스크에서 가상메모리를 거쳐 램메모리에 올라온 상태라고 볼 수 있다. CPU의 PC(Program Counter)는 램메모리에 올라온 프로세스의 코드/데이터/스택중 코드 한 부분을 포인팅을 하고 CPU는 PC가 포인팅 해주는 명령어를 읽어가며 작업을 처리한다. 이때 CPU의 PC가 프로세스의 어느부분을 가리키고 있는가, 다시말해 프로세스 전체 작업중 어느 부분을 지나가고 있는가를 프로세스의 문맥(context)이라고 부른다.
항상 메모리에 상주해있던 커널은 프로세스가 하나씩 올라올 때마다 커널의 코드/데이터/스택 중 데이터 공간에서 PCB(Process Control Block)를 통해 프로세스를 관리한다. 또한 특정 프로세스가 운체에게 시스템 콜을 하게되면 CPU의 PC는 커널의 코드를 향하게 되고 커널의 함수가 스택에 쌓이면 프로세스와 연관된 커널 스택이 쌓인다.
따라서 프로세스 문맥을 관리하기 위해서는 CPU와 프로세스 뿐만 아니라 커널의 PCB, 스택도 살펴보아야한다.
프로세스의 상태 (Process State)
프로세스의 상태는 5가지가 있다. - Running, Ready, Blocked(wait, sleep), New, Terminated
Running
프로세스가 CPU를 점유하고 CPU가 작업을 처리하고 있는 단계
Ready
프로세스가 메모리에 올라와서 CPU 점유하기 위한 줄을선 상태
Blocked(wait, sleep)
CPU를 점유해도 프로세스 작업이 멈춰있어야하는 단계 (I/O작업등으로 인해)
New
프로세스가 만들어지고 있는 상태
Terminated
프로세스 수행이 끝난 상태
1. Ready상태에서는 위와 같이 레디큐에서 CPU 점유할 예정인 프로세스들이 줄을 서다가
2. CPU를 점유하는 Running 상태에서 타이머가 완료되면 인터럽트가 들어오고 (시분할) 다시 레디큐에 줄을 선다
3. 만약 Running 중에 디스크 읽어오는 작업(I/O작업)이 들어오면 프로세스는 디스크 I/O 큐에서 줄을 서고 blocked 상태가 된다.
4. 디스크 작업(I/O작업)이 끝나면 CPU에 인터럽트를 걸고 프로세스가 운영체제에 의해 다시 컨텍스트를 복구한뒤 레디큐에서 줄을 선다.
5. 이러한 프로세스 큐들은 커널 데이터 영역의 PCB에 의해 관리된다.
(정확한 CPU스케쥴링은 줄선순서가 아닌 운영체제가 정해준 우선순위대로 처리된다)
Process Control Block (PCB)
PCB는 각 프로세스에 대한 중요한 정보를 저장하여 운영체제가 프로세스를 효율적으로 관리하고 제어할 수 있게한다. 특히 프로세스를 전환할 때 문맥 교환(context switch)을 수행하기 위해 필요하다. 위와 같이 PCB는 크게 4가지 정보를 담고 있다.
1. OS가 프로세스 관리를 위해 담아둔 정보
Process state, Process ID, Scheduling Information, Process Priority etc
2. 하드웨어
프로그램 카운터(다음에 실행할 명령어의 주소) 및 프로세스가 실행 중에 사용하고 있는 CPU 레지스터 내용
3. 메모리
코드, 데이터, 스택이 메모리 어디에 위치해 있는지 정보
4. 파일
프로세스가 사용하고 있는 리소스 정보
문맥교환 (Context Switch)
프로세스가 CPU를 점유하다 특정 이슈로 인해 CPU를 뺏기고 다른 작업을 하다 다시 복귀하면 처음부터 다시 시작하는 것이 아닌 이전 작업부터 시작하게 된다. 이와같이 CPU가 Process A에서 Process B 를 넘겨받는 과정을 문맥교환이라고 한다.
문맥교환 과정에서 CPU는 운영체제 데이터에 있는, 각 프로세스정보를 담고있는 PCB에 해당 프로세스 정보를 저장하고 넘겨받는 PCB의 프로세스 정보를 가져온다.
주의할 점은 시스템콜/인터럽트에 의해 CPU제어권이 프로세스에서 운체에게 넘어간다고 이를 문맥교환이라고 부른 것은 아니다. A 프로세스에서 제어권이 운체에게 넘어가고 다시 다른 B프로세스에게 제어권이 넘어갔을 때 이를 문맥교환이라고 부른다. 특히 타이머 인터럽트와 같이 프로세스를 넘기기 위해 들어오는 인터럽트의 경우는 문맥교환이라고 봐도 무방하다. 문맥교환이 없는 경우에도 context의 일부를 PCB에 저장하지만 문맥교환 하는 경우의 부담보다 훨씬 적다고 볼 수 있다.
프로세스 스케쥴링 큐
프로세스들이 줄서는 큐에는 세가지 종류가 있다. 프로세스는 각 큐들을 오가며 수행된다. 각 큐들은 위와 같이 링크드리스트 구조이며 PCB들이 줄줄이 연결되어있다. 이 순서에 따라 PCB들을 사용하여 문맥교환이 일어난다.
Job queue
현재 줄서고 있는 모든 프로세스 집합
Ready Queue
인메모리 상황에서 CPU 사용하는 거 기다리는 줄
Device Queue
I/O작업 기다리는 줄
프로세스들이 큐를 돌아다니는 모습을 도식화시키면 위와 같다. 프로그램이 시작되면 먼저 레디큐에 와서 줄을 선다. CPU작업중에 I/O 작업요청이나 타이머 인터럽트, 자식 프로세스 작업 등이 일어나면 위와 같이 수행되고 CPU에서 프로세스가 끝나면 빠져나가는 순이다.
스케쥴러(Scheduler)
스케쥴러에는 CPU스케쥴러도 있고 디스크 스케쥴러도 있지만 먼저 CPU스케쥴러부터 알아보자. 스케쥴러는 말그대로 프로세스를 어떻게 처리할지 스케쥴링 하는 것이다. CPU 스케쥴러는 크게 3가지 방식으로 나눈다.
장기 스케쥴러 (Job Scheduler)
장기 스케쥴러는 프로세스 중 어떤 것들을 ready queue로 보낼지 결정한다. 즉 프로세스에 memory를 주는 문제를 관리한다. 하지만 time sharing system(요즘 쓰이는 리눅스 윈도우 등등)들은 장기 스케쥴러가 없이 이미 프로세스가 메모리에 올라온채로 시작한다.
단기 스케쥴러 (CPU sheduler)
단기 스케쥴러는 timer interrupt가 걸릴 때마다 호출되는 스케쥴러로 어떤 프로세스를 다음번에 running시킬지 결정한다. 즉 프로세스에 CPU를 주는 문제를 관리한다.
중기 스케쥴러 (Swapper)
time sharing systme은 장기 스케쥴러를 안쓰는 대신 중기스케쥴러를 사용하게 된다. Swapper라고도 불리는 이 녀석은 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫒아낸다. 즉 프로세스에게서 메모리를 뺏는 역할을 수행한다. 동시성 프로그래밍에서 현대 운영체제는 장기 스케쥴러를 사용하지 않기 때문에 프로세스 메모리 관리를 중기 스케쥴러가 하게된다. (너무 많은 프로세스가 메모리에 동시에 올라가 있으면 문제가 되기 때문에) - 시스템 입장에서도 메모리관리를 장기보다는 중기 스케쥴러가 하는게 효율적
앞서 프로세스 상태에는 5가지가 있다고 했는데 중기 스케쥴러로 인해 1가지가 더 추가적으로 생겼다. 바로 Suspend(stopped) 상태이다. Bloked 와 같이 CPU를 얻을 수 없는 상태이지만 Blocked는 내부적인 이유(I/O등의 이벤트 기다림)로, Suspended의 경우 외부적인 이유(메모리 공간 부족으로 프로세스를 디스크로 쫒아냄 혹은 터미널 명령어로 중지시킴)로 프로세스 수행이 정지된 상태라는 차이가 있다.
Thread
프로세스가 실행되면 주소공간(코드/데이터/스택)이 만들어지고 이러한 프로세스 정보를 운체의 PCB에 담겨 관리된다. 이때 동시성 프로그래밍에서 여러개의 스레드를 돌린다는 것은 하나의 프로세스의 코드 데이터까지 띄워놓고 PCB에서 코드의 어느부분을 실행하고 있는지 알려주는 PC(Program Counter)를 병렬로 가지고 있는 것이다. 그리고 PC 하나하나의 정보를 담고 있는 것이 바로 Thread이다. 다시말해 스레드는 하나의 프로세스에서 여러개의 수행단위를 두고 각 개별 수행단위를 일컫는 것이다.
정리해보자면 Thread는 CPU의 수행단위이다. 따라서 하나의 프로세스의 스레드들은 코드, 데이터, OS자원을 공유하게된다(공유하는 부분을 task라고 부른다). 스레드들간의 별도로 가지고 있는 부분은 3개 - Program Counter, Resgier Set, Stack - 이다. 이러한 특성탓에 스레드를 가벼운 프로세스, lightweight process 라고 부르기도 한다.
이렇게 다중 스레드로 구성되면 하나의 프로세스를 처리하는 데 있어 어떤 스레드가 blocked(waiting) 상태라도 다른 스레드가 실행(running) 되어 빠른처리가 가능해진다. 이를 통해 높은 처리율(throughput)과 성능향상을 기대할 수 있다.
스레드 종류는 크게 커널 스레드와 유저 스레드가 있다. 전자는 운체의 스레드 후자는 라이브러리의 스레드이다. 커널스레드는 운영체제가 여러개의 스레드를 사용하고 있다는 것을 알고 CPU 스케쥴링과 같이 각 스레드별로 CPU를 넘겨준다. 반면 유저 스레드는 운체에서 보기에는 하나의 프로세스만 볼 수 있지 내부에 여러스레드가 있는지는 알 수 없다.
https://core.ewha.ac.kr/publicview/C0101020140318134023355997?vmode=f
'Computer Science > Operating System' 카테고리의 다른 글
Deadlocks (0) | 2024.06.07 |
---|---|
Process Synchronization (0) | 2024.06.04 |
CPU Scheduling (0) | 2024.06.02 |
Process Management (0) | 2024.06.02 |
System Structure & Program Execution (0) | 2024.05.28 |