시스템 호출 및 커널 모듈(병렬 커널 서비스)에 대한 몇 가지 질문

시스템 호출 및 커널 모듈(병렬 커널 서비스)에 대한 몇 가지 질문

시스템 호출과 커널 모듈에 관해 몇 가지 질문이 있습니다.

  1. 두 개의 애플리케이션(A와 B)이 있고 각 애플리케이션이 서로 다른 코어에서 실행된다고 가정합니다. (A-CPU 0, B-CPU 1) 두 응용 프로그램이 동일한 시스템 호출을 병렬로 호출하면 병렬로 실행됩니까? 그렇다면 시스템 호출은 어떤 CPU 코어에서 실행됩니까? 시스템 호출이 호출자의 CPU 코어에서 실행됩니까?

  2. 커널 모듈이 있고 두 응용 프로그램(A와 B)이 ioctl을 통해(병렬로) 커널 모듈의 동일한 기능을 호출한다고 가정합니다. 병렬로 실행되나요? 그렇다면 커널 모듈 기능을 제공하는 CPU 코어는 무엇입니까? 그렇지 않다면 여러 애플리케이션에 병렬 커널 모듈 기능을 제공하는 가장 효율적인 방법은 무엇입니까?

답변1

SMP 지원이 Linux에 처음 추가되었을 때,"자이언트 락"또는"BKL"(큰 커널 잠금), 이것은 여전히 ​​존재합니다몇 년 전까지만 해도. 이는 효과적으로 커널을 단일 스레드로 만들므로(제가 생각하는 하드웨어 인터럽트 서비스 제외) 단 하나의 시스템 호출만 활성화될 수 있으며 이는 물론 다양한 유형의 작업 부하에 대한 성능을 제한합니다.

시간이 지남에 따라 BKL은 세분화된 잠금으로 대체되었으며 일부 시스템 호출은 완전히 동시에 실행될 수 있었지만 다른 호출은 그렇지 않았습니다. 간단한 예를 생각해보십시오.PID 할당 및 프로세스 생성리눅스 커널에서. PID가 전달되었습니다.비트맵, PID 번호의 할당 및 해제는 잠금 없는 원자 작업을 통해 완료될 수 있습니다. 그러나 프로세스 테이블의 유지 관리는 관련 데이터 구조의 무결성을 보장하기 위해 "작업 목록" 잠금을 통해 수행됩니다( pid_hash).

다음 질문에 대답하십시오:

두 애플리케이션이 동일한 시스템 호출을 병렬로 호출하면 병렬로 실행됩니까?

현대 커널을 가정하면 그렇습니다. 그러나 시스템 호출에 따라 특정 작업을 회전하거나 양보하거나 연기할 수 있습니다. 뮤텍스나 잠금을 사용할 때 동시 호출은 동일한 데이터 구조를 업데이트하거나 동일한 하드웨어에 동시에 액세스할 수 없습니다.

그렇다면 시스템 호출은 어떤 CPU 코어에서 실행됩니까? 시스템 호출이 호출자의 CPU 코어에서 실행됩니까?

호출 CPU에서 시작됩니다.가능한엄격한 선호도를 설정하지 않는 한 시스템 호출과 시스템의 다른 곳에서 발생하는 상황을 기반으로 다른 CPU로 다시 예약합니다. 잠시 생각해 보면getCPU()syscall은 더 명확해야 합니다(사실을 무시하세요).x86에서는 실제 시스템 호출이 아닐 수 있습니다.).

커널 모듈이 있고 두 응용 프로그램(A와 B)이 ioctl을 통해(병렬로) 커널 모듈의 동일한 기능을 호출한다고 가정합니다. 병렬로 실행되나요?

예, 모듈은 필요에 따라 세분화된 잠금 및 기타 동기화 기본 요소를 사용할 것으로 예상됩니다.

그렇다면 커널 모듈 기능을 제공하는 CPU 코어는 무엇입니까?

위와 동일하게 호출 CPU에서 시작됩니다.

그렇지 않다면 여러 애플리케이션에 병렬 커널 모듈 기능을 제공하는 가장 효율적인 방법은 무엇입니까?

모듈(및 하드웨어)에 따라 효율성은 올바른 잠금(스핀 잠금 방지, 메모리 복사본 감소 등)을 주의 깊게 최소한으로 사용하고 프로세서 선호도를 올바르게 사용하는 것에 따라 달라집니다. 시스템 호출을 동시에 처리할 수 없거나 동시에 처리할 수 없는 부분에 대해 묻는다면 좋은 답변을 드리기 어렵습니다. 이는 드라이버의 특정 부분을 다중 스레드 사용자 공간 데몬에 위임함으로써 가능할 수 있습니다(가속기 자체는 한 번에 하나의 작업만 수행할 수 있고 일부 작은 작업은 CPU인 일부 암호화 가속기에서 이것을 관찰했습니다).

무료 PDF 도서리눅스 장치 드라이버(세 번째 버전)이러한 유형의 작업, 특히 5장에 매우 중요합니다.동시성과 경쟁 조건.

관련 정보