아래 내용은 운영체제 | 그림으로 배우는 구조와 원리 를 읽고 정리한 내용입니다.
Chapter 3. 프로세스와 스레드
01. 프로세스의 개념과 상태 변화
1. 프로세스의 개념
프로세스: 실행 중인 프로그램 / 메모리 구조를 이루고, 프로그램 카운터나 레지스터처럼 현재 어떤 자원을 사용하는지 관련 정보가 들어있는 동적인 개체
아래 사진은 프로세스의 일반적인 메모리 구조이다.
- 스택 (stack): 데이터를 일시적으로 저장하는 영역
- 지역 변수에 사용하고, 변수가 범위 밖이면 공간을 해제
- 힙 (heap): 코드 영역과는 별도로 유지되는 자유 영역
- 동적으로 메모리를 할당하기 위해 프로그램 실행 중 시스템 호출을 사용했다가 해제하는 방법으로 사용
- 데이터: 프로그램의 가상 주소 공간
- 코드: 실행 명령을 포함하는 메모리이거나 목적 파일에 있는 프로그램 영역
프로세스의 종류
구분 | 종류 | 설명 |
---|
역할 | 시스템 (커널) 프로세스 | 모든 시스템 메모리와 프로세서의 명령에 접근함. 프로세스 실행 순서를 제어하거나 커널 영역을 침범하지 못하게 감시하고, 사용자 프로세스를 생성하는 기능을 수행 |
| 사용자 프로세스 | 사용자 코드를 수행 |
병행 수행 방법 | 독립 프로세스 | 다른 프로세스에 영향을 주거나 받지 않으면서 수행하는 병행 프로세스 |
| 협력 프로세스 | 다른 프로세스에 영향을 주거나 다른 프로세스에서 영향을 받는 병행 프로세스 |
2. 프로세스의 상태변화와 정보
프로세스의 상태는 크게 두가지로 나뉠 수 있다: 실행 상태, 비실행 상태
프로세스 제어 블록
- 특정 프로세스 정보를 저장하는 데이터를 블록이나 레코드
- 운영체제가 프로세스를 제어할 때 필요한 상태 정보를 저장
- 프로세스 식별자, 상태, 카운터, 레지스터 저장 영역, 프로세스 스케줄링 정보, 계정 정보등이 있음
프로세스의 문맥 교환 (Context switching)
- 인터럽트나 시스템 호출 등으로 실행 중인 프로세스의 제어를 다른 프로세스에 넘겨 실행 상태가 되도록 하는 것
02. 프로세스의 관리
1. 프로세스의 구조
부모 프로세스: 프로세스를 새로 생성하는 프로세스
자식 (서브) 프로세스: 생성되는 프로세스
2. 프로세스의 생성
- 새로운 프로세스에 프로세스 식별자를 할당
- 프로세스의 모든 구성 요소를 포함할 수 있는 주소 공간과 프로세스 제어 블록을 할당
- 프로세스 제어 블록 초기화
- 링크를 건다 (해당 큐에 삽입)
3. 프로세스의 종료
부모 프로세스는 다음 상황에서 자식 프로세스를 종료시킬 수 있다.
- 자식 프로세스가 할당된 자원을 초과하여 자원을 사용할 때
- 자식 프로세스에 할당된 작업이 거의 없을 때
다음과 같은 방법으로 프로세스를 종료할 수 있다.
- 정상 종료
- 시간 초과
- 실패
- 여러 오류 (산술 오류, 보호 오류, 데이터 오류)
- 메모리 부족, 액세스 위반 등
4. 프로세스의 제거
프로세스 제거 = 프로세스 파괴
- 사용하던 자원을 시스템에 반환
- 프로세스 제어 블록 회수
- 부모 프로세스가 제거되면 자식 프로세스도 제거됨
5. 프로세스의 중단과 재시작
프로세스의 준비, 실행, 대기 상태만 이용한다면 시스템이 대부분 유휴 상태가 됨.
유휴 상태: CPU의 처리 시간과 입/출력 장치에서의 처리 시간 차이로 CPU를 사용할 수 있는 상태임에도 CPU가 작업을 하지 않고 쉬고 있는 시간
이는 프로세스 중단 상태를 이용하여 해결 가능
- 시스템 전체의 부하를 증가시키지 않고 프로세스에 서비스 재공 가능
- 대기 상태가 되면서 해당 이벤트가 발생할 때 즉시 실행 상태로 바꿀 수 있음
프로세스 중단과 재시작은 다음과 같은 상황에 발생
- 시스템 장애 → 중단 → 기능 회복 → 재시작
- 프로세스에 의심스러운 부분이 있으면 중단 → 확인 → 재시작/종료
- 처리할 적업이 너무 많아서 시스템에 부담이 되면 몇개 중단 후 재시작
- 장시간 중단할 때에는 해당 프로세스에 할당된 자원 반환
- 메인 메모리는 바로 반환
- 보조 메모리는 중단 시간을 예측할 수 없거나 너무 길때 반환
6. 프로세스의 우선순위 변경
프로세스 스케줄러는 블록에 있는 우선순위를 이용하여 준비 리스트의 프로세스를 처리:
7. 프로세스의 문맥 교환
프로세스 외부에서 이벤트가 일어나면 인터럽트 발생
- 입출력 인터럽트
- 입출력 동작이 발생했음을 확인하고 이벤트를 기다리는 프로세스를 준비 상태로 바꾼 후 실행할 프로세스를 결정함
- 클록 인터럽트
- 현재 실행 중인 프로세스의 할당 시간을 조사하여 실행 중인 프로세스를 준비 상태로 바꾼 후 다른 프로세스를 실행 상태로 바꿈
인터럽트가 발생하면 운영 체제가 다른 프로세스를 실행 상태로 바꾸고 제어를 넘겨주면 프로세스 문맥 교환 발생
프로세스 문맥 교환: 이전 프로세스의 상태 레지스터 내용을 보관하고 다른 프로세스의 레지스터를 적재하여 프로세스 교환
03. 스레드의 개념과 상태 변화
1. 스레드의 개념
스레드: 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스의 직접 실행 정보를 제외한 나머지 프로세스 관리 정보를 공유
- 같은 프로세스의 스레드들은 동일한 주소 공간 공유
프로세스 하나에 포함된 스레드들은 병렬 수행함 = 서로 다른 프로세서에서 프로그램의 다른 부분을 동시에 실행 가능
병렬 수행의 장점
- 사용자 응답성 증가
- 프로세스의 자원과 메모리 공유 가능
- 경계성이 좋음
- 다중 처리로 성능과 효율 향상
2. 단일 스레드와 다중 (멀티) 스레드
3. 스레드의 사용 예
다중 스레드를 이용한 워드 편집기 프로세스
- 사용자의 키 입력에 응답하는 스레드
- 이미지나 텍스트를 보여주는 스레드
- 지정된 시간에 디스크에 저장하는 정기적 백업 스레드
웹 브라우저
- 이미지나 텍스트를 로딩하는 스레드
- 네트워크에 연결하는 스레드
- 사용자와 상호작용하는 스레드
4. 스레드의 상태 변화
5. 스레드의 제어 블록
- 프로세스는 스레드를 한개 이상 가질 수 있음
- 프로세스 제어 블록 = 스레드 제어 블록의 리스트
04. 스레드의 구현
스레드 구현 방법에 따른 구분
- 사용자 수준 스레드
- 사용자 영역의 스레드 라이브러리로 구현
- 스레드와 관련된 모든 행위를 사용자 영역에서 하므로 커널이 스레드의 존재를 모름
- 다수의 사용자 수준 스레드가 커널 수준 스레드 한개에 매핑 (다대일)
- 장단점
- 장점
- 이식성이 높음
- 오버헤드가 적음
- 유연한 스케줄링 가능
- 단점
- 시스템의 동시성을 지원하지 않음
- 확장에 제약이 따름
- 스레드 간 보호 불가능
- 커널 수준 스레드
- 커널이 스레드와 관련된 모든 작업 관리
- 스레드 병행 수행 가능 & 스레드가 대기 상태가 될 시 다른 스레드로 교환 가능
- 사용자 수준 스레드와 커널 수준 스레드 한개씩 매핑 (일대일)
- 장단점
- 혼합형 스레드
- 사용자 수준 프로세스는 커널 수준 스레드와 다대다 매핑
- 사용자 수준 프로세스는 커널 수준 스레드와 비슷한 경량 프로세스에 n:m 매핑
- 경량 수준 프로세스는 커널 수준 스레드와 1:1 매핑