출처: Beginning Lenux Programming
단일 프로세서 컴퓨터의 경우에는 한 시점에서 오직 하나의 프로세스만이 실행될 수 있으며 다른 프로세스들은 자신의 차례를 기다려야 한다. 좀 더 구체적으로 말하면, 프로세스들에는 Time slice이 차례로 부여되며 각 프로세스는 자신에 주어진 Time slice 동안만 실제로 실행된다. 그런데 이 조각의 길이가 아주 짧은 탓에 사용자는 마치 여러 프로세스들이 동시에 실행되는 것처럼 느끼게 된다. ps 의 출력에 R+ 상태를 가진 프로세스가 여러 개 나타나는 경우도 있는데, R+는 단지 해당 프로세스가 전경 (foreground) 태스크(ㅓ다른 프로세스가 종료되길 기다리거나 입, 출력이 완료되길 기다리는 것이 아닌 프로세스 )임을 뜻할 뿐이다. (눈에 보이는 것 외에 실행중인 것으로 표시되는 프로세스로 흔히 볼 수 잇는 것은 X 디스플레이 서버이다.)
리눅스 커널은 프로세스 스케줄러를 이용ㅇ해서 다음번에 Time slice를 부옇라 프로세스를 결정한다. 스케줄러는 프로세스 우선순위를 이용해서 일정을 결정한다. 우선순위가 높은 프로세스는 좀 더 자주 실행되는 반면 우선순위가 낮은 배경 태스크들은 덜 자주 실행된다. 리눅스의 경우 프로세스들은 자신에게 부여된 Time slice를 넘어서서 시행될 수 없다. 리눅스는 소위 선점형(Preemptive) 다중 태스킹 운영체제인데, 선점형이라는 것은 간단히 말하면 운영체제가 프로세스들의 협조에 기대지 않고 프로세스들의 실행을 강제로 중지, 재개한다는 뜻이다. 반면 Windows 3.x 같은 구형 운영체제들은 각 프로세스 자신이 명시적으로 실행을 양보해야 다른 프로세스들이 실행을 재개할 수 이싿.
리눅스 같은 다중 태스킹 시스템들에서는 여러 프로그램들이 같은 자원을 두고 다툴 가능성이 존재하며, 따라서 짧은 시간 동안 잡업을 몰아서 수행한 후 입력을 기다리는 (따라서 다른 프로세스에게 기회를 주는) 식으로 행동하는 프로그램이 오랜 시간동안 어떤 값이 계산하거나 새 입력이 들어왔는지 빈번하게 조사하는 프로그램보다 바람직한 것으로 간주된다.
전자의 형태로 바람직한 행동을 보이는 프로그램을 Nice 프로그램이라고 부르는데 운영체제는 나름대로의 방식을 이용해서 프로그램의 nice 정도를 측정한다. 그리고 운영체제는 프로그램의 nice 값(기본은 0)과 프로그램의 행동에 기초해서 프로세스의 우선 순위를 결정한다. 오랜 시간동안 중단 없이 실행되는 프로그램은 일반적으로 낮은 우선순위를 가진다. 반면 잠깐만 실행된후 입력을 기다리는 프로그램은 높은 우선순위를 받는다. 이런 행동은 사용자에 대한 프로그램 반응성을 높이는데 도움이 된다. 프로세스가 사용자의 입력을 기다리는 동안 시스템에 의해 프로세스의 우선순위가 높아지게 되고, 따라서 실행이 재개되면 프로세스는 전보다 높은 우선 순위로 실행된다. 프로세스의 nice 값은 nice 명령으로 설정할 수 있으며, renice를 이용해서 재조정할 수 있다. nice 명령은 프로세스의 nice 값을 10 증가하여 우선 순위를 낮춘다. 실행중인 프로세스의 nice 값을든 ps 명령의 -l 옵션 또는 -f(긴출력) 으로 볼 수 있다.
=================================================================================================
하지만 이처럼 nice 값을 조정할 수 있는 것은 유닉스 계열에서는 사용자 모드 우선 순위 그룹의 스케줄링에서만 적용이 된다.
유닉스 계열에서는 세가지의 우선 순위 그룹으로 나누어 각 그룹에 대해 별도의 스케줄링 기법을 적용한다.
1. 실시간 프로세스 우선 순위 그룹
이는 지정된 프로세스들이 갖는 가장 높은 우선순위 그룹으로 사용자에 의해 설정된 변화가 없는 우선순위의 다단계 큐를 사용한다. 프로세스 별로 타임 슬라이스가 없는 FCFS와 타임 슬라이스가 주어지는 라운드 로빈을 선택적으로 사용할 수 있다고 한다.
2. 커널 모드 우선 순위 그룹
사용자 실행 모드의 프로세스가 시스템 호출을 하면 커널 모드 실행 상태로 전환된다. 일반적으로 커널 모드에서는 타임 슬라이스에 의한 선점은 없기 떄문에 이떄 우선순위는 의미가 없다. 그러나 프로세스는 보통 커널 모드에서 입출력을 발생시키고 이에 따라 대기 상태가 되면 시스템 호출 내부에서 중지된다. 추후 입출력에 관계된 인터럽트 처리기에서 이 프로세스를 다시 준비 상태로 환원하게 된다. 이때 프로세스는 새로운 높은 우선순위를 받게 되는데 이를 커널 모드 우선 순위라 한다. 즉 커널 모드 우선순위는 커널 모드 실행시에 필요한것이 아니라 커널 모드에서 대기 되었다가 다시 준비 상태로 돌아올때 필요한것이다.
3. 사용자 모드 우선 순위 그룹
이는 위에서 설명한 nice 값을 조정할 수 있는 그룹이며 우선순위가 가장 낮은 그룹이다. 사용자가 생성하는 일반 프로세스가 사용자의 텍스트를 수행 할때 즉 사용자 모드 실행상태에 있을 때에 속하는 그룹으로 다단계 피드백 큐 기법이 적용되며, 이 때의 우선순위를 사용자 모드 우선순위라 하낟. CPU를 많이 사용하면 우선순위는 낮아지며, 준비 큐에서의 CPU 대기가 길어지면 우선 순위가 올라간다.
=================================================================================================
'linux' 카테고리의 다른 글
입출력 재지정 (0) | 2010.08.17 |
---|---|
좀비 프로세스 (0) | 2010.08.17 |
프로세스 이미지 복제 (0) | 2010.08.15 |
프로세스 이미지 대체하기 (0) | 2010.08.15 |
새 프로세스 시작하기 (0) | 2010.08.15 |
프로세스와 신호 (0) | 2010.08.13 |
vim 설정 (0) | 2010.06.30 |
모듈의 상호참조 (0) | 2010.06.03 |
모듈에 대해 알아야 할것들 (0) | 2010.06.03 |
Hello 커널 모듈 작성 예제 (0) | 2010.06.02 |