ref: http://www.newlecture.com
▶ 프로세스 : 실행중인 프로그램, 자원(resources)과 쓰레드로 구성
▶ 쓰레드 : 프로세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
▶ 싱글 쓰레드 프로세스
= 자원 + 쓰레드
▶ 멀티 쓰레드 프로세스
= 자원 + 쓰레드 + 쓰레드 + ....+
ex) 음악을 듣기위해 mp3플레이어를 틀고, 웹브라우저를 사용, 워드프로세스로 작성을 한다고 가정
여러개의 프로세스가 동시에 동작하는 것일까?
OS 가 사용자 요청을 받으면 프로그램을 찾아 실행된다.
OS 실행 프로그램: 보조기억장치, 하드디스크, usb 등에 있다. 메모리는 휘발성이기 때문에 보조기억장치에 저장된다.
보조기억장치에 있는 것을 메모리에 로드하게 된다. 메모리에 로드가 되면 프로그램에서 프로세스라 부른다.
멀티 태스킹
멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 말하는데, 운영체제는 멀티 태스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다.
자바에서 main 스레드를 제공하는데 그 안에 main() 메서드가 호출된다. 새로운 스레드를 생성하고 시작하면 또 다른 스레드가 만들어지고 main스레드와 다른 스레드가 CPU를 점유하려고 하는데 컴퓨터가 성능이 좋으면 좋을 수록 동시에 처리하는 모습으로 나타난다.
멀티태스킹이 가능한 이유
컴퓨터에는 cpu가 기본적으로 1개가 있다. 그 cpu 가 동시에 실행시키는 것처럼 빠르게 순회하면서 실행시킨다. OS가 시분할(Time Share)을 통한 동시 실행을 지원하기 때문이다.
하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 든다.
- 2 프로세스 1쓰레드 vs 1프로세스 2 쓰레드
멀티 쓰레드의 장단점
대부분의 프로그램이 멀티 쓰레드로 작성되어 있다.
EX) 싱글쓰레드인 경우 파일을 전송하면 마칠 때까지 다른 일을 할 수 없다. 멀티 스레드인 경우 작업을 동시 가능
- 교착상태: 이미 점유중인 자원에 대해 다른 프로세스가 무한정 기다리는 현상
교착상태 발생 조건 4가지
1. 상호배제(Mutual exclusion): 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.
2. 점유대기(Hold and wait):프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
3. 비선점(NO preemption):프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
4. 순환대기(Circular wait):각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.
- 기아현상: CPU의 스케줄링과 관련 CPU의 스케쥴 계획에 따라 어떤 작업이 무한대기에 빠지는 경우
특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태
차이점: 교착상태는 여러 프로세스가 동일 자원 점유를 요청 할 때 발생 한다. 기아상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 우선순위가 낮아서 영원히 자원할당이 안되는 경우를 주로 의미
백그라운드(비동기형) 작업의 필요성과 자식 프로세스
웹브라우저에서는 검색, 다운로드 등의 기능이 있는데 검색이 오래걸린다고 가정할 때 검색을 하다가 묶여버리는 일이 생길 수 있다. 즉 메인함수에서 검색을 진행하다가 묶여버리는 현상이 일어난다.
또는 다운로드를 한다고 하였을 때 다운로드를 처리가 오래걸린다면 다른 로직을 처리하지 못하고 기다리고 있을 수 있다.
메인 함수가 특정한 기능을 호출하는 순간 묶어버리게 되고 다른 것이 진행되지 않는다. 순서가 있어서 끝나야만 다음것이 처리 될 수 있는 형태의 흐름을 동기식 실행이라 한다. (순서를 기반)
실제 다운로드를 할 때 다운이 완전히 끝나지 않더라도 다른 것이 진행되는 것을 볼 수 있다. 개별적으로 진행이 되는 것인데 이것을 비동기식 실행이라고 한다.
스레드가 나오기전에는 동기식으로 하지 않기 위해서 별도의 프로그램을 따로 만들었다. 시간이 오래걸릴 것 같은 것은 프로그램으로 만들었다. 브라우저가 실행이 되다가 사용자가 요청하면 자기의 흐름을 별도로 할당해서 구현하는 것이 아니라 다른 프로그램을 프로세스에 올린다. 그때 사용되는 것이 fork() 함수이다. 이 함수를 이용해서 다른 프로그램을 로드할 수 있다. 그러면 브라우저에 의해 실행되는 프로세스가 만들어진다.
프로세스가 올라가는 순간 OS가 시간을 분할한다. 시간이 오래걸릴 것 것 같은 것들을 별도의 프로세스를 만들어
OS 가 비동기처리를 하였다.
사용자에 의해서 직접 실행된 웹브라우저는 메인프로세스이며 메인프로세스에 의해서 따로 실행된 것이 자식프로세스로 비동기를 구현하였다.
모든 자바 애플리케이션은 메인 스레드(main thread) 가 main() 메서드를 실행하면서 시작된다.
메인 스레드는 main() 메서드의 첫 코드부터 아래로 순차적으로 실행하고, main()메서드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다.
메인스레드는 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. 즉 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.
싱글스레드 애플리케이션에서는 메인 스레드가 종료하면 프로세스도 종료된다. 하지만 멀티 스레드 애플리케이션에서는 실행중인 스레드가 하나라도 있다면, 프로세스는 종료되지 않는다. 메인 스레드가 작업 스레드보다 먼저 종료되더라도 작업 스레드가 계속 실행중이라면 프로세스는 종료되지 않는다. '
쓰레드의 구현과 실행
1. Thread 를 상속, 하위클래스에서 생성
2. Thread 클래스로부터 직접생성 - Runnable 인터페이스
public interface Runnable {
public abstract void run();
}
1. Thread 를 상속, 하위클래스에서 생성
작업 스레드가 실행할 작업을 Runnable 로 만들지 않고, Thread 의 하위클래스로 작업 스레드를 정의하면서 작업내용을 포함시킬 수 있다.
2. Thread 클래스로부터 직접생성 - Runnable 인터페이스
Runnable은 작업스레드가 실행할 수 있는 코드를 가지고 있는 객체라고 해서 붙여진 이름이다. Runnable은 인터페이스 타입이기 때문에 구현 객체를 만들어 대입해야 한다.
Runnable에는 run() 메서드가 정의되어 있다. 구현 클래스에서 run() 을 재정의해서 작업 스레드가 실행할 코드를 작성해야한다.
쓰레드 생성과 실행
1. Thread 를 상속, 하위클래스에서 생성
MyThred t1 = new MyThred(); //쓰레드의 생성
t1.start(); //쓰레드의 실행
2. 직접객체화 - Runnable 인터페이스
Runnable r = new MyThread2();
Thread t2 = new Thread(r); //Thread(Runnable r)
// Thread t2 = new Thread(new MyThread2());
t2.start();
start()
쓰레드를 생성한 후에 start() 를 호출해야 쓰레드가 작업을 시작한다.
* 즉시 실행되는 것이 아님
* 먼저 실행했다고 먼저 실행되는 것아님 (os스케줄러가 실행순서결정)
main() 메서드에서 호출
start() 메서드 호출 : 새로운 호출 스텍 생성
run()을 올리고 start() 메서드는 종료
각각의 스레드가 독립적인 작업을 수행
스레드의 이름
스레드는 자신의 이름을 가지고 있다. 직접 생성한 스레드는 자동적으로 "Thread-n"이라는 이름으로 설정된다. n은 스레드의 번호를 말한다. 다른 이름으로 설정하고 싶다면 Thread 클래스의 setName() 메서드로 변경할 수 있다.
thread.setName("스레드 이름");
반대로 스레드 이름을 알고 싶은 경우에는 getName() 메서드를 호출한다.
thread.getName();
setName()과 getName()은 Thread의 인스턴스 메서드이므로 스레드 객체의 참조가 필요하다. 만약 스레드 객체의 참조를 가지고 있지 않다면, Thread의 정적 메서드인 currentThread() 로 코드를 실행하는 현재 스레드의 참조를 얻을 수 있다.
Thread thread = Thread.currentThread();
'개념정리' 카테고리의 다른 글
[Chapter6] Controller , Log4j , RequestMapping (0) | 2021.11.21 |
---|---|
HTTP & HTTPS (0) | 2021.11.14 |
REST API 개념 (HTTP& HTTPS) (0) | 2021.11.13 |
객체지향의 사실과 오해 (0) | 2021.11.09 |
1주차 개념 스터디 (0) | 2021.07.31 |