본문 바로가기
운영체제

프로세스와 쓰레드 그리고 Context Switching

by PainDiver 2022. 11. 26.

 

 

면접에서 Context Switching에 대해서 물어봤다.

 

아! 이거 학교에서 운영체제 시간 때 배웠는데!

 

근데 면접준비도 제대로 안하고 가니까 이걸 설명을 못하겠더라.

 

나중에 가서는 Context Switching이 프로세스끼리 발생하는건지 쓰레드끼리 발생하는건지 헷갈릴 지경.

 

쓰레드가 여럿이서 돌 때, 쓰레드 하나가 부여받은 시간동안 일을 한 후, 다음 쓰레드에게 바통을 터치하기전에, 현재 진행상황을 저장 한 후, 다음 올 쓰레드가 전에 했던 진행상황들을 다시 불러오는 과정이라고 말했는데, 면접관님들 표정이 싸늘했다.

 

너무 리액션이 없으니까 나중에 이게 프로세스 레벨에서 그러는건지 쓰레드 레벨에서 그러는건지 나 혼자 헷갈리더라.

하긴.. 진짜 비 전문적으로 보인다. 

 

그래서 정리하는 프로세스와 쓰레드 개념 그리고 Context Switching..

 

우선 그림으로 프로세스가 뭔지 보자

프로세스는 프로그램이 메모리상에서 올라와 실행되고있는 단위를 뜻한다.

디스크에 존재한다면 이것을 프로그램이라 부른다.

 

프로세스 안에 있는 영역들을 살펴볼까?

 

코드란 사용자가 작성하는 그  소스코드가 맞다.

 

데이터란 전역변수나 static 처럼, 프로그램 전역에서 사용되는 변수가 여기에 해당된다.

 

스택은 지역변수, 매개변수, 리턴 값 등 함수에서 사용되는 임시적인 변수들이라 보면되고,

 

힙은 동적으로 할당되는 메모리로 우리가 동적으로 생성하는 변수가 여기에 해당한다.

 

이 프로세스는 서로 다른 프로세스의 공간에 접근할 수 없고, 최소 1개이상의 쓰레드를 갖게 되는데 이게 메인쓰레드다.

 

그럼 쓰레드는 무엇이냐?

쓰레드는 이 프로세스 안에서 또 나뉘어져 독자적인 쓰레드 각자의 로컬공간과, 스택을 가지고 실행되는 여러 흐름이라 볼 수 있겠다. 여기서는 프로세스의 코드, 데이터, 힙을 공유한다.

 

쉽게 말해서, 우리가 멀티쓰레드 프로그래밍을 할 때 쓰레드를 만드는데, 그 때 c++ 이면 std::thread로 쓰레드를 생성하고 매개변수로 함수를 주지않나? 그렇다면 그 함수안에서 지역변수를 정의하게 되면, 다른 쓰레드는 그 변수에 접근할 수 가 없다.

 

그런데 이 말은 즉, 쓰레드 모두 데이터나 힙에 있는 자원은 공유하니까, 이 부분의 공유자원에 접근하는 문제가 굉장히 민감해진다. 그래서 락을 통해서 공유자원의 접근을 한 타이밍에 한 쓰레드만 할 수 있도록 막는 것이다.

 

 

자 이제, 프로세스와 쓰레드가 어떤건지는 알겠다. 그러면  Context Switching은 뭘까?

 

이 컴퓨터란게 사실 모든게 동시에 돌아가고있는 것 처럼 보이긴 하지만 실제로는 아니다

 

CPU가 각 프로세스 마다 스케쥴을 만들어서, 각 프로세스의 동작시간을 조금씩 분할하여, 마치 동시에 돌아가고 있게 하는것 처럼 보이는것이다.

 

허나 문제점이 있다. 이렇게 동작시간을 분할하려면, 동작점유시간을 넘겨줄 때 마다 현재 프로세스의 정보를 저장하고 다음 프로세스의 정보를 불러와야한다. 이 정보를 PCB라 하여, 프로세스 컨트롤 블락이라 한다. 

 

자, 이건 프로세스 레벨에서의 컨텍스트 스위칭이고,

 

쓰레드 레벨에서는 어떻나?

 

뭐 원리는 비슷하다. 쓰레드에서도 컨텍스트 스위칭이 일어난다.

 

쓰레드 없이 작업을 하는 것을 위 사진이라 가정하면

 

아래처럼 여러 쓰레드를 이용해 작업을 병렬적으로 진행하는데, 잘 보면 멀티쓰레드라고 사실 진짜 동시에 여러개가 진행되는건 아니고, 프로세스가 CPU에 점유시간을 받는 것처럼, 쓰레드 또한 프로세스에게 점유시간을 받게되면서, 컨텍스트 스위칭이 일어난다.

 

하지만 프로세스에 비해 컨텍스트 스위칭의 오버헤드는 적은 편이다.

 

왜냐면, 쓰레드 끼리 프로세스의 데이터, 코드, 힙 영역을 공유하니까 PCB블락만큼의 정보를 저장할 필요는 없기 때문에, 컨텍스트 스위칭의 비용이 적은, 병렬처리를 해야한다면 멀티쓰레드를 사용한다.

 

 

[Reference]

[OS] 프로세스와 스레드의 차이 - Heee's Development Blog (gmlwjd9405.github.io)

운영체제 5: 컨텍스트 스위칭 (Context Switching) :: 머신러닝을 배웠던 데이터 엔지니어 (tistory.com)

씹어먹는 C ++ - <15 - 1. 동시에 실행을 시킨다고? - C++ 쓰레드(thread)> (modoocode.com)

'운영체제' 카테고리의 다른 글

커널쓰레드와 유저쓰레드  (0) 2022.11.29
쓰레드의 생명주기  (0) 2022.11.29
운영체제 페이징 기법  (0) 2022.11.27