본문 바로가기

Computer Science/Operation System

[운영체제/OS] 프로세스와 스레드(Process and Thread)-PCB-Context Switch-Schedulers-Process Scheduling Queues-Process State- 컴도리돌이

728x90
728x90

outline

Process Concept

Process State

Process Control Block-PCB

Process Scheduling Queues

Schedulers

 

Threads

Process creation and terminated

Context Switch

User and Kernel Threads

Issue


프로세스(Process)

  • 프로세스란 실제 메모리에 적재되어 프로세서에 의해 실행되고 있는 프로그램을 의미한다. 즉, 프로그램을 구동하였을 때, 프로그램 자체와 상태가 메모리 상에서 실행되는 작업의 단위를 지칭한다.
  • 실행 중인 프로그램, 프로그램이 실행되는데 필요한 모든 것들을 저장하는 자료구조의 실체.

1) 메모리의 프로세스(Process in Memory)

  • 텍스트(text section) : 텍스트 영역은 실행 명령을 포함하는 코드들이 들어가는 부분이다. 프로그램을 시작할 때 컴파일한 프로그램이 저장되어 있고, 읽기 전용 영역이기에 프로세스가 함부로 변경할 수 없고 변경 시 오류를 발생한다.
  • 스택(Stack) : 프로그램이 자동으로 사용하는 메모리 영역으로 함수 호출과 관계되는 지역변수와 매개 변수가 저장된다. 스택 사이즈는 각 프로세스마다 할당되지만 프로세스가 메모리에 로드될 때 스택 사이즈가 고정되어 있어 런타임 시 스택 사이즈를 바꿀 수 없다.
  • 데이터(data section) : 프로그램이 실행될 때 생성되고 프로그램이 종료되면 시스템에 반환되며, 전역 변수, 정적 변수, 배열, 구조체 등이 저장된다.
  • 힙(Heap section) : 필요에 의해 메모리를 동적으로 할당할 때 사용하는 메모리 영역으로 동적 메모리 영역이라고 부른다. 위에 그림을 보면 스택과 힙 영역은 사실 같은 공간을 공유한다. 힙은 메모리의 낮은 주소부터 할당되면 스택은 높은 주소부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있지만 해당 영역이 매우 크기 때문에 매우 드문 현상이다. 만약 그럼 에러 현상이 일어나면 스택 오버 프로우, 힙 오버 프로우라고 한다.

2) 프로세스 상태(Process State)

  • New : 프로그램이 메인 메모리에 할당된다. 해당 프로세스 상태는 CPU의 스케쥴링 대상이 아니다.
  • Running : CPU가 해당 프로세스를 실행한다.
  • Waiting : 프로세스가 끝나지 않은 시점에서 입출력으로 인해 CPU를 사용하지 않고 다른 작업을 한다. 입출력 이벤트가 끝나기를 기다리는 상태이다.
  • Ready : 할당된 프로그램이 초기화와 같은 작업을 통해 실행되기 위한 모든 준비를 마치며, 일을 할 준비가 되었지만 아직 CPU에서 일을 주지 않아 기다리는 상태이다.
  • Terminated : 프로세스가 완전히 종료된다. 더 이상 CPU가 관여하지 않고 OS에서는 free를 시켜 소멸시킨다.

프로세스 상태

메인 메모리에 올라오는 상태인 new에서 CPU의 할당을 받을 준비가 끝나면 ready 상태로 넘어와 CPU 할당을 기다린다. CPU가 ready 상태인 프로세서를 할당하면 작업을 수행 중인 상태를 running이 되며, 입출력 같은 이벤트가 발생되면 인터럽트가 발생해 running 상태인 프로세스는 wating 상태로 넘어간다. running 상태인 프로세스가 끝날 경우 terminated 상태가 되어 해당 프로세서는 종료되며 free가 된다.


3) 프로세스 제어 블락(Process Control Block - PCB)

PCB는 프로세스에 대한 모든 정보가 모여있는 곳이며, PCB안에는 프로세스의 상태, 프로세스 번호, 해당 프로세스의 PC, 레지스터 값, CPU 점유 시간 등이 포함되어 있다. PCB는 운영체제 내부의 프로세스를 관리하는 코드 부분에 저장된다.  실제로 형태를 갖춘 자료구조이다.

 

CPU 스위치 (프로세스 간에)


4) 스케줄러(Schedulers) & 프로세스 스케줄링 큐(Process Scheduling Queues)

프로세스는 수행하면서 상태가 여러 번 변하는데 이에 따라 서비스를 받아야 하는 곳이 다르다. CPU를 기다리고 있는 프로세스가 여러 개이기 때문에 그에 따른 순서와 저장공간이 필요하다.

  • Job Queue : 하드 디스크에 있는 프로그램이 실행되기 위해 메인 메모리의 할당 순서를 기다리는 큐.
  • Ready Queue : CPU 점유 순서를 기다리는 큐.
  • Device Queue : 입출력을 하기 위한 여러 장치가 있는데, 각 장치를 기다리는 큐가 존재.

장기 스케줄러(Long-term Scheduler(or job scheduler)

  • 메모리는 한정되어 있는데 많은 프로세스들이 한꺼번에 메모리에 올라올 경우, 대용량 메모리에 임시로 저장된다. new 상태인 프로세스 중에 어떤 프로세스를 메모리에 할당하여 ready queue로 보낼지 결정하는 역할을 한다.
  • new -> ready(in memory)

단기 스케줄러(Short-term Scheduler or CPU scheduler)

  • Ready Queue에 존재하는 프로세스 중 어떤 프로세스를 running 시킬지 결정하는 스케줄러로, 프로세스에 CPU를 할당을 한다.
  • 단기 스케줄러는 매우 빈번하게 일어난다.
  • ready -> running -> waiting -> ready

중기 스케줄러(Medium-term Scheduler or Swapper)

 

중기 스케줄러

  • 멀티프로그래밍을 하게 되면 많은 프로세서들이 동시에 돌아가게 돼서 메모리를 확보해야 하는데 메모리 공간이 부족할 수 있다. 메모리를 차지하는 여러 개 프로세서 중에 한놈을 디스크로 Swap out을 시킨다. Swat out 한 프로세서 중에 필요할 때만 다시 Swap in을 하여 ready queue로 보내지만 프로세서를 OS 자체에 CPU를 잡게 해서는 안된다.
  • ready -> suspended , running -> waiting -> suspended

스레드(Thread)

프로세스는 프로세스에 의해 만들어지며, 컴퓨터가 부팅이 되면 운영체제가 메모리에 올라오는데 운영체제가 처음으로 수행하는 일 중에 하나는 최초의 프로세스를 생성하는 것이다. 처음 만들어진 프로세스가 다른 프로세스를 만들고 또 다른 프로세를 만드는 과정을 반복한다.

1) 프로세스 생성(Process Creation)

새로운 프로세스를 만드는 시스템 콜이 존재하며, 이는 포크(fork)라 한다. 만들어진 프로세스에서 어떠한 파일을 실행하려면 실행(exec) 시스템 콜을 사용한다.

 

  • 부모 프로세스는 자식 프로세스를 생성하고, 이는 다른 프로세스를 생성하며, 프로세스 트리를 형성한다.
  • 일반적으로 프로세스 식별자 pid(모든 프로세스는 id값을 가진다.)를 통해 프로세스 식별 및 관리를 한다.

자원 공유(Resource sharing)

  • case 1) 부모 및 자식은 모든 자원을 공유한다. -> 내용적으로 밀접한 관계일 때. text section이 동일하다.
  • case 2) 자식은 부모 자원의 하위 집합(일부 자원)을 공유한다.
  • case 3) 부모 및 자식 자원 공유 x : 내용 자체가 관계없을 때.

실행(Execution)

  • case 1) 부모 및 자식은 동시(concurrently)에 실행된다.
  • case 2) 자식 프로세스가 종료(terminate)될 때까지 부모 프로세스는 대기(wait)한다.

주소 공간(Address space)

  • 자식 프로세스는 부모 프로세스의 주소 공간(address space)을 복제(duplicate)된다. -> 별도의 프로세서라 결정되면 별도의 프로그램으로 내용이 채워진다.
  • 자식 프로세스에 저장된 프로그램이 존재한다.

UNIX 예시 (UNIX 예시)

  • 포크 시스템 호출(fork system call)로 새로운 프로세스를 만들어낸다.
  • exec 시스템 호출로 프로세스의 메모리 공간을 새 프로그램으로 바꾸기 위해 fork 뒤에 사용된다.
  • 1) 자원 공유 : 부모 프로세스와 자식 프로세스는 파일(file)을 공유한다. 
  • 2) 실행 : 부모 프로세스와 자식 프로세스는 동시에 수행(concurrently)된다.
  • 3) 주소 공간 : 자식 프로세스는 부모 프로세스의 정보를 복제되지만, 서로 다른 주소 공간을 갖게 되고, 여기에 새로운 프로그램을 로딩한다.
  • 4) fork() 함수의 특징은 부모에 의해서 호출된 후에, 복제할 때 부모와 자식 프로세스를 구분하기 위해 return 값을 pid of child, pid to parent 두 가지 다르게 하여 구분한다.

2) 프로세스 종료(Process Termination)

프로세스를 종료하는 시스템 콜은 종료(exit)이다. 한 프로세스가 종료되면 해당 프로세스가 사용한 모든 자원을 회수해야 한다. 이러한 횟수 된 자원과 권한은 모두 운영체제로 되돌아가야 한다.

 

case 1) 자식 프로세스가 많은 양의 자원을 보유할 때 종료된다.

case 2) 자식 프로세스에 할당된 자원이 더 이상 필요하지 않을 때 종료된다.

case 3) 부모 프로세스가 종료되었을 때 종료된다.


3) 스레드(Thread)

스레드는 프로세스의 실행 단위라고 할 수 있다. 한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 주소 공간이나 자원을 공유한다. 

 

스레드는 스레드 ID, PC, 레지스터 집합, 그리고 스택으로 구성된다. 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다. 하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능령을 향상하는 것을 멀티스레딩이라고 한다. 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 레지스터 값을 갖는다.

 

스레드는 공동의 목적을 달성하기 위해 병렬로 수행하며 이러한 스레드 이용은 사용자 응답성을 증가시키며, 프로세스 자원과 메모리 공유가 가능하며, 경제성이 좋고, 다중 처리로 성능과 효율을 향상할 수 있는 장점이 있다.


4) 멀티 스레드(Multithreaded)

하나의 프로그램에 스레드가 2개 이상 존재하는 것을 다중 스레드라고 한다. 이렇게 한 프로그램에 여러 개의 스레드를 사용하는 이유는 빠른 시간 간격으로 스위칭되기 때문이다. 이러한 동작으로 사용자는 여러 스레드가 동시에 실행되는 것처럼 보인다.

멀티스레드 프로세스에서는 레지스터와 스택과 같이 가변적으로 계속 변하는 실행 개체는 공유가 불가능하고, 코드, 데이터, 파일과 같은 자원은 공유할 수 있다.

멀티스레드를 사용하는 이유는 프로그램을 여러 개를 실행시키는 것보다 하나의 프로그램 내에서 여러 가지 작업을 실행하는 것이 효율적이다. 그렇기에 멀티 프로세스보다 멀티 스레드를 많이 사용한다.

 

문맥 전환(Context Switching) : 문맥 전환은 CPU가 한 프로세스에서 다른 프로세스로 옮겨가는 것을 말한다. 즉 한 프로세스가 실행 중인 것을 멈추고 다른 프로세스가 실행되는 것이다. 문맥 전환 단위는 프로세스가 아닌 스레드 단위이다.


5) 스레드와 프로세스

한 프로세스에는 기본적으로 하나의 스레드가 존재한다. 프로세스는 코드, 데이터 메모리 공간이 존재하는데, 이는 여러 스레드가 공유한다. 이외에도 프로세스의 자원이 파일, 입출력 등은 여러 스레드가 공유하지만, 각 스레드가 고유하게 가지고 있는 것은 PC, SP, 레지스터, 스택 등이 있다.


728x90
728x90