나는 bash 쉘의 동시성과 병렬성에 대해 약간 혼란스러워합니다. 내가 이해한 바에 따르면 동시에 여러 하위 셸에서 명령을 실행하면 해당 명령이 다양한 프로세서 코어에서 병렬로 실행됩니다.
예를 들어;
cmd1 & cmd2 & cmd3 &
여기서 "&" 기호는 각 명령의 백그라운드(서브셸이라고도 함)에서 동시에 실행됩니다. 다른 방법으로 서브쉘에서 생성될 수 있습니다. (괄호 안에 쓰거나 파이프를 사용하는 것과 같습니다..)
이 방향에서 나는 이러한 질문에 대한 답을 알고 싶습니다.
- Bash는 서브쉘을 통해 병렬성을 제공합니다. 반면에 Bash에서도 동시성을 달성할 수 있는 다른 방법이 있습니까? 내가 아는 한, 동시성은 단일 CPU가 간헐적으로 작업을 수행함으로써 작동합니다. 이를 달성하려면 외부에서 메소드를 구현해야 합니까? 아니면 bash가 이미 이런 방식으로 작동합니다(동시성).
- 병렬 처리를 사용하여 모든 CPU 코어를 점유하면 시스템이 충돌합니까? 아니면 이 상황에 대한 보호 메커니즘이 있습니까?
- 내가 사용하는 병렬 도구와 서브셸에서 제공하는 GNU 병렬 도구의 차이점은 무엇입니까? GNU Parallel 도구가 더 잘 작동한다면 어떻게 이를 달성할 수 있습니까?
- "병렬" 또는 "동시" 중 어느 작업이 더 효율적입니까?
- 일반 작업(명령을 순차적으로 실행)과 달리 "병렬" 또는 "동시" 작업을 수행할 때 어떤 불이익이 발생합니까?
답변1
어떻게 작동하나요?
"동시성은 단일 CPU가 간헐적으로 작업을 수행하는 방식으로 작동합니다"라는 말이 맞습니다.http://ncce.io/wall-building
동시성은 단일 프로세서에서 실행될 수 있으므로 많은 코어가 필요하지 않으며 모두 사용 중인지는 중요하지 않습니다.
사용 가능한 코어가 있는 경우 코어보다 프로세스가 많아질 때까지 위 기술은 사용되지 않습니다.
관리 수수료가 있습니다:
- 생성 프로세스: MS-Windows보다 훨씬 빠르지만 여전히 오버헤드가 있습니다.
- 프로세스 간 통신.
- 동시성 수행: 많은 프로세스가 동시에 실행되는 것처럼 보입니다(다른 프로세스를 실행하도록 전환하려면 약간의 노력이 필요함).
배쉬는 무엇을 합니까?
Bash는 새로운 프로세스를 생성하고 운영 체제 커널이 나머지 작업을 수행합니다. 프로세스(모든 프로세스)가 새 프로세스를 생성하면 커널은 이를 동일한 방식으로 처리합니다. 다음은 Python에서 이를 수행하는 방법의 예입니다.https://ctrlaltdelor.wordpress.com/2019/06/01/creation-of-an-interprocess-pipe-in-python-the-unix-gnu-linux-way/
답변2
내가 이해한 바에 따르면 동시에 여러 하위 셸에서 명령을 실행하면 해당 명령이 다양한 프로세서 코어에서 병렬로 실행됩니다.
아니요, 전혀 사실이 아닙니다. 여러 명령을 실행하면 시스템에서 동시에 실행됩니다.
명령이 병렬로 실행된다고 말할 수도 있습니다. "병렬"이라는 단어에는 여러 가지 의미가 있지만 운영 체제 설계에 관해 이야기할 때 일반적으로 "동시성"과 동의어입니다.
프로세스에는 특정 코어가 할당되지 않습니다. 시스템은 모든 프로세스를 동시에 실행합니다. 보다 정확하게는 커널이 모든 [스레드]를 실행합니다(보다 정확하게는 모든실) 동시에 프로세스에는 여러 스레드가 있을 수 있습니다.
코어가 유휴 상태일 때 커널은 다른 코어에서 아직 실행되지 않은 수행할 작업이 있는 스레드(준비된 스레드)를 선택하여 잠시 동안 유휴 코어에서 실행합니다. 시간 분할이 끝나면 커널은 다른 스레드를 선택하는 식으로 진행됩니다. 한 코어에서 다른 코어로 스레드를 이동하면 일부 리소스가 소비되지만 소비량이 매우 적기 때문에 스레드는 일반적으로 한 코어에서 다른 코어로 자주 이동됩니다.
동시성은 모든 스레드가 동일한 코어에서 실행된다는 의미는 아닙니다.
여기서 "&" 기호는 각 명령의 백그라운드(서브셸이라고도 함)에서 동시에 실행됩니다. 다른 방법으로 서브쉘에서 생성될 수 있습니다. (괄호 안에 쓰거나 파이프를 사용하는 것과 같습니다..)
이러한 명령은 백그라운드에서 실행되지만 외부 명령인 경우에는 실행되지 않습니다.서브쉘. 서브셸은 별도의 프로세스에서 실행되거나 별도의 프로세스에서 실행되는 것처럼 동작하는 스크립트의 일부입니다(역사적으로 모든 서브셸은 별도의 프로세스에서 실행되었지만 일부 최신 셸에서는 이를 최적화할 수 있음).
둘 다 왼쪽과 오른쪽으로 동시에 &
실행됩니다 .|
당신이 "병렬성"이라고 부르는 것은 단순히 발생하지 않기 때문에 거의 모든 다른 질문은 논쟁의 여지가 있습니다.
답변3
내가 사용하는 병렬 도구와 서브셸에서 제공하는 GNU 병렬 도구의 차이점은 무엇입니까? GNU Parallel 도구가 더 잘 작동한다면 어떻게 이를 달성할 수 있습니까?
여기서는 "더 나은"이 핵심 단어입니다. 더 빠르지는 않지만( &
작업당 약 0.5ms, GNU Parallel은 작업당 약 5ms 소요) 더 많은 제어 기능을 제공합니다.
- 혼합 출력을 방지합니다.
seq 100000 & seq 100000 &
출력이 혼합됩니다. - 제한된 수의 작업을 계속해서 병렬로 실행할 수 있습니다.
- 원격으로 작업을 실행할 수 있습니다.
- 템플릿과 여러 입력에서 명령줄을 생성할 수 있습니다.
- 실패한 작업을 다시 시도할 수 있습니다.
몇가지 말하자면.