전공/시스템 프로그래밍(운영체제)

10. Threading

문정훈 2021. 12. 27. 12:49

1. Programs, Processes, and Threads

1) Threading

하나의 프로스에서 여러개 단위의 실행(작업의 실행)을 생성하고 관리하는 기법이다.

CPU는 멀티 코어로 여러 개의 코어로 이루어질 수 있다.

processorCPU와 같다.

하나의 processor에 여러개의 코어가 있다면 각각의 코어에 각각 다른 processthread가 병렬로 실행될 수 있다.

 

병렬 처리

여러 작업이 동시에 실행되는 것이다.

 

Threading을 이해하기 위해 CPUprocessor1개의 코어만 가진다고 가정,

process는 여러 개의 스레드로 동작할 수 있다.

위 가정에서 processorprocess안의 thread를 병렬로 처리할 수 없다.

 

2) Binaries

컴파일 되어 HDD 에 저장되 파일인데 아직 실행이 되지는 않고 준비된 프로그램을 말한다.

 

3) Single threaded / Multithreaded

process가 하나의 스레드를 가지면 Single thread라고 한다.

 

4) Virtualized memory

가상 메모리는 현대 운영체제에서 지원하는 기능이다.

HDD에 프로그램은 page(block) 단위로 적재되어 있다.

A라는 프로그램은 1~10가지 page로 구성되어 있다고 가정하고, 메인 메모리의 A 프로세스에게 할당되는 공간은 3page라고 가정해보면

HDD->RAM으로 load될 때 1~3 page가 메인 메모리로 load된다. 그리고 CPU1page를 실행하고 2page로 넘어가는게 실행이 끝난 1page는 사라지고 그 공간에 4page가 할당된다.

그리고 2page가 실행되고 2page의 실행이 끝나면 2page자리에 5page가 할당되고 cpu3page를 실행한다. 3page가 끝나면 PC4page로 할당되고 4~6page를 실행하게 되는 것이다.

이러면 실제로는 3page단위로 순환을 하는데 프로세스 관점에서 보면 프로그램의 모든 page가 메인 메모리로 load되어 실행되는 것처럼 보인다.

이것이 가상 메모리의 개념이다.

 

가상 메모리는 프로세스와 관련이 있고 스레드와는 거의 관련이 없다.

만약에 프로세스 ARAM 공간에서 실행이되다가 IO 작업을 하게 되면 Waiting Queue로 옮겨지게 되는데 그럼 해당 RAM 공간에는 다른 프로세스가 적재될 수 있다.

그러다가 IO작업이 끝나면 Read Queue에서 다시 실행을 할 준비 상태가 되는데 Read 상태가 된 프로세스 A는 메인 메로리로 다시 적재가 될 수 있다.(이것과 관련된 내용은 운영체제 수업에서 미룬다.)

 

스레드는 RAM에 할당된 프로세스 영역을 공유한다. page n, n+1, n+2를 공유한다.

즉 같은 프로세스에 속한 스레드 간에는 메모리를 공유한다. !

 

5) Virtualized Processor

프로세스는 입장에서는 자신이 가상적인 메모리 공간을 가지고 있다고 환상을 가진다.

반면, 스레드 입장에서

가상 CPU는 프로세스가 아닌 스레드에 할당되는 것이다.

왜냐면 실제 CPU에서 실행되는 것은 프로세스의 스레드 이기 때문이다.

스레드는 자신 만의 Processor가 있다고 환상을 가지게 된다.

하지만 메모리에 대해서는 환상을 가지지 않는다. 즉 스레드 입장에서는 내가 사용하는 메모리가 다른 스레드와 공유해서 사용하는 것을 안다.

 


 

2. Multithreading

1) Programming Abstraction

하나의 프로그램 즉 하나의 작업을 여러개의 작업(여러개의 프로그램)으로 쪼갠다.

 

2) Parallelism

위 개념으로 하나의 프로세스는 여러 스레드들로 구성될 수 있는데 멀티 코어 CPU에서 각 코어당 스레드가 할당되어 실행되는 스레드의 병렬 실행이 가능해진다.

 

3) blocking I/O, Context Swtiching

스레드는 IO가 발생하면 blocking을 하지 않는다. non-block으로 동작한다. 참로로 non-blocking의 개념은 js에서 비동 기 함수의 동작과 유사하다.

만약 한 프로세스에서 스레드 A, B가 있을 때 스레드 A에서 IO작업이 일어난다면 스레드 Aslepp모드 즉 Wating상태가 되고 CPU자원은 스레드 B로 할당된다. (이것이 Context Switching의 개념이다)

 

Context Switching2가지 경우

프로세스간에

프로세스간에 Context Switching은 메인 메모리에 프로세스가 실행된다고 할 때, 만약 극단적으로 프로세스의 모든 스레드에서 IO 작업이 일어난다면 운영체제는 그 프로세스를 내려버리고 새로운 프로세스를 적재할 수 있다.

 

스레드 간에 Context Switching

만약 한 프로세스에서 스레드 A, B가 있을 때 스레드 A에서 IO작업이 일어난다면 스레드 Aslepp모드 즉 Wating상태가 되고 CPU자원은 스레드 B로 할당된다. (이것이 Context Switching의 개념이다)

 

 

 

3. Concurrencym, Parallelism, Races

1) Parallelism

멀티 코어를 가진 프로세서에서는 여러 스레드들이 코어의 개수 만큼 동시에 실행 될 수 있다.

 

2) Concurrency

여러 개의 작업이 마치 동시에 실행하는 것처럼 보이는 것인데 여러개 의 작업을 진행시키는데 반드시 동시에 실행시킬 수는 없다.

하나의 프로세스 안에 하나의 스레드를 가진 여러 프로세스가 있을 때 CPU가 자원을 할당하면 프로세스 A가 실행된다. CPU 자원을 할당받은 프로세서 A의 스레드가 일부가 실행되고 일정 시간이 되었을 때 프로세스 B의 스레드가 실행된다. (Context Swtitcing)

 

Context Switching은 위 예시에서 현재 실행하고 있는 프로세스의 현재 상태 값을 저장하고 전환할 프로세스의 상태 값들을 레지스터에 채움으로써 다른 프로세스의 흐름으로 전환하는 것을 Context Swtiching이라고 한다.

Context SwitchingCPU가 작업하는 시간이라 할 수 없기 때문이 Context Switching이 자주 일어나면 CPU의 성능이 저하된다.

 

정리하면 Parallelism은 실제 멀티 프로세서에서 멀티 스레드가 동시에 실행되는 것이고

Concurrency는 여려 프로세스가 있을 때 CPU는 해당 프로세스들의 스레드들을 일부씩 실행하며 마치 병렬로 수행되는 것처럼 보이는 것을 말한다.

 

Concurrency는 실제로는 동시에 여러 작업을 실행하지 않더라도 위와 같이 동시에 여러 작업을 실행하면 Concurrency이다.

하지만 Parallelism은 실제로 병렬로 처리하는 것을 말한다.

 

3) Race Conditions

Concurrency 지원을 위한 threading으로 인해 발생하는 문제점으로

프로세스 A, B 가 있고 각 프로세스는 하나의 스레드르를 가질 때 A, B 프로세스의 스레드들이 하나의 파일(자원)을 공유할 때 발생하는 문제점이다. 이러한 문제점을 모두 Race Conditions이라고 한다.

 

예제1)
reading만 있을 때는 이런 Race 문제가 발생하지 않는다. 하나의 문서가 있을 때 프로세스 A, 프로세스 B 두 스레드 모두 reading만 한다면 이는 문제가 발생하지 않는다.

write를 할 때 문제가 발생하는데 A가 값을 읽고 Bwrite를 한다고 하면

read 한다는 것은 버퍼에 저장된 문서의 값을 copy하는 것인데 B에 의해서 write되면 버퍼의 문서 내용은 달라진다. 이러한 문제를 해결하기 위해 synchronize 개념을 사용한다.

읽기는 상관 없고 여러 프로세스 중 하나의 프로세스가 공유 문서를 write한다면 그 프로세스 혼자만 문서에 접근이 가능해진다. (Concurrency가 안된다!)

 

만약 Aread로 읽기를 하는 도중 Bwrite를 할려고 한다면 Bwating queue로 들어가 sleep이 되고 A가 읽기가 끝난다면 write를 하고 싶어하는 wating queue에 있는 프로세스를 깨운다.

만약 Aread하는 중에 Bwrite이기 때문에 queuesleep하고 있고 Aread 하는 중에 Cread한다면 read는 바로 이루어질 수 있다. D가 또 read하고 E가 또 read하면

waiting queue에 있는 B 프로세서는 너무 오래 기다린다. (이것을 starbing이라고 한다.)

startbing이 되면 더 이상 read 작업이 추가 되지 않고 이 read 작업을 wating queue에 넣어버리고 write를 깨워 읽도록 시킨다.

즉 계속 read에게 우선권을 주면 write 작업이 wating queue에서 기다리기만 하기 때문에

wating queue에서 write 작업이 특정 시간동안 대기하였다면 계속 되는 여러 프로세스의 read 작업들을 wating queue에 넣어버리고 write 작업을 수행한다.

 

예제2)

read, write모드로 두 모드가 동시에 열린 뒤 write이 수행되고 read를 할 때 read를 롤백을 해서 다시 open을 한다.

 

4) atomic unit

하나의 메소드가 여러 프로세스의 스레드에서 공유되어 사용될 수 있다면 해당 메소드는 한 스레드에서 사용중일 때 다른 스레드에서 사용할 수 없다.

또한 스레드가 메소드를 실행하기 시작하면 메소드의 실행이 끝날 때 까지 CPU는 다른 프로세스로 스케줄링을 하지 않는다. (Context Switchihng을 하지 않는다)

이것이 메소드가 atomic unit이라고 말한다.

 

 

5. Synchronization(동기화)

1) Mutex

두 개의 서로 다른 작업이 서로의 작업이 끝나고 나며 실행되는 개념이다.

atomic해야한다.

하나의 스레드에서 공유 작업(예 공유 메소드)을 접근할 수 있는데 이런 공유 작업은 atomic (원자적인) 해야한다.

lock이라는 것이 있는데 스레드1이 공유작업을 사용하면 공유 작업은 lock된다.

그리고 공유 작업의 사용이 끝나면 unlock한다.

c언어 에서는 이런 동기화 작업을 lock() 메소드와 unlock() 메소드를 통해 구현할 수 있다.

이런 lock을 위해 하드웨어적 기법이 사용되는 것이 아니다.

 

2) Deadlock

concurrency에 의해서 race condition이 발생한다면 이런 race condition을 막기 위해 mutexes를 사용하는데 이 mutexesdeadlock을 만든다.

데드락은 스레드1이 공유 작업1을 사용하고 있고 스레드 2가 공유 작업2를 가지고 있는데

스레드1은 자원2를 필요로하고 스레드2는 자원1을 필요로하는 경우 이러한 상황을 deadlock이라고 한다.

이런 데드락에 대해서 완벽히 해결할 방법은 없으며 누구 하나가 양보를 해야하며

OS는 스레드1 이 자원1을 사용할때는 결국 이후 자원2도 필요로 하기 때문에 T1이 자원1과 자원2를 모두 lock하게 되는 방식으로 deadlock이 해결 가능하다.

'전공 > 시스템 프로그래밍(운영체제)' 카테고리의 다른 글

9. Process Management  (0) 2021.11.11
8. Multy-Process와 Mutual Locking  (0) 2021.11.06
7. Buffered IO  (0) 2021.10.17
6. Blocking, non-Blocking  (0) 2021.10.17
5. 추가적인 System Call  (0) 2021.10.17