본문 바로가기

카테고리 없음

스레드 (운영체제 and 자바)

컴퓨터 상에 프로그램이 이렇게 돌아간다고 가정을 해보자

 

문서를 작성할 프로세스 및 저장하는 상황

 

문서 독스를 저장을 한다면 이런 과정을 거침

저런 프로세스를 가져 갈 때 키보드 입력을 받는 다면 인터럽트가 발생을 한다.

컴퓨터의 입력 및 모든 실행하는 프로그램은 RAM으로 올라가게 된다.

 

만약 인터럽트가 발생을 하게 된다면

 

중간에 하던 일이 있으면 인터럽트를 처리하고 다시 실행하고 반복을 하게 됨

 

 

 

정리

cpu가 처리하고 있었던 일의 진행사항을 저장(1)

인터럽트 코드의 실행을 위해서 cpu에 할당된 작업 인터럽트 교환(2)

cpu에서 교환된 인터럽트 모드 처리(3)

cpu 에 이전 작업을 할당(4)

중단 되었던 곳부터 다시 진행(5)

2번의 과정을 문맥교환 =context switch라고 한다.

 

 

 

context switch

 

컨텍스트 스위칭 발생

스레드는 cpu의 기본적인 단위이다.

어떤 프로세스 안에 여러개의 스레드가 있다.

스레드 아이디 프로그램 카운터 레지스터 셋도 다달라짐

 

싱글 스레드와 멀티 스레드

 

registers, stack, pc는 별도의 스레드가 가지는 set이라 생각 해보자

한 프로세스에서 3개의 스레드가 발생하고 이것을 멀티스레드라 부른다.

 

 

 

멀티스레드 클라이언트 서버 예시

 

클라이언트가 요청을 하고 서버는 응답으로 새로운 프로세스를 생성한다.

서버는 추가적인 클라이언트 리퀘스트를 받는다면 새로운 스레드를 계속 생성이 가능하다.

 

멀티 쓰레딩의 장점

 

연속적인 실행이 가능하며 프로세스가 중단이 되어서 막혀있다면 유저 인터페이스에게는 상당히 중요하다

리소스 공유가 가능하다. 스레드는 코드영역 데이터 영역을 공유한다.

경제성이 있다.    오버헤드가 낮다.      확장성도 굉장히 좋다.

 

 

자바 스레드 코드 예제

 

 

 

 

Runnable 인터페이스를 사용을 해서 Runnable 인터페이스를 자바코드에 이식을 시켜서 호출을 시킨다.

 

 

 

 

 

 

위의 메인 스레드가 먼저 실행이된다.

출력 순서 "Hello, Lambda Runnable! → try에서 jon을 해서 메인 쓰레드는 기다림 → "Hello, my joined child!

 

 

 

스레드 조인을 시켰을 때에 출력결과

 

 

 

스레드 종료시키는 코드 예제

스레드 종료 시키는 법

Thread.sleep 때문에 0.5 초 Hello, Lambda Runnable! 이 5번 호출이 되고

반드시 5번은 아님

인터럽트메소드로 인해서 I'm interrupted 호출

그 후 문장이 실행

 

 

 

 

 

멀티 코어는 동시성을 향상시킴

싱글 코어 : 코어가 하나라면 시간에 따라서 인터리브됨 (시분할처리가 예)

멀티 코어 : 병렬처리가 가능해짐

 

싱글 코어에서의 시분할과 아래는 코어가 두개 일 경우 시분할 처리

 

 

싱글 코어가 첫번째 예제

코어 여러개면 타임 셰어링 가능

 

 

 

 

*중요*

확인된 태스크, 확인된 영역은 분리된 태스크로 분리

태스크는 같은 일과 같은 값으로 동작을 해야한다

데이터는 각각의 코어에서 분리된 상태로 돌아야한다.

태스크는 잘 동결이 되어야한다.

 

멀티 코어 프로그래밍 특징

싱글 스레드보다는 테스트 하고 디버깅 하기 굉장히 어렵다.

하나의 스레드를 브레이크 포인트를 잡았는데 다른 스레드가 뭘 하는지 모름

 

 

병렬 처리의 방법

데이터를 각각의 코어에 쪼개 주거나 데이터는 하나로 두고 태스크를 쪼개는 방법