만약 자동으로 설정될때
CPU bound program = 예를들면.. 1부터 10만까지의 곱셈이라던지
IO bound program = 1부터 10만까지 파일에 쓰는
이런 두 종류의 프로그램이 있을때
CPU scheduling 은 어떤 프로세스를 더 높은 priority 를 두나요? 일반적으로 cpu를 높게 사용해야 더 높은 priority를 두나요?
그리고 혹시, CFS 나 o(1) 둘다 듀얼코어를 썼을때, 싱글코어보단 더 빠른 실행속도를 갖게 될까요?
당연히 CPU 가 2개니까 연산속도가 2배가 돼고 , sceduling 이 나누어서 될테니 더 빠른 실행속도를 가질 것같은데 제 생각이
맞는지 모르겠네요
댓글 5
-
노서영
2011.04.12 20:32
-
심우진
2011.04.12 20:36
감사합니다. 많은도움돼었습니다.
그렇다면 스케쥴링에서 priority를정하는 기준은 무엇일까요?
-
이정승
2011.04.13 03:38
priority는 기본적으로 부모task의 prirority를 상속받고, nice() setpriority()등을 사용하면 조정된 prioriy를 가지게 됩니다.
O(1)에서는 위에서 설정된 정적 priority 외에도 말씀주신 task들의 차이점을
반영하기 위해서 동적 priority라는 개념이 추가로 있었습니다.
>CPU bound program = 예를들면.. 1부터 10만까지의 곱셈이라던지
>IO bound program = 1부터 10만까지 파일에 쓰는
task가
I/O bound 라고 판단되면 우선순위를 증가 (-5까지)
CPU bound라고 판단되면 우선순위를 감소 (5까지)
I/O bound일수록 사용자의 응답성에 더 민감한 task로 판단, 우선순위를 증가 시켜주도록 한것이죠
(게다가 곧바로 blcok되서 다른 task의 동작에 별다른 영향을 주진 않을테니요..그러나 과연 그럴까요 -_-)
판단기준은
block된 시간이 많을 수록 I/O bound,
block 된 시간이 없을 수록 CPU bound
게다가 좀 어이없게도 완전 I/O bound 라고 판단(계산식)되면 timeslice를 다 소비하더라도 expired queue로 이동하지 않고
다시 active queue로 가게 되어 있습니다.(boost up)
O(1)은 이런 휴리스틱한 내용들로 구성되어져 있는데요.
어찌보면 이런 부분들을 보완하고자 만들어진게 CFS입니다.
CFS에는 O(1)에서처럼 CPU bound , I/O bound 인지를 판단하고 별다른 처리를 하지는 않습니다.
다만 구조자체가 오래 수행되면 될수록 RB-tree의 뒷쪽으로 이동되는 구조죠.
-
백창우
2011.04.13 23:48
"CFS 나 O(1) 둘다 듀얼코어를 썼을때, 싱글코어보단 더 빠른 실행속도를 갖게 될까요?"
위에서 노서영님, 이정승님께서 잘 설명해주셔서 이 부분만 조금 첨언 하자면 다음과 같습니다.
process의 type 혹은 process간 resource 공유 여부에 따라 결과가 완전히 다르게 나타날 수 있습니다.
하지만 일반적으로 빨라지는 것은 사실입니다.
우선 아래와 같은 두 개의 process 조합이라면 multi-core라해서 성능 향상이 많이 일어나지 않습니다.
- I/O bound process이고 block간 running time이 매우 작음
- CPU bound process
그리고 아래와 같은 조합이라면 제법 성능 향상 될 수 있습니다.
- I/O bound process이고 block간 running time이 큼
- CPU bound process
그리고 아래와 같은 A, B process 조합이 있을때, A와 B간에는 자원의 공유가 없이 완전 독립적인 경우 거의 두배까지 성능 향상 될 수 있습니다.
하지만 완전 두 배는 불가능 합니다. 왜냐하면 적어도 L3-cache, memory, bus 등의 공유는 항상 존재하기 때문입니다.
- CPU bound process A
- CPU bound process B
마지막으로 아래와 같은 A, B process 조합이 있을때, A와 B간에는 자원의 공유가 존재할 때, 이때는 암달의 법칙(Amdahl's law)에 의해 제한을 받게 됩니다.
- CPU bound process A
- CPU bound process B
더 자세히 이해하고 싶으시면 multi-core 환경에서 미치는 암달의 법칙에 대해 찾아보면 되실겁니다.
덧붙임 : ILP의 경우 IA64와 같은 VLIW 혹은 EPIC 아키텍쳐에서는 컴파일러가 instruction scheduling을 수행하고,
x86과 같은 Superscalar 아키텍쳐에서는 processor가 instruction scheduling을 수행합니다.
Superscalar 아키텍쳐에서 컴파일러는 ILP를 보다 쉽게 할 수 있도록 조금 도와주는 역활만 수행합니다.
-
심우진
2011.04.16 12:34
좋은답변감사합니다.덕분에많은도움이돼었습니다!!
.
마지막 질문에 대해서..
말씀하신 "성능"이 어떤것이냐에 따라 답이 "예"가 될 수 있고 "아니오"가 될수 있을 것 같습니다. 만일 Single Task만을 고려했을 때 성능이 2배가 되려면, 아이디얼하게 Single Task가 2개의 Core에서 수행되도록 해줘야 하겠죠. Instruction Level의 병렬화가 가능하다는 이야기는 들은것 같습니다만 GCC와 같은 컴파일러에서 지원하는지 모르겠습니다만 만일 가능하면 이 부분이 Linux Kernel과는 어떻게 연계되는지는 다른분께서 답변을 해주시면 좋겠네요. 말씀드릴 수 있는 것은 High Performance Computing (소위 말하는 슈퍼컴)에서는 MPI (Message Passing Interface) 프로그램을 통해서 Single Job을 조각내어 성능을 높입니다. 각 조각들이 Core에 할당되어 Single Task에 대해서도 성능 개선을 기대할 수 있습니다. 하지만, 일반 컴퓨터에서는...??
말씀하신 성능이 Multi Task에 대한 것이라면, 성능은 향상됩니다 왜냐하면 Core 별로 Run Queue를 가지고 있기 때문에 독립된 Task라면 각 Core에 할당되어 성능향상을 볼 수 있겠죠.
이런관점에서 보면, Single Task가 Muti Thread형태의 Task라면..성능 향상을 볼 수 있을 것입니다. 왜냐하면 Thread 또한 Kernel 내부에서 Task로 관리되기 때문입니다. 부족한 의견이지만 도움이 되었길 바랍니다.