1. 소스코드를 한 번에 번역하지 않고 한 행씩 번역하여 실행하는 방식을 무엇이라 하는가?
인터프리터 방식
인터프리터의 특성
•
컴파일러는 소스코드 전체를 훑고 컴퓨터 프로세서가 실행 할 수 있도록 바로 기계어로 변환한다. 인터프리터는 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행한다. 이 중간 코드는 다른 프로그램에 의해 실행된다.
•
일반적으로 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다는 실행시간이 빠르다.
•
컴파일러는 전체 소스코드 변환 후 에러를 보고하지만 인터프리터는 각 행마다 실행하는 도중 에러가 보고되면 이후 작성된 코드를 보지 않는다. 보안적인 관점에서 도움이 된다.
•
파이썬은 인터프리터 언어, C,C++은 컴파일 언어, 자바는 컴파일러와 인터프리터 모두 사용한다.
2. 프로그래머가 C나 자바로 소스코드를 작성하여 컴파일하면 일차적으로 만들어지는 코드는 무엇인가?
목적 코드
3. 컴파일할 때 코드에 라이브러리를 연결하지 않고 코드를 실행할 때 라이브러리를 가져와 실행하는 방식을 무엇이라 하는가?
동적 라이브러리
동적 라이브러리
•
필요시 사용할 수 있도록 최소한의 정보만 포함하여 링크
•
정적 라이브러리와 다르게 컴파일할 때 코드가 복사되지 않고 프로그램 시작 시 로딩
•
정적 라이브러리에 비해 프로그램의 사이즈가 작고 메모리 공간을 적게 차지
정적 라이브러리
•
정적 라이브러리의 코드는 실행 파일에 포함되기 때문에 프로세스가 생성될 때 메모리에 할당
•
정적 라이브러리가 추후 제거되더라도 이미 생성된 실행파일을 실행하는 데는 아무런 문제가 없다.
4. 메모리 관리 정책 중 메모리가 꽉 찼을 때 메모리에 있는 어떤 프로세스를 내보낼지 결정하는 것은 무엇인가?
재배치
메모리 관리자의 역할
•
가져오기(fetch), 배치(placement), 재배치(replacement)
1.
가져오기 : 프로세스가 필요로 하는 데이터를 언제 메모리에 가져올지 결정하는 정책
•
필요하다고 예상되는 데이터를 미리 가져오는 방법도 존재(prefetch)
2.
배치 : 가져온 프로세스를 어떤 위치에 올려놓을지 결정하는 정책
•
페이징 : 메모리를 같은 크기로 자르는 것
•
세그먼테이션 : 프로세스의 크기에 맞게 자르는 것
3.
재배치 : 메모리가 꽉 찼을 때 메모리 내에 어떤 프로세스를 내보낼지 결정하는 정책
•
앞으로 사용하지 않을 프로세스를 찾아 내보내는 것 (교체 알고리즘)