프로세스
- 1960년대 멀틱스 시스템 운영체제에서 처음 사용
- 실행 중인 프로그램
- 비동기적 행위 (비동기: 동시에 일어나지 않는)
- 실행 중인 프로시저
- 운영체제에 들어 있는 프로세스 제어 블록(PCB)
- 프로세서에 할당하여 실행할 수 있는 개체 디스패치가 가능한 대상
프로그램이 메모리로 적재되어 운영체제의 제어를 받으면 프로세스가 됨
프로세스의 종류
호출 서비스 | 설명 | |||
역할 | 시스템(커널) 프로세스 | 모든 시스템 메모리와 프로세서의 명령에 액세스할 수 있는 프로세스 프로세스 실행 순서를 제어하거나 다른 사용자 및 커널 영역을 침범하지 못하게 감시하고, 사용자 프로세스를 생성 |
||
사용자 프로세스 | 사용자 코드를 수행하는 프로세스 | |||
병행 프로세스 | 독립 프로세스 | 다른 프로세스에 영향을 주지 않거나 다른 프로세스의 영향을 받지 않으면서 수행하는 병행 프로세스 | ||
협력 프로세스 | 다른 프로세스에 영향을 주거나 다른 프로세스에서 영향을 받는 프로세스 |
프로세스의 상태 변화
- 운영체제가 프로세서 스케줄러를 이용해 상태 변화 관리
- 작업 스케줄러: 스풀러가 디스크에 저장한 작업 중 실행할 작업을 선정하고 준비 리스트에 삽입하여 다중 프로그래밍의 정도를 결정
- 프로세스 스케줄러: 선정한 작업의 상태를 변화시키며 프로세스의 생성에서 종료까지 과정을 수행
- 프로세스 스스로 하는 것은 대기 뿐, 나머지는 외부 조건으로 발생
프로세스의 상태 정보
- 운영체제가 프로세스 제어 시 필요한 프로세스의 상태 정보 저장
- 특정 프로세스 정보를 저장하는 데이터 블록이나 레코드
- 프로세스가 생성되면 메모리에 PCB가 생성
- 프로세스가 실행을 종료하면 해당 PCB도 삭제
프로세스 제어 블록 (PCB)
- Process Control Block
- 프로세스 식별자: 각 프로세스에 대한 고유 식별자(숫자, 색인 항목)
- 프로세스 상태: 생성, 준비, 실행, 대기, 중단 등 상태 표시
- 프로그램 카운터: 프로세스를 실행하기 위한 다음 명령의 주소 표시
- 레지스터 저장 영역: 누산기, 인덱스 레지스터, 스택 포인터, 범용 레지스터, 조건 코드 등에 관한 정보로, 컴퓨터 구조에 따라 수나 형태가 다름, 인터럽트가 발생하면 프로그램 카운터와 함께 저장하여 재실행할 때 원래대로 복귀할 수 있게 함
- 프로세스 스케줄링 정보: 프로세스의 우선순위, 스케줄링 큐에 대한 포인터, 기타 스케줄 매개변수 등이 이에 해당됨
- 계정 정보
- 입출력 상태 정보
- 메모리 관리 정보
프로세스 교환
- 실행 중인 프로세스의 제어를 다른 프로세스에 넘겨 해당 프로세스가 실행 상태가 되도록 하는 것
- 프로세스 문맥 교환이 일어나면 프로세스 제어권을 넘기게 되는 프로세서의 레지스터에 있던 내용을 PCB에 저장
프로세스의 관리
프로세스 생성
- 프로세스는 실행 중에 프로세스 생성 시스템을 호출, 새로운 프로세스를 생성할 수 있음
- 프로세스 생성 순서가 저장되고, 부모-자식(Parent-Child) 관계가 유지되며 계층적으로 생성
- 부모 프로세스가 자식 프로세스의 생성을 반복하게 되면 계층 구조가 형성됨
- 일괄처리 환경: 작업이 준비 큐에 도착할 때 프로세스 생성
- 대화형 환경: 새로운 사용자가 로그온할 때 프로세스 생성
①: 새로운 프로세스에 프로세스 식별자 할당
②: 프로세스의 모든 구성 요소를 포함할 수 있는 주소 공간과 프로세스 제어 블록 공간 할당
③: 프로세스 제어 블록 초기화 (프로세스 상태, 프로그램 카운터 등의 초기화, 자원 요청, 프로세스 제어 정보(우선 순위) 등을 포함)
④: 링크(해당 큐에 삽입
프로세스 종료
- 프로세스가 마지막 명령의 실행을 마치면 종료되고 운영체제에 프로세스의 삭제를 요청
- 일괄처리 환경: 작업 종료 의미의 신호로 인터럽트 발생 또는 시스템 호출로 중지 명령 전달
- 대화형 환경: 사용자가 로그오프하거나 터미널을 닫음
- abort 명령어로 프로세스 종료(종료되는 프로세스를 생성한 부모 프로세스만 가능)
- 부모 프로세스의 자식 프로세스 종료
- 부모 프로세스가 종료될 경우 운영체제가 자식 프로세스도 종료(연속 종료)
- 자식 프로세스가 할당된 자원을 초과하여 사용할 때
- 자식 프로세스에 할당한 작업이 더는 없을 때
- exit 명령어: 유닉스에서 프로세스 종료
- wait 명령어: 부모 프로세스가 자식 프로세스의 종료 기다림
프로세스 종료 원인
- 정상 종료: 프로세스가 응용체제의 서비스를 호출한 경우
- 시간 초과: 프로세스가 명시된 전체시간을 초과하여 실행됨
- 실패: 파일 검색 실패, 입출력이 명시된 횟수 초과하여 실패
- 오류: 산술 오류, 보호 오류, 데이터 오류 등
- 메모리 부족, 액세스 위반 등
프로세스 제거
- 사용하던 자원을 시스템에 돌려주고, 해당 프로세스는 시스템 리스트나 테이블에서 사라져 PCB가 회수됨
- 프로그램은 여전히 디스크에 저장되어 있음
- 자식 프로세스는 부모 프로세스가 제거될 때 같이 제거됨
프로세스 중단
- 시스템의 유휴시간 문제를 프로세스 중단(일시 정지) 상태를 이용해 해결 가능
- 운영체제는 새로운 프로세스를 생성하여 실행하거나, 실행 중인 프로세스를 중단했다가 다시 실행하여 사용 가능
- 후자의 방법을 이용할 경우 시스템 전체의 부하를 증가시키지 않고 프로세스에 서비스 제공
- 실행에서 대기가 아닌 중단 상태를 추가하는 경우
- 특정 이벤트의 발생을 기다리면서 대기 상태가 되어 해당 이벤트가 발생할 때 즉시 실행 상태로 바꿀 수 있음
- 다중 프로그래밍에서의 중단: 프로세스 입출력 요구 외에 다른 원인으로 프로세스가 실행을 중단한 상태(자원 부족(대기) 상태)
- 단일 처리 시스템: 해당 프로세스가 스스로 중단
- 다중 처리 시스템: 다른 프로세서가 실행 중인 프로세스를 중단
프로세스 재시작
- 중단된 프로세스는 다른 프로세서가 재시작하기 전에는 실행 불가
- 장시간 중단 시 해당 프로세스에 할당된 자원 반환, 자원의 성질에 따라 반환 자원 결정
- 메인 메모리: 프로세서 중단 즉시 반환
- 보조 메모리: 중단 시간을 예측할 수 없거나 너무 길 때 반환
- 중단된 프로세스는 중단된 지점부터 다시 시작
프로세스 우선 순위
- 프로세스 스케줄러
- 프로세스 제어 블록의 우선순위 값을 변경할 수 있음
- 프로새스 제어 블록의 우선순위를 이용하여 준비 리스트의 프로세스를 처리
- 준비 리스트의 프로세스는 프로세서 중심 프로세스(낮은 우선순위)와 입출력 중심 프로세스(높은 우선순위)로 구분
- 속도가 느리면서 빠른 응답을 요구하는 단말기 입출력 프로세스에 높은 우선순위 부여 → 시간 할당량을 적게 제공
- 속도가 빠른 디스크 입출력 프로세스에는 낮은 우선순위 부여 → 시간 할당량을 많이 제공
- 입출력 중심 프로세스는 프로세스를 짧게 자주 사용하도록 함
- 프로세서 중심 프로세스는 프로세서를 한 번에 오래 사용하되 사용 횟수를 줄여 균형을 유지
프로세스의 문맥 교환
- Context Switching
- 프로세스의 문맥 교환 시 오버헤드 발생
- 이는 메모리 속도, 레지스터 수, 특수 명령어의 유무에 따라 다름
- 오버헤드는 시간, 비용이 소요되어 운영체제 설계 시에 불필요한 문맥 교환 감소가 주요 목표
- 프로세스가 [준비 → 실행] 상태로 바뀌거나 [실행 → 준비] 또는 [실행 → 대기] 상태로 바뀔 때 발생
- 레지스터 문맥 교환, 작업 문맥 교환, 스레드 문맥 교환, 프로세스 문맥 교환 등이 가능
스레드
- 프로세스의 특성인 자원과 제어에서 제어만을 분리한 실행 단위
- 경량 프로세스(LWP): 프로세스의 속성 중 일부가 들어 있는 것
- 중량 프로세스(HWP): 스레드 하나에 프로세스 하나인 전통적인 경우
- 같은 프로세스의 스레드들은 동일한 주소 공간 공유
- 프로세스 하나는 스레드를 한 개 이상으로 나눌 수 있음
- 프로세스의 직접 실행 정보를 제외한 나머지 프로세스 관리 정보는 공유함
- 다른 프로시저 호출, 다른 실행 기록(별도 스택 필요)
- 관련 자원과 함께 메모리 공유 가능하므로 손상된 데이터나 스레드의 이상 동작도 고려해야 함
스레드 병렬 수행
- 프로세스 하나에 포함된 스레드들은 공동의 목적 달성을 위해 병렬 수행
- 프로세스가 하나인 서로 다른 프로세서에서 프로그램의 다른 부분을 동시 실행
- 사용자 응답성 증가
- 프로세스의 자원과 메모리 공유 가능
- 경제성 좋음
- 다중 처리(멀티 프로세싱)로 성능과 효율 향상
단일 & 다중(멀티) 스레드
- 단일 스레드: 스레드라는 용어가 탄생하기 전이라 개념 불확실(DOS)
- 멀티 스레드: 프로그램 하나를 여러 실행 단위로 쪼개어 실행한다는 측면에서 다중 처리(다중 프로세싱)와 의미가 비슷함
스레드의 상태 변화
- 프로세서를 함께 사용, 항상 스레드 하나만 실행됨
- 한 프로세스에 있는 스레드는 순차적으로 실행 (해당 스레드의 정보 저장 레지스터, 스택 필요)
- 프로세스를 생성하면 해당 프로세스의 스레드도 함께 생성 (단, 스레드 생성에서는 운영체제가 부모 프로세스와 공유할 자원을 초기화할 필요는 없음)
- 프로세스의 생성과 종료보다는 오버헤드가 훨씬 적음
스레드의 제어 블록
- 정보 저장
- 프로세스 제어 블록(PCB)은 스레드 제어 블록의 리스트
- 스레드 간에 보호하지 않음
스레드의 구현
운영체제에 따른 구현
- 사용자 수준 스레드: 다대일 맵핑, 스레드 라이브러리를 이용하여 작동, 속도가 빠름
- 장점: 이식성 높음, 오버헤드 적음, 유연한 스케줄링 가능
- 단점: 시스템의 동시성을 지원하지 않음(스레드가 아닌 프로세스 단위로 프로세서 할당), 커널이 한 프로세스에 속한 여러 스레드에 프로세서를 동시에 할당할 수 없어 다중 처리 시스템에서 분산 처리가 되지 않아 시스템 규모 확장이 어려움, 스레드 간 보호 불가능
- 커널 수준 스레드: 일대일 맵핑, 커널이 스레드와 관련된 모든 작업 관리
- 사용자 수준 프로세스의 한계(커널 지원 부족 문제) 극복 방법
- 한 프로세스에서 다수의 스레드가 프로세서를 할당 받아 병행 수행
- 장점: 동일한 프로세스의 스레드 병행 수행 가능, 동일 프로세스의 스레드 중 한 개가 대기 상태가 되어도 다른 스레드의 실행 가능
- 단점: 오버헤드 커짐
- 혼합형 스레드: 다대다 맵핑, 사용자 수준 스레드와 커널 수준 스레드를 혼합한 형태
- 사용자 수준 스레드와 커널 수준 스레드를 혼합한 구조
- 시스템 호출을 할 때 다른 스레드를 중단하는 다대일 맵핑의 사용자 수준 스레드와, 스레드 수를 제한하는 일대일 맵핑의 커널 수준 스레드의 문제 극복 방안으로 제시
- 스레드 라이브러리가 최적의 성능 지우너
- 커널이 경량 프로세스를 수동적으로 저잘
- 사용자 수준 스레드와 커널 수준 스레드가 다대다로 맵핑
- 응용 프로그램이 커널 영역에서의 병렬 처리 정도를 결정할 수 있음
- 스레드 풀링을 통해 일대일 맵핑으로 오버헤드 감소 가능
- 스레드 풀링: 시스템이 관리하는 스레드의 풀(Pool)을 응용 프로그램에 제공, 스레드를 효율적으로 사용할 수 있게 하는 방법
- 미리 생성한 스레드의 재사용으로 스레드 생성 시간을 줄여 시스템의 부담 경감
- 동시 생성 가능한 스레드 수를 제한하여 시스템 자원의 낭비를 줄이고, 응용 프로그램의 전체 성능을 일정 수준 유지