프로그래밍

[c/c++] 프로세스 우선순위 변경

업글 2021. 12. 10. 01:04

안녕하세요 업글입니다!

 

윈도우 운영체제는 리얼타임 OS가 아니기때문에 윈도우 환경에서 실행되는 프로세스의 경우 실시간으로 동작되는 것은 어렵습니다. 실시간이 중요한 경우 OS를 윈도우를 사용하지 않고 상대적으로 백그라운드에서 동작되는 프로세스가 적은 리눅스를 사용하거나 VxWorks와 같은 RTOS 종류의 운영체제를 사용하게 됩니다.

 

여기서는 윈도우 환경에서 프로세스를 최대한 실시간으로 운영하기 위한 방법에서 단순한 방법 중 하나인 프로세스 우선순위를 변경하는 방법에 대해서 설명드리겠습니다. 반대의 경우로 우선순위를 낮게 변경하는 경우에도 적용할 수 있습니다.

윈도우 프로그램 기본 우선순위

Visual Studio를 통해서 생성된 프로그램을 실행하였을 때 기본적인 우선순위는 보통입니다. 작업 관리자의 세부 정보에서 해당하는 프로그램의 우선순위 설정에서 확인할 수 있습니다.

 

프로세스 우선순위 변경에는 2가지 방법이 있습니다.

 

첫 번째 방법은 작업 관리자를 이용한 방법

위의 그림과 같이 해당하는 프로그램의 우선순위를 우선순위 설정에서 선택하여 변경할 수 있습니다.

쉽게 적용할 수 있지만 프로그램을 매번 실행할 때마다 프로세스 우선순위를 변경해야 하기 때문에 불편하여 현실적으로 사용 불가한 것으로 판단됩니다.

 

 

두 번째 방법은 Visual Studio에서 우선순위 변경 코드 사용

#include <stdio.h>
#include <stdint.h>
#include <windows.h>

int main()
{
	SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

	int32_t i = 0; 
	while (1) {
		printf("%d\n",i);
		Sleep(1000);
		i++;
	}

	return 0;
}

windows 헤더 파일을 선언하고 SetPriorityClass 함수를 사용하여 프로세스 우선순위를 변경할 수 있습니다. 첫 번째 인자에는 GetCurrentProcess함수를 수행하여 현재 프로세스를 입력하고, 두 번째 인자에 변경하고자 하는 우선순위를 입력하면 됩니다.

우선순위 PriorityClass
실시간(R) REALTIME_PRIORITY_CLASS
높음(H) HIGH_PRIORITY_CLASS
높은 우선 순위(A) ABOVE_NORMAL_PRIORITY_CLASS
보통(N) NORMAL_PRIORITY_CLASS
낮은 우선 순위(B) BELOW_NORMAL_PRIORITY_CLASS
낮음(L) IDLE_PRIORITY_CLASS

실시간(R) 설정을 위해서 REALTIME_PRIORITY_CLASS를 적용하는 경우 작업 관리자에서 확인하였을 때 프로세스 우선순위는 실시간(R)이 아닌 높음(H)로 설정됨을 확인하실 수 있습니다. Visual Studio의 프로젝트 속성에서 UAC 실행 수준을 requireAdministrator로 변경해야 실시간(R) 설정이 정상적으로 가능합니다. 아래의 그림 순서대로 적용하시면 됩니다.

1. 프로젝트 속성
2. 링커 > 매니페스트 파일 > UAC 실행 수준

저의 경우 최근 구현한 윈도우 프로그램에서 우선순위를 실시간으로 변경하여 간헐적으로 발생한 이더넷 통신 송수신 지연 문제(송수신 함수 수행 전 타 프로세스 연산 수행)를 해결한 경험이 있습니다. 이러한 경우와 같이 윈도우 환경에서 프로세스의 연산을 보다 빠르게 처리하고 싶은 분들에게 추천합니다. 그러나 타 프로세스에 영향에 있을 수 있으니 이 부분은 주의하셔서 적용하시면 될 것 같습니다.

'프로그래밍' 카테고리의 다른 글

TCP/IP 패킷 수신(패킷 분리 및 합침)  (0) 2021.12.15
[c언어/c++] 분기문(switch) 제거  (0) 2021.01.21
[c언어] 스택(Stack)  (0) 2021.01.14
[c언어] 링크드리스트(Linked List)  (0) 2021.01.13
[c언어] 큐(Queue)  (0) 2021.01.01