2024. 8. 22. 00:27ㆍCS/OS
초기의 컴퓨터 시스템은 한 번에 하나의 프로그램만을 실행하도록 허용하였다. 이 프로그램이 시스템을 완전히 제어하고, 시스템의 모든 자원에 접근할 수 있었다. 반면 오늘날의 컴퓨터 시스템들은 메모리에 다수의 프로그램이 적재되어 병행 실행되는 것을 허용한다. 이러한 발전은 다양한 프로그램을 보다 견고하게 제어하고 보다 구획화할 것을 필요로 했다. 이러한 필요성이 프로세스의 개념을 낳았으면, 프로세스란 실행 중인 프로그램을 말한다. 프로세스는 현대의 컴퓨팅 시스템에서 작업의 단위이다.
모든 프로세스는 잠재적으로 병행 실행이 가능하고, CPU는 이들 프로세스 가운데에서 다중화된다.
프로세스 개념
초기에는 작업을 실행하는 일괄처리 시스템이었고, 사용자 프로그램 또는 태스크를 실행하는 시분할 시스템이 뒤를 이어 발전하게 된다. 단일 사용자 시스템에서도 사용자는 워드 프로세서, 웹 브라우저 및 전자 메일 패키지와 같은 여러 프로그램을 한 번에 실행할 수 있다. 또한 다중 태스킹을 지원하지 않는 임베디드 장치 같이 컴퓨터가 한 번에 하나의 프로그램만 실행할 수 있더라도 운영체제는 메모리 관리와 같은 자체 프로그램된 내부 활동을 지원해야 할 수 있다. 이러한 모든 활동을 프로세스라 부른다.
프로세스
비공식적으로, 프로세스란 실행 중인 프로그램을 말한다. 프로세스의 현재 활동의 상태는 프로그램 카운터 값과 프로세서 레지스터의 내용으로 나타낸다. 프로세스의 메모리 배치는 일반적으로 여러 섹션으로 구분된다.
- 텍스트: 실행 코드
- 데이터: 전역 변수
- 힙: 프로그램 실행 중에 동적으로 할당되는 메모리
- 스택: 함수를 호출할 때 임시 데이터 저장소
텍스트, 데이터의 경우 한번 할당되면 프로그램이 실행되는 동안 크기가 변하지 않고 고정된다.
힙과 스택의 경우 프로그램이 실행되는 동안 동적으로 크기 변화가 이뤄진다. 이를 활성화 레코드라 한다.
스택의 경우 함수의 매개변수 , 지역 변수, 복귀 주소를 포함하는 고정된 메모리 데이터를 제어한다.
힙의 경우 객체, 배열, 동적 변수 등 유동적 메모리 데이터를 제어한다. 시스템의 필요에 따라 메모리 할당량이 늘어나고 작업을 마치게 되면 다시 줄어드는 방식으로 자원관리를 한다. 중요한 점은 이러한 메모리 할당량 증가의 범위가 서로 겹치게 되면 안된다.
주의) 프로그램 != 프로세스
프로그램은 명령어 리스트를 가진 내용을 가진 디스크에 저장된 파일과 같은 수동적 존재이다. 반면 프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련된 자원의 집합을 가진 능동적인 존재이다. 프로그램 파일이 메모리에 적재 때 프로그램은 비로서 프로세스가 된다.
프로세스 상태
프로세스는 실행되면서 상태가 변한다. 프로세스의 상태는 부분적으로 프로세스의 현재의 활동에 따라 정의된다. 프로세스는 다음과 같은 상태 중 하나에 있게 된다.
- 새로운: 프로세스 생성 중
- 실행: 명령어들이 실행되고 있다.
- 대기: 프로세스가 어떤 이벤트가 일어나기를 기다린다.
- 준비: 프로세스가 처리기에 할당되기를 기다린다.
- 종료: 프로세스의 실행이 종료
운영체제별로 임믜적이고 변하지만 이들이 나타내는 상태들은 모든 시스템에서 찾아 볼수 있다. 여기서 중요한 점은 하나의 처리 코어에서는 오직 하나의 프로세스만 처리한다는 것이 중요한 포인트이다.
프로세스 제어 블록
각 프로세스들은 운영체제에서 프로세스 제어 블록 의해 표현된다.
- 프로세스 상태: 새로운, 준비, 실행, 대기, 종료 상태들을 말한다.
- 프로그램 카운터: 프로그램 카운터는 이 프로세스가 다음에 실행할 명령어 주소를 말함
- CPU 레지스터들: CPU 레지스터는 컴퓨터의 구조에 따라 다양한 수의 유형을 가진다. 누산기, 인덱스 레지스터, 스택 레지스터.... 이 상태 정보는 나중에 프로세스가 다시 스케줄 될 때 계속 올바르게 실행되도록 하기 위해 인터럽트 발생 시 저장되어야 한다.
- CPU 스케줄링 정보: 프로세스의 우선순위, 스케줄 큐에 대한 포인터와 다른 스케줄 매개변수를 포함
- 메모리 관리 정보: 이 정보는 운영체제에 의해 사용되는 메모리 시스템에 따라 기준 레지스터와 한계 레지스터의 값, 운영체제가 사용하는 메모리 시스템에 따라 세그먼트 테이블 등과 같은 정보를 포함한다.
- 회계 정보: 이 정보는 CPU 사용 시간과 경과된 실시간, 시간 제한, 계정 정보, 잡 또는 프로세스 번호 등을 포함한다.
- 입출력 상태 정보: 이 정보는 이 프로세스에 할당된 입출력 장치들과 열린 파일의 목록을 포함한다.
제어 블록은 약가느이 회계 데이터와 함꼐 프로세스를 시작시키거나 다시 시작시키는데 필요한 모든 데이터를 저장소 역할을 한다.
스레드
이제까지 말한 프로세스 모델은 프로세스가 단일의 실행 스레드를 실행하는 프로그램을 암시했다. 예를 들면 만일 한 스레드가 워드 프로세스 프로그램을 실행 중이라면, 실행되는 명령의 단일 스레드가 존재한다. 단일 제어 스레드는 프로세스가 한 번에 단지 한 가지 일만 실행하도록 허용했다. 하지만 대부분의 현대 운영체제는 프로세스 개념을 확장해 한 프로세스가 다수의 실행 스레드를 가질 수 있도록 허용한다. 이러한 특성은 특히 다중 처리기 시스템에서 이익을 얻을 수 있는데 여러 스레드가 병렬로 실행되며 이전에 할 수 없었던 입력과 동시에 철자를 검사하는 기능을 수행할 수 있도록 만든다.
요약: 위의 설명은 단일 실행 스레드를 실행하는 프로그램을 말했지만 요즘은 병렬처리를 이용해 여러 스레드들을 한번에 처리할 수 있게 되었다.
프로세스 스케줄링
프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스들 중 하나의 프로세스를 선택한다. 각 CPU 코어는 한 번에 하나의 프로세스를 실행할 수 있다. 단일 CPU 코어가 있는 시스템의 경우 한 번에 2개 이상의 프로세스가 실행될 수 없지만 멀티 코어 시스템은 한 번에 여러 프로세스를 실행할 수 있다. 코어보다 많은 프로세스가 있는 경우 초과된 프로세스는 스케줄을 기다려야 한다. 현재 메모리에 있는 프로세스 수를 다중 프로그래밍 정보라고 한다.
다중 프로그래밍 및 시간 공유의 목표를 균형 있게 유지하려면 프로세스의 일반적인 동작을 고려해야 한다. 일반적으로 대부분의 프로세스는 I/O 바운드 또는 CPU 바운드로 설명할 수 있다. I/O 바운드 프로세스는 계산에 소비하는 것보다 I/O에 더 많은 시간을 소비하는 프로세스이다. 반대로 CPU 바운드 프로세스는 계산에 더 많은 시간을 사용하여 I/O 요청을 자주 생성하지 않는다
스케줄링 큐
프로세스가 시스템에 들어가면 준비 큐에 들어가서 준비 상태가 되어 CPU 코어에서 실행되기를 기다린다. 이 큐는 일반적으로 연결 리스트로 저장된다. 준비 큐 헤더에는 리스트의 첫 번째 PCB(프로세스 제어 블록)에 대한 포인터가 저장되고 PCB에는 준비 큐의 다음 PCB를 가르키는 포인터 필드가 포함된다.
시스템에는 다른 큐도 존재하는데 프로세스에 CPU 코어가 할당되면 프로세스는 잠시 동안 실행되어 결국 종료되거나 인터럽트 되거나 I/O 요청의 완료와 같은 특정 이벤트가 발생할 때까지 기다린다. 프로세스가 디스크와 같은 장치에 I/O 요청을한다고 가정하자 이 경우 요청 응답까지의 시간이 꽤 소요되므로(컴퓨터 기준) 특정 이벤트가 발생되기 전까지 대기 큐에 삽이되게 된다.
CPU 스케줄링
프로세스는 수명주기 동안 준비 큐와 다양한 대기 큐를 이주한다 . CPU 스케줄러의 역할 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스를 CPU 코어에 할당한다. CPU 스케줄러는 CPU를 할당하기 위한 새 프로세스를 자주 선택해야 한다. 왜냐면 우리는 느끼지 못하지만 I/O 바운드 프로세스는 I/O 요청을 대기하기 전에 몇 밀리초 동안만 실행할 수 있다. CPU 바운드 프로세스에는 오랜 시간 동안 CPU 코어가 필요하지만 스케줄러는 프로세스에게 코어를 장기간 부여할 가능성이 없다. 대신에 프로세스에서 CPU를 강제로 제거하고 실행될 다른 프로세스를 스케줄 하도록 설계될 가능성이 높다. 따라서 CPU 스케줄러는 일반적으로 훨씬 더 자주 실행되지만 적어도 100밀리초마다 한 번씩 실행된다.
일부 운영체제의 경우 스와핑으로 알려진 중간 형태의 스케줄링을 가지고 있는데 핵심 아이디어는 때로 메모리에서 프로세스를 제거하여 다중 프로그래밍의 정도를 감소시키는 것이 유리할 수 있다는 것이다. 나중에 프로세스를 메모리에 다시 적재할 수 있으며 중단된 위치에서 다시 실행할 수 있다. 나중에 프로세스를 메모리에서 디스크로 스왑아웃 하고 현재 상태를 저장하고 이후 디스크에서 메모리로 스왑인 하여 현재 상태를 저장하고 이후 디스크에서 메모리로 스왑인 하여 상태를 복원할 수 있다. 이것을 스와핑 기법이라 한다.
문맥 교환
CPU 코어에서 작업을 뺏어 내어 커널 루틴을 실행할 때 이러한 인터럽트 발생 후 시스템은 복구를 위한 현재 프로세스 상태(문맥)를 기록할 필요가 있다. 이는 결국 프로세스를 중단했다 다시 재개하는 작어빈다. 문맥은 프로세스의 PCB에 표현된다. 문맥은 CPU 레지스터 값 프로세스 상태, 메모리 관리 정보 등을 포함한다. 일반적으로 커널 모드이건 사용자 모드이건 CPU의 현재 상태를 저장하는 작업을 수행하고 나중 연산을 재개하기 위하여 상태 복구 작업을 수행한다.
CPU 코어를 다른 프로세스로 교환하려면 이전의 프로세스 상태를 보관하고 새로운 프로세스를 보관된 상태에서 복구하는 작업이 필요하다. 이 작업을 문맥 교환이라 한다.
'CS > OS' 카테고리의 다른 글
[운영체제] 스레드와 병행성 (0) | 2024.09.27 |
---|---|
[운영체제] 프로세스 간 통신 (0) | 2024.09.11 |
[운영체제] 프로세스에 대한 연산 (0) | 2024.09.04 |