36
IT CookBook, 운운운운 : 운운운운 운운운 운운운 운운 운운운운운 운운운

프로세스와 스레드

Embed Size (px)

DESCRIPTION

3. 프로세스와 스레드. 학습목표 프로세스와 스레드의 개념을 이해한다 . 프로세스의 상태 변화 과정을 이해한다 . 프로세스의 생성과 종료 등 프로세스와 관련된 작업을 이해한다 . 프로세스와 스레드의 차이를 알고 스레드의 장점을 이해한다 . 사용자 수준 및 커널 수준 스레드의 장단점을 이해한다 . 내용 프로세스 개요 프로세스 관리 스레드. 1. 프로세스 개요. 프로세스 ( Process ) 개념 1960 년대 멀틱스 시스템 ( Multics System ) 설계자 처음 사용 . - PowerPoint PPT Presentation

Citation preview

Page 1: 프로세스와 스레드

IT CookBook, 운영체제 : 그림으로 배우는 원리와 구조

프로세스와 스레드

Page 2: 프로세스와 스레드

2/36

Contents

학습목표 프로세스와 스레드의 개념을 이해한다 . 프로세스의 상태 변화 과정을 이해한다 . 프로세스의 생성과 종료 등 프로세스와 관련된 작업을 이해한다 . 프로세스와 스레드의 차이를 알고 스레드의 장점을 이해한다 . 사용자 수준 및 커널 수준 스레드의 장단점을 이해한다 .

내용 프로세스 개요 프로세스 관리 스레드

Page 3: 프로세스와 스레드

3/36

프로세스 (Process) 개념 1960 년대 멀틱스 시스템 (Multics System) 설계자 처음 사용 .

• 이후 작업 (Task) 이란 용어와 함께 사용되며 , 다양한 정의를 가짐 .

• 가장 일반적인 정의는 “ 실행 중인 프로그램”

- 디스크에 저장되어 있던 실행 가능한 프로그램이 메모리에 적재되어 운영체제의 제어를 받는 상태 .

- 해당 프로세스가 사용하고 있는 메모리 영역 ( 자신의 주소 공간 ) 이 존재함을 의미 .

- 프로세서 할당 ( 점유 ) 시간과 메모리 , 파일 , 입출력장치 등의 자원이 필요하며 , 자원은 프로세스 생성 및 실행 시 할당됨 .

- 현재의 활동 상태를 나타내는 프로그램 카운터와 프로세서의 현재 활동 ( 레지스터 내용 ) 포함 .

프로그램과 달리 프로세서는 메모리에 주소 공간을 갖는 능동적인 개체 .

1. 프로세스 개요

[ 그림 3-1] 메모리에 존재하는 프로세스 주소 공간 구조

• 실행 스택 (Stack)

: 호출된 프로시저 ( 함수 ) 의 복귀 주소와 지역 변수 등의 일시적인 데이터를 저장하는 영역 .

• 실행 힙 (Heap)

: 텍스트 ( 코드 ) 영역과는 별도로 유지되는 자유 영역 .

• 데이터 ( 정적 변수 )

: 프로세스 실행 중 동적으로 할당 받는 영역 , 전역 또는 정적 변수 저장 .

• 텍스트 ( 코드 )

: 프로세서가 실행하는 코드 저장 .

Page 4: 프로세스와 스레드

4/36[ 그림 3-2] 시스템 관점에 본 프로세스

재진입 프로그램 ( 재진입 코드 )• 메모리 내에 동일한 사본을 여러 사용자가 공유할 수 있도록 작성된 프로그램 또는 루틴 .

- 실행 중 사용할 데이터를 보관하는 실행 스택과 공통적인 데이터를 보관하는 데이터 영역을 가짐 .

- 프로세서가 동일한 프로그램을 사용하여도 텍스트 ( 코드 ) 영역은 같으나 별도의 스택에 서로 다른 데이터를 가지므로 별개의 프로세스로 인식됨 .

- 데이터베이스 , 문서 편집기 등

프로세스는 사용자 관점에서 세그먼트 ( 코드 , 데이터 , 스택 등 ) 의 가상 주소 공간을 갖는 상태를 의미 , 시스템 관점에서 실행중인 프로그램을 의미 .

1. 프로세스 개요

• 처리 상태에 있는 데이터 구조로 표현 가능 ( 그림 3-2)

- 스케줄러 ( 디스패칭 ) 에 의해 프로세서 할당 .

- 파일에 관련된 자원에 대한 참조 ( 장치 관리 , 메모리 관리 )

- 프로세스 지원과 협력에 관한 정보 ( 교착상태 , 보호 , 동기화 ) 교환

- 프로세스 관련 연산은 생성 , 종료 , 보류 , 자원 할당 , 해제 등

Page 5: 프로세스와 스레드

5/36

프로세스 종류 실행 유형에 따라 크게 3 가지로 구분 .

• 운영체제 프로세스 - 커널 프로세스 또는 시스템 프로세스라 부름 .

- 프로세스 실행 순서 제어 , 사용하고 있는 프로세스가 다른 사용자나 운영체제 영역을 침범하지 못하게 감시하는 기능 담당 .

- 사용자 프로세스 생성 , 입출력 프로세스 등 시스템 운영에 필요한 작업 수행 .

• 사용자 프로세스 : 사용자 코드 수행 .

• 병행 프로세스 : 프로세스 여러 개가 동시에 실행되며 , 독립 프로세스와 협동 프로세스로 구분 .

1. 독립 프로세스

- 프로세스 여러 개가 병행하여 수행 시 주어진 초기값에 따라 항상 같은 결과를 보여줌 .

- 서로 독립적으로 실행되어 다른 프로세스에 영향을 받지 않고 , 데이터를 공유하지 않음 .

2. 협동 프로세스

- 다른 프로세스에 영향을 주거나 다른 프로세스에 의해 영향을 받음 .

- 컴퓨터 시스템의 제한된 자원을 공유하는 프로세스들이 통제되어 상호 작용해야 하는 경우 발생 .

- 서로 협동해야 하는 경우 , 통신을 위한 수단과 동기화 기능이 필요 .

1. 프로세스 개요

Page 6: 프로세스와 스레드

6/36

프로세스 상태 실행과 비실행 프로세스로 구분 .

• 프로세스는 실행되며 상태가 변하므로 운영체제는 프로세스 제어에 필요한 프로세스 상태를 점검해야 함 .

- 운영체제가 프로세스를 새로 생성하면 비실행 상태로 초기화되어 실행을 기다림 .

- 실행 중인 프로세스 종료 또는 인터럽트 발생 시 비실행 프로세스 중 선택된 프로세스가 실행 상태로 변하고 ( 디스패치 ) 인터럽트 된 프로세스는 비실행 상태로 변경 .

• 실행 상태 프로세스 - 실행 : 명령어가 실행되는 상태 , 즉 프로세스가 프로세서를 점유한 상태

- 대기 또는 보류 : 프로세서가 이벤트 ( 입출력 종료와 같은 외부 신호 ) 가 일어나길 기다리는 상태

- 준비 : 프로세스가 프로세서를 할당 받기 위해 기다리는 상태

• 대부분의 프로세스는 준비나 대기 ( 보류 ) 상태이며 , 어느 한 순간에 한 프로세스만 실행상태가 됨 .

1. 프로세스 개요

[ 그림 3-3] 프로세스 상태 구분 [ 그림 3-4] 프로세스 상태

Page 7: 프로세스와 스레드

7/36

프로세스 상태 변화• 시스템의 모든 프로세스는 종료되어 시스템을 떠날 때까지 준비 , 실행 , 대기 ( 보류 )

상태로 변화되며 실행되는 과정을 반복 .

• 운영체제는 프로세서 스케줄러를 이용해 프로세스 상태 변화를 관리 .

작업 스케줄러• 스풀러가 디스크에 저장한 작업들 중 실행할 작업을 선정 , 준비 리스트에 삽입 .

• 이를 통해 다중 프로그래밍의 정도를 결정하는 핵심적인 역할 수행 .

• 선정한 작업에 대한 프로세스의 생성에서 종료까지의 과정 수행을 위해 아래 그림과 같은 상태 변화를 일으킴 .

1. 프로세스 개요

[ 그림 3-5] 프로세스 상태 변화

• 프로세스 상태 변화 ( 그림 3-5)

- 실행 프로세스가 자발적으로 프로세서 반환 전 할당된 시간이 경과하면 준비상태로 변경 .

- 실행 프로세스가 실행하다 입출력 명령이 발생 시 대기 ( 보류 ) 상태로 변경 .

- 대기 프로세스는 보류 이유가 제거되면 준비 상태로 변경 .

- 준비 프로세스는 디스패처 (Dispatcher) 가 프로세서를 할당하면 다시 실행상태로 변경 .

Page 8: 프로세스와 스레드

8/36

준비 → 실행• 디스패치 (Dispatch)

: 준비 리스트 맨 앞에 있던 프로세스가 프로세서를 선택 ( 배당되어 실행 ) 하는 것 .

1. 프로세스 개요

dispatch( 프로세스명 ) : 준비 → 실행

• 시간 할당 - 실행 프로세스가 프로세서를 일정 시간만 사용할 수 있도록 시간을 제한 .

- 특정 프로세스가 프로세서를 계속 독점하는 것을 방지함 .

[ 그림 3-6] 프로세스와 디스패처

Page 9: 프로세스와 스레드

9/36

실행 → 대기 ( 보류 )• 실행 프로세스가 지정 시간 전에 입출력 연산 등이 필요하거나 새로운 자원 요청 등의 문제

발생 시 스스로 프로세서를 양도하고 대기 상태로 변경 .

1. 프로세스 개요

대기 ( 보류 ) → 준비• 깨움 (Wake up) : 프로세스의 마지막 상태 변화로 입출력 작업이 끝났을 때 발생 .

block( 프로세스명 ) : 실행 → 대기 ( 보류 )

※ 프로세스 상태 변화 중 프로세스 스스로 하는 것은 보류뿐 , 나머지는 외부 조건에 의해 발생 .

wakeup( 프로세스명 ) : 대기 ( 보류 ) → 준비

실행 → 준비• 프로세스가 프로세서를 점유한 상태를 “ 프로세스가 실행 상태에 있다”라고 함 .

• 운영체제는 프로세스의 독점을 방지하기 위해 인터럽트 클록 (Interrupt Clock) 을 둠 .

- 특정 프로세스가 일정 시간이 지나도 ( 타임아웃 ) 프로세서를 반환하지 않으면 클록 (Clock) 이 인터럽트를 발생 , 운영체제가 프로세서 제어권을 가짐 .

• 운영체제가 제어권을 가지면 실행 중인 프로세스는 준비 상태로 변화 , 준비 리스트의 첫 프로세스가 실행 상태로 변경 .

timeout( 프로세스명 ) : 실행 → 준비

Page 10: 프로세스와 스레드

10/36

프로세스 제어 블록 (PCB, Process Control Block)• 프로세스는 운영체제 내에서 프로세스 제어 블록이라 표현하며 , 작업 제어 블록이라고도

함 .

- 프로세스를 관리하기 위해 유지되는 데이터 블록 도는 레코드의 데이터 구조 .

- 프로세스 식별자 , 프로세스 상태 , 프로그램 카운터 등의 정보로 구성 .

- 프로세스 생성 시 만들어지고 메인 메모리에 유지 , 운영체제에서 한 프로세스의 존재를 정의 .

- 프로세스 제어 블록의 정보는 운영체제의 모든 모듈이 읽고 수정 가능 .

1. 프로세스 개요

[ 그림 3-7] 프로세스 제어 블록 (PCB)

• 프로세스 제어 블록 ( 그림 3-7)

- 프로세스 식별자 : 각 프로세스에 대한 고유 식별자 지정 .

- 프로세스 상태 : 생성 , 준비 , 실행 , 대기 , 중단 등의 상태 표시 .

- 프로그램 카운터 : 프로그램 실행을 위한 다음 명령의 주소 표시 .

- 레지스터 저장 영역 : 누산기 , 인덱스 레지스터 , 범용 레지스터 , 조건 코드 등에 관한 정보로 컴퓨터 구조에 따라 수나 형태가 달라짐 .

- 프로세서 스케줄링 정보 : 프로세스의 우선순위 , 스케줄링 큐에 대한 포인터 , 그 외 다른 스케줄 매개변수를 가짐 .

- 계정 정보 : 프로세서 사용시간 , 실제 사용시간 , 사용상한시간 , 계정 번호 , 작업 또는 프로세스 번호 등 .

- 입출력 상태 정보 : 특별한 입출력 요구 프로세스에 할당된 입출력장치 , 개방된 (Opened) 파일의 목록 등 .

- 메모리 관리 정보 : 메모리 영역을 정의하는 하한 및 상한 레지스터 ( 경계 레지스터 ) 또는 페이지 테이블 정보 .

Page 11: 프로세스와 스레드

11/36

프로세스 교환 프로세스의 교환은 인터럽트와 트랩 , 시스템 호출로 나타냄 .

• 실행 중인 프로세스가 인터럽트되어 운영체제가 다른 프로세스를 실행 상태로 변경 , 제어를 넘겨줄 때 , 프로세서의 레지스터 내용은 저장해야 함 .

• 프로세스는 현재 사용되는 자원에 대한 정보를 가지며 , 실행되는 과정에서 여러 프로세스가 파생될 수 있는 능동적인 개체 .

- 프로그램은 프로세스 여러 개로 생성될 수 있는 디스크에 저장된 파일 내용으로 정적 단위 .

• 즉 , 자원을 할당 받은 상태의 프로그램 .

1. 프로세스 개요

[ 그림 3-8] 프로세스 간 교환 ( 프로세스 사용을 전환하는 P1, P2 간의 교환 )

Page 12: 프로세스와 스레드

12/36

프로세스 구조• 실행 중 프로세스 생성 시스템을 호출 , 새로운 프로세스를 생성 가능 .

• 이때 프로세스 생성 순서 저장 , 부모 /자식 관계를 유지하며 계층적으로 생성됨 .

- 부모 프로세스 (Parent Process) : 생성하는 프로세스 .

- 자식 프로세스 (Child Process) or 서브 프로세스 (Sub Process) : 생성되는 프로세스 .

• 유닉스 시스템의 일반적인 프로세스 계층 구조 ( 그림 3-9)

- 처음 부팅 시 식별자 (PID, Process ID) 가 0인 첫 번째 프로세스 Swapper 생성 .

- 이어서 Init(PID=1), Pagedeamon(PID=2) 생성 .

- Swapper(PID=0), Pagedeamon(PID=2) 를 운영체제 ( 커널 ) 프로세스라 하며 운영체제 모드에서만 실행 .

- 모든 사용자 프로세스는 fork() 명령을 통해 계층적으로 Init 의 자식 프로세스로 생성됨 .

2. 프로세스 관리

[ 그림 3-9] 프로세스 계층 구조 예 ( 유닉스 시스템 )

Page 13: 프로세스와 스레드

13/36

프로세스 생성 프로세스는 운영체제 또는 다른 사용자의 응용 프로그램 요청에 의해 생성 .

• 운영체제가 새로운 프로세스를 생성 , 추가하려면 프로세스 관리를 위한 프로세스 제어 블록을 만든 후 프로세스에 주소 공간을 할당해야 함 .

- 일괄 처리 환경에서는 실행을 위해 작업이 준비 큐에 도착할 때 생성 .

- 대화형 환경에서는 새로운 사용자가 로그온 (Log-on) 할 때 생성 .

• 프로세스 생성을 위해 다음과 같은 작업이 필요함 .

- 프로세스 식별자 결정 .

- 시스템에 알려진 프로세스 리스트에 식별자 삽입 .

- 프로세스에 초기 우선 순위 부여 .

- 프로세스 제어 블록 생성 .

- 프로세스에 초기 자원 할당 .

• 프로세스 생성 과정 .

1 단계 : 새로운 프로세스에 프로세스 식별자 할당 .

2 단계 : 프로세스의 모든 구성 요소를 포함할 수 있는 주소 공간 , 프로세스 제어 블록 공간 할당 .

3 단계 : 프로세스 제어 블록 초기화 .

- 프로세스의 상태 정보 /프로그램 카운터 /스택 포인터 등의 초기화 , 자원 요청 , 프로세스 제어 정보 ( 우선 순위 ) 등

4 단계 : 링크 ( 해당 큐에 삽입 ).

2. 프로세스 관리

Page 14: 프로세스와 스레드

14/36

프로세스가 작업을 수행하기 위해 자원 필요 .• 자식 프로세스 생성 시 필요한 자원을 운영체제로부터 직접 또는 부모 프로세스의 자원

일부 사용 가능 .

• 부모 프로세스는 자식 프로세스에 자원을 나눠주거나 일부 자원 공유 가능 .

- 자원의 일부만 사용하도록 제한하면 시스템에 부담을 주는 것을 방지 가능함 .

- 프로세스 생성 시 획득하는 다양한 물리적 , 논리적 자원 외에도 약간의 초기화 데이터가 부모 프로세스에서 자식 프로세스로 전달되는 경우도 있음 .

새로운 프로세스 생성 시 실행과 관련해 다음 두 가지 경우가 가능함 .• 부모 프로세스와 자식 프로세스가 동시에 실행됨 .

• 부모 프로세스는 자식 프로세스들이 모두 종료될 때까지 기다림 .

새로운 프로세스의 주소 공간은 다음 두 가지 경우가 가능함 .• 자식 프로세스가 부모 프로세스의 주소 공간을 복사 .

- 유닉스는 각 프로세스마다 정수로 된 고유한 프로세스 식별자를 가짐 .

- 새로운 프로세스는 fork() 명령에 의해 생성 , 주소 공간은 부모 프로세스의 주소 공간을 복사함 .

- 부모 프로세스와 자식 프로세스의 정보 교환이 쉬움 .

• 자식 프로세스가 별도의 프로그램을 적재 .

2. 프로세스 관리

※ 윈도우 NT 계열은 새로운 프로세스의 주소 공간을 두 가지 방식을 모두 지원 .

Page 15: 프로세스와 스레드

15/36

프로세스 종료 프로세스가 명령 실행 후 종료되고 운영체제에 프로세스 삭제 요청

• 일괄 처리 환경 : 작업 종료를 의미하는 신호로 인터럽트 발생 또는 시스템 호출로 중지명령 전달 , 프로세스 완료 .

• 대화형 환경 : 사용자가 로그오프 (Log-off) 하거나 터미널을 닫을 때 또는 오류에 의해 프로세스 종료 .

• abort 시스템 호출을 이용한 프로세스 종료 .

- 종료되는 프로세스를 생성한 부모 프로세스만 호출 가능 .

- 부모 프로세스가 자식 프로세스의 생존권을 가져 다른 프로세스가 임의로 작업을 중단시킬 수 없음 .

- 자식 프로세스 종료 시 자식 프로세서의 신원 (Identity) 이 부모 프로세스로 전달 .

부모 프로세스는 아래의 이유로 자식 프로세스 종료 가능• 자식 프로세스가 할당된 자원을 초과하여 자원을 사용할 때 .

• 자식 프로세스에 할당된 작업 (Task) 이 더 이상 없을 때 .

2. 프로세스 관리

Page 16: 프로세스와 스레드

16/36

연속 종료• 시스템이 부모 프로세스 종료 시 자식 프로세스의 존재를 허용하지 않아 종료시키는

현상으로 운영체제가 수행함 .

- 유닉스에서 exit 명령으로 프로세스 종료 , 부모 프로세스는 wait 명령을 사용하여 자식 프로세스의 종료를 기다림 .

- wait 명령 : 종료된 자식의 프로세스 식별자를 부모 프로세스에 전달함 .

프로세스를 종료하는 경우와 그 예• 정상 종료 : 프로세스가 운영체제의 서비스를 호출한 경우 .

• 시간 초과 : 프로세스가 명시된 전체 시간을 초과하여 실행되거나 명시된 시간을 초과하면서 어떤 이벤트 발생을 기다리는 경우 .

• 실패 : 파일 검색 실패 , 명시된 횟수를 초과하여 입출력이 실패한 경우 .

• 산술 오류 , 보호 오류 , 데이터 오류 등 .

• 메모리 부족 , 접근 위반 등

프로세스 제거 프로세스를 파괴하는 것 .

• 제거 시 프로세스에 속한 자원을 시스템에 돌려주고 해당 프로세스는 시스템 리스트나 테이블에서 사라지며 , 프로세스 제어 블록 회수 .

• 프로그램은 디스크에 저장됨 .

2. 프로세스 관리

Page 17: 프로세스와 스레드

17/36

프로세스 중단과 재시작 프로세스 중단 ( 일시 정지 )

• 프로세서의 동작 시간과 입출력 동작 시간의 차이로 시스템의 활동 시간이 유휴 상태로 되는 것을 해결 가능 .

• 장시간 중단되는 경우 해당 프로세스에 할당된 자원을 다시 풀어주어야 하며 , 풀어줄 자원의 결정은 자원의 성질에 따라 결정 .

• 다중 프로그래밍에서 중단은 자원 부족 ( 대기 ) 상태를 의미하기도 함 .

- 다중 프로그래밍 환경에서는 자원의 이용률과 시스템 효율 향상을 위해 자원을 동적으로 할당 .

- 교착상태 발생 시 문제 생김 .

- 중단 : 할당된 자원을 기다리는 상태 .

- 대기 : 자원을 할당 받기 위해 기다리는 상태 .

운영체제는 다음 두 가지 방법으로 프로세스를 실행 가능 .• 새로운 프로세스를 생성하여 실행 .

• 이미 실행 중인 프로세스를 중단시켰다가 다시 실행 .

- 시스템 전체의 부하를 증가시키지 않으면서 프로세스에 서비스 제공 가능 .

- 특정 이벤트 발생을 기다리며 대기 상태가 되므로 해당 이벤트 발생 시 즉시 실행 상태로 변화 가능 .

프로세스 재시작• 중단 원인이 제거되어 프로세스가 다시 실행되는 것 .

• 중단되었던 프로세스는 중단되었던 지점부터 다시 시작 .

2. 프로세스 관리

Page 18: 프로세스와 스레드

18/36

프로세스 중단과 재시작은 다음과 같은 경우에 발생함 .• 시스템에 장애가 발생하면 실행 중인 프로세스는 잠시 중단했다가 , 시스템이 기능을 회복했을 때 다시 재시작할 수 있다 .

• 프로세스의 어느 부분이 의심스러울 때 사용자는 실행 중인 프로세스를 중단하여 확인한 후 재시작하거나 정지할 수 있다 .

• 처리할 일이 너무 많아 시스템 부담이 크면 프로세스 몇 개를 중단했다가 시스템이 다시 정상 상태로 돌아왔을 때 재시작할 수 있다 .

2. 프로세스 관리

[ 그림 3-10] 중단과 재시작을 추가한 프로세스 상태 변화

• 중단과 재시작을 추가한 프로세스 상태 변화( 그림 3-10)

- 중단 : 프로세스 자신 또는 다른 프로세스에 의해 가능 .

- 단일 처리 시스템 : 프로세스 자신이 중단시켜야 함 .

- 다중 처리 시스템 : 다른 프로세서에 의해서도 가능하지만 , 다른 프로 세서가 재시작 시켜주기 전엔 실행 불가능 .

Page 19: 프로세스와 스레드

19/36

프로세스 우선 순위 변경 프로세스 제어 블록의 우선 순위 값 변경 가능 .

• 준비 리스트의 프로세스는 프로세서 중심 프로세스 ( 낮은 우선 순위 ) 와 입출력 중심 프로세스 ( 높은 우선 순위 ) 로 구분 .

- 우선 순위가 낮은 프로세스 : 시간 할당량을 크게 제공 .

- 우선 순위가 높은 프로세스 : 시간 할당량을 적게 제공 .

※ 입출력 중심의 프로세스를 자주 짧게 사용 , 프로세서 중심 프로세스는 사용 횟수는 적으나 한번에 오래 사용하게 하여 균형을 유지함 .

• 입출력 프로세스 - 높은 우선 순위 : 속도가 느리면서 빠른 응답을 요구하는 단말기 입출력 프로세스 .

- 낮은 우선 순위 : 속도가 빠른 디스크 입출력 프로세스 .

프로세스 스케줄러는 준비 리스트의 우선 순위를 이용해 프로세스를 처리 .

할당 시간을 초과할 경우 프로세스 실행 상태에서 준비 상태로 변경 .

2. 프로세스 관리

Page 20: 프로세스와 스레드

20/36

문맥 교환 (Context Switching) 프로세스 교환

• 실행 중인 프로세스가 인터럽트되면 운영체제가 다른 프로세스를 실행 상태로 변경 , 해당 프로세스에 제어를 넘겨주는 과정에서 실행 중인 프로세스로부터 제어를 인수한 운영체제가 또 다른 프로세스에 제어를 넘겨주기 위해 발생 .

- 인터럽트 처리 루틴을 실행한 후 현재 실행 중인 프로세스가 재실행될 수 있으므로 대부분의 운영체제는 프로세스 교환으로 인터럽트가 발생하지 않음 .

- 트랩은 시스템이 치명적인 오류인지를 판단 , 치명적 오류일 경우 프로세스를 종료하면서 프로세스 교환 발생 .

문맥 교환• 프로세스를 다른 프로세스로 교환하기 위해 이전 프로세스의 상태 레지스터 내용을

보관하고 다른 프로세스의 레지스터를 적재하는 일련의 과정 .

- 프로세스가 “ 준비→실행” , “ 실행→준비” , “ 실행→대기”상태로 변할 때 발생 .

- 오버헤드가 발생하며 오버헤드는 메모리 속도 , 레지스터 수 , 특수 명령어의 존재에 따라 다르므로 시스템마다 다름 .

2. 프로세스 관리

[ 그림 3-11] 문맥 교환 과정

Page 21: 프로세스와 스레드

21/36

인터럽트 (Interrupt)• 현재 실행되는 프로세스와 별도로 외부에서 발생되는 여러 종류의 이벤트 ( 입출력 동작의 종료

등 ) 에 의해 발생 .

• 제어가 인터럽트 처리 루틴으로 넘어간 후에도 기본 시스템 관리 작업을 처리 , 인터럽트 형태에 따라 관련된 운영체제 루틴으로 분기 .

• 대표적인 인터럽트 예 - 입출력 인터럽트

: 입출력 동작이 발생한 사실을 확인 후 이벤트를 기다리는 프로세스를 준비 상태로 변경 , 실행할 프로세스를 결정 .

- 클록 인터럽트 : 현재 실행 주인 프로세스의 할당 시간을 조사하여 실행 중인 프로세스를 준비 상태로 변경 , 다른 프로세스를 디스패치하여 실행 상태로 변경 .

트랩 (Trap)• 부적절한 파일 접근 또는 현재 실행 중인 프로세스에 의해 발생되는 오류나 예외 상황으로 인해

발생 .

2. 프로세스 관리

Page 22: 프로세스와 스레드

22/36

스레드 개요 프로세스에서 실행 제어만 분리한 실행 단위 .

• 경량 프로세스 (LWP, Light Weight Process) 라고도 부름 .

- 중량 프로세스 (HWP, Heavy Weight Process) 는 스레드를 하나 가진 작업 .

• 프로세서를 사용하는 기본 단위이며 , 명령어를 독립적으로 실해할 수 있는 하나의 제어 흐름 .

• 작업 : 스레드의 그룹 환경 - 같은 그룹의 스레드와 코드 , 주소 공간 , 운영체제의 자원 ( 파일 , 신호 ) 등을 공유 .

※ 작업에 스레드가 없으면 아무 일도 할 수 없으므로 반드시 스레드가 있어야 함 .

프로세스는 스레드를 하나 이상 가지며 , 각 스레드는 아래 내용을 포함 .

3. 스레드

• 스레드 실행 시의 상태 ( 실행 , 준비 등 )

• 실행 스택

• 지역 변수와 스레드의 특정 데이터를 저장하기 위한 스레드별 정적 저장소

• 프로세스의 다른 스레드가 공유하는 프로세스의 메모리와 자원에 대한 접근 등의 스레드 실행 환경 정보( 문맥 정보 )

[ 그림 3-12] 스레드 구조

Page 23: 프로세스와 스레드

23/36

스레드의 장점• 프로세스에 포함된 스레드들은 공통의 목적 달성을 위해 병렬로 수행 .

- 자원을 공유하여 한 프로세스에서 동시 작업 가능 .

• 시스템 성능과 효율 향상 .

- 하나의 프로세스가 서로 다른 프로세서에서 프로그램의 다른 부분을 동시에 실행 가능 .

- 응용 프로그램 하나가 비슷한 작업들을 여러 개 수행 .

• 스레드를 이용하여 다음과 같은 이점을 얻을 수 있음 .

3. 스레드

- 사용자에 대한 응답성 증가 : 응용 프로그램의 일부분이 봉쇄 또는 긴 작업 수행 시에도 프로그램 실행을 계속 허용하여 사용자에 대한 응답성이 증가 .

- 프로세스의 자원과 메모리 공유 가능 : 스레드는 그들이 속한 프로세스의 자원과 메모리를 공유하 므로 , 응용 프로그램 하나가 같은 주소 공간에서 여러 개의 스레드를 실행 , 시스템 성능 향상과 편리함 제공 .

- 경제성 : 한 프로세스의 자원을 공유하므로 프로세스를 생성하는 것 보다 오버헤드를 줄일 수 있음 .

- 다중 프로세서 구조 활용 가능 : 다중 프로세서 구조에서 각 스레드는 다른 프로세서에서 병렬로 실행될 수 있음 .

[ 그림 3-13] 프로세스와 다중 스레드

Page 24: 프로세스와 스레드

24/36

단일 스레드와 다중 스레드 운영체제는 단일 프로세스에서 단일 스레드 실행과 다중 스레드 실행을 지원 .

• 단일 스레드 프로세스 - 프로세스 하나에 스레드 하나가 실행되는 전통적인 방식으로 스레드의 개념이 불확실함 .

- MS-DOS

• 다중 스레드 프로세스 - 프로세스 하나에 여러 스레드를 실행하는 것을 지원 .

- 윈도우 NT/XP, 솔라리스 등

3. 스레드

[ 그림 3-14] 단일 스레드 프로세스와 다중 스레드 프로세스

Page 25: 프로세스와 스레드

25/36

다중 스레드의 특징• 각 스레드를 별도의 프로세서에서 실행하는 측면 다중 프로세싱 ( 프로세서 ) 와 같은 의미 .

• 동일 프로세스 내의 스레드는 메모리와 파일을 공유하므로 , 프로세스 하나에 다수의 실행 단위로 구분된 자원을 공유 .

• 자원 생성과 관리의 중복성을 최소화하여 실행 능력 향상 .

• 각 스레드는 커널 개입 없이 서로 통신이 가능하여 독립적으로 실행 .

• 서버에서 많은 요청을 효과적으로 처리할 수 있는 환경 .

• 프로세스를 새로 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르고 , 같은 프로세스 내 스레드 간 교환이나 스레드 종료 역시 빠름 .

• 프로세스의 상대적인 무게를 줄여 효율을 극대화하는 것이 목표 .

• 프로그램 변경 없이 프로세서의 개수에 따라 스레드를 병렬로 처리 가능 .

• 같은 그룹의 스레드에 프로세서를 할당 또는 스레드 생성 시 중량 프로세서들 사이의 문맥 교환과 비교하여 더 경제적임 .

3. 스레드

Page 26: 프로세스와 스레드

26/36

단일 스레드와 다중 스레드 모델• 단일 스레드 프로세스 모델 - 프로세스를 하나의 스레드 , 스레드가 가진 레지스터와 스택으로 표현 .

• 다중 스레드 프로세스 모델 - 프로세스를 각각의 스레드와 고유의 레지스터 , 스택으로 표현 , 프로세스 주소 영역을 모든 스레드가

공유 .

- 프로세스의 모든 스레드는 해당 프로세스의 자원과 상태를 공유 , 같은 주소 공간에 존재하며 동일한 데이터에 접근 .

3. 스레드

[ 그림 3-15] 프로세스 관리 면에서 살펴본 단일 스레드와 다중 스레드 프로세스

Page 27: 프로세스와 스레드

27/36

스레드 용법 단일 사용자 다중 처리 시스템 환경

• 시스템 호출이 아닌 사용자 라이브러리 수준에서 스레드 개념을 제공 , 빠른 속도 .

• 프로그램에 비동기적 요소를 구현 가능 .

• 실행 중인 스레드를 대기 상태로 변경 , 다른 스레드로 제어를 이동시키는 상태 변화는 하나의 서버가 많은 요청을 받아들여 처리하는 효과적인 방법 .

공유 메모리 형태의 다중 프로세서 시스템 환경• 프로그램을 공유 메모리에 저장 , 스레드를 각 프로세서에 할당 , 병렬 처리하여 프로세서

성능을 매우 향상시킬 수 있음 .

스레드의 단점• 사용자 수준 스레드는 커널 자체가 스레드 하나로 구성 , 시스템 호출 실행 시 해당

스레드가 포함된 전체 작업이 시스템 호출 결과가 돌아올 때까지 대기 .

3. 스레드

[ 그림 3-16] 다중 스레드 환경의 워드 프로세서 실행 [ 그림 3-17] 다중 스레드 환경의 웹 서버 프로세스

Page 28: 프로세스와 스레드

28/36

스레드의 상태 변화 스레드의 특징

• 준비 , 실행 , 대기 , 종료 상태로 구분 , 프로세서를 함께 사용하며 항상 스레드 하나만 실행됨 .

• 한 프로세스에 있는 스레드는 순차적으로 실행 , 자신의 정보를 위한 프로그램 카운터와 스택을 가짐 .

• 스레드 생성 시 운영체제는 부모 프로세스와 공유할 자원을 초기화하지 않음 .

• 프로세스 내 스레드는 해당 프로세스에서 다른 스레드를 생성 , 새로 형성된 스레드를 위한 스택과 레지스터를 제공함으로 프로세스의 생성 및 종료 과정 보다 오버헤드가 적음 .

• 하나의 스레드가 대기 상태로 변할 때 전체 프로세스를 대기 상태로 변화시키지 않음 .

- 하나의 스레드가 대기 상태일 경우 다른 스레드 실행 가능 .

• 서로 독립적이지 않다 .

- 한 작업에 있는 모든 스레드는 작업의 모든 주소에 접근 가능 .

• 보호 문제 - 프로세서는 다수의 사용자에게서 발생 , 경쟁적인 자원 요구와 서로 다른 관계 유지 .

- 스레드는 한 명의 사용자가 여러 스레드를 가진 작업 하나를 소유 .

3. 스레드

Page 29: 프로세스와 스레드

29/36

스레드의 상태• 대기 - 스레드가 이벤트를 기다릴 때 , 즉 입출력 작업 등이 완료될 때까지 대기 ( 보류 ) 상태 .

- 자신의 정보 ( 프로그램 카운터 , 스택 포인터 등 ) 를 실행 스택에 저장 .

• 준비 - 스레드가 프로세서에 의해 실행될 수 있는 상태 .

- 스레드를 대기시킨 이벤트 발생 시 해당 스레드는 준비 리스트에 삽입됨 .

• 실행 - 스레드가 프로세서를 점유하여 실행 중인 활성화 상태 .

• 종료 - 스레드가 작업을 종료하면 자원을 해제 , 레지스터 문맥과 스택 할당 제거 .

3. 스레드

[ 그림 3-18] 스레드 상태 변화

Page 30: 프로세스와 스레드

30/36

스레드 구현 사용자 수준 스레드

• 커널 스레드를 지원하지 않는 운영체제에서 사용 .

• 사용자 수준 스레드 여러 개가 커널 스레드 ( 프로세스 ) 하나로 매핑되는 방식 .

• 다중 스레드 프로세스에 대해 프로세서 ( 실행 문맥 ) 하나를 할당하므로 다대일 스레드 매핑이라 칭함 .

• 사용자 수준 ( 공간 ) 에서 스레드 관리가 효율적으로 이루어지므로 스레드와 관련된 모든 과정을 응용 프로그램이 수행 .

• 응용 프로그램은 사용자 수준 스레드 관리를 위한 루틴으로 구성된 스레드 라이브러리( 스레드 패키지 ) 를 이용 , 다중 스레드로 프로그래밍 가능 .

• 응용 프로그램은 기본적으로 스레드 하나에서 시작 , 해당 스레드에서 실행을 시작함 .

3. 스레드

[ 그림 3-19] 다대일 스레드 매핑과 사용자 수준 스레드

Page 31: 프로세스와 스레드

31/36

스레드 라이브러리• 스레드 생성 , 종료 , 문맥 교환을 위한 코드 , 동기화 , 메모리 할당 , 스레드 간 메시지

전달 , 스레드 실행 스케줄링 등의 정보를 포함 .

• 생성 유틸리티를 통해 스레드가 생성 , 제어는 프로시저 호출을 통해 해당 유틸리티로 이동하여 수행 .

사용자 수준 스레드의 장점• 커널 도움 없이 사용자 주소 공간에 구현된 스레드 패키지로 스레드 연산 실행 .

• 커널은 연산 과정은 모르고 프로세스를 계속 하나의 단위로 스케줄하고 하나의 실행 상태를 할당 .

• 커널과 상관 없이 다양한 목적의 응용 프로그램이나 언어 인터페이스의 요구에 적용할 수 있는 융통성을 가짐 .

여러 수준에서 스레드 구현 가능• 운영체제에 따라 다르며 일반적으로 사용자 수준과 커널 수준 , 혹은 혼합한 방식 중 하나를

사용 .

• 윈도우 2000/XP, Mach, OS/2, 솔라리스 운영체제는 커널 수준 지원 , 시스템 호출 제공 .

• 사용자 수준에서 라이브러리 호출을 통한 지원 가능

3. 스레드

Page 32: 프로세스와 스레드

32/36

사용자 수준 스레드 이용 시 시스템의 장점• 높은 이식성 - 기본 커널 변경 없이 모든 운영체제에 적용 가능 .

• 오버헤드 감소 - 스레드 관리를 위한 모든 데이터 구조가 프로세스의 사용자 주소 공간에 있어 커널의 도움 없이

스레드 교환 가능 .

• 스케줄링의 유연성 - 스레드 라이브러리에서 스레드 스케줄링을 제어하므로 스케줄링이 응용 프로그램에 맞게 적절히

구성됨 .

사용자 수준 스레드 이용 시 시스템의 단점 • 시스템의 동시성 지원 불가 - 한 번에 하나의 스레드만 커널에 접근 가능하므로 여러 스레드가 시스템 호출을 동시에 사용할 수 없

음 .

• 시스템 규모 확장 제약 - 커널이 프로세서 내부의 다중 스레드를 프로세스 하나로 관리 , 다중 처리 환경에서 여러 프로세스를

이용한 분산 처리를 할 수 없음 .

• 스레드 간 보호가 어려움 - 스레드 간의 보호에 커널의 보호 기법을 사용할 수 없고 , 스레드 라이브러리에서 스레드 간 보호를

제공해야 프로세스 수준에서 보호됨 .

3. 스레드

Page 33: 프로세스와 스레드

33/36

커널 수준 스레드• 사용자 수준 스레드의 한계를 해결하기 위해 사용자 스레드마다 프로세서 ( 실행 문맥 ) 를 매핑하는 일대일 스레드 매핑을 지원 .

• 커널에 의해 생성 , 삭제되고 커널의 텍스트와 전역 데이터를 공유 , 자신만의 커널 스택을 가짐 .

• 사용자 영역에는 스레드 관리를 위한 코드가 없음 .

- 모든 응용 프로그램은 다중 스레드로 지원 , 응용 프로그램의 스레드는 하나의 프로세스에서 지원 .

- 스레드 관련 모든 작업은 커널 ( 운영체제 ) 이 지원 , 프로세스와 스레드에 대한 실행 문맥 정보 유지 .

• 일대일 모델 구현 운영체제 : 윈도우 NT/XP/2000, 리눅스 , 솔라리스 9 이상 버전 , OS/2

3. 스레드

[ 그림 3-20] 일대일 스레드 매핑과 커널 수준 스레드

Page 34: 프로세스와 스레드

34/36

커널 지원 부족 문제 해결• 커널에 의한 직접적인 스케줄링과 실행으로 사용자 수준 스레드의 문제를 해결하여 시스템

성능 향상 .

병렬 실행 가능• 하나가 시스템 호출 시 다른 스레드가 중단되는 다대일 방식의 문제를 해결할 수 있어 다중

프로세서에서 다중 스레드를 병렬로 실행 가능 .

• 시스템 규모 확장이 쉬우며 처리량을 늘릴 수 있음 .

커널 모드 전환 오버헤드• 커널 스레드 생성으로 인한 오버헤드 증가로 응용 프로그램의 성능 저하를 막기 위해

시스템이 지원 스레드 수를 제한해야 함 .

• 사용자 수준 스레드보다 스케줄링과 동기화를 위해 자원이 더 필요함 .

• 시스템이 모든 스레드를 관리하므로 오버헤드 증가 .

이식성이 떨어짐• 시스템 변경 시 제공된 스레드 API(Application Program Interface) 를 사용하여 프로그램을

수정 .

• 제한적인 자원으로 인해 사용자 수준 스레드 생성에 따라 커널 스레드를 무한정 생성할 수 없음 .

3. 스레드

Page 35: 프로세스와 스레드

35/36

혼합형 스레드 지원• 스레드 생성은 사용자 영역에서 , 여러 개의 사용자 수준 스레드에 여러 개의 커널 스레드가 매핑되는 다대다 스레드 모델 .

• 사용자 수준 스레드 생성 시 커널 수준 스레드를 생성 , 성능 감소 .

• 시스템 호출 시 다른 스레드가 중단되는 문제를 해결하기 위한 방법 .

• 다대다 모델 구현 운영체제 : 솔라리스 (Solaris)

3. 스레드

[ 그림 3-21] 솔라리스 2 스레드

• 솔라리스 2 스레드 ( 그림 3-20)

① 작업 - 일반적인 프로세스

② 사용자 수준 스레드 - 응용 프로그램의 병렬 처리를 위한 인터페이스 .

- 프로세스의 주소 공간에 있는 스레드 라이브러리 를 통해 실행 .

③ 경량 프로세스 스레드 - 하나 이상의 사용자 수준 스레드 지원 .

- 커널 스레드 하나에 매핑 .

- 커널에 의해 독립적으로 스케줄링 .

- 다중 프로세서에서는 병렬로 실행 .

④ 커널 스레드 - 프로세서에서 실행되기 위해 디스패치되며 스케줄 링됨 .

Page 36: 프로세스와 스레드

36/36

자원과 입출력 대기를 위한 대기가 경량 프로세스 단위로 이루어짐 .• 스레드는 하나의 커널 스레드와 경량 프로세스 (LWP) 가 연결됨 .

• 각 작업 ( 프로세스 ) 은 경량 프로세스를 한 개 이상 가지며 , 경량 프로세스는 대응하는 커널 스레드를 가짐 .

• 어떤 작업의 경량 프로세스가 입출력 완료를 기다리더라도 프로세서는 그 작업의 다른 경량 프로세스로 이동하여 작업을 계속 수행할 수 있음 .

스레드 라이브러리가 최적의 성능을 지원• 경량 프로세스의 수를 동적으로 조절 , 사용자 수준 스레드와 커널 수준 스레드를 다대다

스레드 매핑함 .

• 다대다 스레드 매핑은 스레드 풀링 기법을 통해 일대일 스레드 매핑에서의 오버헤드를 줄여줌 .

스레드 활용 운영체제 예• 매크 (Mach)

- 다중 스레드 시스템 , 커널은 여러 개의 요청을 동시에 서비스할 수 있음 .

- 스레드 자신은 동기적 .

• 유닉스 커널 - 단일 작업 (Single-Tasking).

- 하나의 프로세스만 수정하는 것을 허용하여 데이터 제어의 동시성 문제 해결 가능 .

• 스레드가 비동기적 시스템 - 록킹 (Locking) 기능 필요 .

3. 스레드