JVM은 교재에서 배운 프로세스 구조와는 조금 다른 구조를 가진다. 일반적인 프로세스는 stack, heap, data, text 영역으로 구분되는 반면, JVM의 프로세스는 method area
, heap area
, stack area
를 갖고 cpu의 pc 역할을 수행하는 pc register
와 자바 외 C, C++ 등의 코드를 위한 별도의 native method stack area
를 가진다.
method area
는 프로세스가 갖는 data, text 영역을 포함한다고 할 때 다음 코드에서 각각의 변수와 인스턴스가 할당되는 영역은 어디일까? → 스택
class Main {
static class SimpleClass {
private String name;
private int age;
public SimpleClass(String name, int age) {
this.name = name;
this.age = age;
}
}
public static void main(String[] args) {
int x;
int y = 15;
SimpleClass simpleClass = new SimpleClass("koo", 21);
return 0;
}
}
→ static으로 선언된 것들은 static 영역에, static 에 있는 클래스를 사용하여 만든 인스턴스는 힙영역에, STring같은 클래스단위의 변수(name = koo)는 같은 힙 영역에 21같은 int(21) 는 인스턴스영역에 저장된다.
main 함수에서 실행된 x,y는 지역변수로써 stack에 저장
CPU 사용량이 높은 CPU bound 프로세스 $P_A$와 I/O 사용량이 높은 I/O bound 프로세스 $P_B$가 있다.
→ 준비 상태에서 CPU를 사용하는 CPU 바운드 프로세스와 다르게 I/O 바운드 프로세스같은 경우 준비상태에서 수 밀리초로 수행된 뒤 입츌력을 요하는 이벤트를 대기하는 대기큐로 들어간다.
→ 지속적인 이벤트를 받지 않고, CPU를 계속 할당받는 CPU bound 프로세스에서의 효율이 더 좋다.
⇒ I/O 바운드 프로세스의 경우 계속 조금씩 조금씩 해도 IO이벤트를 대기하기에 더 효율이 좋아진다. CPU 바운드 프로세스는 쓸데없는 cotext switching 자체가 많아져서 오히려 효율이 떨어지는 것을 볼 수 있다.
→ IO 바운드의 경우 계속 이벤트가 발생 횟수(?)가 많아져서 효율이 떨어지고, CPU 바운드의 경우에는 계속 이벤트들의 발생횟수가 떨어지기에 보다 더 효율적일 것 같다. ⇒ 2번의 연장선상…….어느정도 까지는 효율적일 수 있으나, 어느 순간 부터는 context switching 이 늘어나고, 이에 효율성이 떨어진다.
❇️ fork는 자식 프로세스를 생성하는 시스템 콜이다. 만약의 하나의 메인 프로세스에서 fork 시스템 콜을 10번 호출했다면 생성된 프로세스의 개수는 몇 개가 될까?
→ 11개
⇒ 1024개 : 부모만 계속 fork를 하는 것이 아니라, 부모에 속한 자식 프로세스도 계속 fork()를 하기에 2 지수식 만큼 늘어나게 된다.
int main() {
for(int i=0;i<10;i++)
fork();
return 0;
}