티스토리 뷰
병행성이란 말은 동시에 여러 일을 하려 할 때 반드시 해결해야 하는 문제들을 가리킬 때 사용한다.
가상화에서 봤듯이 운영체제는 하나의 프로세스 처리, 그 다음 프로세스 처리, 다음 프로세스 등의 순서로 여러 프로세스를 실행시켜 한 번에 많은 일을 한다. 이러한 행동은 문제를 일으킨다.
멀티 스레드 프로그램으로 알아보자.
메인 프로그램은 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
- 머신러닝
- SOME/IP
- 차량용 이더넷
- automotive ethernet
- 딥러닝
- porks
- 회귀
- cuckoo
- 차량 네트워크
- 단순선형회귀
- AE
- many-to-many
- AVTP
- problem statement
- SVM
- AVB
- PCA
- 로지스틱회귀
- Python
- one-to-many
- CAN-FD
- HTML
- 이상탐지
- json2html
- many-to-one
- 논문 잘 쓰는법
- Ethernet
- 크로스 엔트로피
- automotive
- 케라스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |