본문 바로가기
Operating system

Thread

by 권성호 2021. 10. 31.

1.  강의 링크

https://www.inflearn.com/course/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B3%B5%EB%A3%A1%EC%B1%85-%EC%A0%84%EA%B3%B5%EA%B0%95%EC%9D%98/lecture/63031?tab=curriculum&speed=1.25 

 

운영체제 공룡책 강의 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

2.  정리

 

프로세스란, disk에 저장된 프로그램이 OS로부터 실행 대상이 되고 자원을 할당받아 실행 중인 상태라고 했다. 지금까지는 프로세스를 하나의 실행 단위로만 간주했는데, 프로세스 내부에서 여러 개의 실행 흐름을 가질 수는 없을까?

 

프로세스가 되기 위해 OS로 부터, 할당받는 자원으로는 [CPU time / Memory / IO-device / file]이 있다. 즉, 프로그램에 대한 하나의 실행 흐름을 갖기 위해 필요한 것이 [CPU time / Memory / IO-device / file] 자원이다. 하나의 프로세스에서 fork() 함수를 호출하면 이 모든 자원이 자식 프로세스를 위해 정확히 하나 더 복사가 된다. 그런데, 하나의 실행 흐름을 추가하기 위해 꼭 이 모든 자원이 복사되어야 할까? CPU time은 반드시 하나 더 필요하다. CPU를 구동하기 위해 필요한 register 값들도 필수적인 것들이 있다. 그런데, code 영역에 있는 인스트럭션은 꼭 하나 더 복사해야 할까? heap 영역에 있는 객체들이나 전역 변수도 꼭 하나 더 복사해야 하는 것일까?

 

하나의 실행흐름을 추가로 생성하기 위해 필요한 최소 자원은 [CPU time / Memory / IO-device / file]이지만 이중에선, 여러 실행 흐름이 공유할 수 있는 자원도 있다.

 

하나의 프로세스 내에서 공유할 수 있는 자원들은 공유하고 공유할 수 없는 자원은 독자적으로 소유하게 하여 여러 실행 흐름을 갖도록 한 것이 스레드이다.

 

(stack의 경우 공유하게 되면 실행 흐름을 독자적으로 유지하는 것이 어렵기 때문에, 스레드마다 독자적으로 갖도록 설계되었다.)

 

프로세스와 비교해서 스레드의 장점은 아래와 같다.

  1. 반응성: blocking 되는 작업이 발생하게 되면 별도의 스레드 하나 더 만들어서 blocking 작업을 맞기고 main 스레드는 다음 작업을 수행할 수 있는 구조
  2. 자원 공유: 하나의 프로세스 내의 스레드는 code 영역, data 영역을 공유 => 스레드 간 통신을 위해 IPC와 같은 작업을 할 필요가 없음
  3. 경제성: 프로세스에 비해 사용하는 메모리도 적고 문맥 교환 비용도 적다.
  4. 확장성: cpu 구조가 multi-core로 발전하게 되면 시분할 개념이 아니라 근본적으로 동시 처리를 core 수만큼 받을 수 있는데, 그 구조에 thread를 통한 동시성 코드가 적합..?(이건 잘 모르겠음..)

 

이러한 스레드의 특성은 분명 프로세스보다 강점을 가진다. 따라서 최근 대부분의 동시성 프로그램은 스레드를 기반으로 구현된다.

 

 

댓글