티스토리 뷰

[운영체제] 프로세스가 뭐지?

개요

프로세스란 단어를 본적있나요?

아래 사진은 안드로이드 설정창의 어플리케이션 메뉴를 클릭했을 때 나타나는 화면입니다.
프로세스란 단어가 등장하는데 프로그램이란 단어가 있는데 왜 굳이 프로세스라고 하는지 궁금하지 않으셨나요?

안드로이드 설정안드로이드 설정

저는 안드로이드와 서버 개발을 해봤는데 프로세스란 단어는 개발을 할 때 정말 자주 만나게 됩니다. 그 때마다 대충 뭐 실행중인걸 프로세스라고 하겠지하고 정리된 관련 사용법만 따라했었습니다. 그러다 운영체제 수업을 들으면서 프로세스가 뭔지 배우게 됐는데요 어떻게 지금까지 이 중요한 개념을 몰랐을까 싶었습니다.

이 글에서는 프로세스에 대한 지식을 사전식으로 나열하지 않았습니다. 목차를 보면 알 수 있는데 프로세스의 정의, 생성, 관리에 대해 제가 프로세스를 배울 때 궁금했던 질문을 했고 그에 대한 을 설명했습니다. 저는 이 질문들에 대한 답을 알고 싶어서 프로세스를 공부했기 때문입니다. 이제 프로세스에 대한 질문들에 답해봅시다.


프로세스란? 프로그램과 뭐가 다르지?

프로세스와 프로그램의 차이는 정말 명확합니다. 프로그램자체는 생명이 없습니다. 프로그램은 보조 기억장치(하드디스크, SSD)에 존재하며 실행되기를 기다리는 명령어(코드)와 정적인 데이터의 묶음입니다. 이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면 생명이 있는 프로세스가 됩니다.

프로세스란 실행 중인 프로그램입니다.


어떻게 여러 개의 프로세스가 동시에 실행될 수 있을까?

요즘 스마트폰이나 컴퓨터에서 음악을 들으면서 네이버에서 검색을 하고 도중에 온 카카오톡 메시지를 보는건 너무 당연한 일입니다. “사람이 숨을 쉬면서 동시에 심장이 뛰는 서로 다른 두가지 행위가 어떻게 동시에 일어날 수 있지”하고 의심하지 않듯이 저도 프로세스가 동시에 여러개가 실행되는 것을 당연하게 생각했습니다.

그러나 컴퓨터의 세상에서 여러개의 프로세스동시에 실행되는건 놀라운 일입니다.
하나의 CPU 즉 프로세서한 순간하나의 프로세스만 실행할 수 있기 때문이죠.

도도하게 물위를 떠가는 오리가 물속에서 발을 엄청 빠르게 움직이고 있다는 사실을 아시죠? 프로세스가 동시에 여러개가 실행될 수 있는 이유는 운영체제가 엄청나게 빠르게 CPU가 실행할 프로세스를 교체하고 있기 때문입니다. 눈 깜박할 사이에 이 교체가 수십번에서 수천번 일어나기 때문에 사람은 동시에 여러개의 프로세스가 실행되고 있다고 느끼는 것이죠.

헤엄치는 오리헤엄치는 오리

운영체제는 사용자에게 이렇게 동시에 여러개의 프로세스가 실행되고 있다는 환상을 제공합니다. 또 개발자는 이런 운영체제 덕분에 프로세스의 교체와 사용할 수 있는 CPU자원에 대해 신경 쓰지 않고 프로그램 개발에 온전히 집중할 수 있습니다.

그럼 어떻게 운영체제는 프로세스를 교체하고 있을까요? 중간에 실행 흐름을 끊고 교체되고 있는데도 프로세스는 마치 계속해서 실행되는 것처럼 작동될까요? 나한테 만약 유튜브에서 음악을 틀고 동시에 파워포인트에서 과제를 하다가 심심하면 브라우저를 열어서 네이버 실시간 검색어를 볼 수 있게하는 프로세스 관리 프로젝트가 주어졌다고 생각하면 이게 얼마나 어려운일인지 체감할 수 있습니다. 도대체 어떻게 운영체제는 이런일 할 수 있는 걸까요? 프로세스가 어떻게 구성되고 관리되는지 그 비밀을 알아봅시다.


프로세스의 구성

프로세스는 어떻게 구성되어 있을까?

프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block)또는 프로세스 기술자(process descriptor)라고 부르는 자료구조에 저장됩니다. 대부분 PCB라고 부릅니다. 이 자료구조 크게 다음과 같은 정보를 담고있습니다. 

  • PID

운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호(PID, Process IDentification)입니다.

  • 프로세스 상태

CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행중인 프로세스도 있고 대기 중인 프로세스도 있습니다. 그런 프로세스의 상태를 저장합니다.

  • 프로그램 카운터

CPU가 다음으로 실행할 명령어를 가리키는 값입니다. CPU는 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 메모리 주소를 가리키는 값입니다.

  • 스케줄링 우선순위

운영체제는 여러개의 프로세스를 동시에 실행하는 환상을 제공합니다. 운영체제가 여러 개의 프로세스가 CPU에서 실행되는 순서를 결정하는 것을 스케줄링이라고 합니다. 이 스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케줄링 우선순위라고 합니다.

  • 권한

프로세스가 접근할 수 있는 자원을 결정하는 정보입니다. 안드로이드 앱을 예로 들면 아무 앱이나 휴대폰 통화내역을 볼 수 있는 권한을 가지면 이를 악의적으로 이용하는 앱이 등장하겠죠? 그래서 프로세스마다 어디까지 접근할 수 있는지에 대한 권한이 필요합니다.

  • 프로세스의 부모와 자식 프로세스

최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제해서 생성되고 이 계층관계는 트리를 형성합니다. 그래서 각 프로세스는 자식 프로세스와 부모프로세스에 대한 정보를 가지고 있습니다.

  • 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터

프로세스는 실행중인 프로그램입니다. 따라서 프로그램에 대한 정보를 가지고 있어야합니다. 프로그램에 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장됩니다. 이 공간에 대한 포인터 값을 가집니다.

  • 프로세스에 할당된 자원들을 가리키는 포인터

  • 실행문맥

프로세스가 실행상태에서 마지막으로 실행한 프로세서의 레지스터 내용을 담고 있습니다. CPU에 의해 실행되는 프로세스는 운영체제에 의해 계속 교체되는데 교체되었다가 다시 자신의 차례가 되어서 실행될때 중단된적 없고 마치 연속적으로 실행된것처럼하기 위해 이 레지스터 정보를 가지고 있습니다.


PCB의 구성을 처음봤을 때 너무 뭐가 많아보이고 눈에 안들어왔습니다. 그래서 각 요소가 왜 프로세스에게 없어서는 안될 요소인지 생각해보니 왜 이것들이 있어야하는지 이해할 수 있었습니다.


프로세스가 접근 할 수 있는 메모리 공간

PCB의 구성 요소중 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터를 자세히 설명하겠습니다. 프로세스의 데이터와 명령어가 있는 메모리는 구체적으로 어떻게 구성되어 있을까요?

이 주소 공간은 Text, Data, BSS, Heap, Stack 영역으로 구성됩니다. 아래 그림에서 각 영역에 프로그램의 어떤 정보를 저장하는지 나타냈습니다.

프로세스의 메모리 공간프로세스의 메모리 공간

스택영역과 힙영역 사이에 빈 공간이 보이나요? 컴파일 타임에 지역변수를 얼마나 사용할지 미리 계산할 수 없기 때문에 런타임에 지역변수 선언 순서에 따라 스택영역은 위쪽으로 주소 값을 매기고 동적 할당될때 힙영역은 아래쪽으로 주소값을 매깁니다.


프로세스 관리

프로세스는 어떻게 관리될까?

운영체제는 프로세스들의 실행 사이에 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리해야합니다. 이를 위해 운영체제는 프로세스의 상태를 실행(running), 준비(ready), 블록(block) 상태로 분류하고 프로세스들을 상태전이(state transition)를 통해 체계적으로 관리합니다.

프로세스 상태 전이프로세스 상태 전이

위 그림을 보면서 그 과정을 따라가 봅시다. 사용자가 프로그램을 실행하면 프로세스가 생성되고 준비리스트에 추가됩니다. 프로세스는 프로세서(CPU)가 사용가능한 상태가 되면 CPU를 할당받습니다. 이를 준비상태에서 실행상태로 상태전이(state transition)된다고 합니다. 이 과정을 디스패칭(dispatching)이라고 하고 디스패처(dispatcher)가 이 일을 수행합니다.

이제 프로세스는 실행상태에서 CPU를 이용해 연산한 후 CPU를 자발적으로 반납하고 작업이 끝나지 않았으면 다시 준비상태에 들어갑니다. 운영체제는 다시 준비리스트의 첫번째에 있는 프로세스를 실행상태로 바꾸고 이 과정을 반복합니다.

운영체제는 프로세스가 CPU를 자발적으로 반납하지 않고 독점하는 경우를 방지하기 위해 하드웨어적으로 인터럽팅 클록을 주기적으로 발생시켜 프로세스가 특정 시간 간격동안만 실행할 수 있도록 합니다. 인터럽팅 클록이 발생되면 강제로 실행중인 프로세스의 CPU제어권을 운영체제에게 빼앗기고 프로세스는 준비상태로 상태 전이 됩니다.

만약 프로세스를 다시 사용하기 전에 입출력이 완료대기를 기다려야 하는 상황이라면 완료될때까 자신을 블록합니다. 입출력이 완료되면 운영체제가 프로세스를 블록상태에서 준비상태로 다시 전이 시킵니다.

많은 운영체제는 일시정지 상태를 추가로 정의한다고 합니다. 이 상태 덕분에 디버깅을 편리하게 할 수 있습니다.


References

Operating Systems Three Easy Pieces, Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Arpaci-Dusseau Books, 2015

운영체제론, 송정희 옮김, 한빛미디어(2009)


댓글
최근에 달린 댓글
Total
Today
Yesterday