- 서적소개: 링크
- 운영체제 정리 (2): 링크
- 운영체제 정리 (4): 링크
3-1. 프로세스의 개념과 상태 변화
프로세스의 개념
- 등장배경
- 병행 실행하는 프로그램들은 자원을 공유하기 때문에, 제어가 필요하다.
- 실행 중인 프로그램
- 디스크에 있던 프로그램을 메모리에 적재하여 OS의 제어를 받는 상태가 됨
- asynchronous (비동기적) 행위
- 실행 중인 프로시저 및 그의 제어 추작
- OS에 들어있는 프로세스 제어 블록 (PCB)
- 프로세서에 할당하여 실행할 수 있는, 개체 dispatch가 가능한 대상
프로세스의 메모리 구조
- Stack
- 데이터를 일시적으로 저장
- 지역변수에 사용
- 함수를 호출할때 공간을 제공
- 힙과 인접한 방향으로 커지는 경우가 많기 때문에 힙 포인터를 만나면 메모리가 소진되었다는 것
- Heap
- 코드 영역과 별도의 자유 영역
- 동적 메모리 할당시, 공간을 제공
- Data
- 프로그램의 가상 주소 공간
- 전역변수, 정적변수를 저장/할당
- 초기화하지 않은 데이터는 데이터의 영역의 끝에서 시작
- Code
- 실행 명령을 포함하는 메모리 / 목적 파일에 있는 프로그램 영역
- 프로세서가 디스크에서 읽어 실행하는 컴파일한 프로그램 저장
- 읽기 전용, 변경 불가능
- 공유가 가능하기 때문에, 자주 실행하는 프로그램(재진입 프로그램) 사본은 메모리에 존재
프로세스의 종류
- 시스템 프로세스
- 모든 시스템 메모리와 프로세서 명령에 액세스 가능
- 프로그램 실행 순서, 커널 영역 관리, 프로세스 생성
- 사용자 프로세스
- 독립 프로세스
- 협력 프로세스
프로세스의 상태 변화와 상태 정보
- 상태 변화
- 실행 / 비실행 상태로 구분
- 프로세스 생성 시, 비실행 상태로 초기화 됨
- 자원을 할당 받기 위해서 비실행 상태가 되기도 함
- dispatch: 종료/인터럽트에 의해 프로세스 실행 상태가 바뀌는 것
- dispatcher: 스케줄러가 선택한 프로세스에 프로세서 할당하는 모듈
스케줄러
작업 스케줄러 |
스풀러가 디스크에 저장한 작업 중 실행할 작업 선정후, 준비 리스트에 삽입 |
프로세스 스케줄러 |
선정한 작업의 상태를 변화, 프로세스 생성부터 종료까지 수행 |
상태 변화
이름 |
상태변화 |
설명 |
dispatch |
준비-실행 |
프로세스가 프로세서 점유하는 것 |
timeout |
실행-준비 |
interrupt click에 의해 할당된 시간 소모 후 OS에게 프로세서 제어권을 넘김 |
block |
실행-대기 |
할당된 시간 소모 이전에 연산/자원 요청의 문제로 프로세서 스스로 양도 |
wakeup |
대기-준비 |
입출력 작업 후 |
- 프로세스 제어 블록
- 운영체제가 프로세스 제어할 때 필요한 프로세스 상태 정보를 저장하는 곳
- 특정 프로세스 정보를 저장하는 데이터 블록
- TCB (Tack Control Block) 이라고도 함
- 작동
- 프로세스 생성 시, 메모리에 프로세스 제어 블록 생성
- 프로세스 종료 시, 프로세스 제어 블록 삭제
- 프로세스 문맥 교환
- interrupt, system call로 제어를 넘겨 다른 프로세스가 실행 상태가 되도록 하는 것
- 교환 발생 시, 프로세서의 레지스터에 있던 내용을 PCB에 저장 (나중에 쓰게)
3-2. 프로세스의 관리
프로세스의 구조
- 실행 중 프로세스가 새로운 프로세스를 생성하면 계층적 구조를 가짐
프로세스의 생성
OS나, 응용 프로그램에서 요청을 받아 프로세스를 생성(fork)하면, OS는 해당 프로세스에서 PCB를 만들어 주소 공간 할당한다. 과정은 아래와 같다.
- 새로운 프로세스에 프로세스 식별자 할당
- 주소 공간과 PCB 공간 할당
- PCB 초기화
- 프로세스 상태, PC 초기화, 자원 요청, 프로세스 제어 정보(우선순위) 포함
- 해당 큐에 삽입 (링크를 건다)
- 자식 프로세스는 부모 프로세스나 운영체제에게서 자원을 할당 받을 수 있음
- 부모 프로세스는 자식 프로세스가 쓰는 자원을 한정함
프로세스의 종료
- 프로세스가 마지막 명령을 실행후, 운영체제에 프로세스 삭제 요청
- 연속 종료: 부모 프로세스 종료 시, 자식 프로세스 또한 종료하는 것
- 종료의 예
- 정상종료: 프로세스가 운영체제 서비스 호출
- 시간 초과:
- 실패
- 각종 오류
- 메모리 부족, 액세스 위반
프로세스의 제거
- 자원 반납, PCB 반납
- 해당 프로세스는 시스템 리스트에서 제거
- 그러나, 프로그램 자체는 디스크에 저장되어 있음
- 부모 제거 시, 자식도 함께 제거
프로세스의 중단과 재시작
- 시스템의 유휴시간 문제를 해결하기 위해 중단이 필요
- 중단: 이벤트의 발생을 기다리는 대기 상태 / 자원이 부족한 상태
- 재시작: 중단한 원인을 제거하여 다시 실행하는 것
- 다중 프로그래밍 환경
- 자원의 동적 할당 때문에 대기와 중단 발생
- 대기: 자원 할당을 기다리는 것
- 중단: 할당받은 자원을 기다리는 것
- 중단된 대기 상태: 프로세스가 보조 메모리에 있고 이벤트 대기 중
- 중단된 준비 상태: 프로세스가 보조 메모리에 있고 메인 메모리로 적재 가능한 상태
- 중단된 프로세스는 다른 프로세서가 재시작하기 전에는 실행이 불가
프로세스의 우선순위 변경
- Process scheduler는 PCB에 있는 우선 순위를 이용하여 준비 리스트의 프로세스 처리
- 준비 리스트의 프로세스는 프로세서 중심/입출력 중심으로 구분
- 입출력 중심은 프로세서를 짧게 여러번, 프로세서 중심은 길고 뜸하게 사용
프로세스의 문맥 교환 (context switching)
- 이전 프로세스의 상태 레지스터 내용을 보관, 다른 프로세스의 레지스터를 적재하여 교환하는 것
- 문맥 교환 시, 오버헤드가 발생 (
- 메모리 속도, 레지스터 수, 특수 명령어의 유무에 따라 다름
- 레지스터/작업/스레드/프로세스 문맥 교환
- 불필요한 문맥 교환은 줄이는 것이 좋음
- 스레드를 이용해 문맥교환을 효율적으로 처리할 수 있음
인터럽트 유형
입출력 |
입출력 동작 감지 후, 이벤트를 기다리는 프로세스를 준비 상태로 전환, 실행할 프로세스 결정 |
클록 |
현재 실행 중인 프로세스의 할당 시간 조사 후, 준비 상태로 전환, 다른 프로세스 실행 |
- trap
- 부적절한 파일 접근, 실행 중인 프로세스의 오류나 예외 상황으로 발생.
- 심각하면 프로세스 종료
3-3. 스레드의 개념과 상태 변화
Thread의 개념
- 프로세스는 자원과 제어로 구분하고, 이 중 제어만 분리한 실행 단위를 스레드라 칭함
- 스레드는 다른 프로시저를 호출하고 다른 실행을 기록함
- 별도의 스택이 필요하고, PC가 독립적
- 동일한 주소 공간 공유
- 경량 프로세스(Light weight process):프로세스 속성 중 일부가 들어 있음
- 중량 프로세스(Heavy -): 프로세스 하나에 프로세스 하나
단일/멀티 스레드
- 하나의 프로세스에 있으면 코드와 전역 데이터, 힙을 공유
- 스레드 실행 환경 정보, 지역 데이터, 스택은 스레드 각각이 제어
스레드의 상태 변화
- 한 프로세스에 있는 스레드는 순차적으로 실행
- 해당 스레드의 정보를 저장하는 레지스터와 스택이 존재
- 스레드 생성에는 공유 자원 초기화가 필요 없음 (프러세스가 스택과 래지스터 제공)
스레드의 제어 블록
- TCB(Thread Control Block)에 정보를 저장
- Process는 스레드를 한 개 이쌍 가지기 때문에 PCB는 TCB의 리스트를 말함
- 레지스터 값, PC, 스택 포인터, 스케줄링 상태 + 스레드 ID, 스레드를 포함하는 프로세스 포인터
- 스레드 간의 보호 X
3-4. 스레드의 구현
사용자 수준 스레드(user-level)
- n:1 mapping
- 다수의 사용자 수준 thread : 커널 수준 스레드 1개
- 커널이 스레드의 존재를 모름
- 사용자 영역의 스레드 라이브러리로 구현
- 생성/종료, 스레드 간의 메시지 전달, 스케줄링과 문맥 등의 정보
- ex) POSIX 표준안의 스레드 확장판인 Pthread, Win32 thread, java thread API
- 커널은 스레드가 아닌 프로세스를 한 단위로 인지 후, 프로세서 할당
커널 수준 스레드(kernel-level)
- 1:1 maping
- 사용자 수준 thread가 각각 커널 수준 thread와 1:1 매핑
- 사용자 수준 thread 생성 시, 커널 수준 thread 자동 생성
- 커널이 스레드 작업 모두 관리
- PCB, TCB 유지
- 오버히드가 커짐
- 시스템 동시성 지원
혼합형 스레드(multiplexed)
- n:m mapping
- 사용자 수준 스레드는 커널 수준 스레드와 비슷한 경량 프로세스에 n:m 매핑
- 경량 프로세스는 커널 수준 스레드와 1:1 매핑
- 구성
- 프로세스 하나에는 경량 프로세스가 하나 이상
- 경량 프로세스에는 이에 대응하는 커널 스레드가 1개
- 입출력 대기는 경량 프로세스 단위로 대기하기 때문에 완료까지 대기 X
- thread pooling을 이용하여 1:1 매핑으로 오버헤드 줄일 수 있음
- thread pooling
- 시스템이 관리하는 스레드의 pool을 이용
- 즉, 미리 생성한 스레드를 재사용하여 생성 시간 줄임
- 동시 생성 수에 제한을 두어 자원 소비 절약
용어 정리
- multiprocessing(다중 처리)
- 프로세서 하나 이상이 서로 협력 (병렬 처리)
- multiprogramming(다중 프로그래밍)
- 프로세서가 IO 응답 대기할 동안 다른 프로그램 실행할 수 있도록 하는 것
- 프로세서 하나에서 프로세스 여럿을 교대로 수행
- multitasking(다중 작업)
- 프로세서 하나에서 스케줄링에 따라 작업을 조금씩 번갈아 수행하는 것
- 정해진 시간 동안 교대로 작업
- 서로 자원 공유 X, 자원 전달에 별도의 IPC(Inter-Process Communication) 필요 → 메모리 독립적
- multithread(다중 스레드)
- 프로세스 하나에서 스레드 복수를 동시에 실행
- 스레드는 메모리 하나를 공유