컴퓨터 구조
[04] 운영체제 - 프로세스와 스레드
BGK97
2024. 3. 27. 16:51
프로세스
- 실행중인 프로그램
- 프로그램이 메모리에 적재되고 실행되는 순간 프로세스라고 부름
포그라운드 프로세스와 백그라운드 프로세스
- 포그라운드 프로세스
- 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스
- 사용자가 보지 못하는 뒤에서 실행되는 프로세스
- 사용자와 직접 상호작용하지 않는 백그라운드 프로세스를 '데몬', 윈도우에서는 '서비스'라고 함프로세스 제어 블록 (P C B)
- 운영체제가 빠르게 번갈아 수행되는 프로세스의 순서를 관리하고
- CPU를 비롯한 자원 배분을 위해 사용하는 블록
- 프로세스와 관련된 정보를 저장하는 자료 구조
- 프로세스 식별을 위한 꼭 필요한 정보가 저장됨
- 프로세스 생성 시 만들어지고, 실행이 끝나면 폐기
- PCB에 담기는 정보는 다음과 같다.
- 프로세스 ID (PID)
- 특정 프로세스를 식벼랗기 위해 부여하는 고유 번호
- 레지스터 값
- 자신의 실행 차례가 돌아오면 프로세스는 이전 까지 사용한 레지스터의 중간 값 복구
- 이를 위해, PC값 등 레지스터 값이 담김
- CPU 스케줄링 정보
- 프로세스가 언제 어떤 순서로 CPU를 할당 받을지에 대한 정보
- 메모리 관리 정보
- 메모리에 저장된 위치가 다르기 때문에, 어느 주소에 저장되어있는지 확인
- 베이스 레지스터나, 한계 레지스터 값 같은 정보가 들어감
- 페이지 테이블 정보
- 사용한 파일과 입출력 장치 목록
- 실행과정에서 특정 입출력 장치나 파일을 사용하면 PCB에 해당 내용 명시
- 어떤 입출력장치가 할당 됐는지, 어떤 파일을 열었는지 저장
문맥 교환
- 문맥
- 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
- PCB에 표현되어 있음
- 실행 문맥을 잘 기억해두면 언제든 해당 프로세스의 실행을 재개할 수 있음
- 문맥 교환은 기존 프로세스의 문맥을 PCB에 저장하고, 새 프로세스 실행을 위해 PCB로부터 문맥을 복구하여 새로운 프로세스를 실행하는 것
- 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 원리
프로세스의 메모리 영역
- 사용자 영역에 저장됨
- 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나누어 저장코드 영역
- 텍스트 영역이라고 함
- 실행할 수있는 코드(기계어로 이루어진)가 저장
- CPU가 실행할 명령어 이기 때문에, 수정 불가데이터 영역
- 프로그램이 실행되는 동안 유지될 데이터가 저장
- 전역 변수 등...
- 크기가 고정되어 있기 때문에 정적 할당 영역이라고 함힙 영역
- 프로그램을 만드는 사용자, 프로그래머가 직접 할당할 수 있는 공간
- 메모리 공간할당 후 사용 종료시, 해당 공간 반환 필요
- 메모리 공간을 반납하지 않는다면, 메모리 누수 발생
- 동적 할당 영역스택 영역
- 데이터를 일시적으로 저장
- 매개 변수나, 지역 변수가 대표적
- 동적 할당 영역
일반적으로 힙 영역은 메모리의 낮은 주소에서 높은주소로, 스택은 반대로 할당
프로세스 상태와 계층 구조
프로세스 상태
- 프로세스의 상태는 PCB를 통해 인식하고 관리
- 프로세스가 가질 수 있는 상태는 다음과 같음
- 생성 상태
- 프로세스를 생성중인 과정
- 이제 막 메모리에 저장되어 PCB에 할당 받은 상태
- 준비 상태
- 당장이라도 CPU를 할당 받아 실행할 수 있으나 아직 차례가 아닌 상태
- 실행 상태로 전환되는 것을 디스패치라고 함
- 실행 상태
- CPU를 할당 받아 실행중인 상태
- 일정 시간만 이용할 수 있음
- 타이머 인터럽트 발생시 다시 준비상태로 전환
- 실행 도중 입출력장치를 사용해 입출력 장치의 작업이 끝날 때 까지 기다려야 한다면 대기 상태
- 대기 상태
- 프로세스 사용 도중 입출력장치를 사용한 상태
- 입출력장치가 입출력을 끝낼 때 까지 기다려야하는데, 이러한 상태를 대기 상태라 함
- 종료 상태
- 프로세스가 종료된 상태
- 운영체제는 CB와 프로세스가 사용한 메모리를 정리
- 이 도표를 프로세스 상태 다이어그램이라고 함
프로세스 계층 구조
- 프로세스 진행 중 시스템 호출을 통해 다른 프로세스를 생성 가능
- 이 때 생성한 프로세스를 부모 프로세스, 생성된 프로세스가 자식 프로세스
- 자식 프로세스의 PID는 부모프로세스의 PID인 PPID가 기록
- 자식은 또 자식을 생성가능하여, 운영체제는 계층적인 구조로 프로세스를 관리
예시
- 사용자가 컴퓨터를 켠 순간 최초 프로세스는 로그인을 담당하는 프로세스를 자식으로 생성
- 로그인 프로세스는 사용자 인터페이스(bash 셀)을 자식으로 생성
- 사용자 인터페이스 프로세스는 Vim프로세스를 생성
- 이 때 최초의 프로세스는 유닉스(init), 리눅스(systemd), macOS(launchd)
- PID는 1번
프로세스 생성 기법
- 부모 프로세스릉 통해 생성된 자식 프로세스는 복제 및 옷 갈아입기를 통해 실행
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성
- 이후 자식 프로세스는 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체
- fork와 exec는 시스템 호출임
- fork 한 후에 exec를 하지 않는다면, 같은 코드를 병행하여 실행하는 프로세스가 됨
스레드
- 실행의 단위
- 프로세스를 구성하는 실행의 흐름 단위
- 하나의 프로세스는 여러개의 스레드를 가질 수 있음
- 스레드를 이용해 하나의 프로세스에서 여러 부분을 동시에 실행 가능
단일 스레드 프로세스
- 하나의 프로세스는 한 번의 하나의 일만 처리
- 이 때 모든 프로세스는 하나의 실행흐름을 가지고 한번의 하나의 부분만 실행
멀티 스레드 프로세스
- 스레드의 개념이 도입되며 하나의 프로세스가 한 번의 여러개를 처리할 수 있게 됨
- 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있게 됨
스레드의 구성요소
- 프로세스 내에서 각기 다른 스레드ID
- PC값을 비롯한 레지스터 값
- 스택
- 이에 따라 각기 다른 코드를 실행 가능