스레드 / 프로세스간공유 자원에 접근 시 주의사항
。스레드간 통신(IPC)은프로세스의논리적 주소공간을공유자원으로서 공유
▶Shared Memory와Message Passing
데이터 불일치( Data Inconsistency ) 문제
。복수의스레드 / 프로세스가 서로간의 공유중인논리적 주소공간또는공용 데이터에Concurrent하게 접근하는 경우Race Condition발생
。프로세스들이Concurrent하게 공유되고있는 데이터 접근 시Data Consistency를 유지하기위해순차적으로 접근하도록 설정
프로세스 / 스레드간공유자원에Concurrent Execution하는 경우
ex)Execution중인프로세스가선점(preemtive) 등의 이유로인터럽트되어 다른프로세스로Context Switch하는 경우에서데이터 불일치문제가 발생할 수 있다.
프로세스 / 스레드간공유자원에Parallel Execution하는 경우
ex) 2개 또는 3개 이상의프로세스들이CPU의 각각의코어들에 의해 동시에 실행되고 있을때데이터 불일치문제가 발생할 수 있다
데이터 불일치( Data Inconsistency )
。동일 데이터의공유를 통해 생성된여러 사본이일관성 없이서로다른 값을 가지고 있는 상태
데이터 불일치문제가 발생하는 예시
。Race Condition에 의해프로세스 / 스레드에 의한공유메모리접근순서에 따라 결과가 각각 변화
생산자-소비자 문제IPC
。여러프로세스가 공유메모리( ex.버퍼)에 동시에 접근 시 발생하는동기화( Syncronization ) 문제
IPC-Shared Memory예제 활용 시
。전역변수로공유버퍼로서 활용할buffer외 전역변수int count = 0;를 추가 설정하여 각프로세스에서 참조 시생산자 / 소비자 프로세스코드를 다음처럼 정의
。생산자 프로세스while(true){ // 버퍼가 가득찬 경우 아무 작업도 하지않기 while(count == BUFFER_SIZE) ; // // 버퍼가 빈 경우 item input buffer[in] = next_produced; in = (in + 1) % BUFFER_SIZE; count++; };。
소비자 프로세스while (true) { // 버퍼가 비어있는경우 아무 작업하지 않기 while ( count == 0 ) ; next_consumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; count--; }。두개
프로세스가 전역변수인공유 버퍼내 동일 데이터에Concurrent하게 접근하는 경우,생산자 프로세스에CPU배정 후버퍼에 작성 및Context Switching을 통해소비자 프로세스에CPU배정 후버퍼에서 데이터를 읽어온다.
▶Parallel이 아닌Concurrent하게 작용하므로 이론상으로는 공유데이터의 일관성에 문제없으나 실제로는데이터 불일치발생
ex ) 전역변수count = 5일때 위 두프로세스가Concurrent하게 접근하는 경우
count++과count--에 의해count = 5가 되야하지만,count는4 or 5 or 6이 될 수 있음
데이터 불일치문제가 발생하는 이유
。두프로세스가Concurrent하게공유메모리에 접근 시CPU Scheduler에Context Switching에 의한save/restore과정에서데이터 불일치문제가 발생할 수 있음
▶ 각프로세스간문맥교환으로 명령어들이 임의 순서로interleaving되면서데이터 불일치문제가 발생
▶ 해당 상황을Race Condition이라고 한다.
。위생산자 - 소비자 문제의 전역변수count의 소스코드count++와count--는저급언어단계에서 다음처럼 표현됨register1 = count // LOAD register1 = register1 + 1 // ADD count = register1 // STOREregister2 = count // LOAD register2 = register2 - 1 // SUB count = register2 // STORE。
count++와count--를Concurrent하게 실행 시register = count,count = register가 아닌register = register + 1단계에서Context Switch가 발생하면데이터 불일치문제 발생
▶CPU Scheduler에Context Switching에 의한save/restore과정에서레지스터값의데이터 불일치문제가 발생
。해당 코드를임계영역으로 설정하여 중간에문맥교환이 발생안하도록하여 문제해결이 가능.
Race Condition상황에서의데이터 불일치발생 원리
。전역변수int count = 5일때
생산자 프로세스에서CPU를 배정받아count++를 실행 중register1 = register1 + 1에서Context Switch가 발생
。register1 = register1 + 1에서문맥교환이 발생하여 문제가 발생하는 단계
。생산자 프로세스는register1 = 5+1 = 6정보만을 저장 후 전역변수count에 대해 값 할당없이소비자 프로세스로Context Switch
소비자 프로세스에CPU배정 후count--실행 중 작업을 정상적으로 완료
。문제가 없는 단계
。소비자 프로세스는 전역변수count = 5를 가져온 후Register2 = 5-1 = 4를 통해count = 4로 할당후Context Switch
생산자 프로세스로 다시CPU배정 시
。이전 작업에서 수행 못한 명령어count = register1에서 작업을 재개 시 기존PCB에 저장된register1 = 6이므로count = 6을 할당
。해당 작업의 결과는5가 나와야 정상이지만,count++의count = 6이 수행되기 전Context Switching이 발생하여 결과적으로6을 할당하게됨.
▶Context Switch위치에따라데이터 불일치가 발생
。만약소비자 프로세스의count--에서register2 = register2 - 1에서문맥교환발생 시 다음 결과 (count = 4)가 도출
문제1
문제2