혼자 공부한 내용을 정리하는 글입니다.
양희재 교수님의 강의 참고.
참고:https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-5.-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC
과거와 달리 오늘날의 컴퓨터 시스템들은 메모리에 다수의 프로그램을 적재하여 사용한다. 이러한 발전으로 프로그램을 보다 견고하게 제어하며 , 보다 구획화할 것을 필요로 하는데 , 이러한 필요성이 프로세스라는 개념을 낳았다.
code 영역
사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간
컴파일(compile) 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 되어있다.
data 영역
전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간
전역 변수또는static 값을 참조한 코드는 컴파일이 완료되면 data 영역의 주소값을 가르키도록 바뀐다. 전역변수가 변경 될 수도 있어 Read-Write로 되어있다.
stack 영역
호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴값 등)를 임시로 저장하는 공간
이 영역은 함수 호출시 기록하고 함수의 수행이 완료되면 사라진다. 메커니즘은 자료구조(stack)에서 배운 LIFO(Last In First Out) 방법을 따른다. 컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 할 수 없다. 따라서 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 너무 많이 가지고 있다면stack overflow가 발생한다.
heap 영역
프로그래머가 필요할 때마다 사용하는 메모리 영역
heap 영역은 런타임에 결정된다. 자바에서는 객체가 heap영역에 생성되고 GC에 의해 정리된다.
참조 : https://zangzangs.tistory.com/107 [장장스]
프로세스는 실행되면서 그 상태가 변한다.
앞서 말했다 시피 메모리에는 여러개의 프로세스가 올라와있다고 하였는데 , 사실은 한번에 하나의 프로세스가 수행된다.
프로세스마다 시간을 할당받아 조금씩 돌아가며 작업이 수행되는데 ,
그 속도가 너무 빨라 동시에 돌아가는 것처럼 보인다. 이처럼 다른 프로세스로 작업이 변경되는 과정을 Context Switching라고 한다.
(요새는 쓰레드 단위로 돌아가지만 , 프로세스에 대해 정리하기 위해 이렇게 언급하였다.)
이처럼 프로세스는 실행되었다가 잠시 대기하였다가하는 프로세스만의 사이클이 있다.
running에서 ready로 변할 때는 time sharing system에서 해당 프로세스가 CPU시간을 모두 소진하였을 때 인터럽트에 의해 강제로 ready상태로 변하고, CPU는 다른 프로세스를 실행시킨다.
프로세스에 대한 모든 정보가 모여 있는 곳이며 , TCB라고도 한다.
내부에는 프로세스 번호 , PC , MMU 정보 , CPU 점유 시간 등이 있다.
CPU는 여러 프로세스를 동시에 수행하기 위해 각 프로세스 별로 조금씩 돌아가면서 수행한다.
이때 , 다시 자신의 차례가 되어 CPU를 할당받는 프로세스는 이미 어느 정도 코드들이 수행된 상태일 텐데 , 이를 처음부터 다시 수행하기 않기 위해서는 얼마나 수행되었는지등에 대한 정보가 필요한데 PCB가 이러한 역할을 해준다.
프로세스에는 여러 상태가 있다고 했다.
이때 프로세스는 일반적으로 여러 개가 한꺼번에 수행되므로 , 순서가 필요하다.
이 순서를 대기하는 곳을 큐(queue)라고 한다.
대기줄에도 여러 프로세스가 있을텐데 어느것을 꺼낼 지를 처리하는 작업을
scheduling 이라고 한다.
실제로는 프로세스가 대기 한다기 보다는 각 프로세스의 PCB가 대기하고 있다고 보면 된다
단일 프로세서 환경에서 여러 개의 프로세스가 동시에 실행되는 것을 말한다.
실제로는 조금씩 번갈아가며 수행되나 그 속도가 빨라 동시에 수행되는 것처럼 보이기에 위처럼 표현한다.
이러한 환경에서 프로세스는 크게 I/O 기반인지 CPU 기반인지를 나눌 수 있다.
이를 I/O bound process , CPU bound process라고 하는데 , 쉽게 말해 I/O(입출력) 작업이 차지하는 비중이 높은지 , 아니면 연산 작업이 차지하는 비중이 높은지에 따라 분류되어진다고 보면 된다.
이때 , 메모리에 적재된 프로세스들이 어느 한쪽에 많이 치우쳐져 있다면 , 비효율적이므로 운영체제는 이를 적당히 분배하여 할당해줘야 한다.
여러 개의 프로세스가 번갈아가며 수행된다고 하였다.
이때 한 프로세스에서 다른 프로세스로 cpu가 옮겨가는 과정을 context switching라고 한다.
이때 dispatcher가 context switching이 발생하였을 경우 현재 프로세스의 정보를 PCB에 반영하여 갱신하고 , 새로 시작되는 프로세스의 PCB를 CPU로 가져와 준다.
단, 너무 context switching가 자주 발생되어 dispatcher가 행하는 작업이 많아질수록 이는 ,
효율을 저하 시키는 것이며 overhead가 크다고 표현한다.