어디까지 파고들수 잇을까..
프로세스는 : 각각 은행 지점
스레드: 하나의 은행지점에 여러개의 창구
프로세스는 서로 완벽히 독립적인 공간 가짐.
- 공유 영역:
- 코드 영역: 프로세스 내의 모든 스레드는 동일한 코드를 공유합니다.
- 데이터 영역: 전역 변수와 정적 변수는 프로세스 내의 모든 스레드에 의해 공유됩니다.
- 독립적 영역:
- 스택 영역: 각 스레드는 자신만의 스택을 가집니다. 이 스택에는 해당 스레드의 함수 호출과 관련된 정보(인자, 지역 변수, 반환 주소 등)가 저장됩니다.
프로세스 비용이너무크니 (아래 컨텍스트스위칭)
그래서 탄생한게 스레드. 적은 메모리 점유 정보교환 쉽고 그러지만
자원 선점 동기화 문제.
자기만의 스택과 데이터 영역을 가짐, 보호 받기까지함?
프로세스는 시작시 운영체제의 PCB (Process Control Block)
메모리 공간 할당 초기화 과정이필요 어후 만핟.,..
프로세스는 서로 독립되어있어서 공유메모리로 서로 주고받거나등
번거로운 작업을 거침. (은행에 비유)
하나가 불나도 다른점은 괜찮아! , 지점끼리 연락 직접가거나 번거로운 작업!
- 코드영역: 프로그램의 코드가 저장되는 부분입니다. 이 영역에는 실행할 프로그램의 기계어 코드가 저장됩니다.
- 데이터 영역: 프로그램의 전역 변수와 정적 변수(클래스 변수)가 저장되는 영역입니다. 프로그램 실행 동안 생성되고 수정될 수 있는 변수들이 위치합니다.
- 스택 영역: 함수 호출 시 전달되는 인자, 반환 주소 및 함수 내부의 지역 변수 등이 저장되는 영역입니다. 함수 호출 과정에서 생성되며, 함수가 끝나면 사라집니다.
public class Example {
public static int globalCounter = 0; // 정적 변수
public int instanceCounter; // 인스턴스 변수
public void incrementCounter() {
globalCounter++; // 정적 변수 증가
instanceCounter++; // 인스턴스 변수 증가
}
public static void main(String[] args) {
Example ex1 = new Example();
Example ex2 = new Example();
ex1.incrementCounter();
ex2.incrementCounter();
System.out.println("Global counter: " + globalCounter); // 출력: 2
System.out.println("Ex1 instance counter: " + ex1.instanceCounter); // 출력: 1
System.out.println("Ex2 instance counter: " + ex2.instanceCounter); // 출력: 1
}
}
멀티 프로세스 환경! cpu가 하나의 프로세스 실행하고 있다.
인터럽트 요청! 다음 우선순위 프로세스가 실행 될때?
기존의 프로세스 상태 또는 레지스터 값 (context) 저장
다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(context) 교체하는 작업
뭐 너무 자주 발생하면.. 성능의 영향이 간다.
간단히 말하면 컴퓨터가 여러 작업을 빠르게 번갈아 가면서
처리하는 방법 문서작성했다.. 인터넷 작업했다..
병렬처리 효율성 처리속도 향상
I/O 작업 많은 프로그램에서 자원 효율적 사용
뭐 .. 응답성향상 ,, 복잡한 작업 분할.. 당연한거?
동기화 문제 같이 달려드니 무결성 문제 디비쪽인가?
교착 상태 위험.
컨텍스트 스위칭으로 인한 오버헤드 .. 전반적인 성능저하
피자를 주문해보자
피자가 나왔다? 피자 레시피를 줫음 ? 왜 피자를 안주고 레시피를 줘!
레시피는 구현하고 있는 코드파일. 프로그램이라고함
프로그램은 실행시키전 코드가 구현되어있는 파일
실행시키기전 ( 레시피로 피자만들기 전까진) 아무것도아님
실행되어 사용할 수 있는 무언가 되야된다 이게 프로세스 (레시피를 보고 피자를 완성해야 피자가 되지!)
프로그램이 프로세스가 되면 뭐가 일어날까?
프로세스가 필요한 재료들이 메모리에 올라가야됨. (메모리 공간 확보)
해당 프로세스 정보를 담고있는 PCB 블록이 올라감
프로세스 상태 중에 뭐 준비 상태나 대기 상태에 큐를 구현하기 위해 필요한 포인터
현재 프로세스의 상태를 담는 프로세스 스테이트
고유 번호를 담는 PID
다음 명령어를 가리키는 프로그램 카운터 등등
회의실로비유
노트북을 공유 모니터에 연결 스피커 리모컨 을 사용해 작동
다음팀이 들어와서 사용할라면? 프로세스 관점에선 리모컨 스피커 모니터 다들고 와서 셋팅
하지만 스레드 관점에선 노트북만들고 서로 다른팀들이 오면 노트북만 모니터에 연결하고
스피커 리모컨등을 사용하면 됨
반면 스레드는 한 프로세스 내에서 구분지어진 실행 단위
실행 단위? 프로세스일수도 스레드일수도 있다 여기 이야기에선
만약에 프로세스가 다수의 스레드로 구분되어있지않다? 단일 프로세스로 하나로 실행
이때 실행 단위는 프로세스 그 자체
해당 프로세스의 하나밖에없는 쓰레드가 실행 단위가 되는거.
프로세스 내에서 분리해서 여러 스레드로 나뉘어서 실행단위가 나뉘어 지면
그게 멀티 스레드
인텔리제이를 사용하며 코드를 수정는 동시에
인텔리제이의 추천코드도 보여줘야하고
테스트도 돌리는 동시에 코드를 수정해야 될대도 잇고
이렇게 한 어플리케이션에 대한 작업의 단위가 나눠질때가 많다
이 때 각각 스레드가 그 작업들을 담당한다..
프로세스는 독립적이기 때문에 IPC를 통해서 통신을 해야합니다.
같은 작업을 두명이 두개의 다른 회의실에서 진행하다가 논의 할일이 생기면 밖으로 나와서 얘기하고 다시 회의실에들어감
그리고 자원소모적 메모리 차지 위에 언급 다함.
개별 독립적이기 때문에 동기화 작업 신경 덜 서도 됨.
혹시 잘못될까바 마우스도 안움직이고..
그러다가 창 자체가 저절로 꺼짐
멀티스레드를 이용했기 때문
긴밀하게 연결되어있기 때문에 한 탭에 문제가 생기면 전체 프로세스에 영향이 감
크롬은 멀티 프로세스를 이용하기 때문에 멀티 탭 간에 영향을 받지 않음
다 장단점이있는대 흐음 뭔가 이해가 전체적으로 애매한대
싱글코어 CPU가 실행 단위 처리 위해서
동시에 여러가지 진행하기 위해 빠른 텀으로 전환되어 실행된다 그 개념이 동시 성
여러 실행 단위를 번갈아 실행하면서 동시에 일어나는 것 처럼 보임
애니메이션 같다. 동시성은 짧은 순간에 CPU 시간을 분할해서 동시에 하는 것처럼 보이게..
멀티코어는 병렬처리
물리적으로 여러코어를 사용해서 다수의 실행단위를 한순간에 처리할수 있게함
한꺼번에 두 개의 코어에서 각각 실행 단위가 진행 됨
그것이 병렬 처리
다수의 프로세서로 여러가지 일을 각 코어에서 진행하는 것.