티스토리 뷰

병행성이란 말은 동시에 여러 일을 하려 할 때 반드시 해결해야 하는 문제들을 가리킬 때 사용한다.

가상화에서 봤듯이 운영체제는 하나의 프로세스 처리, 그 다음 프로세스 처리, 다음 프로세스 등의 순서로 여러 프로세스를 실행시켜 한 번에 많은 일을 한다.  이러한 행동은 문제를 일으킨다.

 

멀티 스레드 프로그램으로 알아보자.

메인 프로그램은 pthread_create()를 사용하여 두 개의 쓰레드를 생성한다. 쓰레드를 동일한 메모리 공간에서 함께 실행 중인 여러 개의 함수라고 할 수 있다.

 

#include<stdio.h>
#include<stdlib.h>

volatile int counter = 0;
int loops;

void * worker(void * arg){
	int i;
    for(i=0;i<loops;i++){
    	counter++;
    }
}

int main(int argc,char * argv[]){
	if(argc != 2){
    
    }
    loops = atoi(argv[1]);
    pthread_t p1,p2;
    printf("Initial value : %d\n",counter);
    
    Pthread_create(&p1, NULL,worker,NULL);
    Pthread_create(&p2, NULL,worker,NULL);
    Pthread_join(p1,NULL);
    Pthread_join(p2,NULL);
    printf("Final value : %d\n",counter);
  
}	

 

loops가 1000이라 가정할 때 위 프로그램을 실행하면 final value는 2000으로 예상된다.

 

 

> ./thread 10000
initial value :0
final value : 143012

>./thread 100000
initial value : 0
final value : 137298

final value가 다를 뿐만 아니라 다시 반복한 결과값도 이전과는 달랐다.

이런 결과의 원인은 명령어가 한 번에 하나씩만 실행된다는 것과 관련이 있다.

 

counter값을 증가시키는 부분은 3개의 명령어로 이루어져있다.

1.counter값을 메모리에 적재하는 명령어

2.레지스터를 1 증가시키는 명령어

3.레지스터의 값을 다시 메모리에 저장하는 명령어

 

이 3개의 명령어가 한번에 실행되지 않기 때문에 이런 결과가 나타난다.

 

이 부분이 병행성 문제이다.

 

예를 들어 2개의 프로세스가 실행된다고 생각해보자.

 

프로세스1 프로세스2
1.count값 적재 4.count값 적재
2.레지스터 1++ 5.레지스터 1++
3.레지스터 값 저장 6.레지스터 값 저장

우리의 생각으로는 프로세스1이 1->2->3 실행해 레지스터 값 = 1, 프로세스2가 4->5->6 실행해 레지스터 값 = 2 ... 이렇게 예상한다.

 

하지만 실행 결과는 다음과 비슷한 결과가 나온다.

프로세스1 프로세스2
1.count값 적재 3.count값 적재
2.레지스터 1++ 4.레지스터 1++
5.레지스터 값 저장 6.레지스터 값 저장

5번 과정에서 레지스터 값이 1이 아닌 2가 저장되기 때문에 예측과 다른 결과가 나오는 것이다.

꼭 이처럼 변하는 건 아니지만 이렇게 순서가 바뀌기 때문이라고 생각된다.

'컴퓨터 공학 > 운영체제' 카테고리의 다른 글

[운영체제]가상화의 문제점  (0) 2021.02.02
[운영체제]프로세스 API  (0) 2021.02.02
[운영체제]가상화  (0) 2021.01.31
[운영체제]운영체제 개요, 영속성  (0) 2021.01.31
운영체제 개요, 가상화  (0) 2021.01.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함