본문 바로가기
Computer Science/운영체제

스레드 & 멀티스레드, 공유자원

by 콩순이냉장고 2022. 6. 24.

스레드 : 스레드는 프로세스의 실행 가능 한 가장 작은 단위 1개의 프로세스는 여러 스레드를 가질수 있습니다.

 

 

코드,데이터, 스택 힙을 각각 생성하는 프로세스와는 달리 스레드는 코드, 데이터, 힙은 스레드끼리 서로 공유함

 

 

멀티스레딩  :

멀티스레딩은 프로세스 내 작업을 여러개의 스레드, 멀티스레드로 처리하는 기법,

 

멀티 스레딩의 장점과 단점

 

장점

  1. 응답성 : 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가한다.
    ex) 멀티 스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에서 사용자와 상호작용 가능
  2. 경제성 : 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어든다. 스레드 간 통신이 필요한 경우에도 쉽게 데이터를 주고 받을 수 있으며, 프로세스의 context switching과 달리 스레드 간의 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.
  3. 멀티프로세서 활용 : 다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가한다.

 

단점

  • 임계 영역(Critical Section)? 둘 이상의 스레드가 동시에 실행하면 문제를 일으키는 코드 블록. 공유하는 자원에 동시에 접근하는 경우, 프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 따라서 동기화가 필요!
  • 동기화를 통해 스레드의 작업 처리 순서와 공유 자원에 대한 접근을 컨트롤할 수 있다. (Java에서 synchronized 키워드) 그러나 불필요한 부분까지 동기화를 하는 경우, 과도한 lock으로 인해 병목 현상을 발생시켜 성능이 저하될 가능성이 높기 때문에 주의해야 한다. 동기화 방법에는 뮤텍스와 세마포어가 있다. 
  • context switching, 동기화 등의 이유 때문에 싱글 코어 멀티 스레딩은 스레드 생성 시간이 오히려 오버헤드로 작용해 단일 스레드보다 느리다.

출처: https://eun-jeong.tistory.com/20 [흔들리며 피는 꽃:티스토리]

 

 

공유자원(shared resource) : 시스템 안에서 각 프로세스, 스레드가 함께 접근할수 있는 모니터, 프린터, 메모리, 파일 , 데이터등의 자원이나 변수등을 의미

 

경쟁상태(race condition)  : 공유자원을 두개 이상의 프로세스가 동시에 읽거나 쓰는 상황

 

 

공유자원 예시

 

 

임계영역(critical section) : 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역, 이를 해결하기위한 방법이 크게 뮤텍스 ,세마포어, 모니터 세가지가 있음 -> 상호배제, 한정기, 융통성이란 조건을 만족함

 

상호배제 : 한프로세스가 임계영역에 들어갔을때 다른 프로세스는 들어갈수 없다.

한정대기 : 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다.

융통성 : 한프로세스가 다른 프로세스의 일을 방해해서는 안된다.

 

 

뮤텍스(mutex) : 공유 자원을 사용하기 전에 설정하고 사용한 후에 해제하는 잠금, 잠금이 설정되면 다른 스레드는 잠긴 코드 영역에 접근 불가 그리고 뮤텍스는 하나의 상태(잠금 또는 해제)만 가짐 

 

 

세마포어(semaphore) : 일반화된 뮤텍스, 정수 값과 두가지 함수 wait(p함수) 및 signal(v함수)로 공유 자원에 대한 접근을 처리 wait()는 자신의 차례가 올 때가지 기다리는 함수이며 signal()은 다음 프로세스로 순서를 넘겨주는 함수

 

세마포어를 이용한 리소스 공유

가. 리소스 공유 매커니즘

 

  • N개의 태스크와 M개의 리소스 공유 시, 세마포어(계수형) 초기 값을 N개로 설정

나. 리소스 공유 절차

 

태스크가 세마포어를 획득해도 뮤텍스를 획득해야 리소스 접근 가능

 

세마포어를 이용한 태스크 간 동기화 방법

① Task A가 동기화 전처리 시작
② Task B는 동기화 세마포어가 POST 시그널 줄 때까지 wait
③ Task A가 동기화 전처리 완료
④ Task A, Task B 동기화 완료

 

 

태스크 간 동기화는 여러 태스크가 공유 자원에 접근할 경우 동일한 값을 얻을 수 있도록 조정(Sync)

  • 계수형 세마포어의 경우 태스크A 전처리 결과에 따라 계수 증가, 태스크는 누적된 계수만큼 처리

출처 : http://blog.skby.net/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4-semaphore/

 

 

바이너리 세마포어 : 0 과 1의 두가지 값만 가질 수 있는 세마포어, 뮤텍스는 바이너리 세마포어라고 할 수 있음, 그러나. 엄밀히 따지면 뮤텍스는 리소스에 대한 접근을 동기화하는데 사용 잠금 매커니즘,

세마포어는 신호를 기반으로 상호 배제가 일어나는 신호 메커니즘

 

카운팅 세마포어 : 여러개의 값을 가질 수 있는 세마포어, 여러 자원에 대한 접근을 제어하는데 사용

 

 

모니터 : 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공

 

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

프로세스와 스레드  (0) 2022.06.18
메모리  (0) 2022.06.03