본문 바로가기
정글

TIL(24일차) 프로세스

by 진득한진드기 2023. 5. 18.

전에 시간에 예외상황을 다루고 공부했던 적이 있다.

 

TIL 21일차인가 20일차쯤이었던 것으로 기억하는데 이어지는 내용인 프로세스에 대해서 공부한 것을 기록하려고 한다.

 

우리 컴퓨터는 하나에 집중하는 그런 집중력이 좋은 녀석으로 보이지만 실제로는 그렇지 않다.

 

1. 프로그램은 단 한개만 돌아가고 있는 것처럼 보인다. -> 프로세서와 메모리를 독점하고 있다고 착각하게 한다.

 

2. 프로세서는 프로그램 내의 인스트럭션들을 차례대로 중단됨 없이 실행하는 것처럼 보인다.

 

3. 프로그램을 메모리상의 유일한 객체 처럼 보이게 한다. 

 

위와 같은 1,2,3번같은 환상을 보여준다. 하지만 이 환상은 컴퓨터에 빠른 처리에 감춰져 있다. 이것은 프로세스라는 개념에 의해서 이루어지는데, 프로세스에 대해서 알아보자 (^ㅁ^)

 

프로세스

프로세스는 컴퓨터에서 연속적으로 실행되고 있는 프로그램을 의미한다.

 

프로세스는 시스템에 서로 다른 여러 프로그램들이 동시적으로 동작하고 있지만, 프로세서를 혼자 사용한다는 착각을 일으킨다.

 

시스템 내의 각 프로그램은 어떤 프로세스의 문맥(context)에서 돌아간다. 문맥은 프로그램이 정확하게 돌아가기 위해서 필요한 상태로 구성된다.

 

이 상태는 메모리에 저장된 프로그램의 코드와 데이터, 스택, 범용 레지스터의 내용, PC, 환경변수, 열려있는 파일의 식별자를 포함한다.

 

 


논리적인 제어 흐름

만약 실행을 단일로 하기 위해 디버거나 목적파일 내에 있거나 프로그램과 동적으로 런타임에 공유된 객체 내의 인스트럭션들에게 일련의 프로그램 카운터 PC값들이 대응된다는 것을 관찰 할 수있다.

 

이런 PC 값들의 배열을 논리적 제어흐름 또는 간단히 논리흐름이라고 부른다.

 

 

 

논리적 제어흐름

 

위 그림에서 보듯 3개의 프로세스의 논리흐름이 서로 중첩되지 않는다.

 

한개가 돌면 나머지가 멈추고 다른 하나가 실행됐을때 멈춰 있는 동작을 보인다.

 

즉 하나의 프로세서를 사용해서 여러 프로세스들이 교대로 돌아가는데, 각 프로세스는 자신의 흐름의 일부분을 실행하고 나서 다른 프로세스들로 순서를 바꾸어 실행하는 동안 선점된다.

 


동시성 흐름

 

논리흐름은 컴퓨터 시스템 내에서 여러 가지 다른 형태를 갖는다. 예외 핸들러, 프로세스, 시그널 핸들러 ,쓰레드 ,자바 프로세스는 모두 논리 흐름의 예이다.

 

자신의 실행시간이 다른 흐름과 겹치는 논리흐름을 동시성 흐름이라고 하며, 이 두 흐름은 동시에 실행한다고 말한다. 

 

정확히 말하면 Y가 시작해서 종료하기 전 에 X가 시작하거나 X가 시작해서 종료하기전에 Y가 시작할 때에만 흐름 X와 Y는 서로에 대해 동시적이다.

 

공동으로 실행되는 흐름의 일반적인 현상을 동시성이라고 부른다.

 

또 프로세스가 다른 프로세스들과 교대로 실행된다는 개념을 멀티 태스킹 이라고 부른다.

 

한 프로세스가 자신의 흐름 일부를 실행하는 매 시간 주기를 타임 슬라이스라고 한다.

 

동시적 흐름에 대한 개념은 흐름들이 돌아가는 프로세서 코어나 컴퓨터의 개수와는 무관하다.

 

병렬흐름이라고 알려진 동시성 흐름의 부분 집합을 구별하는 것이 유용할 때가 있는데,

 

두 개의 흐름이 서로 다른 프로세서 코어나 컴퓨터에서 동시에 돌아가고 있다면 이건 병렬 흐름이다 -> 병렬로 돌아간다.

 


사적 주소 공간

 

프로세스는 각 프로그램에 자신이 시스템의 주소공간을 혼자서 사용한다는 착각을 불러 일으킨다.

 

n 비트 주소를 갖는 머신에서, 주소공간은 2^n의 가능한 주소들로 0~2^n-1 을 갖는다.

 

프로세스는 각 프로그램에 자신만의 사적 주소공간을 제공한다.

 

이 공간의 특정 주소에 연결된 메모리의 한 개의 바이트가 일반적으로 다른 프로세스에 의해서 읽히거나 쓰일 수 없다는 의미로 사적이다.

 

비록 각각의 사적 주소공간에 연결된 메모리의 내용이 일반적으로 서로 다를지라도 각각의 이런 공간은 동일한 구조를 가진다.

 


 

사용자 및 커널모드

 

운영체제가 완벽한 프로세스 추상화를 제공하기 위해 프로세서는 응용프로그램이 접근할 수 있는 주소공간 부분뿐만 아니라 응용프로그램이 실행할 수 있는 인스터력션들을 제한하는 메커니즘을 제공해야한다.

 

대개 이런 작업을 지원하기 위해 지금 가지고 있는 특권을 저장 하는 일부 제어 레지스터로 모드 비트를 제공한다.

 

모드 비트가 설정되면 프로세스는 커널 모드(Supervisor mode)로 동작한다. 커널 모드에서 돌고 있는 프로세스는 인스터력션 집합의 어떤 인스트럭션도 실행가능 하고 어떠한 메모리도 접근이 가능하다.

 

모드 비트가 세팅 되지 않으면 프로세스는 사용자 모드에서 돌고 있고, 사용자 모드의 프로세스는 프로세서를 멈추거나 모드 비트를 변경하여 입출력연산 초기화 하는 특수 인스트럭션을 실행할 수 없다.

 

이러한 시도를 하면 치명적인 보호 오류가 발생한다. 대신 사용자 프로그램은 시스템 콜을 통해 커널 코드와 데이터 간접적으로 접근해야한다.

 

응용 코드를  실행하는 프로세스는 처음에 사용자 모드에 있는데 프로세스가 사용자 모드에서 커널 모드로 진입하는 유일한 방법은

 

전에 우리가 배운 예외 처리와 같다.

 

1. 인터럽트

2. 오류

3. 트랩 시스템 콜

 

예외가 발생해서 제어가 예외 핸들러로 넘어가면, 프로세서는 사용자 모드에서 커널모드로 변경한다.

 

핸들러는 커널 모드에서 돌아간다.

 

제어가 응용코드로 돌아오면 프로세서는 모드를 커널모드에서 다시 사용자 모드로 변경한다.

 


문맥전환(Context Switching)

 

운영체제 커널은 문맥전환(context switching)이라고 알려진 예외적인 제어흐름의 상위수준 형태를 사용해서 멀티태스킹을 구현하고 이다.

 

커널은 각 프로세스마다 컨텍스트를 유지한다.

 

컨텍스트는 커널이 선점된 프로세스를 다시 시작하기 위해서 필요로 하는 상태를 의미한다.

 

이것은 범용 레지스터, 부동소수점 레지스터,프로그램 카운터, 사용자 스택, 상태 레지스터, 커널 스택, 여러 가지 커널 자료구조 같은 -주소공간을 규정하는 페이지 테이블 ,현재 프로세스에 관한 정보를 가지고 있는 프로세스 테이블, 프로세스가 오픈한 파일에 관한 정보를 저장하는 파일 테이블 같은 객체들의 값들로 구성된다.

 

커널은 프로세스가 실행되는 동안의 어떤 시점에 현재 프로세스를 선점하고 이전에 선점된 프로세스를 다시 시작할 것을 결정할 수 있다.

 

이 결정은 스케줄링 이라고 불리며, 스케줄러 라고 불리는 커널 내부의 코드에 의해 처리된다.

 

커널이 실행할 새 프로세스를 선택할 때 커널이 그 프로세스를 스케줄했다고 한다.

 

커널이 실행할 새 프로세스를 스케줄한 후 에 현재 프로세스를 선점하는 것을 문맥전환 이라고 하며 이 메커니즘을 사용하여 새로운 프로세스로 제어를 이동한다.

 

수행 절차는 다음과 같다.

 

 

Context Switching

 

1. 현재 프로세스의 컨텍스트를 저장한다.

2. 이전에 선점된 프로세스의 저장된 컨텍스트를 복원한다.

3. 제어를 이 새롭게 복원된 프로세스로 전달한다.

 

 

문맥 전환은 커널이 사용자를 대신해서 시스템 콜을 실행하고 있을때 일어날 수 있다. 만일 시스템 콜이 어떤 이벤트를 발생을 기다리기 때문에 블록된다면 커널은 현재 프로세스를 sleep 시키고 다른 프로세스로 전환한다.

 

 

'정글' 카테고리의 다른 글

WIL(6주차) Malloc-lab 구현  (1) 2023.05.20
(TIL 25일차) 가상 메모리1  (0) 2023.05.18
(TIL23일차) 캐시  (0) 2023.05.18
(TIL22일차) 저장장치  (0) 2023.05.17
TIL(21일차) 메모리 할당기 제작 기초  (1) 2023.05.17