1. 프로세스
CPU에 의해 수행되는 시스템 및 사용자 프로그램
- 프로그램 카운터의 값과 처리기 레지스터의 내용으로 대표되는 현재 활동을 포함
- 프로그램은 디스크에 저장된 파일의 내용과 같은 수동적인 존재 프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 연관된 자원의 집합을 가진 능동적인 존재
특징
- 실행중인 프로그램
- 프로세서가 할당되는 개체
- 프로시저가 실행중인 것
- 샐행중인 프로시저 제어의 경로
- 비동기적 행위
- 디스패치가 가능한 단위
- PCB를 가진 프로그램
프로세스 상태 전이도
- 생성상태 : 사용자가 요청한 작업이 커널에 등록되어 커널공간에 PCB 생성된 상태
- 준비 (Ready) 상태 : 프로세스가 기억장치를 비롯한 모든 필요한 자원들을 할당받은 상태에서 프로세서를 할당받기위해 기다리고 있는 상태
- 실행 (Execute) 상태 : 프로세스의 프로그램코드가 기억장치로부터 읽혀지면서 프로세서에 의해 실행되고 있는 상태
- 대기 (Block) 상태 : 프로세스가 원하는 자원을 할당받지 못해서 기다리고 있는 상태
- 완료(Finish) 상태 : 프로세스가 자신의 연산을 모두 마치면 완료상태로 전환되고 그 프로세스에 할당되었던 모든 자원 해제
프로세스가 전이되는 시기와 이유
- dispatch : 준비상태 → 실행 상태
- 준비상태의 프로세스들 중에서 우선순위가 가장 높은 프로세스를 선정하여 CPU 할당
- 단기 프로세스 스케줄러에 의해 선택된 프로세스가 실질적으로 CPU를 할당
- Time Run Out : 실행상태 → 준비상태
- 지정된 CPU의 할당 시간을 모두 사용한 프로세스는 다른 프로세스가 CPU를 선점하고, 그 프로세스는 준비상태로 전환
- Block : 실행 → 대기
- 실행중인 프로세스가 입출력명령을 만나면 입출력 인터럽트가 발생하여 입출력 전용 프로세서 (DMA)가 입출력을 완료할 때까지 CPU를 반납하고 대기상태로 전환
- Wake up : 대기 → 준비
- 입출력 완료를 기다리다가 입출력 완료 신호가 들어오면, 대기중인 프로세스는 준비상태로 전환
프로세스 제어블록 (PCB)
운영체제에게 프로세스에 대한 모든 정보를 제공해 주는 자료구조 테이블
- 운영체제가 CPU를 다른 프로세스에게 넘기고 다시 그 프로세스를 가져올때 저장된 PCB 재사용
PCB의 정보
- 프로세스의 현상태
- 프로세스의 고유한 식별자
- 부모프로세스 포인터
- 자식프로세스 포인터
- 프로세스 우선순위
- 프로세스가 위치한 메모리에 대한 포인터
- 할당된 자원에 대한 포인터
- 프로그램 카운터
- 중앙처리장치 레지스터 보관장소
2. 스레드 (Thread)
프로세스 구성을 제어흐름부분과 실행환경부분으로 나눌때, 프로세스의 실행부분을 담당. 실행의 기본단위
- 각 스레드는 독립적인 제어흐름을 가지고, 자신만의 스택과 레지스터 가짐
- 한 프로세스 안에 있는 다른 스레드들과 코드, 데이터, 운영체제 자원등을 공유
- 스레드들도 중앙처리장치를 공유, 준비, 블록, 수행, 종료 등 여러 상태들중 하나의 상태로 있기 가능
- 한 프로세스 내에 여러개의 스레드 존재 가능
- 빠른 속도의 문맥 교환가능
- 공유 영역 : 코드, 정적 전역 데이터, 힙, 커널데이터
- 사유영역 : 스택, 지역데이터, 프로그램카운터, 레지스터 집합
다중 스레드 장점
- 응답성: 응용프로그램의 일부분 봉쇄가능, 긴 작업수행시 프로그램 수행 계속되는 것을 허용
- 자원공유
- 경제성
- 다중처리기 구조의 활용 : 병렬 가능
| 구분 | 코드 | 데이터 | 힙 | 스택 | 레지스터 |
|---|
| 단일 프로세스 | 공유 | 공유 | 공유 | 1개 | 1개 |
| 다중 스레드 | 공유 | 공유 | 공유 | 스레드별 | 스레드별 |
3. 스레드 구현 방법
1) 커널 수준 (시스템 호출 ) 스레드
- 커널이 스레드 관리
- 스레드가 봉쇄형 시스템 콜을 수행하면 커널은 응용프로그램내의 다른 스레드의 수행을 스케줄 가능
- 인터럽트를 통한 이전 → 수행시간 많음
- 태스크 내의 스레드도 독립적으로 스케줄 가능
2) 사용자수준 (라이브러리) 스레드
- 커널위에서 지원되며 사용자 수준의 스레드 라이브러리에 의해 구현
- 모든 스레드 생성과 스케줄링은 커널의 개입없이 사용자 공간에서 이루어짐
- 운영체제는 스레드 인식 못함 → 운영체제의 호출 시에 프로세스 전체가 기다리게 됨 (스케줄링 불공평)
프로그램 실행시 메모리 영역 구조
- 컴파일 시 크기 결정
- code (text) : 함수, 제어문, 상수 (쓰기 금지)
- data : 전역변수, 정적 변수
- bss (blocked stated symbol) : 초기화 안된 전역변수
- 실행중 메모리 할당
- heap : 동적할당 malloc, new
- stack : 지역변수, 매개 변수