관리 메뉴

Value Creator의 IT(프로그래밍 / 전자제품)

(멀티) 프로세스, (멀티) 쓰레드, 임계영역, 뮤텍스, 세마포어 본문

1. 프로그래밍/4) Network

(멀티) 프로세스, (멀티) 쓰레드, 임계영역, 뮤텍스, 세마포어

valuecreatort 2020. 1. 8. 18:39
반응형

1. 멀티프로세스의 특징

프로세스 신규 생성은 운영체제가 부담을 느끼는 작업이다.

프로세스 마다 독립된 메모리 공간을 보유하기 때문에 프로세스 사이에서 메시지를 주고받는 구현이 어렵다.

(별도의 IPC 기법을 적용해야 한다.)

컨텍스트 스위칭을 하기 때문에  CPU에 부담이 많이 된다.(컨텍스트 스위칭은 CPU를 매우 작은 시간 단위로 프로세스 끼리 나눠서 사용하는 것이다. 때문에 사용자는 수많은 프로그램이 동시에 실행되는 것처럼 보이는 것이다.)

 

2. 쓰레드의 특징

쓰레드는 경량화된 프로세스이다.

쓰레드의 생성 및 컨텍스트 스위칭은 프로세스의 그것보다 빠르다.

쓰레드 사이의 데이터 교환은 특별한 기법이 필요하지 않다.

 

프로세스의 스택 영역만 분리시키면 다음과 같은 장점이 있다.

- 컨텍스트 스위칭시 데이터 영역과 힙은 올리고 내릴 필요가 없다.

- 데이터 영역과 힙을 이용해서 데이터 교환을 할 수 있다.

 

프로세스 : 운영체제 관점에서 별도의 실행흐름을 구성하는 단위

쓰레드 : 프로세스 관점에서 별도의 실행흐름을 구성하는 단위

 

하나의 프로세스에 여러개의 쓰레드를 만들 수 있다.

 

3. 임계영역

둘 이상의 쓰레드가 동시에 호출하면 문제를 일으키는 문장이 하나 이상 존재하는 함수

쓰레드에 안전한 함수(thread safe function)

: 임계영역이 있더라도 둘 이상의 쓰레드가 동시에 접근했을 때 문제가 생기지 않도록 조치해 놓은 함수

 

쓰레드에 불안전한 함수(thread unsafe function)

 

ex) 쓰레드에 불안전한 함수 : gethostbyname,

쓰레드에 안전한 함수 : gethostbyname_r

헤더 파일 선언 이전에 매크로 _REENTRANT를 정의하면 매번 _r을 쓰지 않아도 된다.

 

명령어 gcc -D_REENTRANT mythread.c -o mthread -lpthread

 

수십개의 쓰레드가 동시에 하나의 변수에 접근해서 변화를 발생시킬 때 알 수 없는 오류가 발생할 수 있다.

 

4. 동기화

한 쓰레드가 어떤 변수에 접근해서 연산완료할 때까지, 다른 쓰레드가 그 변수에 접근하지 못하도록 하는 것

 

5. 동기화 기법 - 뮤텍스, 세마포어

1) 뮤텍스 : Mutual Exclusion. 쓰레드의 동시 접근 허용하지 않음.

뮤텍스는 자물쇠와 같은 시스템이다. 뮤텍스를 이용해서 특정 변수로 접근하는 쓰레드를 차단하면, 나머지 쓰레드는 대기줄에서 기다린다. 뮤텍스를 사용한 쓰레드가 뮤텍스를 반환하면, 대기줄에 기다리던 순서대로 쓰레드가 변수에 접근할 수 있다.

뮤텍스 생성, 삭제, 잠금, 잠금해제 함수가 있다.

단, 뮤텍스 잠금 함수를 호출한 뒤, 잠금 해제 함수를 호출하지 않으면 뮤텍스 잠금 함수는 블로킹 상태에서 빠져나가지 못한다. 이를 데드락 상태라 한다.

뮤텍스 잠금 함수, 잠금 해제 함수 호출은 오랜 시간이 걸리기 때문에, 함수 호출 횟수를 최소화 한다.

 

2) 바이너리 세마포어

sem_post

sem_wait

 

sem_wait함수를 이용해 블로킹 시키고, sem_post 함수를 이용해 블로킹 해제를 시킨다.

 

 

 

 

반응형
Comments