public static void main(String[] args) {
log.info("My First Programs");
}
이 로직이 실행되야 -> 프로세스
하나의 애플리케이션 실행될때 -> 데이터들이 메모리 로드 -> 프로세스 형성
프로스세는 실행 중인 프로그램, 실행중, 메모리에 적재.
프로그램이 메모리에 적재되는 순간 프로세스
프로세스를 위한 독자적 주소 공간 생김.
프로세스마다 독립적 할당. 메모리 영역에 할당되는 주소들을 논리주소.
애플리케이션에서 작성한 코드들이 프로세스의 메모리 영역 할당, 논리주소 부여
애플리케이션이 실행되어 메모리에 적재, 기억장치 메모리의 주소
논리주소와 물리주소를 사용, 주소 값이 매칭되지 않는 문제 발생.
주소 바인딩은 명령어와 데이터를 메모리에 적재. 메모리 주소를 결정하는 것을 의미
data라고 하는 메모리 번지를 언제 결정하는냐에 따라 세가지 방식으로 나뉨
1) 컴파일 시간 바인딩

논리주소 범위에 함수 내의 데이터와 변수 저장. 그리고 물리주소 또한 같은 주소를 부여 받음
컴파일 시간 바인딩은 프로그램내부에서 사용하는 논리주소와 물리주소 동일
2) 적재 시간 바인딩

로딩할때 물리주소를 결정. 프로그램 내부에서 사용하는 주소랑 물리주소 다름
적재시간 바인딩에서 프로그램 내부에서 상대 주소라는 개념 도입해서 사용
단점 : 프로그램 안에 코드들과 데이터, 명령어들이 많은데, 로딩할 때마다 주소를 결정하게 되면 메모리 로딩할때 시간이 오래 걸린다는 단점
3) 실행 시간 바인딩

실행할때 물리주소를 변경
실행시간 바인딩의 특징은 바로 더하기 연산. 더하기 연산을 하는 위치를 보면 하드웨어.
즉 더하기 연산을 수행하기 위해 하드웨어가 별도 필요 = MMU
4) 동적 적재
메모리 공간을 보다 효율적 사용 -> 동적 적재
각 루팅은 실제 호출되기 전까지 메모리에 올라오지 않고 재배치한 상태로 디스크에서 대기
자바에서 객체를 만들때 사용되는 방식 = 동적 적재.
실행시 모든 클래스가 적재되지 않아도 필요한 시점에 메모리로 로딩해서 사용
1. CPU가 해당 루틴 수행 요청
2. 메모리에 해당 루틴 적재 되었는지 확인
3. 적재 되지 않았다면 재배치 연결 적재기 호출 -> 필요 루틴 적재
4. CPU 요청한 루틴을 수행
즉 루틴이 필요한 경우에만 적재
5) 스와핑
프로세스 실행되기 위해서는 메모리에 있어야 하지만 프로세스는 실행중에 임시로 예비 저장장치로 보내졌다가 실행 하기 위해 다시 메모리로 돌아옴 (= backup store)

모든 프로세스들은 준비 리스트(준비 완료 큐), CPU 스케줄러가 다음 실행할 프로세스를 선정할때 디스페처를 호출, 디스패처는 준비 리스트에 있는 다음 프로세스가 메모리 올라왔는지 확인,
안올라왔다면 디스크에서 호출, 실행시킬 프로세스를 위한 공간이 메모리에 없다면 ? 공간 확보 위해 현재 메모리에 올라와 잇는 프로세스를 내보내고 실행시킬 프로세스를 메모리에 적재
프로세스의 컨테스트 스위칭 비용은 크기 때문에 운영체제에서 스와핑 사용 X. 대신 스와핑을 변형한 방식을 사용
스와핑 = VMM(Virtual Memory Management)
VMM은 가상 메모리 관리, 가상 메모리 전체가 8GB ~ 10GB 짜리 프로그램을 돌리게 할 수 있는 기법
스와핑은 swap-in, swap-out 의 단위가 프로세스(process)인 반면, VMM 은 페이징(paging)이라는 단위로 스와핑