10-1 프로세스 개요
- 지금까지는 단순히 ‘실행 중인 프로그램’이라고 표현했지만 이 프로그램을 프로세스라고 한다.
- 프로그램은 실행되기 전까지는 보조 기억장치에 있는 데이터일 뿐이지만 보조 기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 됩니다.
- 이 과정을 프로세스를 생성한다고 표현한다.
프로세스 직접 확인하기
- 컴퓨터의 프로세스는 윈도우에서는 작업관리자의 [프로세스] 탭에서 확인이 가능하고 유닉스 체계의 운영체제에서는 ps 명령어로 확인할 수 있다.
- 실제로 컴퓨터를 켜고 확인하면 실행한 프로세스 외 알 수 없는 여러 프로세스가 실행되고 있다.
- 사용자가 보는 앞에서 실행되는 프로세스는 포그라운드 프로세스 , 사용자가 보지 못하는 뒤편에서 실행되는 프로세스는 백그라운드 프로세스 라고 한다.
- 백그라운드 프로세스 중에서도 사용자와 상호작용 없이 정해진 일만 수행하는 백그라운드 프로세스가 있는데 이러한 프로세스를 데몬 (유닉스 운영체제),서비스 (윈도우 운영체제)라고 한다.
프로세스 제어 블록
- CPU 자원은 한정되어 있기 때문에 모든 프로세스가 CPU를 동시에 사용할 수 없다.
- 차례대로 돌아가며 한정된 시간만큼 사용하고 시간이 끝났음을 알리는 인터럽트(타이머 인터럽트)가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다린다.
- 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고 프로세스에 CPU를 비롯한 자원을 배분한다. 이를 위해 운영 체제는 프로세스 제어블록 (이하 PCB)을 이용한다.
- 프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료구조이다.
- 상품에 달린 태그로 해당 제품을 식별하는 거처럼 프로세스 제어 블록에는 해당 프로세스를 식별하기 위한 정보가 저장된다.
- PCB는 메모리의 커널 영역에 생성된다. PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는데 필요한 정보를 판단한다.
- PCB는 프로세스 생성시 만들어지고 실행이 되면 폐기된다.
- 즉 새로운 프로세스가 생성되었다 = 운영체제가 PCB를 생성했다
- 프로세스가 종료되었다 = 운영체제가 해당 PCB를 폐기했다.
PCB에는 어떤 정보들이 담길까?
- 프로세스
- 프로세스ID(PID) 는 특정 프로세스를 식별하기 위해 부여하는 고유한 번호다.
- 같은 프로그램이라도 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성된다.
- 레지스터 값
- PCB 안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
- 프로세스는 자신의 실행 차례가 오면 이전까지 사용했던 레지스터의 중간 값들을 모두 복원하여 이전까지 진행했던 작업들을 이어 실행할 수 있게 한다.
- 프로세스 상태
- 현재 프로세스가 입출력 장치를 사용하기 위해 기다리고 있는 상태인지, CPU 상태를 기다리고 있는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지 등의 프로세스 상태 정보가 PCB에 저장된다
- CPU 스케줄링 정보
- 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록된다
- 메모리 관리 정보
- 프로세스마다 메모리에 저장된 위치가 다르다. 그래서 PCB에는 프로세스가 어느 주소에 저장되어 있는지에 대한 정보가 있어야한다.
- PCB에는 베이스 레지스터, 한계 레지스터, 값과 같은 정보들이 담긴다.
- 또한 프로세스의 주소를 알기 위해 또 다른 중요 정보 중 하나인 페이지 테이블 정보도 담긴다
- 사용한 파일과 입출력장치 목록
- 프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시된다.
- 어떤 입출력장치가 이 프로세스에 할당 되었는지, 어떤 파일들을 열었는지 에 대한 정보들이 기록된다.
문맥 교환
- 하나의 프로세스에서 다른 프로세스로 실행 순서가 넘어가면 어떤 일이 생길까?
- 직전까지 실행되었던 프로세스 A는 중간 정보를 백업해야 다음 차례가 왔을 때 다시 실행을 재개할 수 있다.
- 이러한 중간 정보, 즉 하나의 프로세스 수행을 재게 하기 위해 기억해야 할 정보를 문맥 이라고 한다.
- 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어있다.
- 실행 문맥을 잘 기억해두면 프로세스의 실행을 언제든지 해당 프로세스를 재개할 수 있기 때문에 예기치 못한 상황이 발생하여 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다.
- 그리고 뒤이어 실행할 프로세스 B의 문맥을 복구한다. 이렇게 자연스럽게 실행되는 프로세스가 바뀐다.
- 이러한 과정을 문맥교환이라고 한다.
- 문맥 교환은 여러 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 원리이다.
- 문맥 교환이 자주 일어나면 프로세스는 그만큼 빨리 번갈아 가며 수행되기 때문에 우리 눈에는 프로세스들이 동시에 실행되는 것처럼 보인다.
프로세스의 메모리 영역
- 하나의 프로세스는 사용자 영역에 크게 코드 영역 데이터 영역 힙 영역 스택 영역 나뉘어 저장한다.
코드 영역
- 코드 영역 은 텍스트 영역 이라고도 부른다.
- 기계어로 이루어진 명령어가 저장된다.
- 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있고 읽기 전용 공간이다.
데이터 영역
- 데이터 영역 은 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다.
- 대표적인 데이터는 전역변수가 있다.
- 전역 변수는 프로그램이 실행되는 동안 유지되며 프로그램 전체에서 접근할 수 있는 변수이다.
- 코드 영역과 데이터 영역은 바뀔 일이 없어 코드 영역 크기가 변할리 없다.
힙 영역
- 프로그램을 만드는 사용자, 프로그래머가 직접 할당할 수 있는 저장 공간이다.
- 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠간 해당 공간을 반환해야한다.
- 메모리 공간을 반환하지 않는다면 메모리 낭비를 초래한다. 이러한 과정을 메모리 누수라고 한다.
스택 영역
- 스택 영역은 데이터를 일시적으로 저장하는 공간이다.
- 데이터 영역에 담기는 값과는 달리 잠깐 쓰다가 말 값들이 저장되는 공간으로 대표적으론 함수의 실행이 끝나면 사라지는 매개 변수 지역 변수가 있다.
- 일시적으로 저장할 데이터는 스택영역에 PUSH되고, 더이상 필요하지 않은 데이터는 pop됨으로써 스택 영역에서 사라진다.
- 코드 영역과 데이터 영역은 크기가 고정된 영역이라는 점에서 정적 할당 영역이라고도 부른다.
- 반면 힙 영역과 스택 영역은 프로세스 실행 과정에서 크기가 변할 수 있는 영역이다. 이것을 동적할당 영역이라고 부른다.
- 일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다. 그래야만 힙 영역과 스택 영역에 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠일이 없다.
10-2 프로세스 상태와 계층 구조
- 운영체제는 프로세스의 상태를 PCB에 기록하여 관리한다.
- 많은 운영체제는 동시에 실행되는 수많은 프로세스를 계층적으로 관리한다.
프로세스
- 컴퓨터를 사용할 때 여러 프로세스들이 빠르게 번갈아가면서 실행되는데 그 과정에서 여러 상태를 거친다. 그리고 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.
- 프로세스가 가질 수 있는 대표적인 상태
- 생성 상태
- 프로세스를 생성 중인 상태
- 이제 막 메모리에 적재되어 PCB를 할당받은 상태이다.
- 생성 상태를 거쳐 실행할 준비가 된 프로세스는 곧바로 실행되지 않고 준비 상태가 되어 CPU의 할당을 기다린다.
- 준비 상태
- CPU를 할당 받아 실행할 수 있지만 자신의 차례를 기다리는 상태
- 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치라고 한다
- CPU를 할당 받아 실행할 수 있지만 자신의 차례를 기다리는 상태
- 실행 상태
- CPU를 할당받아 실행 중인 상태
- 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다.
- 이때 프로세스가 할당된 시간을 모두 사용하면 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용하여 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.
- 대기 상태
- 프로세스 실행 도중 입출력장치를 사용하는 경우가 있다.
- 입출력 작업은 CPU에 비해 처리 속도가 느리기 때문에 입출력 작업을 요청한 프로세스는 입출력을 끝낼때까지 기다려야 한다. 이상태를 대기상태라고한다.
- 종료 상태
- 프로세스가 종료된 상태로 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스 계층 구조
- 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
- 이때 새 프로세스를 생성한 프로세스를 부모 프로세스 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스 라고 한다.
- 부모 프로세스와 자식 프로세스는 각기 다른 PID를 가진다.
- 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 한다.
- 최초의 프로세스가 자식 프로세스들을 생성하고 그 생성된 자식 프로세스들이 새로운 프로세스들을 낳는 형식으로 여러 프로세스가 동시에 실행 된다.
- 이러한 과정을 프로세스 계층 구조라고 한다.
프로세스 생성 기법
- 부모 프로세스를 통해 생성된 자식 프로세스는 복제와 옷 갈아입기를 통해 실행된다.
- 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성해내고
- 만들어진 복사본은 exec를 통해 자신의 메모리공간을 다른 프로그램으로 교체한다
- fork와 exec는 시스템 호출이다.
- fork는 자기 자신 프로세스의 복사본을 만드는 시스템 호출이다.
- fork를 통해 복사본이 만들어진 뒤에 자식 프로세스는 exec 시스템 호출을 통해 새로운 프로그램으로 전환된다.
- exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출이다.
- exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바꾸고 나머지 영역은 초기화가 된다.
- 부모 프로세스가 자식 프로세스를 fork한 뒤에 부모 프로세스, 자식 프로세스 누구도 exec를 호출하지 않는 경우도 있다.
- 이 경우 부모 프로세스와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 된다.
10-3 스레드
- 스레드는 프로세스를 구성하는 실행의 흐름 단위다.
- 하나의 프로세스는 여러 개의 스레드를 가질 수 잇고 스레드를 이용하여 여러 부분을 동시에 실행할 수 있다.
- ‘실행의 흐름 단위가 하나’로 실행되는 프로세스들은 단일 스레드 프로세스다
- 하지만 스레드 라는 개념이 도입되면서 하나의 프로세스가 여러 일을 동시에 처리할 수 있게 되었다. 즉, 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있게 된 것이다.
- 스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다.
- 그러기 때문에 스레드마다 각기 다른 코드를 실행할 수 있다.
- 여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한채 프로세스 자원을 공유하며 실행된다.
- 프로세스의 자원을 공유한다는 것이 스레드의 핵심이다.
- 실제로 최근 많은 운영체제는 CPU에 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달한다.
멀티프로세스와 멀티스레드
- 하나의 프로세스에 여러 스레드가 있을 수 있다는 말을 더 자세히 알아보자.
- 프로세스를 이루는 스레드는 여러 개 있을 수 있다. 이때 여러 프로세스를 동시에 실행하는 것을멀티 프로세스 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티 스레드 라고 한다.
- 동일한 작업을 수행하는 단일 스레드, 프로세스를 여러 개를 실행하는 것과 하나의 프로세스를 여러 스레드로 실행하는 것은 무엇이 다를까?
- “hello.os”를 화면에 출력하는 간단한 프로그램을 세번 fork하여 실행하면 화면에는 “hello.os”가 세번 출력된다. 스레드를 세개 만들어도 똑같이 세 번 출력한다.
- 프로세스끼리는 기본적으로 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원을 공유한다는 점에 차이점이 있다.
- 프로세스를 fork하여 같은 작업을 하는 프로세스를 동시에 실행하면 모든 자원이 복제되어 메모리에 적재된다. 이는 메모리에 동일한 내용이 중복되어 메모리 낭비가 된다.
- 이에 반해 스레드는 모든 자원을 공유하여 여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용할 수 있다.
- 또한 프로세스는 남남처럼 독립적으로 실행되지만 스레드는 자원을 공유하기 때문에 서로 협력과 통신에 유리하다.
'혼자 공부하는 컴퓨터 구조+운영체제' 카테고리의 다른 글
12장 프로세스 동기화 (0) | 2024.06.08 |
---|---|
11장 CPU 스케줄링 (2) | 2024.06.07 |
9장 운영체제 시작하기 (0) | 2024.06.07 |
8장 장치 컨트롤러와 장치 드라이버 (1) | 2024.06.05 |
7장 보조기억장치 (0) | 2024.06.05 |