운영체제
병행성 개요
운영체제는 크게 3가지의 개념이 있다고 했다.
가상화, 병행성, 지속성
이 중 가상화에서 cpu, 메모리 가상화를 배웠다
하나의 cpu를 다수의 가상 cpu로 확장하여 여러개의 프로그램이 동시에 실행하는 듯한 착시를 만들었다.
개별적 프로세스가 모두 독립적으로 많은 가상 메모리를 가지는 것처럼 보이게 했다.
주소 공간을 통해 각 프로세스가 자신만의 메모리를 가지고 있는 것 처럼 동작하는데, 이는 OS가 물리 메모리를 여러 주소공간이 서로 번갈아가며 사용하게 한다
그럼 쓰레드를 통해 병행성에 대해 알아보자
쓰레드, 병행성 ?
- 싱글 프로세스의 새로운 개념
- 한번에 하나의 명령어를 실행하는 관점에서 벗어나 하나 이상의 실행지점을 가짐
- 다수의 실행 유닛을 가지고 프로그램을 실행한다
쓰레드들은 주소 공간을 공유하기 때문에 동일한 값에 접근할 수 있다
멀티 스레드 프로세스?
스레드는 어디서 명령어를 가져올지 추적하는 PC
연산을 위한 레지스터
를 가지고 있다
여러 쓰레드가 실행중이라면 context switch
를 통해 교체된다(프로세스와 비슷)
- 프로세스는 하나 이상의 쓰레드를 지닌다
- context switching 유닛도 쓰레드
- 각 쓰레드는 고유의 execution state를 가진다
- 스레드 각각의 execution state는 TCB에 저장된다
T1에서 T2로 스위칭 될때
- T1의 execution state가 TCB에 저장됨
- T2의 execution state를 TCB에서 복구함
주소 공간은 그대로 사용한다
멀티 스레드 프로세스의 주소 공간
- 프로세스의 모든 스레드는
주소 공간
을 공유한다
멀티 스레드 프로세스를 쓰는 이유?
- 성능이 좋다
병렬처리
프로세스는 multiple cpu에 의해 실행된다
- 각 프로세서가 작업의 일부분을 수행함으로 실행 속도를 높인다
- I/O와 실행이 중첩될 수 있다
- I/O를 기다리는 동안 프로세스의 다른 쓰레드가 cpu를 활용해 다른 작업을 수행
문제점1 쓰레드 수행 순서
- 쓰레드 실행 순서는
OS 스케줄러
에 의해 결정되는데, 비결정적이다
- 어떤 쓰레드가 실행될지 알기 어렵다
- 디버깅 하기 힘들다
즉 쓰레드 수행 순서가 매번 다르다!
문제점2 Race condition
- multiple 쓰레드는 공유되는 데이터를 동시에 업데이트 한다
- 값이 갱신되지 않았는데 다른 쓰레드가 그 값을 사용할 수도??
- 결과는 예측할 수 없다..
ex
두개의 쓰레드가 하나의 값의 접근해 1을 키운다
근데 먼저 공유하는 값에 접근한 스레드가 값을 갱신하지 않았는데
다른 쓰레드가 그 값을 가져가는 상황이 생기면...
원하는 값이 나오지 않음!!
- 다중 쓰레드는 공유하는 데이터를 갱신하기위해
critical section
에 들어간다
- 실행할때마다
비결정적
결과가 나온다
- 값 증가 +2를 증가했는데 1만 증가됨.... 같은 상황
Critical section
critical section
임계 영역
- 공유 자원에 접근하는, 여러 쓰레드에서 동시에 실행되면 안되는 코드
- critical section을 실행하는 다중 쓰레드는
race condition
의 결과를 낳는다
- 실행 순서에 따라 결과가 달라지는 상황을 race condition이라 한다
mutual exclusion
(상호 배제)가 필요하다
- 임계 영역에 대해 원자성이 필요하다
- 쓰레드가 임계영역을 실행중일 때 다른 쓰레드가 그 영역을 실행 못하게 보장해준다
임계영역에 접근해 있을 때 인터럽트가 발생하면 안된다...
해결법
하드웨어 지원
- super instruction
소프트웨어 지원
- 동기화 함수
- mutex,semaphore...
super instruction
- 하드웨어는 인스트럭션을
atomically
하게 실행되는것을 보장
- 인터럽트가 되지 않음
- 3개의 동작을 1개의 인스트럭션으로 만들어서 그렇다
- 인터럽트 되더라도 명령어 실행이 안되거나 실행이 종료된 후에 인터럽트가 일어난다
요약
- critical section
- race condition
- 멀티 스레드가 동시에 임계영역을 실행할때 발생, 의도하지 않은 결과를 만든다
- indeterminate
=> mutual exclusion
기법을 사용해 하나의 쓰레드만 임계영역으로 진입하게 해야한다
- 다중 쓰레드 프로세스, 이득
- 병행성: 프로그램을 다중 실행 유닛을 가지고 실행
- 병렬성
- 입출력 중첩
- 문제