문제1.

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 영역을 포함한다고 할 때 다음 코드에서 각각의 변수와 인스턴스가 할당되는 영역은 어디일까? → 스택

Untitled

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에 저장

문제2.

CPU 사용량이 높은 CPU bound 프로세스 $P_A$와 I/O 사용량이 높은 I/O bound 프로세스 $P_B$가 있다.

  1. 둘의 동작 상의 차이를 설명하라

→ 준비 상태에서 CPU를 사용하는 CPU 바운드 프로세스와 다르게 I/O 바운드 프로세스같은 경우 준비상태에서 수 밀리초로 수행된 뒤 입츌력을 요하는 이벤트를 대기하는 대기큐로 들어간다.

  1. 자식 프로세스를 만들어 task를 나눈다고 한다면 어떤 프로세스에서의 효율이 더 좋을까?

→ 지속적인 이벤트를 받지 않고, CPU를 계속 할당받는 CPU bound 프로세스에서의 효율이 더 좋다.

⇒ I/O 바운드 프로세스의 경우 계속 조금씩 조금씩 해도 IO이벤트를 대기하기에 더 효율이 좋아진다. CPU 바운드 프로세스는 쓸데없는 cotext switching 자체가 많아져서 오히려 효율이 떨어지는 것을 볼 수 있다.

  1. 자식 프로세스를 많이 만들면 그만큼 효율이 높아질까? (프로세스가 아닌 쓰레드로 생각해도 좋다)

→ IO 바운드의 경우 계속 이벤트가 발생 횟수(?)가 많아져서 효율이 떨어지고, CPU 바운드의 경우에는 계속 이벤트들의 발생횟수가 떨어지기에 보다 더 효율적일 것 같다. ⇒ 2번의 연장선상…….어느정도 까지는 효율적일 수 있으나, 어느 순간 부터는 context switching 이 늘어나고, 이에 효율성이 떨어진다.

문제3.

❇️ fork는 자식 프로세스를 생성하는 시스템 콜이다. 만약의 하나의 메인 프로세스에서 fork 시스템 콜을 10번 호출했다면 생성된 프로세스의 개수는 몇 개가 될까?

→ 11개

⇒ 1024개 : 부모만 계속 fork를 하는 것이 아니라, 부모에 속한 자식 프로세스도 계속 fork()를 하기에 2 지수식 만큼 늘어나게 된다.

int main() {
	for(int i=0;i<10;i++)
		fork();
	return 0;
}