>  기사  >  시스템 튜토리얼  >  임베디드 개발 엔지니어로서 여러분은 Linux 커널 동기화 메커니즘에 대해 알아야 합니다.

임베디드 개발 엔지니어로서 여러분은 Linux 커널 동기화 메커니즘에 대해 알아야 합니다.

王林
王林앞으로
2024-02-12 14:50:071249검색

作为嵌入式开发工程师,关于Linux kernel同步机制你不得不知道

머리말

동기화는 프로세스 간, 프로세스와 시스템 리소스 간의 상호 작용입니다. Linux 커널은 멀티태스킹을 사용하므로 조정을 보장하기 위해 여러 프로세스 간에 동기화 메커니즘이 있어야 합니다.

Linux 커널에는 많은 동기화 메커니즘이 있습니다. 오늘 우리는 커널의 비동기 메커니즘에 중점을 두고 커널의 비동기 및 동기 메커니즘에 중점을 둘 것입니다. 커널의 비동기 메커니즘은 두 가지 유형으로 나뉩니다. 하나는 애플리케이션 계층의 동기화 메커니즘, 즉 애플리케이션 계층 스레드 간의 통신이고, 다른 하나는 커널의 동기화 메커니즘입니다.

스레드가 커널 상태에 들어가면 커널과 직접 통신할 수 있습니다. 커널에는 두 개의 스레드가 있습니다. 하나는 스레드 A입니다. 커널 상태에 들어간 후 커널과 직접 통신하고 완료되면 커널에 알립니다. (이 작업을 세미(semi)라고 합니다.) 스레드가 커널 상태에 들어가면 먼저 커널과 한 번 통신한 다음 직접 실행할 수 있습니다.

커널의 동기화 메커니즘은 본질적으로 스레드 간의 통신 메커니즘이며 스레드 간의 통신은 동기화 메커니즘을 통해 이루어집니다.

1. 프로세스 간 통신

시스템의 정확성과 일관성을 보장하기 위해 Linux 커널은 차단 대기열을 사용하여 프로세스 간 통신 중에 프로세스 간 통신을 처리합니다. 차단 대기열은 메시지가 전송될 때 메시지 대기열의 요소가 생성되지만 특정 메시지에 대한 대기 대기열이 가득 찬 경우에만 모든 메시지가 전송되지는 않음을 의미합니다. 수신자의 대기 큐에 메시지가 없으면 알림이 수신됩니다. 수신자의 대기 큐에 메시지가 있으면 알림이 수신되지 않습니다.

커널에서는 차단 대기열이 추상화됩니다. 즉, 프로세스가 메시지를 보내면 차단됩니다. 따라서 차단 대기열은 실제로 동기화 메커니즘입니다. 차단 큐는 대기 큐 포인터(Push/Pop)를 포함하는 특정 함수를 통해 새 객체를 생성합니다. 대기 큐가 가득 차면 시스템은 대기 큐 포인터가 가리키는 객체를 첫 번째 프로세스의 스레드로 사용하여 알림을 발행합니다. 즉, 작업을 계속 수행하기 전에 프로세스에 알림이 전달됩니다.

2. 세마포어

세마포어를 사용하여 메시지를 보내거나 받을 수 있습니다. 프로세스가 세마포어를 소유한다는 것은 프로세스가 이미 자체 변수인 세마포어를 소유하고 있음을 의미합니다. 이 개인 변수는 다른 프로세스에서 얻을 수 없습니다. 세마포어는 프로세스가 소유한 세마포어 수를 나타내는 데 사용됩니다. 이 프로세스가 세마포어를 소유하면 다른 프로세스에 메시지를 보낼 수 있습니다. 이 개인 변수는 이 프로세스 자체에서만 사용할 수 있으며 다른 프로세스의 프로세스로 가져갈 수 없습니다.

스레드에 자체 세마포어가 있으면 공유 변수를 통해 다른 스레드와 통신할 수 있습니다. 공유 변수는 다른 스레드에서도 사용되며, 다른 스레드는 공유 변수를 사용하여 자신과 통신합니다.

3. 뮤텍스

Mutex는 주로 시스템 리소스용입니다. Linux 커널의 뮤텍스는 공유 리소스와 전역 뮤텍스 리소스의 두 가지 유형으로 나눌 수 있습니다.

공유 리소스는 프로세스 간에 공유됩니다. 예를 들어 프로세스에 여러 스레드가 있는 경우 각 스레드는 이 공유 메모리 공간에 액세스할 수 있습니다. 전역 상호 배타적 리소스는 프로세스와 스레드가 자신이 위치한 전역 메모리 공간에만 액세스할 수 있음을 의미합니다. 시스템에서 뮤텍스를 사용하면 여러 프로세스가 메모리에서 동시에 실행될 수 있습니다. 그러나 동시에 실행되는 여러 프로세스를 구현하려면 모든 프로세스가 동일한 메모리에서 실행될 수 있도록 동기화 메커니즘을 사용해야 합니다. 뮤텍스를 사용하면 프로세스는 자신이 위치한 전역 메모리 공간에만 액세스할 수 있고 다른 메모리 공간에는 액세스할 수 없습니다. 그러나 뮤텍스에는 큰 장점이 있습니다. 즉, 프로세스가 차단되지 않는다는 것입니다.

4. 메시지 대기열

메시지 대기열의 출현으로 프로세스 간 통신이 크게 확장되었습니다. 커널에는 동기화 메커니즘 외에도 메시지 큐라는 또 다른 비동기 메커니즘이 있습니다. 우리 모두는 Linux 커널이 메시지 대기열을 지원한다는 것을 알고 있습니다. 커널에 메시지 큐에 대한 자세한 정보가 있지만 커널은 사용자 모드 메시지 큐를 지원하지 않으므로 메시지 큐를 이해하려면 애플리케이션 계층부터 시작해야 합니다.

우선 메시지 큐가 무엇인지부터 알아볼까요?

메시지 큐는 여러 애플리케이션 스레드 간의 동기화 요구를 충족할 수 있는 특수 큐입니다. 메시지 큐는 애플리케이션과 다른 프로세스 또는 스레드 간의 비동기 통신을 제공하는 데 사용됩니다. 비동기식으로 통신해야 하는 경우 메시지 큐를 사용하면 됩니다. 예를 들어, clear() 함수를 호출하면 등록된 메시지 큐를 직접 사용할 수 있습니다.

그렇다면 메시지 대기열을 만드는 방법은 무엇일까요? ext2.json을 사용하면 JAR.json.clear()의 세마포어 명령을 사용하여 메시지 큐를 생성할 수 있습니다.

5. 공유 메모리

공유 메모리에서는 공유 잠금을 사용하는데, 공유 잠금은 특정 프로세스와 메모리를 공유하기 때문에 공유 잠금을 획득하려면 다른 프로세스에 요청해야 합니다.

위의 예처럼 휘발성 키워드를 통해 공유 메모리에 접근합니다. 이때는 다른 프로세스에 요청을 하지 않으므로 이 공유 잠금을 획득하려면 다른 프로세스에 요청하기만 하면 됩니다. 이는 두 프로세스 간의 경쟁을 피하고 데이터 동기화를 달성합니다.

공유 잠금은 프로세스와 메모리를 공유하므로 해당 주소에 액세스하려면 프로세스를 요청해야 합니다. 이 상황에 대한 가장 간단한 해결책은 스레드 풀을 사용하는 것입니다.

스레드 풀에는 "byte"라는 객체가 있는데, 이 역시 공유 잠금입니다. 이 잠금을 획득하려면 바이트 개체에 요청만 보내면 됩니다. 이때 바이트 개체는 요청을 스레드의 대기열로 보냅니다. 스레드가 요청을 받으면 응답 메시지를 반환합니다.

6. 스레드 풀

스레드 풀은 여러 스레드를 동시에 실행할 수 있고 스레드 간의 교착 상태와 충돌을 줄일 수 있는 매우 훌륭한 스레드 관리 도구입니다. 가장 중요한 기능 중 하나는 시스템 메모리를 효과적으로 활용하여 효율성을 향상시킬 수 있다는 것입니다.

스레드 풀의 사용은 매우 간단합니다. 실행할 작업을 해당 스레드 풀에 할당하기만 하면 됩니다. 실행할 작업을 해당 스레드 풀에 할당하면 실행할 수 있다. 스레드 풀을 사용하면 다음과 같은 많은 이점을 얻을 수 있습니다.

  1. 작업을 더 빠르게 완료할 수 있습니다. 작업이 스레드 풀에 할당되면 실행이 완료되거나 스레드가 다시 생성될 때까지 루프에서 실행됩니다.
  2. 자원 활용 효율성이 향상되었습니다. 작업에 CPU, 메모리 등과 같은 많은 리소스가 필요한 경우 스레드 풀을 사용하여 이러한 리소스를 관리하여 각 스레드가 작업을 수행하는 데 충분한 CPU와 메모리를 갖도록 할 수 있습니다.

7. 커널 상태 동기화 메커니즘

위에서 두 가지 동기화 메커니즘이 소개되었으므로 커널 상태의 동기화 메커니즘을 살펴보겠습니다. 커널 상태에는 네 가지 동기화 방법이 있습니다.

  1. 세마포어: 잠금을 작동하는 데 사용됩니다. 스레드가 잠금을 점유하면 시스템에 세마포어를 보냅니다.
  2. 세마포어 전송: 이 메커니즘은 운영 체제에서 제공합니다. sys_thread 함수를 호출한 후 인터럽트 상태로 들어갑니다. 이때 sys_thread 함수가 호출되면 세마포어가 시스템에 전달됩니다.
  3. 뮤텍스 잠금: 이 방법은 주로 우선순위를 통해 리소스에 대한 액세스를 제어합니다.
  4. 뮤텍스와 세마포어는 모두 프로세스 간의 동기화 문제를 해결하는 데 사용됩니다.
  5. 또 다른 동기화 방법은 스레드 풀을 이용하는 것입니다. 이 프로세스에서 스레드 풀은 동기화 효과를 달성하기 위해 이 스레드를 통해 다른 스레드와 상호 작용하는 스레드를 생성합니다.

8. 요약

위의 분석을 통해 우리는 동기화가 커널 상태에서 어떻게 완료되는지 이해합니다.

우선, 커널 상태에는 세 가지 프로세스가 있습니다. 이 세 프로세스는 서로의 리소스에 액세스할 수 있고, 다른 프로세스에서 리소스를 요청할 때 동기화할 수도 있습니다.

프로세스가 차단되면 모든 하위 프로세스는 대기 대기열에서 하위 프로세스(또는 다른 하위 프로세스)를 꺼내어 차단 대기열에 추가합니다. 모든 하위 프로세스가 차단되면 차단 대기열에 하위 프로세스가 없습니다. 이때 대기 큐에 있는 다른 하위 프로세스는 현재 스레드를 대기 큐에 추가합니다. 이 세 프로세스는 대기 프로세스 동안 서로 영향을 미치지 않습니다. 세 스레드는 자체 우선 순위를 설정하여 다른 스레드와 동기화할 수 있습니다.

위 내용은 임베디드 개발 엔지니어로서 여러분은 Linux 커널 동기화 메커니즘에 대해 알아야 합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제