그림과 같이 스레드가 구현되어 있다고 해보자.(이 구현은 user level 스레드를 보여주고 있다. 런타임 시스템과 그 내부에 스레드 테이블이 있기 때문이다.) 이때 각각의 프로세스에게는 50ms 의 퀀텀이 주어졌고, 각 스레드는 CPU burst 마다 5ms의 시간이 소모된다고 해보자. 그러면 커널이 먼저 실행할 프로세스를 고르고, 그 다음에 런타임 시스템이 실행할 스레드를 골라서 굴리므로 프로세스 A의 스레드들이 A1 A2 A3 A1 A2 A3 이런식으로 돌아간다.유저 레벨 스레드는 스레드 스위칭이 빠르므로, thread_yield 와 같은 프로시저를 사용하여 빠르게 스레드를 교체하며 돌리는 것이 가능하고, 성능도 좋다. (다만 라운드 로빈과 같이 정해진 퀀텀을 정해두고 돌리는 것은 힘들다.) 이때..
스레드를 구현하는 방법은 User space 에서 구현하거나, Kernel space 에서 구현하거나, 두 방법을 섞는 하이브리드 방법 크게 3가지가 있다. 각각의 구현 방법에 대해서 정리해본다. User Space 메모리 공간은 크게 User space 와 Kernel space 로 나뉜다.유저 스페이스는 일반적인 유저 프로세스가 실행되는 공간이고, kernel spaces는 운영체제의 핵심 요소인 커널이 존재하며 실행되는 공간이다. User space 에서 스레드를 구현하는 경우 위 그림과 같이 구현할 수 있다.이때 운영체제는 실제로 멀티스레드가 가능한 환경으로 동작하지만, 커널은 스레드의 존재를 모르고, 기존의 프로세스 모델에서 프로세스를 다루는 것과 비슷하게 돌아간다. 따라서 커널에는 proce..
Process Model지금까지는 프로세스와 프로세스 스케줄링, 프로세스 통신에 대해서 정리하였다.이렇게 프로세스를 사용하여 컴퓨터 프로그램의 동작을 기술하는 것을 Process Model 이라고 하며,이번 글부터는 Thread Model 을 통해서 프로그램의 동작을 기술해보고자 한다. Process Model 은 크게 2가지 개념을 갖는다.1. Resource Grouping2. Thread 리소스 그룹핑은 다음과 같은 데이터를 프로세스 단위로 갖는 것을 말한다.- Address Space (메모리에 프로세스가 차지하는 공간, 유닉스의 경우 Text(Code) 세그먼트, Data 세그먼트, Stack 세그먼트로 구분)- open file (현재 이 프로세스가 open 한 file에 대한 정보)- c..
예를 들어 어떤 DBMS 가 실행되고 있다고 해보자.DBMS는 여러 사용자가 접근 가능한 시스템이므로, 각 사용자를 응대하는 자식 프로세스가 여러 개 존재할 것이다.이때 DBMS가 유동적으로 자신이 원하는 특정 자식 프로세스에게 더 높은 CPU를 할당하고 싶은 상황이 있을 수 있다.하지만 일반적으로는 DBMS의 부모 프로세스도, 클라이언트를 응대하는 자식 프로세스도 모두 운영체제에 의해 관리되므로 DBMS가 이를 컨트롤 할 수 있는 방법은 존재하지 않는다. Policy vs. Mechanism 은 부모 프로세스에게 자식 프로세스에 대한 관리 기능을 제공해보자는 아이디어에서 등장했다.즉, 어떤 스케줄링 알고리즘 (Mechanism) 을 사용할 지는 운영체제가 결정하되, 그 알고리즘을 활용하는 정책(Poli..
Real-Time System 은 외부의 이벤트에 대해 정해진 시간 안에 적절하게 반응해야 하는 시스템이다.디스크 플레이어를 예로 들면, 디스크에 담긴 디지털 음원 데이터를 바로바로 디코딩해야 끊김없이 노래를 들을 수 있다.자동 조립 로봇, 자동 항법 시스템과 같은 경우도 모두 실시간 시스템의 한 예시이다. 실시간 시스템은 올바른 답을 '정해진 시간 안에' 내놓는 것이 매우 중요하다.정해진 시간 안에 답을 내놓지 못하는 실시간 시스템은 잘못된 답을 내보내는 시스템과 똑같이 나쁜 시스템이다. 실시간 시스템은 크게 2가지로 구분된다. 1. Hard Real Time : 절대적인 데드라인이 반드시 지켜져야 한다.2. Soft Real Time : 때때로 데드라인을 못 지켜도 (바람직하지는 않지만) 괜찮다. 미..
인터렉티브 시스템은 사용자의 요청에 얼마나 빠르게 응답하는지를 중점적으로 보는 시스템이다.따라서 인터렉티브 시스템은 선점형 스케줄링 알고리즘을 사용하며 response time 을 낮추는 것을 목표로 하였다. 이번 글에서는 인터렉티브 시스템의 스케줄링 알고리즘들을 정리해보자. Round Robin Scheduling라운드 로빈 스케줄링은 이름 그대로 빙글빙글 돌아가면서 프로세스를 실행하는 알고리즘이다.배치 시스템 스케줄링에서 봤었던 FCFS 스케줄링처럼 앞에 것을 실행하고 뒤로 보내는 것을 반복하면서 마치 원형큐를 사용하듯 쓰는 방법인데, 여기에 선점형 스케줄링의 속성이 추가되었다고 보면 된다. (a) 그림에 있는 프로세스들이 runnable 프로세스 ( = ready 상태에 있는 프로세스, run..
지난 글에서 정리한 것처럼, 배치 시스템은 프로세스 스위칭을 최소화하고 성능을 높이는 것을 목표로 한다.배치 시스템에서 사용하는 다양한 스케줄링 알고리즘을 정리해보자. FCFS (First-Come-First-Served)선입 선처리 스케줄링 또는 FCFS 스케줄링라고 부른다.이름 그대로 CPU 사용을 요청한 순서대로 할당해주는 방식의 알고리즘이다. 이를 위해서 하나의 큐를 사용하며, 현재 실행중인 프로세스가 Blocked 상태로 가면 큐의 맨 앞에 있는 프로세스를 running 상태로 올린다. 만약 blocked 상태에 있던 프로세스가 ready상태가 되면, 큐의 맨 뒤에 해당 프로세스를 넣는다. 이 스케줄링 알고리즘은 비선점 스케줄링 알고리즘이다.큐에 들어온 순서대로 순차적으로 실행만 하고, 실행하..
Scheduling과거 배치 시스템과 TimeSharing 방식의 컴퓨터가 있었을 때는 CPU가 매우 희귀한 자원이었다.그래서 이 비싸고 귀중한 CPU 자원을 최대한 많은 프로세스를 처리하는데 효율적으로 쓰기 위해서 여러가지 고민이 필요했다. 시간이 지나면서 CPU 성능이 증가하고 개인용 컴퓨터 시대가 온 뒤에는 과거만큼 CPU를 효율적으로 사용하기 위한 스케줄링 알고리즘의 고민 필요성이 낮아졌지만, 그럼에도 불구하고 서버 컴퓨터와 같은 고성능 컴퓨터에서는 스케줄링 알고리즘에 대한 고민이 필요하다.(보통 서버컴퓨터는 접속하는 클라이언트마다 프로세스를 생성하기 때문이다.) 그리고 프로세스는 계속 상태가 변하면서 번갈아 실행이 되는데,이렇게 실행하는 프로세스를 교체하는 것을 가리켜 프로세스 스위칭 또는 컨텍..
그림과 같이 음식과 포크가 주어져있다.이때 각 음식 앞에는 철학자들이 있고, 철학자들은 생각을 하거나 음식을 먹는다. 철학자들은 다음과 같은 순서로 식사를 진행한다. 1. 생각을 하다가 왼쪽 포크가 사용가능하면 집는다.2. 생각을 하다가 오른쪽 포크가 사용가능하면 집는다.3. 두 포크를 모두 집었다면 일정시간 식사를 한다.4. 식사를 마치고 오른쪽 포크를 내려둔다.5. 왼쪽 포크를 내려둔다.6. 1~5반복 이를 코드로 구현하면 아래와 같다. 이때 만약 모든 철학자가 동시에 식사를 시작하면 모두 동시에 왼쪽 포크를 집어들고 오른쪽 포크를 서로가 영원히 기다리므로 식사를 할 수 없게 된다. 이렇게 서로가 이미 점유한 자원에 서로 의존하여 모든 프로세스가 동작을 멈추는 상황을 '데드락(교착 상태)' 이라고..
Message Passing지난 글까지 정리한 프로세스 동기화는 모두 하나의 컴퓨터에서 같은 메모리와 CPU를 공유하는 서로 다른 프로세스 사이의 동작을 이야기했다. 이번에는 네트워크로 연결된 서로 다른 컴퓨터 상에서 돌아가는 서로 다른 프로세스 사이의 동작에 대해 이야기해본다. 서로 다른 프로세스 사이에 메세지를 주고받으려면 네트워크를 통해서 메세지를 전송하고 수신할 수 있어야 한다.메세지를 전송할 때는 send(), 메세지를 수신할 때는 receive() 라는 시스템 콜을 사용한다.send() 는 목적지로 메세지를 전송하는 것이니 간단한데, receive() 의 경우, 호출 했을 때 자신에게 온 메세지가 없다면 blocked 상태로 빠지거나(Sleep) 에러 코드를 return 할 수 있다. (뒤에서..