[운영체제] 프로세스 휴식, 보류 상태와 문맥

Robert.Yang·2023년 3월 25일
1

OS

목록 보기
7/22
post-thumbnail

이 포스트는 널널한 개발자님의 강의를 듣고 작성한 글입니다.

프로세스 휴식, 보류 상태와 문맥

프로세스 상태는 이전 포스트에서 설명한 상태말고도 중요한 상태가 sleep상태와 suspend상태가 있다. sleep상태와 suspend상태는 둘다 보류상태지만 좀 다른 부분이 존재한다.

suspend상태는 OS 혹은 다른 프로세스로부터 강제된 상태를 말하는데 즉 의도치 않은 요인으로 그 원인이 swap날때 (가상메모리 상태에서 보류상태나 대기상태가 너무 오래될때) 혹은 프로그램이 죽을때 발생하고 sleep상태는 자발적으로 된 상태로 우리가 코드로 Thread.sleep(10)을 쓴 상태로 볼 수 있다.

중요한 것은 Ready-Queue에서 쓰레드가 sleep이나 suspend를 하면 이 대기열에서 이탈을 하는데 예를 들어 sleep(10) 함수를 호출하면 10ms만큼만 쉬는게 아니라 + @만큼 더 쉬는데 이 @가 대기열에 이탈했다가 10ms후 대기열에 진입을 한다. 그러면 재진입된 쓰레드는 앞에 대기열이 연산을 다 처리후 수행이 되는데 그 시간이 @이다. 그래서 앞에 대기열에 따라 @시간이 달라짐으로 어느 누구도 장담하기 힘들다. 이 과정은 suspend상태도 마찬가지다.

구체적으로 보면 쓰레드가 작업을 하다 suspend든 sleep든 만나면 일시정지가 되는데 이때 흐름이 정지되고 문맥을 이어나가기 위한 상태가 PCB에 저장이 되는데 여기에 저장되는 것들은 프로세스 구분자, 프로세스 카운터, 프로세스 우선순위, 각종 레지스터 정보, 메모리 관련정보, 할당된 자원정보등이 저장된다. 그 이후 다시 스케줄링되서 연산할 차례가 되면 흐름이 이어가는데 이때 나오는 말이 Context이다.

예를 들어 프로그램 A,B,C가 있다고 해보자. 프로그램마다 각자 흐름이 있을텐데 A,B,C 각각 어느정도하다 멈췄다고 해보자. 코어가 1개면 3개중에 1개만 연산을 하고 나머지는 멈출텐데 A문맥을 이어가다 B로 바꼈을때 Context Switching되었다고 볼 수 있다.

결론적으로 프로세스가 실행이 되면 연산을 하고 연산을 할때마다 상태가 변화를 할텐데 이 상태변화가 register에 전부 기록이 되어있고 이 기록을 담은 레지스터들이 여러 존재한다.

profile
모든 것을 즐길 줄 아는 개발자, 양성빈입니다.

0개의 댓글