프로세스란 실행중인 프로그램을 말한다. 프로세스는 현대의 컴퓨팅 시스템에서 작업의 단위이다.
인터럽트의 개념
1) 인터럽트
프로세스가 수행 중에 다른 프로세스를 수행하기 위해 현재 수행중인 프로세스를 중단하거나 외부 입력 장치에 의해 프로세스가 중단되는 상태. 인터럽트는 어떤 이유에서든 H/W적, S/W적으로 현재 프로세스를 중단시키는 모든 행위
2) 인터럽트 처리를 위한 작업 순서
(1) 인터럽트가 발생하면 운영체제가 제어권을 받는다.
(2) 운영체제는 인터럽트 받은 현재의 프로세스 상태를 저장한다.
(3) 운영체제는 인터럽트의 정보를 분석하여 지정되어 있는 루틴으로 제어권을 넘겨준다.
(4) 인터럽트 처리 루틴이 인터럽트를 처리한다.
(5) 인터럽트가 걸렸던 이전 프로세스의 상태로 복구된다.
(6) 인터럽트가 걸렸던 시점 이후부터 프로세스가 실행된다
CPU를 항상 바쁘게 만드는 것을 목적으로, 프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스 중에서 하나의 프로세스를 선택한다. 각 CPU 코어는 한 번에 하나의 프로세스를 실행할 수 있다.
스케줄링 시에, I/O 바운드 프로세스와 CPU 바운드 프로세스를 적절하게 섞어야 효율적인 스케줄링이 가능하다.
일반적으로, CPU 버스트 시간이 짧은 I/O 바운드 프로세스에게 우선순위를 높여주는 것이 더 바람직하다.
스레드는 프로세스 내에서 실행되는 흐름의 단위를 말한다. 즉, 프로세스 보다 작은 CPU 이용의 기본 단위이다.
스레드는 같은 프로세스에 속한 다른 스레드와 코드 영역, 데이터 영역 그리고 열린파일이나 신호와 같은 운영체제 자원들을 공유한다.
응답성: 응용 프로그램의 일부분이 봉쇄되거나, 응용 프로그램이 긴 작업을 수행하더라도, 프로그램의 수행이 계속되는 것을 허용함으로써, 사용자에 대한 응답성을 증가시킨다.
자원 공유: 프로세를 끼리는 공유 메모리나 메시지 전달 기법등을 통해 서만 자원을 공유할 수 있다. 반면, 스레드는 자동으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다.
경제성: 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에, 스레드를 생성하고 문맥교환(Context Switching)을 하는 것이 더욱 경제적이다. 일반적으로 스레드 생성은 프로세스 생성보다 시간과 메모리를 덜 소비한다.
규모 적응성: 다중 스레드의 이점은 듀얼 코어와 같은 다중 처리기 구조에서 더욱 증가할 수 있다. 각각의 스레드가 다른 처리기에서 병렬로 수행될 수 있기 때문이다. 단일 스레드 프로세스는 처리기가 아무리 많더라도 오직 한 처리기에서만 실행된다.
사용자 스레드(user thread): 사용자 스레드는 커널 위에서 지원되며 커널의 지원 없이 관리된다. 일반적으로 사용자 레벨의 라이브러리를 통해 구현된다.
커널 스레드(kernel thread): 커널 스레드는 운영체제에 의해 직접 지원되고 관리된다.
여러개의 사용자 스레드를 하나의 커널 스레드로 매핑한다. 한 스레드가 봉쇄형 시스템 콜을 할 경우, 전체 프로세스가 봉쇄된다. 한번에 하나의 스레드만이 커널에 접근이 가능하기 때문에 병렬로 실행될 수 없어, 다중 스레드의 장점을 살리기 힘들다.
각 사용자 스레드를 각각 하나의 커널 스레드로 매핑한다. 이 모델은 하나의 스레드가 봉쇄형 시스템 콜을 호출하더라도 다른 스레드가 실행될 수 있기 때문에 다대일 모델보다 더 많은 병렬성을 제공한다. 이 모델의 유일한 단점은 사용자 스레드를 만드려면 해당 커널 스레드를 만들어야 하며 많은 수의 커널 스레드가 시스템 성능에 부담을 줄 수 있다는 것이다.
Linux, Windows가 이 모델을 구현하고 있다.
여러개의 사용자 스레드를 그보다 작은 수, 혹은 같은수의 커널 스레드로 매핑한다. 다대일 모델과 일대일 모델의 단점을 보완한 방식이다.
다대다 모델을 변형한 두 수준 모델(two-level model)도 있는데, 이 모델은 중요한 스레드는 one-to-one 방식으로, 덜 중요한 스레드는 many-to-many 방식으로 구현한다.