2024.01.10 운영체제
10. 프로세스와 스레드
10.1 프로세스 개요
실행중인 프로그램 프로세스
프로그램을 메모리에 적재하는 순간 프로세스가 된다.
이 과정을 프로세스를 생성한다라고 한다.
프로세스의 종류
포그라운드 프로세스
-사용자가 볼 수 있는 공간에서 실행되는 프로세스
백그라운드 프로세스
-사용자가 볼수 없는 공간에서 실행되는 프로세스
사용자와 직접 상호작용이 가능한 백그라운드 프로세스와
사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스가 있다. 이것들은 데몬 혹은 서비스라고도 부른다.
운영체제가 이런 프로세스를 어떻게 관리하는가
모든 프로세스는 실행을 위해 CPU가필요하다.
그러나 CPU는 자원이 한정되어있다.
그래서 프로세스들은 돌아가며 한정된 시간만큼만 CPU를 이용한다.
자신의 차례에 정해진 시간만큼 CPU를 이용하고 타이머 인터럽트가 발생하면 차례를 양보한다.
시간이 끝났다고 알리면 다음 프로세스에게 일을 넘긴다.
10.1.1 프로세스 제어블록
빠르게 번갈아 수행되는 프로세스를 관리해야한다.
이를 위해 사용되는 자료구조가 프로세스 제어블록이다.(이하 PCB)
프로세스 관련 정보를 저장하는 자료구조이다.
마치 상품에 달린 태그와 같은 정보이다.
프로세스 생성 시 커널 영역에 생성되고 종료시 폐기된다.
운영체제마다 차이점이 있지만 PCB에 담기는 대표적인 정보는 다음과 같다.
1.프로세스 ID(PID)
특정 프로세스를 식별하기 위해 부여하는 고유한 번호이다. 학교 학번 회사 사번과 비슷하다.
2.레지스터값
컨텍스트 스위칭을 알기 위해 필요하다.
프로세스는 자신의 실행차례가 오면 이전까지 사용한 레지스터 중간값을 모두 복원 -> 실행재개해야한다.
연산을 하던 값을 까먹으면 다시 돌아와도 자기 일을 못한다.
그래서 프로그램 카운터 스택포인터 등 중간 값들을 저장하고 실행하게 된다.
사용하던 레지스터 값들을 저장하고 다시 차례가 돌아오면 불러와서 사용한다.
3.프로세스 상태
다음 강의에서 알아볼 정보
입출력 장치를 사용하기 위해 기다리는 상태 CPU를 사용하기 위해 기다리는 상태 이용중인 상태 등등
4.CPU 스케줄링정보
프로세스가 언제 어떤 방식을 CPU를 할당 받아서 사용하게 될지
5.메모리정보
프로세스가 어느 주소에 저장되어 있는지에 대한 정보
페이지 테이블 정보가 담긴다.
6.사용한 파일과 입출력장치 정보
할당한 입출력장치 사용중인(열린) 파일 정보
10.1.2 문맥교환(CONTEXT SWITCH)
가장 중요한 부분이다.
어떻게 돌아가면서 실행을 하는가
한 프로세스에서 다른 프로세스로 실행순서가 넘어갔다면?
어떤 작업이 이루어지는가?
기존에 실행되던 프로세스 A는지금까지의 중간정보를 백업해야한다.
프로그램 카운터 등 각종 레지스터값 메모리 정보 열었던 파일 등을 저장한다.
이러한 중간정보가 '문맥'이다.
다음 차례가 왔을때 실행을 재개하기 위한 정보이다.
실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다.
뒤이어 실행할 프로세스 B의 문맥을 복구한다.
기존 실행 중인 프로세스 문맥을 백업하고
새로운 프로세스 실행을 위해 문맥을 복구하는 과정을
문맥교환이라고한다.
여러 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 원리이다.
10.1.3 프로세스의 메모리영역
그렇다면 사용자 영역에는 어떻게 저장되는가?
크게 코드 영역(텍스트영역), 데이터영역, 힙영역, 스택영역 등에 저장하게 된다.
대표적으로 4개이고 더 다양한 영역이 있다.
10.1.3.1.코드영역
실행할 수 있는 코드 기계어로 이루어진 명령어를 저장한다.
데이터가 아닌 cpu가 실행할 명령어가 담기기에 쓰기가 금지된 영역이다.
10.1.3.2 데이터영역
잠깐 썼다가 없앨 데이터가아닌 프로그램이 실행되는 동안 유지할 데이터를 저장한다.
ex) 전역변수
위 두가지는 정적할당영역이다.
크기가 고정되어 있다. 명령어나 전역변수가 실행중에 변할 이유가 없기 때문이다.
10.1.3.3 힙영역
프로그램을 만드는 사용자 즉 프로그래머가 직접할당할 수 있는 저장공간이다.
만약 힙영역에 공간을 할당햇다면 언젠가는 반환해야하는데
자바같은 경우는 가비지 컬렉션을 통해 알아서 반환한다.
c는 일일이 알아서 반환해줘야하고 하지 않으면 메모리 누수가 일어난다.
10.1.3.4 스택영역
데이터가 일시적으로 저장되는 공간
잠깐 쓰다가 말 값들이 저장되는 공간이다.
매개변수 지역변수 들이 저장된다.
이들은 동적으로 변환하기 때문에 동적할당영역이다.
힙영역과 스택영역
일반적으로 힙영역은 낮은주소-> 높은주소로 할당
스택영역은 높은주소 -> 낮은 주소로 할당한다.
그래서 서로 주소가 겹치지 않도록 반대로 할당하게 된다.
크기가 가변적이기 때문에 같은 곳 부터 작성하면 겹쳐셔 문제가 발생할 수 있기 때문이다.