달력

5

« 2018/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

음 이런 내용에 대해 꼭 알아야해! 완전 중요해! 필수야! 이런건아니지만.. 

알아서 나쁠거없고 다 차곡 차곡 쌓이는 지식이기 때문에 ㅎㅎㅎㅎ ! 


정리를 해본다.. 


쓰레드 그룹은 말그대로 thread group이다 ㅋㅋ 

서롸 관련된 쓰레드를 그룹으로 다루기 위한걸로 폴더를 생성해서 관련된 파일들을 함께 넣어서 

관리하는 것처럼 쓰레드 그룹을 생성해서 쓰레드를 그룹으로 묶어서 관리할 수 있다. 

폴더 안에 폴더를 넣는거마냥 

쓰레드 그룹에 다른 쓰레드 그룹을 포함시킬수도 있는데 


쓰레드 그룹은 보안상의 이유로 도입된 개념이라고 한다.(자세한건 더 찾아봐야할듯)

자신이 속한 쓰레드 그룹이나 하위 쓰레드 그룹은 변경할 수 있지만 

다른 쓰레드 그룹의 쓰레드를 변경할수는 없는부분?!


자바에서 ThreadGroup을 사용해서 생성할 수 있고, 주요 생성자와 메서드를 제공한다. 

쓰레드는 반드시 쓰레드 그룹에 포함되있어야하기때문에


쓰레드 그룹을 지정하는 생성자를 사용하지 않은 쓰레드는 기본적으로 

자신을 생성한 쓰레드와 같은 그룹에 속한다. 


자바 어플리케이션이 실행되면 JVM은 main과 system이라는 쓰레드 그룹을 만들고 JVM운영에 필요한 쓰레드를 생성!

그리고 그 쓰레드 그룹에 포함시킨다. 


ex) main메서드를 수행하는 main이라는 이름의 쓰레드는 main쓰레드 그룹에 속하고, 

가비지 컬렉션을 수행하는 Finalizer쓰레드는 system쓰레드 그룹에 속한다. 


우리가 생성하는 모든 쓰레드 그룹은 main쓰레드 그룹의 하위 쓰레드 그룹이 되며, 

쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 자동적으로 main쓰레드 그룹에 속하게된다. 



음 내가 이걸 정리하면서 느끼는건 아.. 이런게 있구나 !_! 

쓰레드그룹이라는게 있고 이렇게 사용하는구나..! 

나중에 정리해야할 일이 있으면 그때 더 자세히.. 


<데몬스레드(daemon thread)와 일반 스레드(non-daemon thread)>


자바에서 스레드는 두가지 종류로 구분된다.


첫째는 데몬 스레드(daemon thread)인데 JVM이 스스로 필요에 의해 사용하는 스레드이다. 

데몬쓰레드는 다른 일반 쓰레드의 작업을 돕는 보조적인 역학을 하는 쓰레드라서 

일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료된다. 

-->데몬 쓰레드는 일반 쓰레드의 보조역할을 수행하기때문에  일반스레드가 종료되고나면 

    데몬쓰레드의 존재의 의미가 없기 때문이다. 

(JVM은 응용프로그램에서 생성한 일반 스레드가 하나라도 살아 있는 한 실행을 계속 한다.)

이 점을 제외하고는 일반쓰레드와는 다르지 않다. 


ex))가비지컬렉터, 워드프로세서 자동저장, 화면 자동갱신 등이있다.. 

가비지 걸렉터가 대표적인 데몬스레드인데 응용프로그램에서 작성한 스레드를 데몬스레드로 표시해서 

JVM이 데몬스레드로 인식하게 할 수도있다.


데몬 쓰레드는 무한루프와 조건문을 이용해서 실행 후 대기하고 있다가 특정 조건이 만족되면 

작업을 수행하고 다시 대기하도록 작성한다.

--

데몬쓰레드는 일반스레드의 작성방법과 실행방법이 같다.

 다만 

쓰레드를 생성한 다음 실행하기 전에  setDaemon(true)를 호출하기만 하면 된다. 

(데몬스레드가 생성한 쓰레드는 자동적으로 데몬쓰레드가 된다! )

 


일반쓰레드 (non-daemon thread)는 응용프로그램에서 생성한 스레드이다. 

main( )메소드도 대표적인 일반쓰레드다. 


:
Posted by Gongdile

쓰레든느 우선순위(priority)라는 속성(멤버변수)를 가지고 있다. 

이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다. 


쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다. 


예를들어서 내가 카카오톡을 하는데 파인을 다운로드 처리하는 쓰레드보다 채팅 내용 전송하는 쓰레드 우선순위가 더 높아야

채팅하는게 불편함이 없을거다.

카카오톡 하는데 사진다운 받는동안은 채팅을 못한다던가.. 기다려야한다던가 이러면 엄청 불편할것이다. 


이렇게 시각적인 부분이나 사용자에게 빠르게 반응해야하는 작업을 하는 쓰레드의 우선순위는 다른 작업을 수행하는 쓰레드에 비해 높아야 한다.



<쓰레드의 우선순위 지정하기>


쓰레드의 우선순위와 관련된 메서드와 상수는 다음과 같다. 


void setPriority (int newPriority)  쓰레드의 우선순위를 지정한 값으로 변경한다.
int getPriority()                         쓰레드의 우선순위를 반환한다.
 
public static final int MAX_PRIORITY    = 10 //최대 우선순위 
public static final int MIN_PRIORITY     =  1 //최소 우선순위 
public static final int NORM_PRIORITY  =  5 //보통 우선순위 


쓰레드가  가질 수 있는 우선순위 범위는 1~10이고 숫자가 높을수록 우선순위가 높다. 

알아둬야할건 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속받는다는 것이다. 


main메서드를 수행하는 쓰레드를 우선순위가 5이므로 main메서드 내에서 생성하는 쓰레드의 우선순위는 자동적으로 5가 된다.


-->우선순위는 쓰레드를 실행하기 전에만 변경할수 있다! 

그치만 

(싱글 코어 가정)

두쓰레드의 우선순위가 같은경우시 작업하는것과 

t1이 t2보다 우선순위가 높은경우 에 작업하는것을 비교한다면 


우선순위가 같은 겨웅네는 각쓰레드에 거의 같은 양의 실행시간이 주어지지만, 

우선순위가 다르다면 우선순위가 높은 t1에게 상대적으로 t2보다 많은 양의 실행시간이 주어지고

-->결과적으로 작업 A(t1담당)가 작업 B(t2담당)보다  더 빨리 완료될수 있다. 


그러나 멀티코어에서는 쓰레드의 우선순위에 따른 차이가 거의 없었다. 

-->쓰레드에 높은 우선순위를 주면 더 많은 실행시간과 실행기회를 갖게될거라고 기대할수는 없다는거..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 


그래서 굳이 우선순위에 차등을 두어 쓰레드를 실행하려면, 특정 OS의 스케쥴링 정책과 JVM의 구현을 직접확인해 봐야하는데 


차라리 쓰레드에 우선순위를 부여하는 대신 작업에 우선순위를 두어서 Priority Queue에 저장해놓고, 우선순위가 높은 작업이 먼저 처리되도록

하는게 나을수도 있다.! 



:
Posted by Gongdile

저번에 멀티쓰레드와 멀티프로세스에 관해서 설명한적이 있는데 

이번에는 싱글쓰레드와 멀티쓰레드에 관해 다뤄보려고한다.


그전에 컨텍스 스위칭에대해 알고넘어가사 


컨텍스트 스위칭(context switching)이란 프로세스 또는 쓰레드 간의 작업 전환을 말한다. 


<가정을 해보자> 

두개의 작업을 

-하나의 쓰레드(t1)로 처리하는 경우 

-두 개의 쓰레드로 처리하는경우(t1,t2)


t1으로 두 작업을 처리하는 경우는 한 작업을 마친후에 다른 작업을 시작한다.

t1,t2으로 작업하는 경우 짧은시간동안 2개의 쓰레드가 번갈아가며 작업을 수행해서 동시에 두작업이 처리되는 것과 같이 느끼게한다.


싱글코어에서 싱글쓰레드 프로세스와 멀티쓰레드 프로세스를 비교하면 


두 경우다 작업을 수행한 시간은 거의 같다. 

오히려 두 개의 쓰레드로 작업한 시간이 싱글쓰레드로 작업한 시간보다 더 걸리는데 

그 이유는 

쓰레드간 작업전환(context switching)에 시간이 걸리기 때문이다. 

작업전환을 할대는 현재 진행 중인 작업의 상태등을 저장하고 읽어 오는 시간이 소요된다. 

(쓰레드 스위칭에 비해 프로세스 스위칭이 더 많은 정보 저장해야하므로 더 많은 시간이 소요됨!)


그래서 싱글코어에서 단순 cpu만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍 하는게 더 효율적이다.


두 개의 쓰레드로 작업하는데 더 많은 시간이 걸린 이유는 두가지다.

(1)두 쓰레드가 번갈아가며 작업을 처리하기에 쓰레드간 작업전환시간이 소요됨

(2)한 쓰레드가 화면에 출력하고 있는 동안 다른 쓰레드는 출력이 끝나기 기다려야하는데 이때 발생하는 대기시간 때문이다.



여러 쓰레드가 여러 작업을 동시에 진행하는 것을 병행(concurrent)라고 하고, 

하나의 작업을 여러 쓰레드가 나눠서 처리하는 것을 병렬(parallel)이라고 한다. 




1.싱글코어로 두 개의 쓰레드를 실행하는 경우와 

2.멀티코어로 두개의 쓰레드를 실행하는 경우에도 차이가 발생한다.


1의 경우는 멀티쓰레드라도 하나의 코어가 번갈아가며 작업을 수행하는 거라 두 작업이 절대 겹치지 않는다.

2의 경우는 멀티쓰레드로 두 작업을 수행하면, 동시에 두 쓰레드가 수행될 수 있으므로 

               두 작업, A와B가 겹치는 부분이 발생한다. 

--> 그래서 화면(console)이라는 자원을 놓고 두쓰레드가 경쟁하게된다. 

 

하지만 이런 결과는 실행할때마다 다른 결과를 얻을 수 있다. 

왜냐면 내가 실행하고있는 예제프로그램(프로세스)이 OS의 프로세스 스케줄러의 영향을 받기 때문이다. 


JVM이 쓰레드 스케줄러에 의해 어떤 쓰레드가 얼마동안 실행될건지 결정하는거와 같이 

프로세스도 프로세스 스케줄러에 의해서 실행순서와 실행시간이 결정되기 때문에 


매 순간 상황에 따라 프로세스 할당되는 실행시간이 일정치않고, 쓰레드에게 할당되는 시간 도한 일정하지 않다. 

--> 그래서 쓰레드가 이런 불확실성을 가지고 있다는 것을 염두에 둬야한다.


자바가 OS에 독립적이라곤 하지만 실제로는 OS종속적인 부분이 몇가지 있는데 쓰레드도 그 중의 하나이다.

(JVM종류에 따라 쓰레드 스케줄러의 구현 방법도 다를수 있다.)


..그림 나중에 첨부해야지!! 



두 쓰레드가 서로 다른 자원 사용하는 작업의 경우는 싱글쓰레드 프로세스보다 멅이쓰레드 프로세스가 더 효율적이다. 


ex)) 사용자로부터 데이터 입력받는 작업, 네트워크 파일 주고받는 작업, 프린터로 파일 출력하는 작업 

-->외부기기와의 입출력을 필요로 하는경우 


(A)사용자로부터 입력받는 작업

(B)화면에 출력하는 작업 


이 두가지를 하나의 쓰레드로 처리하면 사용자가 입력을 마칠 때까지 아무 일도 하지 못하고 기다려야한다. 

그러나 두 개의 쓰레드로 처리하면 사용자 입력 기다리는 동안 다른 쓰레드가 작업을 처리할 수 잇기 때문에 보다 효율적인 cpu사용이 가능하다.



:
Posted by Gongdile
2018. 5. 16. 14:12

글쓰면서 느낀거 개인/생각 정리2018. 5. 16. 14:12

공부목적으로 블로그를 작성한거라 

공부할일이 있거나 시간을 내서 정리하는 편인데 

책이나 피피티등 자료에서 충분히 나오는 부분을 굳이 세세하게 설명할 필요가 없다고 느꼈다.

물론 내가 모르겠어서 세세하게 풀어야한다면 의미가 있겟지만


블로그에 정리하는거니까 더  자세히 자세히 ! 막 이럴 필요는 없을거같다 

그러면 흥미도 좀 사라질거같아서 

순서가 뒤죽박죽이거나 빠지는 부분이 있더라도 내가 시간을 내서 생각하고 정리한거에 의미를두고 

시간 날때마다 글쓴거 보면서 추가하고 빼는게 더 효율적인거같다.


뭔가 완벽하게 빼먹지말고 잘적어봐야겠어 라는 욕심이 요새 올라왓다 

그게 나쁜건 아니지만 블로그외에도 우선 순위라는게 있으니까 


너무 힘빼지말자 !


전체적으로 훅쓰고 나중에 정리해도 괜찮은거같다

보고 또보면 되지뭐 어디 제출해야해서 모든걸 다써야하는것도 아니고 

 글이 어딘가로 슉! 날라가는것도 아니고 


꾸준함이 중요하니까 잘 기록해서 지식으로 남기를!  

너무 무리하지말기!_! 



'개인 > 생각 정리' 카테고리의 다른 글

몰입과 정리  (1) 2023.02.04
꾸준히  (0) 2021.07.22
되돌아보기  (0) 2020.03.04
오늘의 일지  (0) 2018.01.22
C언어 공부 //JAVA 2의보수  (0) 2017.12.04
:
Posted by Gongdile