
|
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
스레드는 스택공간을 할당해준다.
쓰레드 관련 정보가 들어갈 공간
사이즈정보
쓰레스 스택의 시작주소 쓰레드의 시작 포인트 쓰레드 속성들
쓰레드가 스케줄링하는것도 프로세스에 비하면 오버해드가 적다
피시값의 변화만 해서 쓰레드를 바꾼다.
피쓰레드라는것은 라이브러리가 따로 존재한다.
소프트웨어적으로 쓰레드 구현
2.1. pthread_create 이것만 알면 우선은 쓰레드를 생성해서 돌릴수 있다.
스레드로 생성되는 함수는 무한루프로 돌린다.
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *)함수로 넘김, void *arg함수로 넣어줄 인자값);
2.2 #include <pthread.h>
int pthread_join(pthread_t th, void **thread_return); 해당 쓰레드가 끝날때까지 기다리는 함수
void **thread_return: 리턴값을 반환 받기 위해서 쓰는것
첫번째 아규먼트 th는 기다릴(join)할 쓰레드 식별자이며, 두번째 아규먼트 thread_return은 쓰레드의 리턴(return) 값이다. thread_return 이 NULL 이 아닐경우 해다 포인터로 쓰레드 리턴 값을 받아올수 있다.
2.3. pthread_detach
피스레드를 기본적으로 생성을 하면생성된 쓰레드와 연결이 된다는것이다.
조인을 호출을 안해주면 반환이 안되고 해당정보에대한것들이 메모리에 그대로 남아있게 된다.
***디테치를 선언하면 조인을 하지 않아도 메모리에 관한 정보가 그대로 남아 있게 된다.***
2.4. pthread_exit 자기 자신만 종료하는 스레드
void pthread_exit(void *retval);
pthread_exit 는 현재 실행중인 쓰레드를 종료시키고자 할때 사용한다. 만약 pthread_cleanup_push 가 정의되어 있다면, pthread_exit 가 호출될경우 cleanup handler 가 호출된다. 보통 이 cleanup handler 은 메모리를 정리하는 등의 일을 하게 된다.
2.5 void pthrad_cleanup_push(void (*routine) (void *), void *arg);
자원반환 엠얼록으로 할당한 자원의 자원 반한 뮤텍스 제거역할등을 수행을한다.
2.6. pthread_cleanup_pop
pthread_cleanup_push 와 함께 사용되며, install 된 cleanup handler 을 제거하기 위해서 사용된다. void pthread_cleanup_pop(int execute);
만약 execute 가 0 이라면, pthread_cleanup_push 에 의해 인스톨된 cleanup handler 를 (실행시키지 않고)삭제만 시킨다. 0 이 아닌 숫자라면 cleanup handler 을 실행시키고 삭제 된다. 사용예제는 2.5절을 참고하라.
그리고 pthread_cleanup_push 와 pthread_cleanup_pop 은 반드시 같은 함수내의 같은 레벨의 블럭에서 한쌍으로 사용해야 한다.
2.7. pthread_self 현재 쓰레드의 쓰레드 아이디를 알수 있다
pthread_t pthread_self(void);
pthread_self를 호출하는 현재 쓰래드의 쓰레드식별자를 되돌려준다.
동기화 오브젝트는 크게 메세지 큐도 되는데
좀더 크게 이야기하면 세마포어랑 뮤텍스가 있다
semaphore
mutex 이것도 내부적으로 세마포어로 구현 할수있다.
세마포어랑 뮤텍스랑
A.C B.C
int g_flag; extern int g_flag;
main() app_main()
프로세스가 하나 생성되면서 내부적으로 쓰레드가 하나있다.
스레드가 1개면의미가 없다.스레드를 추가로 하면
하나의 프로세스에 여러개의 프로세스가 돌고있다.
스레드의 특징은 하나의프로세스에서 돌고 있기 때문에
메모리 영역은 다 공유를 한다.
P1 P2
th1
th2
th3
th4
프로세스 1에서 프로세스2 통신을 위해서
메세지큐나 공유메모리를 사용하게 된다.(프로세스간의 메모리는 보호된다)
process
t1
t2
t3
t1에서 t2에의 한지역변수를 참조할수있다.
오버헤드가 작고 빠르지만
프로세스는 메모리 보호가 되지만
스레드끼리는 메모리가 보호가 안되서
서로 침범을 가능할수있다.
하나의 프로세스에 여러개의 스레드가 발생
g_flag가있을때
th1과 th2와 th3까 있다
th1
g_flag =1
g_flag ++;
g_flag
원하는 2
th2
g_flag =3;
g_flag ++;
원하는 값 4
th3
g_flag =0;
g_flag --;
원하는 결과 -1
이렇게 되지만 중간중간 th1 th2 th3이렇게 반복되면서 일이 되면서 일을 처리하기 때문에
값이 이상하게 되버린다.
th1이 실행할동안에 중간에 값이 변하면안된다.이 영역을 크리티컬 섹션이라고한다.
크리티컬 섹션을 주고 계산을 하게 한다.
---------------------------------------------------
크리티컬 섹션 잠가준다
th1
g_flag =1
g_flag ++;
g_flag
크리티컬섹션을 열어준다
---------------------------------------------------
---------------------------------------------------
크리티컬 섹션 잠가준다
th2
g_flag =3;
g_flag ++;
크리티컬섹션을 열어준다
---------------------------------------------------
---------------------------------------------------
크리티컬 섹션 잠가준다
th3
g_flag =0;
g_flag --;
크리티컬섹션을 열어준다
---------------------------------------------------
th1이 잠겨서 들어가고 스케줄링에의해서 th2가 실행되면 th2는 크리티컬을섹션을 잠가서
들어갈려고 하는데 열쇠가 없어서 잠그지 못하고 슬립상태로 대기하고있다.
th3도 마찬가지임 슬립상태로 대기 하고 있다. th1이 끝나고 크리티컬섹션을 열어주면
열쇠가 반납되고 다음일이 생길수있다.
________________________________________________________________________________________
func()---------------------------------
크리티컬섹션 잠가준다
g_flag=???
크리티컬섹션 열어준다.
------------------------------------------
th1,th2,th3가 있을때 th1이 g_flag를 참조하고 들어가면 th1이 나올때까지
th2,th3가 못들어간다.
_________________________________________________________________________________________
세마포어는 그 키값이 다양하게 존재할수있는데(열쇠를 많이 만들수 있다)
퓨텍스는 0,1 밖없다.(락 언락 개념 열쇠가 1개)
_________________________________________________________________________________________
semaphore-put 일을 끝내고 열쇠를 반납한다는 뜻이다.
semaphore-get 열쇠를 획득해서문을 열고 들어간다는것이고.
get은 1감소 (쓸수있는 키를 가져다가 임계영역으로 들어가니까)
put은 1증가(일끝내고 열쇠를 반납)
_____________________________________________________________________________________________
mutex
Lock 은 0
unLock은 1
뮤텍스는 unlock을 백번해도 계속 1이다
_____________________________________________________________________________________________
데드락 예제
ASDF ZXCV
A Lock B Lock
B Lock A Lock
B Unlock A Unlock
A Unlock B Unlock
asdf가 a락걸고 zxcv가 b락걸고 들어가면 asdf가 b락걸라고하면 대기 zxcv가 a락 걸라고 하면 대기
sokoban's Blog is powered by Daum & Tattertools