bash 는 단순히 순차 실행이 되는 구조이기 때문에 일반적으로 싱글 쓰레드로 볼 수 있다 ‘ㅅ’a
하지만 실행속도 향상을 위해 다중실행하는것이 유리 하다면 그렇게 만들면 되겠다 ‘ㅅ’a
리눅스는 기본적으로 프롬프트에서 background 실행을 할수 있다.
보통 백업을 할때 ‘ㅅ’a
1 |
~]# tar czfp backup.tgz 경로/파일 & |
이걸 응용하여 단순실행용 스크립트와 여러 명령어를 실행하는 스크립트를 두개를 만들어서 구성 해야 하겠지만..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/bin/bash ########################################################################################## # 멀티쓰레드 구현 # # main in enteroa_j@naver.com # ########################################################################################## th="8" # 동시 생성할 최대 쓰레드 숫자 지정 # list=( 10 5 8 2 3 9 1 2 5 3 9 2 5 ) for a in ${list[@]} do j_count=`jobs -l|wc|awk '{print $1}'` if [[ $j_count -ge $th ]];then until [[ $j_count -lt $th ]] do j_count=`jobs -l|wc|awk '{print $1}'` sleep 0.1 done fi ########################################### # threads 에 명령 넘기는 부분. sleep $a & ########################################### done lastPIDs=`jobs -l|awk '{print $2}'` wait $lastPIDs echo "";echo "work complet." |
여기서는 list 어레이에 선언된 숫자 값을 각 쓰레드에서 sleep 하는걸로…..
최대 리미트 $th 에 선언된 8의 갯수 만큼 동시실행을 하고 기존 프로세스들이 종료될 경우 추가 실행을 하도록 하였다 ‘ㅅ’a
- 백그라운드로 돌아가는 명령어
- 이를 확인하는 jabs 명령어
- 프로세스 종료를 기다리는 wait 명령어
위와 같은 명령어 조합으로 멀티쓰레드 구현이 간단히 되었다. 🙂
8쓰레드 의 단순 성능향상은 8배 이겠지만 단순히 8개 동시 실행을 하고 먼저 실행된 애들이 종료되면 순차실행을 하기 때문에..
에러이 선언된 시간들은 총 64초 이지만 멀티쓰레드 구현을 했을때에는 14초가 걸릴것이다 ‘ㅅ’a
PS. 싱글쓰레드에서 4분 56초 걸리는 작업 ( BIND[named.conf/zone] -> Pdns query )을 멀티쓰레드로 구현했을때 1분 44초가 걸렸다 ‘ㅅ’a