분류 전체보기
가상 메모리
가상메모리 프로그램이 CPU에서 실행되려면 실행에 당장 필요한 부분이 메모리에 올라와 있어야 한다. 한편 여러 프로그램이 동시에 수행되는 시분할 환경에서는 한정된 메모리 공간을 여러 프로그램이 조금씩 나누어서 사용한다. 따라서 운영체제는 어떤 프로그램에게 어느 정도의 메모리를 할당할 것인가 하는 문제에 당면하게 된다. 운영체제는 모든 프로그램들에게 같은 크기의 메모리를 할당하는 것이 아니라 몇몇 프로그램들에게 메모리를 집중적으로 할당하고 시간이 흐르면 회수하는 방식을 사용한다. 그 이유는 프로세스의 빠른 수행을 위해 프로그램마다 최소한 확보해야 하는 메모리의 크기가 존재하기 때문이다. 운영체제는 CPU에서 당장 수행해야 할 부분만을 메모리에 올려놓고 그렇지 않은 부분은 디스크의 스왑 영역에 내려놓았다가 ..
메모리 관리
메모리 관리 컴퓨터 내에서는 byte 단위로 메모리 주소를 부여하기 때문에 32 비트 주소 체계를 사용하면 2^32 바이트만큼의 메모리 공간에 서로 다른 주소를 할당할 수 있다. 컴퓨터상의 주소는 32비트를 그대로 사용하지 않고 효율적인 운영을 위해 연속된 일련의 영역을 행정구역처럼 묶어서 사용한다. 보통 4KB(2^12byte) 단위로 묶어서 페이지라는 하나의 행정구역을 만든다. 페이지 하나의 크기가 2^12 바이트이므로 페이지 내에서 바이트별 위치 구분을 위해서는 12비트가 필요하다. 따라서 총 32비트의 주소 중 하위 12비트는 페이지 내에서의 주소를 나타내게 된다. 이번 장은 메모리를 어떠한 행정구역으로 나누어 관리하고 어떻게 물리적 메모리에 올라가서 주소를 할당받는지 본다. 주소 바인딩 프로그램..
프로세스 관리
프로세스 관리 프로세스란 실행 중인 프로그램을 뜻한다. 디스크에 실행파일 형태로 존재하던 프로그램이 메모리에 올라가서 실행되기 시작하면 비로소 생명력을 갖는 프로세스가 된다. 프로세스는 CPU를 획득해 자신의 코드를 수행하기도 하고, 때로는 CPU를 반환하고 입출력 작업을 수행하기도 한다. 그러다 자신의 임무를 다 수행하면 종료되어 사라진다. 프로세스가 시작해서 종료할 때 까지 CPU에서 명령을 한꺼번에 수행하면 좋겠지만, 여러 프로세스가 함께 수행되는 시분할 시스템 환경에서는 타이머 인터럽트에 의해 짧은 시간 동안 CPU를 사용한 후 빼앗겼다가 추후에 다시 CPU를 획득하는 식으로 CPU 관리가 이루어진다. 따라서, 수행을 재개하는 시점에는 이전에 어디까지 명령을 수행했는지 정확한 상태를 재현할 필요가..
CPU 스케줄링
CPU 스케줄링 기계어 명령은 크게 CPU 내에서 수행되는 명령, 메모리 접근을 필요로 하는 명령, 입출력을 동반으로 하는 명령으로 나눌 수 있다. CPU 내에서 수행되는 명령은 Add를 예로 들 수 있다. CPU내의 레지스터에 있는 두 값을 더해 레지스터에 저장하는 명령이다.CPU 내에서만 수행되므로 명령의 수행 속도가 매우 빠르다. 메모리 접근을 수행하는 명령은 Load 명령과 Store 명령이 있다. Load 명령은 메모리에 있는 데이터를 CPU로 읽어들이는 명령이며, Store명령은 CPU에서 계산된 결괏값을 메모리에 저장하는 명령이다. 메모리 접근 명령은 CPU내의 명령보다는 오래 걸리지만 비교적 짧은 시간에 수행할 수 있는 명령이다. 입출력 명령은 시간이 오래걸리는 명령이고, 사용자 프로그램이..
[Spring] 의존관계 주입에 대해
의존관계 주입에 대해 본 내용은 김영한 님의 스프링 핵심 원리 강의 내용을 토대로 정리했습니다. 의존관계 주입은 크게 4가지가 있다. 생성자 주입 수정자 주입(setter) 필드 주입 일반 메서드 주입 @Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 대상이 없어도 동작하게 하려면 @Autowired(required=false) 지정 순수한 자바 테스트 코드에는 @Autowired가 동작하지 않는다. @SpringBootTest처럼 스프링 컨테이너를 테스트에 통한 경우에만 가능 생성자 주입 @Component public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepos..
[Spring] ComponentScan에 대해
ComponentScan에 대해 본 내용은 김영한 님의 스프링 핵심 원리 강의 내용을 토대로 정리했습니다. 스프링 빈을 등록할 때에 @Bean을 사용해서 등록하고는 했다. 하지만 이런 빈이 수십, 수백개가 되면 문제가 생길 것이다. 그래서 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔을 제공한다. @Configuration @ComponentScan( //@Configuration 내부에 Component가 있음. 우리는 Configuration 에서 Bean 으로 등록해줬기 때문에 충돌할 수 있으므로 filter로 뺐다. excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration..
[Spring] 빈 스코프
Spring 빈 스코프 본 내용은 김영한 님의 스프링 핵심 원리 강의 내용을 토대로 정리했습니다. 빈 스코프란 빈이 존재할 수 있는 범위를 뜻한다. 지난번에 싱글턴 컨테이너에 대해 정리를 했었는데, 그때의 빈은 스프링 컨테이너의 시작 때에 생성되어 종료될 때 까지 유지됐었다. Spring 싱글턴 컨테이너 스프링은 싱글턴, 프로토타입, request, session, application과 같은 다양한 스코프를 지원한다. 빈 스코프는 다음과 같이 지정할 수 있다. //컴포넌트 스캔 자동 등록의 경우 @Scope("prototype") @Component public class HelloBean{} //수동 등록의 경우 @Scope("prototype") @Bean PrototypeBean HelloBean..
[Spring] 빈 생명주기 콜백
빈 생명주기 콜백 본 내용은 김영한 님의 스프링 핵심 원리 강의 내용을 토대로 정리했습니다. 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작과 종료 시점에 객체의 초기화와 종료 작업이 필요한 경우가 있다. 그 방법을 익혀보자. public class NetworkClient { private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); connect(); call("초기화 연결 메시지"); } public void setUrl(String url) { this.url = url; } //서비스 시작시 호출 public void connect() { System.out.println("con..