본문 바로가기

전공지식/운영체제

[운영체제] 프로세스와 쓰레드

1. 프로세스와 쓰레드


1.1 프로세스와 쓰레드의 정의

- 프로세스 : 현재 실행 중이거나 곧 실행이 가능한 프로세스 디스크립터(PCB)를 가진 프로그램. 

- 쓰레드    : 프로세스 내에서 분리된 실행 흐름.


1.2 프로세스와 프로그램의 정의

- 프로세스 : 다음 명령어를 수행하게 지정하는 프로그램 카운터를 가진 능동적(Active)인 단위를 의미.

- 프로그램 : 단순히 디스크 상에 저장된 파일의 내용으로서 수동적(Passive)인 단위를 의미.


1.3 프로세스와 쓰레드의 차이

     프로세스와 쓰레드는 메모리 관리에서 차이점을 가지고 있다.



- 프로세스는 자신만의 고유 메모리 공간을 할당받아 사용.

- 쓰레드는 메모리 공간에서 Register, Stack을 독립적으로 가지고, 나머지 메모리 공간 Code, Heap, Data등은 서로 공유.

- 쓰레드의 구체적인 차이점

1) 스택을 독립적으로 할당하는 이유
- 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다.
- 따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고, 이는 독립적인 실행 흐름이 추가되는 것이다.
- 결과적으로 실행 흐름의 추가를 위한 최소 조건이 독립된 스택을 제공하는 것이다.

2) 코드 영역을 공유
- 프로세스는 독립적인 구조이기 때문에 다른 프로세스의 Code영역에 있는 함수를 호출할 수 없다.
- 쓰레드는 Code영역을 공유하기 때문에 두 개 이상의 쓰레드가 자신이 포함된 프로세스의 Code영역에 있는 함수를 호출할 수 있다.

3) 데이터 영역과 힙 영역을 공유
- 전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 이를 통해 쓰레드 간 통신을 할 수 있다.
- 대신 동시에 메모리에 접근하기 때문에 주의해야 한다.


4) 쓰레드의 경우 프로세스보다 컨텍스트 스위칭 속도가 더 빠르다.

a) sp(Stack Pointer), fp(Frame Pointer), pc(Program Counter) 레지스터
- pc는 실행해야 할 명령어의 위치를 가리키는 레지스터이다.
- 쓰레드별로 main함수를 독립적으로 가지고 있고, 함수 호출도 독립적으로 진행되기 때문에 쓰레드별로 현재 pc값은 달라야 한다. 따라서 pc는 공유되지 않는다.
- 쓰레드는 독립적인 스택을 가지기 때문에 스택의 정보를 담고 있는 sp와 fp는 공유되지 않는다.

b) 범용적으로 사용가능한 레지스터
- 시스템을 어떻게 디자인 하느냐에 따라 달라지는 것이기 때문에 일반적으로 공유된다고 할 수 없다.


=> 다중 스레드의 경우 Register Set을 switching 하는 과정에서 프로세스 내부적으로 Thread Stack을 제외한 모든 메모리 공간을 공유하기 때문에 스택에 관련된 몇개의 레지스터만 바꾸는 과정이 (ex fp, sp // frame pointer, stack pointer) 프로세스 Context Switching 과정을 대신합니다.

c) 캐시메모리
-캐시 메모리는 CPU에서 한번 이상 읽어 들인 메인 메모리의 데이터를 저장하고 있다가 CPU가 다시 그 메모리에 저장된 데이터를 요구할 때 메인 메모리를 통하지 않고 바로 값을 전달하는 용도로 사용된다.
-프로세스 사이에서 공유하는 메모리가 하나도 없기 때문에 컨텍스트 스위칭이 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.
-쓰레드는 캐쉬 정보를 비울 필요가 없기 때문에 프로세스와 쓰레드의 컨텍스트 스위칭 속도의 차이는 이때 발생한다.


=> 실제로 다중 프로세스보다 다중 스레드가 빠른 이유는 Cache 메모리에 있습니다. 캐쉬는 CPU에서 읽어들인 메인 메모리의 데이터를 임시적으로 저장하고 있다가 CPU가 다시 필요할때 다시 전달해주는 용도로 사용합니다. (메인메모리로의 접근하는 경우보다, Cahce를 사용할때 훨씬 빨라집니다.) 다중 프로세스의 경우, 이 캐쉬메모리에 올리는 데이터를 계속 갱신시켜야 합니다. 하지만, 다중 스레드의 경우 A스레드, B스레드 모두 메모리를 공유하기 때문에 데이터를 갱신시킬 필요가 없습니다. 이때문에, 스레드는 다중 프로세스보다 수배, 수십배 더 빠릅니다.


=> 이러한 쓰레드의 메모리를 공유한다는 점은 컨텍스트 스위칭의 속도차이를 만들어낸다. (프로세스보다 컨텍스트 스위칭이 좀 더 빠르다.)
     (쓰레드가 프로세스보다 컨텍스트 스위칭 속도가 더 빠른 이유 구체적으로 적기)


1.4 프로세스 상태도

- 하나의 프로세스가 시스템 내에 존재하는 동안 그 프로세스는 계속해서 여러 가지 사건들로 일련의 서로 구분되는 상태 변환을 거치게 된다.

이러한 상태에는 보류(Pending), 준비(Ready), 실행(Running), 대기(Blocked), 완료(Terminated) 상태 등이 있다. 단일 프로세서 시스템에서의

프로세스는 단지 1개의 프로세스만이 실행 상태에 있고, 준비 상태나 대기 상태의 프로세스 들은 여러 개 존재할 수 있다.



[프로세스 상태 전이도]


※ 서스펜드(Suspend) : 메모리에서 디스크로 빼는 작업.


※ 디스패치(Dispatch) : (준비상태 → 실행상태) /  준비 상태의 프로세스들 중에서 우선순위가 가장 높은 프로세스를 선정하여 CPU를 할당.  이 때 CPU의 할당 시간(보통 100ms) 지정. 프로세스는 준비 상태에서 실행상태로 전환되고 이 때 컨텍스트 스위칭이 일어난다.


※ 할당시간 초과(Timeout) : (실행상태 → 준비상태) / 지정된 CPU의 할당시간을 모두 사용한 프로세스는 다른 프로세스를 위해 CPU가 선점되고, 그 프로세스는 준비상태로 전환.


※ 대기(Block) : (실행상태 → 대기상태) / 실행중인 프로세스가 입출력 명령을 만나면 인터럽트가 발생하여 CPU를 양도하고, 자신은 스스로 대기 상태로 전환.


※ 깨움(Wake up) : (대기상태 → 준비상태) / 입출력 완료를 기다리다가 입출력 완료 신호가 들어오면, 대기 중인 프로세스는 준비 상태로 전환.


※ 할당 시간(time slice, time quantum) : 하나의 프로세스가 CPU를 독점하는 것을 방지하기 위해 지정된 시간 동안에만 프로세스가 CPU를 점유하도록 하는 시간을 의미하며, 할당시간이 너무 길면 CPU가 비선점 효과를 갖게 되어, 특정 프로세스에게 독점되고 할당시간이 너무 짧으면 컨텍스트 스위칭이 자주 발생하여 부하가 증가.


1.5 PCB(Process Control Block)

- 프로세스 제어 블록(PCB) 또는 태스크 제어 블록(TCB : Task control block), 프로세스 디스크립터로도 불리며, 운영체제에게 프로세스에 대한 중요한 정보를 제공해주는 자료구조 테이블. 운영체제가 CPU를 다른 프로세스에게 넘겨주고자 할 때, 프로세스에 관한 모든 정보를 PCB에 저장시키고 나서 다시 실행하고자 할 때는 PCB에 보관된 정보를 재사용.


- PCB 내용

* 프로세스 식별자 (Process ID)

* 프로세스 상태(Process State): 생성(create), 준비(ready), 실행(running), 대기(waiting), 완료(terminated) 상태가 있다. - 유예준비상태suspended ready, 유예대기상태suspended wait 는 스택이 아닌 disk에 저장된다.

* 프로그램 계수기 (Program Counter): 프로그램 계수기는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.

* CPU 레지스터 및 일반 레지스터

* CPU 스케줄링 정보: 우선 순위, 최종 실행시각, CPU 점유시간 등

* 메모리 관리 정보: 해당 프로세스의 주소 공간 등

* 프로세스 계정 정보: 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등

* 입출력 상태 정보: 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등


1.6 멀티프로세스, 멀티프로그래밍, 멀티태스킹, 멀티스레딩의 차이


a) 멀티프로세싱

멀티프로세싱은 단어 그대로 하나의 프로세서가 아닌 하나 이상의 프로세서가 서로 협력하여 일을 처리하는 것을 가르킨다. 처리해야 하는 작업이 간단한 경우에는 상관 없지만 많은 작업을 빠른 시간에 처리하기 위해서는 여러개의 프로세서가 하나의 작업을 병렬처리 하는 것이 효율적이다. 즉 하나 이상의 프로세서가 작업을 병렬처리하는 것으로 정의한다.


b) 멀티프로그래밍

배경 : 초기의 컴퓨터는 하나의 프로그램을 처리한 후에 다음 프로그램을 처리해야 했다. 하지만 하나의 프로그램을 사용할 때 프로세서의 처리속도와 입출력 속도간의 차이가 너무 크기 때문에 입출력 작업이 완료될 때 까지 프로세서는 대기해야 한다. 이후에 하나의 프로그램 처리를 마무리하면 다음 프로그램을 수행할 수 있었다.


이것은 프로세서의 자원을 낭비하는 결과를 가져온다. 따라서, 프로세서가 입출력 작업의 응답을 대기할 동안 다른 프로그램(프로세스)을 수행시킬 수 있도록 하는 것이 멀티프로그래밍이라 한다. 요즘은 모든 운영체제에서 멀티프로그래밍을 지원하기 때문에 잘 쓰이지 않는 용어이다. 

다시 정리하면, 멀티프로그래밍은 프로세서의 자원 낭비를 최소화하기 위해 낭비되는 시간을 다른 프로그램 수행에 쓰게 하여, 하나의 프로세서에서 여러 프로그램(프로세스)을 교대로 수행할 수 있게 하는 것이다.


※ 멀티태스킹과 그 개념이 유사하므로 혼동 유의할 것.


c) 멀티태스킹

멀티태스킹을 알아보기 전에 우선 작업을 뜻하는 태스크(task)에 대해서 알아보자. Task를 Wikepedia에서 찾아보면 공통된 언어 상에서 성취하고자 하는 문제의 집합 중 한 부분이라고 정의되어 있다. 또한, 프로젝트 관리에서의 Task의 의미는 프로젝트를 정해진 기간내에 성취하기 위한 활동이라고 한다. 컴퓨터 관점에서 보면 메모리에 로드되어 있는 명령어 집합이라고도 정의되어 있다.

여러 가지 의미가 존재하지만 간단히 말해 Task는 어떤 정해진 일을 수행하기 위한 명령어 집합이라고 하자. 이러한 의미가 앞서 말한 프로그램이 될 수 있겠지만 조금 차이점이 존재한다. 하나의 프로그램은 프로그램내에 정의에 따라 하나 또는 그 이상의 프로세스가 될 수 있다. 하지만 프로그램이 동작하기 위해서는 프로그램 실행으로 메모리에 로드된 프로세스 외에도 이미 수행되고 있는 운영체제 상의 많은 프로세스와 상호작용이 필요하다.

따라서, 하나의 Task라는 개념은 프로세스의 개념보다 조금 확장된 개념이라고 생각해야 한다. 이러한 Task가 하나의 프로세서 상에서 운영체제의 스케줄링에 따라 조금씩 번갈아 가면서 수행되는 것이 멀티태스킹이다. 조금씩 아주 빠르게 동작하기 때문에 사용자는 마치 동시에 동작하는 것처럼 느끼게 된다.

멀티프로그래밍과 다른 점은 프로그램과 Task의 구분으로도 그 의미가 다르겠지만 멀티프로그래밍이 낭비되는 자원을 최소화 하기 위해 교대로 실행하였다면 멀티태스킹은 좀 더 확장해서 정해진 시간 동안 교대로 Task를 수행하는 것이다. 인터넷을 하면서 음악을 교대로 실행하였다면 멀티태스킹은 좀 더 확장해서 정해진 시간 동안 교대로 Task를 수행하는 것이다. 인터넷을 하면서 음악을 들을 수 있는 것도 멀티태스킹이 가능하기 때문이다.

여러 일을 동시에 교대로 처리한다는 점에서 멀티프로그래밍과 멀티태스킹과 그 의미가 같다. 둘의 차이점을 구별하는 것은 서로 상이한 관점이 존재하기 때문에 멀티프로그래밍이라는 용어보다 멀티태스킹이라는 용어를 쓰는 것이 일반적이라는 것을 알아두자.


d) 멀티스레딩

멀티스레딩은 프로세스와 스레드의 차이를 안다면 쉽게 구별이 가는 개념이다. 스레드는 프로세스 내에서 생성되는 하나의 실행 주체이다. 한 프로세스 내에서 생성되는 것으로 여러 개가 동시에 생성이 가능하다. 또한 생성된 여러 스레드는 하나의 공유메모리를 가진다. 그렇기 때문에 서로 간의 정보를 주고 받는데 제한이 없는 것이다. 

예를 들어, 네트워킹을 지원하는 프로그램이 있다고 가정하자. 한 프로그램 내에 사용자가 접속할 때 마다 사용자 각각을 처리할 수 있는 처리모듈이 생성되어야 한다. 이것이 스레드이다.

멀티스레딩이 멀티태스킹과 구별되는 점은 말한대로 서로 간의 자원공유가 가능하며, 프로그래밍을 통해 구현이 가능하다는 점이다. 하지만 멀티태스킹은 운영체제에서 지원해주는 것으로 서로간의 자원이 공유되지 못하기 때문에 자원 전달을 위해서 별도의 IPC를 구현해야 하며, 멀티스레딩에 비해 운영체제에게 부담을 줄 수 있다.

하지만 멀티태스킹은 서로 간의 독립된 메모리를 가지고 있기 때문에 독립된 수행이 가능하므로 멀티스레딩과 멀티태스킹을 그 용도에 맞게 적절히 사용해야 한다.


1.6 Context Switch



[Context Switch Flow]


- Running 상태의 Task가 사용하던 context를 메모리 특정 영역에 저장한 후 새로이 수행될 Task의 context를 PCB 또는 Stack 에서 CPU의 레지스터 영역으로 복사하여 새로운 Task가 수행되도록 하는 일련의 작업.


1) 인터럽트나 시스템 콜에 의해 문맥교환 요구

2) 유저 모드 -> 커널 모드

3) 기존 프로세스의 현재 HW상태 정보를 PCB에 저장

4) 다음에 실행할 프로세스의 상태 정보를 PCB에서 복구한 후 다음 프로세스를 실행

5) 유저 모드 -> 커널 모드



- Context Switch 오버헤드와 해결방안



가. 오버헤드 발생시점


 

나. 해결방안

- Context Switch가 자주 발생하지 않도록 다중 프로그래밍 정도 낮춤

- 스택 중심의 시스템에서는 스택 포인터를 변경하여 프로세스간 문맥교환 수행

- Light weight 프로세스인 스레드를 이용하여 Context switch 부하 최소화

'전공지식 > 운영체제' 카테고리의 다른 글

[운영체제] 교착상태  (0) 2017.03.09
[운영체제] 프로세스 동기화  (0) 2017.03.09
5장 CPU Schedule  (0) 2016.12.18