일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 쓰레드
- OS
- 알고리즘
- 자료구조
- 파일시스템 구현
- 컨디션 변수
- 멀티프로세서
- DirectX 12
- 병행성
- 다이나믹 프로그래밍
- 그리디알고리즘
- 병행성 관련 오류
- 프로그래머스
- codility
- directx
- DirectX12
- 운영체제
- 영속성
- 타입 객체
- 렌더링 파이프라인
- 그리디 알고리즘
- 백준
- 동적계획법
- 락
- 멀티쓰레드
- 디자인패턴
- 스케줄링
- I/O장치
- 다이나믹프로그래밍
- Direct12
- Today
- Total
기록공간
1-2장. 운영체제 개요 - 병행성 본문
운영체제는 여러 가지 일을 동시에 수행하고 있다. 프로세스를 하나 실행하고, 다음 프로세스를 실행하고, 또 다음 프로세스를 실행하고... 이 동작을 반복한다. 마치 곡예사가 여러 물건을 저글링 하는 것처럼 말이다.
병행성 문제
현대의 멀티스레드 프로그램은 병행성 문제를 추가로 갖고 있다. 다음 코드를 한번 보자.
#include <iostream>
#include <thread>
using namespace std;
volatile int counter = 0;
int loops;
// 카운터를 증가 시키는 작업을 하는 함수
void worker()
{
for(int i = 0; i < loops; ++i)
++counter;
}
int main()
{
// 두개의 스레드를 만든다.
thread p1, p2;
cout << "Initial Value: " << counter << endl;
// 각 스레드는 worker()를 실행한다.
p1 = thread(worker);
p2 = thread(worker);
p1.join();
p2.join();
cout << "Final Value: " << counter << endl;
}
여기서 스레드는 같은 주소 공간에서 동시에 실행되는 함수를 말하는 것이다. 실행시켜 보면 지정한 loops의 값만큼 counter가 증가할 것이다.
loops 수가 적을 때에는 값이 제대로 나오지만 왜 loops가 커지면 이상한 값이 나올까? 그 이유는 우선 counter가 증가하는 작업을 컴퓨터 내에서 어떻게 하는지부터 살펴봐야 한다. counter의 증가 작업은 총 3개의 명령이 필요하다. 메모리에서 counter값을 읽어서 레지스터로 보낸다. 그리고 레지스터의 값을 증가시키고, 레지스터의 값을 다시 counter로 돌리면 counter값이 증가한다.
문제는 이 명령을 스레드에서 동시에 수행 중인 것이 문제가 된다. counter는 공유 메모리로 여러 스레드에서 사용하고 있는 변수이다. 첫 번째 스레드에서 counter값을 레지스터로 가져와 증가시키고 레지스터의 값을 다시 counter로 보내려던 찰나에 두 번째 스레드에서 counter값을 가져오면 어떻게 될까?
그렇다. 증가되지 않은 값을 가지고 증가 작업을 수행할 것이다. 순서에 맞게 실행되어야 올바른 값이 나오는데, 그러지 못한 것이다. 즉, 각각의 명령어들이 원자적(Atomic)으로 수행되지 않은 것이다. 이러한 점이 병행성 문제를 발생시킨다. (이러한 문제점을 경쟁 상태(Race Condition)라고 한다.)
그럼 왜 loops의 값이 작은 경우 왜 올바른 값이 나오는 것일까? 그것은 원자적으로 수행되지 않았지만 운이 좋게 순서가 꼬이지 않았기 때문이다. 값이 작아도 계속 실행하다 보면 낮은 확률로 값이 틀리게 나올 것이다.
이러한 문제들을 어떻게 해결할지에 대해 앞으로 살펴보게 될 것이다.
'OS' 카테고리의 다른 글
2장. 가상화 (0) | 2020.02.07 |
---|---|
1-4장. 운영체제 개요 - 설계 목표와 역사 (0) | 2020.02.04 |
1-3장. 운영체제 개요 - 영속성 (2) | 2020.02.04 |
1-1장. 운영체제 개요 - CPU 가상화 (0) | 2020.02.04 |
1장. 운영체제의 개요 (0) | 2020.02.04 |