스케줄링은 운영체제가 프로세스나 스레드에게 CPU와 같은 시스템 자원을 할당하는 방법을 결정하는 과정이다. 스케줄링은 프로세스가 생성되어 완료될 때까지 여러 단계를 거치게 된다. 스케줄링의 종류에는 장기 스케줄링, 중기 스케줄링, 단기 스케줄링이 있다. 장기 스케줄링은 어떤 프로세스가 시스템의 자원을 차지할 수 있도록 결정하고, 중기 스케줄링은 어떤 프로세스들이 CPU를 할당 받을 것인지 결정하며, 단기 스케줄링은 프로세스가 실행되기 위해 CPU를 할당받는 시기와 특정 프로세스를 지정하는 작업을 의미한다. 스케줄링에 대해서는 너무 깊게 알아보지 않도록 하겠다.
`std::this_thread::sleep_for`은는 C++에서 제공하는 함수로, 현재 스레드의 실행을 지정된 시간 동안 일시 중지한다.
std::this_thread::sleep_for(std::chrono::seconds(3));
위 코드는 현재 스레드를 3초 동안 잠재운다. 이 기능은 스레드가 일정 시간 동안 대기하거나, 다른 스레드가 특정 작업을 완료하는 것을 기다리는 등의 상황에서 유용하게 사용된다.
단, `sleep_for` 함수는 최소한 지정된 시간 동안 스레드를 잠재우지만, 스케줄링이나 리소스 경합 등의 이유로 지정된 시간보다 더 오래 잠재울 수 있다.
`std::this_thread::yield`는 C++에서 제공하는 함수로, 현재 스레드의 실행을 잠시 중단하고 다른 스레드에게 실행 기회를 주는 역할을 한다.
std::this_thread::yield();
이 함수를 호출하면, 현재 스레드는 실행을 멈추고 운영체제의 스케줄러에게 제어를 넘긴다. 그러면 스케줄러는 다른 스레드를 선택하여 실행한다. 이렇게 하면, 여러 스레드가 동시에 실행되는 멀티스레딩 환경에서 스레드 간의 실행 순서를 조절할 수 있다.
그러나 `std::this_thread::yield` 함수의 동작은 운영체제의 스케줄링 정책과 시스템의 상태에 따라 달라질 수 있다는것을 고려해야 한다.
저번 SpinLock 구현코드에 두 함수를 넣어보았다.
class SpinLock
{
public:
void lock()
{
bool expected = false;
bool desired = true;
while (!_locked.compare_exchange_strong(expected, desired))
{
expected = false;
//지정한 시간동안 재스케줄링이 되지 않고 대기타다가 시간이 지나면 다시 스케줄링 대상이 되어 해당 쓰레드가 실행 될 수 있게 함
//this_thread::sleep_for(std::chrono::milliseconds(100));
this_thread::sleep_for(100ms); //위와 동일함
//언제든지 다시 스케줄링이 될수 있지만 현재쓰레드는 실행을 멈추고 운영체제에게 스케줄러 제어를 넘긴다.
this_thread::yield();//sleep_for(0ms)를 하는것과 동일함
}
}
void unlock()
{
_locked.store(false);
}
private:
atomic<bool> _locked = false;
};
댓글