안녕하세요 ^^;;
Windows에서 하나의 프로세서는 하나의 PRCB를 갖습니다.
궁금한게, 코어당 하나의 PRCB는 멀티프로세싱입니까?
아니면 그냥 Windows 에서 관리하는 구조입니까?
바꿔말하자면 네개의 CPU 코어가 있고 Windows에서 네 개의 PRCB를 갖는다면
이것이 네 개의 CPU 코어에서 균등하게 동작합니까?
만약 그렇다면 어떤 원리로 이게 가능하게 되는 건가요?
궁금합니다! @_@
제가 알고 있는 이론으로는, 멀티코어에 대응하는 PRCB를 갖고 각각의 쓰레드 스케쥴링을 기반으로 멀티프로세싱을 가능케 하는 것 같습니다. 하지만 늘 그렇듯이 이런 OS의 원리가 어떻게 시스템과 연동되는지는 이해하기 어렵습니다... ㅠㅠ
예를들면 IOAPIC 와 같은 정적으로 메모리에 대응되는 주소값들이 CPU 별로 존재한다든지,
그래서 CPU별로 별개의 IDT를 갖을 수 있다... 이런 원리를 자세히 알려주시면 감사하겠습니다.
그럼 좋은 주말 되세요
PS. 생각난 김에 질문 하나 더 드리겠습니다.
C와 C++ 의 차이점에 대해선데 OOP같은 개념적인건 생략하고,
vtable외에 구현상에 차이가 있나요?
댓글 8
-
백창우
2010.10.30 23:55
-
백창우
2010.10.31 18:18
본적이 없다니깐요. ^^
-
박한범
2010.10.31 15:54
프로세서 메뉴얼에 관련 내용이 있다면 알려주시면 감사하겠습니다.
Intel® 64 and IA-32 Architectures
Software Developer’s Manual volume 3A system programming Guide , Part 1을 보고 있는데 관련 내용이 없는것 같습니다. -
서태원
2010.10.31 00:20
Windows에 대해서는 잘모르겠습니다만...
IOAPIC에 대해서는 좀 말씀드릴수 있을것 같습니다.
SMP machine처럼 CMP (chip multiprocessor, corei7같은...)에 기반한 시스템들은 모두
single shared address space를 기본으로 하고 있습니다.
이 adddress space에서 IOAPIC은 0xFEC0_0000가 base address이고
(backward compatibility문제 때문에 base address가 쉽게 바뀌진 않을것으로 사료됩니다)
따라서 시스템에 있는 모두 CPU가 IOAPIC을 access하려면 그쪽 address를 접근해야 하겠죠..
IDT도 마찬가지로 당연히 share될것이라고 당연히 생각하고 있습니다. (CPU마다 별개의 IDT를 가질 필요는 없죠)
x86에 기반한 system은 3개의 interrupt controller가 있습니다.
South Bridge에 있는 IOAPIC와 2개의 8259 (Legacy INTC), processor (x86)내부에 있는 Local APIC.
Local APIC의 base는 0xFEE0_0000이고요.
IOAPIC에 interrupt를 보내면 Local APIC의 ID (CPU의 ID와 같이 사용되죠)에 따라
어떤 CPU가 interrupt를 처리할 지가 결정되고요..
또 IPI (Inter-Processor Interrupt)의 기능도 Local APIC는 있어서 booting할때
BIOS에서 system에 몇개의 CPU가 있는지를 poking할때 사용합니다.
하드웨어적으로는 IPI로 자신이 처리하기가 버거울경우 다른 CPU가 처리하도록
message를 보낼수 있는데 Windows나 Linux가 이 기능을 얼마나 사용하는지는 모르겠습니다.
-
박한범
2010.10.31 15:42
답변 감사드립니다.
제가 windows 라는 단서를 달아놓은게 실수같습니다.
예를들면 Windows에서는 PRCB라는 Process Control용 Block 있다는 것입니다.
Linux에서는 어떻게 동작하는지를 알려주실 수 있으면 감사하겠습니다.
Local APIC 로 넘어가는 과정에 대해서는 아주아주 대충 알고 있습니다.
LocalAPIC로 넘어가더라도 각 APIC에서 넘어오는 메시지에 대응하는 IDT를 참조하는게 아닌가요? 제가 왜 이런 식으로 두리뭉실한 질문을 하냐면, 이전에 한번 인터럽트를 후킹하는 소스를 본 적이 있는데 SMP 모듈을 적용해야 core마다 인터럽트 후킹이 적용된다고 본 적이 있어서 입니다. 무례하지만 ^^; 왜 그런지 궁금해서 질문드리는 입장이니... 이해부탁드리고,
제 질문의 요지를 정확히 말씀드려야 될 것 같습니다.
이번에 어떤 프로그램을 만들려고 하는데 Single-core로 동작하는 쓰레드를 강제로 Multi-core 로 동작하게 만드려고 합니다.
쓰레드 동기화 측면을 생각하지 않을 수가 없는데,
제가 책을 참고한 바로는, Windows는 PRCB로 프로세서를 관리하고, 이 프로세서 관리 구조체는 각자의 스케쥴링 테이블을 갖습니다. 쓰레드가 동시에 동작하는 경우를 배제하게끔 잘 손을 보면 되지 않을까 생각하고 있습니다.
그런데 아무리 생각해봐도 이해가 안되는게 말씀드린 프로세서 관리 구조체가 어떻게 다중코어에 대응해서 돌아가는걸 보장하는지를 도대체 알 수가 없어서 질문을 드렸습니다. 이에 대한 답변 부탁드립니다. ^_^
-
서태원
2010.10.31 21:59
글쎄요... 저도 뭐 Linux source code를 잘 보질 못해서 뭐라 답하기가 그렇습니다.
그리고 질문의 요지도 사실 정확하게 이해가 안가고요..
제가 그냥 직관적으로 이해한 바로는 PCB (Process Control Block)을 access하려면
lock을 먼저 획득한후 (critical section이기때문에) PCB구조체를 변경하면 되니까
별 issue는 없어보입니다. lock을 구현하기 위해 atomic instruction (수행이 끝날때 까지 bus를 잡고있죠)을 사용할 수
있으니까 SMP에서 사용하는 shared bus구조에서도 문제가 없구요..
Local APIC에 대해서 말씀드리면
interrupt message를 IOAPIC에서 받으면 lowest priority를 수행하고 있는 CPU가 수행을 하도록 되어 있는것 같구요..
(근데 좀 더 복잡한 상황에 대해서도 대비해서 Linux kernel이 되어 있는것 같습니다.)
이전에 말씀드린 IPI를 이용해서 process scheduling에서 많이 사용되는 걸로 또한 알고 있습니다.
사실 생각해 보면 scheduler도 하나의 CPU에서 돌아 갈것이고 다른 CPU에게 일을 시킬 방법이 IPI 외에는 없어보입니다...
IPI에 대한 자세한 내용은 Unabridged Pentium-4를 참고하시면 될것 같습니다.
그리고 IDT에 관련되서는 x86 system에는 256개의 interrupt만을 처리할 수 있고
Local APIC에 들어온 message에 vector정보가 포함되어 있기때문에 (아닐 경우는 8259에서 register를 읽어야 하고요)
말씀하셨듯이 해당하는 IDT entry를 참고해서 ISR를 수행하게 됩니다.
-
김남형
2010.10.31 22:03
죄송하지만 질문의 요지가 여전히 잘 파악되지 않는군요.. ;;
제가 이해한 바로는.. 멀티 스레드 환경을 고려하지 않고 작성한 프로그램을
멀티 스레드를 지원하도록 변경해야 하는데 어떤 점을 고려해야 하는지 궁금하시다는 것인가요?
-
김남형
2010.10.31 22:11
C와 C++의 차이점에 대해서는 대략 생각나는 것만 적어보면 (사실은 C++을 잘 몰라서.. ;;)
OOP에 따른 차이점을 제외하더라도 템플릿에 의한 코드 생성 부분이나 예외 처리를 위한
추가적인 코드가 필요하다는 정도가 떠오르네요..
.
PRCB는 windows에서 관리하는 자료 구조인것 같군요.
processor 메뉴얼에서는 본적이 없습니다.