티스토리 뷰

정리/운영체제

프로세스(process)와 스레드(thread)

갈치참치꽁치멸치 2018. 11. 17. 20:20

프로세스는 실행중인 프로그램이라고 할 수 있다. 

하나의 프로세스의 메모리는 heap, stack, data, code 영역을 갖는다.

프로세스는 스레드를 포함한다.


스레드는 프로세스 안에서 실행되는 흐름의 단위 이다.

스레드는 stack만 따로 갖고 heap, data, code 영역은 공유하여 사용한다.


각각의 프로세스끼리는 독립적이지만 스레드끼리는 자원을 공유하여 사용하기 때문에 독립적이지 않다.

병렬 처리 기법인 멀티 프로세스, 멀티 스레드를 보며 차이를 알아보자.


프로세스나 스레드는 한 번에 한개씩 동작한다고 생각하면 좋다. 

한 번에 한개씩 동작하는 프로세스를 동시에 사용하기 위해서는 여러개의 프로세스를 빠른 속도로 번갈아가며 실행하는 것이다. 

빠른 속도로 번갈아가며 실행하기 때문에 동시에 사용하는 것처럼 보이는 것이지 실제로 완전히 동시에 실행되진 않는다.


다른 프로세스를 실행 하기 위하여 현재 프로세스의 상태(Context)를 저장해두고 다음 프로세스의 저장된 상태(Context)를 불러와 프로세스를 실행한다. 


이 과정을 Context Switching 이라고 하는데 프로세스는 스레드에 비해 큰 오버헤드가 발생한다.


왜냐하면 각각의 프로세스들은 서로 메모리 공간을 공유하지 않는 것에 비해 스레드는 스택(stack) 영역을 제외한 나머지 메모리 공간들을 모두 공유하여 사용하기 때문에 프로세스가 상대적으로 초기화 해야하는 것이 많기 때문이다.


하지만 멀티 스레드에서는 메모리를 공유하여 사용하기 때문에 동시에 같은 자원에 접근하는 문제가 발생한다.

이런 문제 때문에 같은 자원을 공유하는 스레드임에도 불구하고 서로 다른 값을 출력할 수 있다. 이렇게 동시에 접근할 수 있는 자원이 있는 영역을 임계영역이라고 한다.

이런 문제를 해결하기 위해 스레드가 자원을 점유하게 되면 다른 스레드들이 접근하지 못하게 자원에 lock을 걸어주어야 한다.


문제가 다 해결된 듯 하지만 여기서 또 문제가 발생한다.

A thread가 1번 리소스를 사용하고 있고 B thread가 2번 리소스를 사용하고 있다고 가정해보자.

A thread는 2번 리소스를 사용하고 싶어 2번 리소스의 lock이 해제되길 기다리고 있다.

B thread는 1번 리소스를 사용하고 싶어 1번 리소스의 lock이 해제되길 기다리고 있다.


이 둘은 서로 자원이 해제되길 영원히 기다리게 된다.

이 것을 교착상태(Dead Lock)이라고 한다.


현재는 교착상태를 완전히 해결하는 방법이 없어서 최소화하려고 노력해야한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함