본문 바로가기
프로그래밍/Desktop App

[시스템 프로그래밍] 프로세스와 컨텍스트 스위칭

by YuminK 2023. 12. 3.

64비트와 32비트

CPU가 입출력 버스를 통해 한번에 전송 및 수신할 수 있는 데이터의 크기가 32비트라면 32비트 컴퓨터, 64비트라면 64비트 컴퓨터가 된다. 

 

표현할 수 있는 주소의 범위가 많다는 것은 그 만큼 많은 메모리를 관리할 수 있다는 의미가 된다. 32비트 컴퓨터는 4GB의 메모리를 다룰 수 있다. 32비트 컴퓨터에서 주소값을 64비트로 사용한다는 것은, 주소값에 대한 연산을 두 번으로 나눠서 처리하게 되므로 성능 저하가 일어난다. 따라서 64비트 컴퓨터에서는 주소값이 64비트(8바이트)를 의미하고 32비트 컴퓨터에서는 주소값이 4바이트이다. 

 

direct 모드와 indirect 모드

레지스터에 저장할 데이터가 존재하는 주소에 직접 접근하는 방식을 direct 모드이다. indirect모드는 데이터가 존재하는 주소를 참조하여 실제 데이터가 있는 메모리에서 값을 가져온다. indirect 모드는 비트수의 제한으로 표현하지 못하는 메모리를 참조할 수 있도록 한다. 

 

8개의 비트로 주소를 표현한다면 0x0000 ~ 0x00ff까지의 주소를 표현할 수 있는데, 0x0100의 주소는 표현할 수 없다. 이런 상황에서 표현할 수 있는 범위의 주소에 해당하는 메모리 공간에 주소 값을 넣고 해당 주소에 값을 넣어두는 것이다.

 

0x0100(direct 방식으로 불가)

0x0000에 접근하여 0x0100의 주소 값을 얻고, 해당 주소로 접근하여 값을 가져오는 방식(indirect)

 

프로세스

실행중에 있는 프로그램을 '프로세스'라고 한다. 

 

프로세스의 스케쥴링

CPU는 1개인데 여러 프로세스가 존재한다. 이때 하나의 CPU가 여러 개의 프로세스를 번갈아 실행하는 스케쥴링을 처리한다. 따라서 마치 동시에 여러 프로세스가 실행되는 것처럼 보이는 것이다. 만약 A 프로세스가 I/O처리를 진행하는 경우 그 상황에서 CPU는 놀게 된다. 이때 다른 프로세스에게 실행될 기회를 주는 것이다. 

 

프로세스의 상태 변화

1. 프로세스는 생성과 동시에 Ready 상태가 된다. CPU에 의해 실행되길 바라는 상태이다.

2. Ready 상태에서 Running 상태가 된다. 스케쥴링 알고리즘에 의해 처리된다.

3. Running 상태에서 Ready 상태가 된다. 일의 중요도에 따라 프로세스에 우선순위가 정해진다. 우선순위가 높은 프로세스가 먼저 실행이 되기에 Running 상태에서 Ready 상태가 되는 것이다. 

4. Running 상태에서 Blocked 상태가 된다. 실행 중에 I/O처리가 진행되는 경우 Blocked 상태가 되고 Ready 상태에 있는 다른 프로세스를 실행시킨다. 

5. Blocked 상태에서 Ready 상태가 된다. Blocked 상태에선 스케쥴러에 의해 선택될 수 없다. Blocked 상태과 Ready 상태의 차이점은 스케쥴러에 의해 실행이 가능한지 여부이다. 

 

컨텍스트 스위칭

CPU에 존재하는 레지스터들은 현재 실행 중에 있는 프로세스 관련 데이터들로 채워진다. 그렇다면 이전에 사용하던 프로세스의 데이터를 저장하는 처리가 필요하다. 그리고 새로운 프로세스의 데이터를 복원하는 작업 역시 필요하다. 이러한 데이터의 저장과 로드 과정을 '컨텍스트 스위칭'이라고 한다. 과도한 컨텍스트 스위칭은 성능 저하의 원인이 된다. 

 

커널 오브젝트

프로세스, 쓰레드 혹은 파일과 같은 리소스들을 원활히 관리하기 위해 필요한 정보를 저장하는 메모리 블록이다. 커널 오브젝트는 프로그래머가 직접 생성하거나 조작할 수 없다. 커널 오브젝트는 관리하는 대상에 따라 서로 다른 구조체로 되어 있다. 

 

Usage Count

레퍼런스 카운트의 개념이다. 처음 프로세스가 생성되면 1의 Usage Count를 가진다. 만약 누군가의 자식 프로세스인 경우에는 부모 프로세스가 자식 프로세스의 핸들 정보를 얻으므로 Usage Count는 2가 된다. 자식 프로세스를 종료하면 Usage Count는 1이 되므로 커널 오브젝트는 사라지지 않는다. 

 

바탕 화면을 예시로 든다면, 바탕화면에서 시작한 프로그램은 Usage Count가 2이다. 이유는 바탕화면 자체가 일종의 프로세스이기 때문이다. 다만 자식 프로세스를 생성하자 마자 바로 핸들을 반환하기에 Usage Count는 1이 된다. 따라서 이후에 실행된 자식 프로세스를 종료하면 정상적으로 커널 오브젝트가 삭제된다. 

댓글