OS - 어플리케이션은 어떻게 실행될까?

박경현·2023년 8월 29일
0
post-thumbnail

운영체제에 대한 개념은 매번 블로그에 적으면서 복습을 계속 해주는게 잊어버리지 않고
스스로 한번 더 생각을 정리할 수 있어서 os 관련 공부도 매일 적어보려고 한다!!

어플리케이션은 어떻게 실행 될까?

이걸 이해하기 위해서는 어플리케이션이 무엇인지, cpu, 메모리를 먼저 정확하게 정의하고 넘어가야한다!

일반 사용가자 사용할 기능을 제공하는, 컴퓨터가 실행 할 수 있는 명령어들의 집합!
메모리: 실행된 어플리케이션이 상주하는 곳
cpu: 명령어를 실행하는 추세

예제로 보는 cpu와 메모리 사용

public static void main(String [] args) {
	int a = 7;
	int b = 3;
	int c = a + b;
}

일단 저렇게 코드가 작성되어있고 유저가 실행을 누른다면!

  1. cpu에서 메모리에 7을 저장하고 a라는 이름을 붙인다
  2. cpu에서 메모리에 3을 저장하고 b라는 이름을 붙인다
  3. a + b를 더해서 메모리에 저장하라는 명령어를 cpu가 던지고 c라는 이름으로 저장됨!

간단하게 보면 cpu의 명령을 보고 메모리에 저장이 되고 있다!

runtime -> 실행되고 있는 시간을 의미! (실행상태)
위의 코드에서는 코드가 끝날때까지가 runtime인거다!

그렇다면 메모리 안은 어떤 구조로 되어있을까?

우리는 cpu의 명령을 통해 메모리를 사용한다
하지만 메모리에 데이터가 아무렇게 저장된다면 컴퓨터가 지금처럼 빠르게 응답을 주지는 못할거다!

메모리 구조를 누군가 물어본다면 대표적으로 stack과 heap에 대해서 알고 있으면 된다

stack -> 함수가 스택프레임으로 저장이 되고 그안에 함수의 매개변수와 지역변수가 저장된다!
함수가 호출될때 stack에 쌓인다!

heap -> 객체가 저장 되는 공간! 흔히 java에서 new로 만든 애들이 저장된다!

java를 사용해서 메모리 stack,heap에 데이터가 어떻게 쌓이는지 알아보자!

public class Main {
	public static void main(String [] args) {
		int a = 7;
    	int b = 3;
    	int c = a + b;
    	System.out.println(c);
    
    	int d = 100;
    	d = wow(d);
    	
    	Counter cc = new Counter();
	}
    private int wow(int num) {
    	int b = num * 4;
        return b;
    }
}
class Counter {
	private int state = 0;
    public void increment() { state++; }
    public int get() { return state; }
}
함수를 호출하면 어떻게 쌓이고 사라질까?
  1. 일단 memory의 stack에 main함수를 위한 stack-frame이 만들어진다!
  2. 그리고 매개변수인 args와 지역변수들이 저장!
  3. wow() 메소드 호출부분을 만나게 된다면! 스택프레임에 그 wow를 위한 공간이 만들어진다
  4. wow를 위한 스택프레임에 매개변수와 지역변수들이 넣어진다
  5. 그래고 return 하게되면서 스택프레임에서 wow함수가 사라진다!
  6. 마지막으로 main함수에서 d가 400으로 바뀐다!!

스택에는 넣을 수 있는 한계가 있기 때문에 재귀함수를 사용하게 될때 무한으로 쌓이지 않게 조심하기!

객체를 만들어 사용한다면 Heap에는 어떻게 저장될까?

wow() 호출이 다 끝난 다음 부분부터 봐보자!

  1. new로 Counter라는 객체를 생성했다 -> 이건 Heap에 만들어짐!
  2. 스택에서는 Counter cc 변수가 Heap에서 Counter의 주소를 가리키고 있다! (참조!!!)
  3. 여기 안에 있는 객체의 상태를 바꿀때는 항상 신중해야함!

stack에서 함수는 리턴되면 사라지는데 Heap에서 객체는 언제 사라질까? - Garbage Collector

결론부터 말하면 Counter cc = new Counter(); 인 부분을 cc = null; 로 하면 된다!

java에서는 프로그램이 객체를 참조하고 있는지 확인해준다!
그렇기에 heap메모리 참조를 더는 안하게 된다면 Garbage Collector에서 보고 제거한다!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글