여태까지 프로세스라는 단어를 자주 써왔는데 이에 대해서 조금 더 구체적으로 알아보도록 한다.
우선 사전식으로 정의해보자면 실행중인 프로그램. 다시 말해 CPU가 하는 모든 일은 어떤 코드를 실행하고 있는데 이런 걸 프로세스라고 한다. (같은 말로 jobs, tasks라고도 한다.)
같은 프로그램에 대해서 여러 프로세스들이 관계되어있을 수 있다. 즉, 자식 프로세스를 생성할 수 있으며 부모와 자식 프로세스는 pid가 다르다.
예를 들어 한글 창을 2개 열면 한글 프로그램은 같지만 data 부분은 다른 2개의 프로세스를 갖는다.
프로세스의 구조는 다음 그림과 같다.
header : 파일 이름, 파일 사이즈, 만들어진 날짜 등등 파일 자체의 정보를 나타낸다.
text : code와 instruction을 뜻한다.
data : 전역 변수가 저장된다.
heap : malloc 메모리가 저장된다.
stack : 임시 데이터(파리미터, 지역 변수, 리턴 주소 등)가 저장된다.
헤더, 데이터, 텍스트는 고정적이며 스택, 데이터, 힙은 그냥 묶어서 데이터라고 부르기도 한다.
그냥 상식으로 function은 return value를 가지고, 없다면 procedure, 둘을 합쳐서 subroutine이라 부른다. 이게 왜 나왔는진 기억이 안나는데 아무튼 적혀있어서 나중에 한 번 더 볼 겸 적어둔다..
프로세스들의 상태는 전에 이미 했었다.
용어가 살짝 바뀌고, 조금 더 detail해지긴 했지만 크게 다름이 없다. 상태도만 봐도 알 수 있으니 별도의 설명은 하지 않겠다.
Process Control Block은 말 그대로 프로세스에 관한 정보가 들어있는 블록이다.
PID, 프로세스 상태, PC 등등 많은 정보가 블록에 들어 있는데 이 블록이 더블 연결 리스트로 관리된다. 블록의 정보들을 context라 부르고 context switch는 PCB를 save하고 load하는 과정이다.
context switch가 일어나는 동안에는 프로세스들은 일을 못한다. 이걸 overhead라고 한다.
overhead가 발생하는 동안에는 당연히 성능적인 면에서 저하된다. 따라서 최대한 줄이는 것이 바람직하다. overhead의 절대적인 시간을 줄이는 방법은 하드웨어를 좋은 걸 사용해야한다..
프로세스들은 그들의 일생동안 다양한 상태로 돌아다닌다.(migrate한다.)
프로세스가 여러 개 있을 때 그 중 어떤 것을 선택할지는 스케쥴러에 의해 결정된다.
스케줄러에는 장기(long term), 단기(short term), 중기(medium term) 3개가 있다.
장기 스케줄러는 작업 스케줄러라고도 불리며 멀티 프로그래밍의 정도(degree)를 제어한다. 다시 말해 ready한(실행 가능한) 프로세스들이 메모리에 여러 개 존재하는 것을 멀티 프로그래밍이라 하고 정도(degree)는 메모리에 올릴 수 있는 프로세스들의 개수이다. 즉, 몇 개의 프로그램이나 실행시킬지 조정하는 뭐 그런 것이다.
요즘엔 CPU가 발전해 굳이 개수를 제어할 필요가 없으니 사실 거의 안쓰인다. 게다가 time-sharing 방식에서는 없는 경우가 많은데 요즘의 OS들은 대체로 time-sharing 방식이다..
뿐만 아니라 한 가지 일을 더 하는데 프로세스의 혼합 비율을 조정한다. 프로세스는 주료 사용되는 명령에 따라 CPU-bound와 I/O-bound로 나뉘는데 두 종류의 프로세스를 골고루 사용해야 더 효율적이다.
단기 스케줄러는 CPU 스케줄러라고도 불리며 메모리에 있는 프로세스 중 하나를 선택한다 정도로만 알아두고 나중에 다시 자세히 설명하겠다.
중기 스케줄러는 장기 스케줄러를 대부분의 CPU들이 사용을 안하다보니 어떤(사실 대부분의) 시스템들은 중기 스케줄러를 가진다.
모든 프로세스는 실행되려면 메모리에 있어야하는데 때론 메모리에서 프로세스를 쫓아내는 게 도움이 될 수 있다.(degree를 줄일 수 있다.) 그래서 프로세스를 쫓아낼 때 daemon 프로세스 즉, 백그라운드에서 작동하는 프로세스를 쫓아낸다. 왜 ??
언제 올지도 모르고 자주 오지도 않으니 쫓아낸다. daemon이라고 무조건 쫓아내지는 않고 오랜 시간 사용 안한 일명 least recently used 프로세스를 쫓아낸다.
이렇게 메모리와 디스크 사이에서 프로세스를 올렸다 내렸다 하는 것을 스와핑(swapping)이라 한다. 스와핑 과정에는 당연히 context switch가 발생한다.
정리해보자면..
장기 : 들어오는 job들 중 선택해 메모리에 적재한다.
단기 : 메모리의 프로세스 중 선택해 CPU를 할당받는다.
중기 : 메모리와 디스크 사이에서 오갈 프로세스를 선택한다.
정도로 이해하면 되겠다.
'운영체제' 카테고리의 다른 글
| 쓰레드(thread) (1) | 2020.08.05 |
|---|---|
| 프로세스 생성 (0) | 2020.07.12 |
| 시스템 콜 (0) | 2020.07.07 |
| OS Structure, Hardware Protection (0) | 2020.07.07 |
| 메모리 (0) | 2020.07.06 |