JAVA
[JAVA] 프로세스와 스레드, 시스템 발전 과정(멀티 프로그래밍, 멀티태스킹)
정공자씨
2024. 4. 29. 17:24
프로그램과 프로세스
프로그램
- 어떤 작업을 위해 실행할 수 있는 파일의 형태로 하드디스크에 저장된 것
- 아직 파일이 실행된 상태는 아니기 때문에 정적인 상태
- 프로그램은 코드 덩어리 자체
프로세스
- 프로그램이 실행된다는 것은
- 하드 디스크에 존재하던 실행 파일이 시스템 메모리에 올라간다(로드)는 것이고
- 프로그램이 운영체제(OS)에 의해 CPU를 할당 받고
- CPU에 의해 프로그램이 실행되고 있는 상태를 말함
- 코드 덩어리인 프로그램을 실행 시켜서
- 정적인 프로그램이 동적으로 변하여 프로그램이 실행되는 상태를 말함
- 프로세스는 자원(메모리, CPU 등)과 쓰레드로 구성됨
- 프로그램은 정적
- 프로세스는 동적, 프로그램이 실행된 것이므로 동적인 상태
멀티 프로세스
- 1개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것
- 여러 개의 프로세스를 메모리에 생성할 수 있음
시스템의 발전 과정 : 스레드가 탄생하는 과정
단일 프로세스
- 과거에는 1개의 컴퓨터에서 1개의 프로그램만 실행이 가능했음
- 다른 프로그램을 실행해야 하면, 현재 프로그램을 종료하고 실행해야 했음
- 만일 프로세스1과 프로세스2를 순차적으로 실행하는 경우에
- CPU가 프로세스1 작업을 하다가 I/O(입력, 출력) 상황이 발생하면
- 해당 입출력이 끝날때까지 CPU는 프로세스1의 작업을 멈추고 대기하여야 하는 상황이 발생함
[ 실행 상태의 프로세스 상태가 변하는 경우 ]
1. 프로세스를 실행하다가 I/O(입력, 출력) 명령이 발생하는 경우, 프로세스는 대기 상태로 전환됨. 즉 프로세스는 I/O 요청이 완료되기를 기다려야 함
2. I/O(입력, 출력)이 완료되면, 프로세스는 준비 상태로 전환
멀티 프로그래밍
- 이러한 문제를 해결하고자
- 여러 개의 프로그램을 메모리에 올려놓고, 1개의 CPU가 여러 개의 프로세스를 돌아가면서 처리함
- 1개의 CPU가 2가지 이상의 프로그램을 실행시키기 위한 방법으로 병행 처리를 생각함
- 즉, CPU가 여러 프로세스를 순차적으로 처리함
- 만일 프로세스1과 프로세스2를 순차적으로 실행하는 경우에
- 만일 CPU가 프로세스1 작업을 하다가 I/O(입력, 출력) 상황이 발생하는 경우,
- 해당 입출력이 끝날때까지 CPU는 프로세스1의 작업을 멈추고 대기하는 것이 아니라 프로세스2 작업을 시작하고
- 다시 I/O(입력, 출력) 상황이 발생하면, 프로세스1 작업을 시작함
- 즉, 어떤 프로세스가 대기를 해야 하면, 운영체제(OS)는 CPU를 회수하여 다른 프로세스에 할당함
[ 병행 처리 ]
프로세스A와 프로세스B를 처리해야 할 때
[ 병렬 ]
A와 B의 일을 동시에 실행하는 성질
[ 병행 ]
- A를 했다가 B를 했다가 순차적으로 이것저것 처리함
- 1개의 CPU가 여러 프로세스를 번갈아가며서 조금씩 처리하여, 컴퓨터가 여러 작업을 동시에 실행하는 것처럼 보이게 만듦
멀티 태스킹
- 멀티 프로그래밍에도 한계점이 있었는데
- 1개의 프로세스가 CPU를 사용하는 시간이 길어지면, 다른 프로세스는 계속 대기를 해야한다는 문제점이 발생하고
- 어느 한 프로세스가 모두 실행되어야 다음 프로세스가 실행될 수 있는 한계가 있음
- 이를 해결하고자 멀티 태스킹이라는 개념이 나옴
- 멀티태스킹은
- 프로세스 1개가 CPU를 연속적으로 선점하는 것을 막고, 모든 프로세스가 공평하게 작업을 수행하기 위해
- 1개의 프로세스가 CPU를 사용할 때 아주 짧은 시간(quantum)만 실행되도록 하여
- 각 프로세스가 아주 작은 단위로 번갈아가면서 처리하면서, 작업 응답 시간을 최소화 함
- 이때에 잘게 나누어진 프로세스끼리 작업이 교환되는 것이 문맥 교환(context-switching)
- 마치 여러 프로세스가 동시에 실행되는 것처럼 느껴지지만, 하나의 프로세스가 동시에 여러 작업을 수행하지 못하는 한계가 있음
프로세스의 한계
- 프로세스는 각기 다른 독립적인 메모리 공간을 할당 받아서 동작하기 때문에 프로세스끼리의 데이더의 공유가 까다로움
스레드(Thread)
등장
- 하나의 프로세스 안에서 여러 작업이 동시에 진행되기도 하는데,
- 이처럼 1개의 프로세스 내에서 여러 개의 작업을 처리하기 위해서 스레드(thread)가 등장
- 채팅 앱을 실행(프로세스)하여
- 사용자가 메시지를 입력하는 중(스레드1)에
- 상대방의 새로운 메시지를 계속 받을 수 있고(스레드2)
- 이전에 메시지로 보낸 동영상을 다운 받을 수도 있음(스레드3)
[ 멀티 스레드(multi-thread) ]
하나의 프로세스 내에서 2개 이상의 쓰레드가 동시에 작업을 수행하는 것
개념
- 하나의 프로세스 내에서 실행되는 세부 실행 단위
- 실행 흐름의 단위를 두어, 작업을 효율적으로 하고자 하는 것
특징
- 1개의 프로세스는 반드시 1개 이상의 스레드를 가짐
- 일반적으로 1개의 프로그램은 1개 이상의 프로세스를 가지고
- 프로세스를 생성하면 기본적으로 1개의 메인 스레드(main thread)가 생성됨
- 스레드는 CPU에서 실행되는 단위
- 과거에는 프로세스가 CPU에서 실행되는 단위었다면
- 이제는 스레드가 CPU에서 실행되는 단위
- 같은 프로세스 내의 스레드끼리는 문맥 교환(context switching)이 가벼움
- 스레드들은 자신이 속한 프로세스의 메모리 영역을 공유하여
- 데이터의 공유가 쉬움
프로세스 | 스레드 |
각 프로세스마다 메인 메모리 공간을 부여받음 | 스레드 간에 메인 메모리 공간 공유 |
메인 스레드(Main Thread)
- 자바 프로그램에는 최소 1개의 스레드가 있는데, 이것이 메인 스레드
- JVM이 자동으로 생성하는 스레드
- 자바의 프로그램의 시작점은 main() 메서드이고
- 이 main() 메서드를 수행되도록 하는 것이 스레드인데
- 이 쓰레드가 메인 스레드
- 모든 자바 프로그램은 JVM(자바 머신 러닝) 위에서 동작하는데,
- 이 JVM은 프로그램의 시작점인 main() 메서드가 있는 클래스를 찾고 메인 스레드를 생성한 후에
- 메인 스레드에서 main() 메서드를 호출하여, 작업이 수행되도록 함
- 따라서, 메인 스레드는 JVM에 의해 자동으로 생성됨
JVM이 자동으로 생성하는 메인스레드(Main Thread) 이외에 추가로 사용자 정의 스레드를 생성하여 구현해보자
출처
[Java Study] - 멀티 쓰레드(쓰레드 생성과 실행) :: 코니의 개발 노트 (tistory.com)
https://velog.io/@yukicow/%EC%8A%A4%EB%A0%88%EB%93%9C%EC%99%80-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4