×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,045,673명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형



Memory Sharing


- 스레드는 자신의 프로세스의 가상 메모리를 공유 할 수 있다.

- 하지만 스레드 각자가 가진 스택은 공유할 수 없다.

- 예외적으로 스택에서 static 변수는 공유할 수 있다.

 

Unsafe Region


메모리 쉐어링을 하면 프로세스에서 fork()를 해야되는 일을 줄일 수 있고,

프로세스보다 더 경량화되어있어서 만들기도, 지우기도 쉽지만, Unsafe region이 존재한다.


예를들어보자.


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
32
33
34
35
36
37
// Unsafe Region Ex
 
#include <pthread.h>
#include <stdio.h>
 
int sum = 0;
 
void *threadRoutine(void *argumentPointer)
{
    int i;
    for(i = 0; i < 1000000; i ++)
        sum++;
    
    return NULL;
}
 
int main()
{
    pthread_t threadID1, threadID2;
 
 
    printf("Create Thread!\n");
    pthread_create(&threadID1, NULL, threadRoutine, NULL);
 
    printf("Create Thread!\n");
    pthread_create(&threadID2, NULL, threadRoutine, NULL);
 
    pthread_join(threadID1, NULL);
    pthread_join(threadID2, NULL);
 
    printf("Result :: %d\n",sum);
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


다음과 같은 코드가 있다.


이 코드는 스레드 2개를 생성하고 메인 스레드가 자식 스레드를 기다리게된다.


이때 자식 스레드1, 2는 각각 전역 변수로 선언된 sum을 공유하며 백만번동안 +1씩 할 것이다.


즉, 우리가 예상하는 답은 이백만이어야 한다.


하지만 답은 무조건 이백만이 아니다.


sum++;의 과정에서 ++는 어셈블리어로 다음과 같은 코드를 가지고 있다. 


load         sum eax

increment  eax

store        sum


이렇게 ++는 3줄의 어셈블리어로 되어있는데 저 3줄을 하기 전, 컨텍스트 스위칭을 당한다면 어떻게 될까?


예를들어 스레드 1번이 50만까지 더해두었고 500001이 될차례인데


increment eax에서 컨택스트 스위칭이되어 스레드 2번이 52만까지 더했다.


그리고 스레드 1로 다시 컨텍스트 스위칭이되면 스레드 1은 500001을 store sum eax를 통해 저장하게된다.


그리고 컨텍스트 스위칭이되어 스레드 2로 가면 스레드 2는 sum++를 할 때, 500001부터 다시 +1을 하고 있을것이다.


즉, sum++의 과정이 Unsafe Region이다.








결과에서도 나타나다시피 9번의 실행 결과 이백만이 된 경우는 단 3번밖에 없다.


반응형