OpenGL 게임을 개발 중인데 비슷한 기능을 가진 코드의 일부를 복사했고, 새로운 기능으로 코드를 부분적으로 수정했지만 여전히 버그가 있습니다. 이 코드는 잘못된 데이터와 매개변수를 사용하여 OpenGL 렌더링 함수를 호출합니다.
잘못된 데이터/매개변수로 OpenGL 함수를 호출한 후 전체 시스템이 정지되고 콘솔로 전환할 수도 없습니다 CtrlAltF1.
Linux는 안정적인 소프트웨어/운영 체제로 간주되기 때문에 실망스럽습니다. 그 다음에,결함이 있는 OpenGL 프로그램이 전체 시스템에 충돌을 일으키는 이유는 무엇입니까?
답변1
Linux 커널의 "모놀리식" 특성을 고려할 때 CPU의 가장 높은 권한 수준에서 실행되는 코드에서 발생하는 버그(종종 "커널 모드"라고 함)할 수 있는전체 시스템을 무릎 꿇게 만듭니다.
세 가지 이유가 있습니다:
- 이러한 코드는 다른 코드의 메모리 공간에 직접 액세스할 수 있습니다. 따라서 이러한 코드는 커널 자체를 손상시키고 드라이버 등을 실행할 가능성이 있습니다.
- 이러한 코드는 I/O 장치에 직접 액세스할 수 있습니다. I/O 장치를 잘못 구성하거나 잘못된 시간에 잘못된 비트를 설정하여 전체 시스템이 잠길 수 있습니다. 버그 없는 장치 드라이버는 사용자 코드가 하드웨어에 시스템 불안정을 일으킬 수 있는 작업을 수행하도록 허용하지 않지만, 버그가 있거나 베타이거나 잘못 작성된(또는 버그가 있는) 드라이버는 그럴 수 있습니다.
- 처리할 수 없는 문제나 예외가 발생한 코드에는 더 높은 수준의 "throw"가 없습니다. 따라서 커널 예외로 인해 시스템 충돌이 발생할 수 있습니다.
그래서 커널이나 그래픽 드라이버에서 OpenGL이 얼마나 잘 작동하는지 모르겠지만 이것이 도움이 되기를 바랍니다.
답변2
최신 사용자 인터페이스 환경(Windows, OSX, Linux, 모바일 장치 등)은 그래픽 파이프라인의 성능에 크게 의존합니다.
시스템에 ** 그래픽 파이프라인이 있습니다. 모든 그래픽 프로그램(데스크톱, 브라우저, 게임 등)은 별도의 스레드이며 이 단일 그래픽 컨텍스트를 공유해야 합니다.
이는 멀티스레딩 문제에 필요한 조건을 만듭니다. 스레드는 교착 상태, 라이브 잠금, 경합 등으로 인해 어려움을 겪을 수 있습니다.
귀하의 스레드가 데스크탑 그래픽 스레드와 "잘 작동"하지 않아 작동이 중단될 수 있습니다. 더 이상 사용할 수 없는 리소스를 기다리고 있을 수 있습니다(모든 리소스를 올바르게 릴리스했습니까?).
OpenGL은 매우 공격적으로 개발되었으며 하드웨어를 한계까지 밀어붙였습니다. 다른 하드웨어에서는 오류가 발생하지 않는 것을 확인할 수 있습니다.
그러나 전체 시스템이 종료되면 파이프의 실제 칩셋이 과열되거나 과압될 수 있습니다. 대부분의 하드웨어에는 유해한 부하 급증이 발생할 경우 전원을 차단하는 센서가 있습니다. 제조업체는 하드웨어 부하 테스트를 수행하고 이에 따라 컷오프를 설정합니다.
**단일 그래픽 파이프라인은 여러 파이프라인(화면의 독립적인 작은 영역을 "소유"할 수 있음)으로 대체되고 있습니다. 이것이 바로 OpenGL이다불카누스이는 사실이며 특수 GPU 칩셋이 필요합니다.