Concurrent Programming
지금까지, concurreny를 주로 운영 체제 kernel이 여러 응용 프로그램을 실행하기 위해 사용하는 메커니즘을 다뤘다.
그러나, concurreny는 kernel에만 국한되지 않는다. 응용 프로그램에서도 중요한 역할을 할 수 있다.
응용 프로그램 수준의 concurreny는 다음과 같은 방법에서도 유용하다.
Accessing slow I/O devices
Application이 디스크와 같이 느린 I/O 장치로부터 데이터가 도착하기를 기다릴 때, kernel은 다른 프로세스를 실행함으로써 CPU를 busy 상태로 유지한다. application은 유용한 작업을 I/O 요청과 겹치게 함으로써 유사한 방식으로 concurreny를 이용할 수 있다.
Interacting with humans
컴퓨터를 사용하는 사람들은 동시에 여러 작업을 수행할 수 있는 능력을 요구한다.
예를 들어 문서를 인쇄하는 동안 창 크기를 조정할 수 있다. 현대의 윈도우 시스템은 concurreny를 사용하여 이 기능을 제공한다. 사용자가 일부 작업을 요청할 때마다 별도의 concurrent logical flow이 생성되어 작업을 수행한다.
Reducing latency by deferring work.
Application은 concurreny를 사용하여 다른 작업을 지연시키고 동시에 수행함으로써 특정 작업의 지연 시간을 줄일 수 있다. 예를 들어, dynamic sotrage allocator는 더 낮은 우선순위에서 실행되는 concurreny "coalescing" flow로 병합을 지연시켜 spare CPU cycle이 사용 가능해지면 이를 흡수함으로써 개별로 사용 가능한 작업의 지연 시간을 줄일 수 있다.
Servicing multiple network clients.
iterative network server는 한 번에 하나의 client만 service할 수 있기 때문에 비현실적이다.
따라서, 하나의 느린 client는 다른 모든 client에 대한 service를 거부할 수 있다. 초당 수백 ~ 수천 개의 client를 service 할 것으로 예상되는 실제 server의 경우, 느린 client가 다른 client에 대한 service를 거부하도록 허용되지 않는다.
더 나은 접근 방식은 각 client에 대해 별도의 logical flow를 생성하는 concurrent sesrver를 구축하는 것이다. 이렇게 하면 server가 여러 client를 동시에 service 할 수 있고 느린 client가 server를 독점하는 것을 방지할 수 있다.
Computing in parallel on multi-core machines
현대의 많은 시스템에는 여러 CPU를 포함하는 멀티 코어 프로세서가 장착되어 있다.
concurrent flow로 분할된 application들은 종종 단일 프로세서 시스템보다 멀티 코어 시스템에서 더 빨리 실행되는데,
그 이유는 flow가 interleave되는 것이 아니라 parallel로 실행되기 때문이다.
Three basic approaches for building concurrent programs
응용 프로그램 수준의 concurry를 사용하는 응용 프로그램을 concurrent program이라고 한다.
현대의 운영 체제는 concurrent program을 구축하기 위한 세 가지 기본 접근 방식을 제공한다.
Processes
각 logical control fow은 kernel에 의해 schedule 되고 유지되는 프로세스다. 프로세스에는 별도의 가상 주소 공간이 있기 때문에 서로 통신하려는 IPC(Inter Process Communication) 메커니즘을 사용해야 한다.
I/O multiplexing
이것은 application이 단일 프로세스의 context에서 자신의 logical flow를 명시적으로 schedule 하는 concurrent programming의 한 형태이다. logical flow는 file descriptor에 도착한 데이터의 결과로 main 프로그램이 state에서 state로 명시적으로 전환하는 state mahcine으로 모델링 된다.
프로그램이 단일 프로세스이기 때문에 모든 flow는 동일한 주소 공간을 공유한다.
Threads
thread는 단일 프로세스의 context에서 실행되며 kernel에 의해 schedule되는 logical flow다.
thread는 프로세스 flow 처럼 kernel에 의해 scheduling 된다.
또한 I/O multiplexing flow처럼 동일한 가상 주소 공간을 공유하는 접근 방식의 hybrid라고 생각할 수 있다.