본문 바로가기

메모리10

C++ 언어의 기초 C++ 언어의 기초 주석은 프로그래머를 위한 것으로 컴파일러는 주석을 무시한다. 주석은 //와 /*를 사용하여 나타낼 수 있다. C++은 세 단계를 거쳐서 빌드 된다. 전처리 작업으로 코드 내에 지시된 메타 정보를 인식하여 자동으로 코드를 수정하고 컴파일 작업으로 소스 코드를 기계어로 번역한다. 마지막 링크 작업으로 기계어로 된 여러 오브젝트 파일을 묶어서 하나의 실행 파일로 만든다. 전처리 지시자인 #include은 헤더 파일의 코드를 가져와서 현재 소스 파일에 삽입하도록 지시한다. #define은 상수나 매크로를 정의하는데 사용되고 #ifdef나 #ifndef는 헤더 파일의 중복 인클루드를 막는 경우에 사용된다. main 함수는 프로그램을 실행할 때 가장 먼저 호출되는 시작점이다. main의 인자로는.. 2017. 7. 11.
운영체제 22장 - 메모리 관리(9) : 유효 접근 시간 및 지역성의 원리 - 운영체제 22장- 유효 접근 시간 및 지역성의 원리 - 프로세스를 메인 메모리에 적재할 때 모든 부분을 다 올리게 되면 메모리 공간이 많이 부족하게 된다. 따라서 프로세스를 적재를 할 때 지금 당장 필요로 하는 코드의 부분만 올리는 방법을 택하여 프로세스들이 다 메모리상에 올라와 있는 것처럼 보이게 하여 메모리 공간이 더 커보이게 보인다. 이러한 방법이 바로 가상 메모리를 사용하는 것이다. 가상 메모리는 요구 페이징 기법을 사용하여 메모리에 올리게 된다. 프로세스는 페이지의 집합이므로 지금 필요한 페이지만 메모리에 올리고 사용하지 않는 페이지들은 backing store에 저장한다. 페이지 테이블은 메인 메모리에 적재되어 있는지 backing store에 있는지를 구분하는 valid 비트를 가지게 된다... 2017. 5. 8.
운영체제 21장 - 메모리 관리(8) : 가상 메모리 - 운영체제 21장- 가상 메모리 - 메인 메모리의 크기가 한정되어 있으므로 물리적인 메모리 크기보다 크기가 큰 프로세스를 실행시킬 수 없다. 예로 100MB 메인 메모리에서 200MB 크기의 프로세스를 실행할 수 없게 되는 것이다. 그렇다면 메인 메모리보다 크기가 큰 프로세스를 실행시키고 싶으면 어떻게 해야 할까? 단순히 메인 메모리가 더 큰 컴퓨터를 사용해야하는가? 이런 방법은 매우 비효율적일 것이다. 그래서 나온 방법이 바로 가상 메모리이다. 프로세스의 모든 코드는 항상 필요한 것이 아니다. 오류 처리하는 부분이나 필요 없는 배열 부분은 실제로 프로세스가 잘 동작한다면 필요 없는 부분이 된다. 따라서 프로세스는 필요한 부분만 메모리에 올림으로써 메인 메모리에 올라가는 프로세스의 크기를 줄인다. 프로세스.. 2017. 5. 7.
운영체제 19장 - 메모리 관리(6) : 페이징(3) - 운영체제 19장- 페이징(3) - 모든 프로그램들은 실행되기 전에 하드디스크에 보관된다. 그리고 사용을 하고자 하는 프로그램들이 메인 메모리에 적재되어서 CPU를 할당받아 기능을 수행하게 된다. 처음에 메인 메모리에 프로세스의 적재를 배울 때에는 프로세스들이 연속적으로 하나씩 메모리에 적재되는 것으로 알고 있었다. 하지만 이런 방법은 메모리의 공간을 매우 낭비시켜 효율을 떨어뜨린다는 것을 배웠다. 이를 해결하기 위해 프로세스를 페이지라는 단위로 나누어서 메모리에 적재하는 방법인 페이징 기법을 사용하였다. 재배치 레지스터를 사용하여 페이지 테이블에 맞는 주소로 논리 주소를 물리 주소로 변환시켜 프로세스의 메모리 주소 위치를 파악하는 방법이다. 운영체제는 프로세스 관리와 메모리 관리 외에도 다양한 일을 수행.. 2017. 5. 4.
운영체제 18장 - 메모리 관리(5) : 페이징(2) - 운영체제 18장- 페이징(2) - 다중 프로그래밍 환경으로 바뀌면서 다양한 프로그램들이 메인 메모리 공간에 올라가서 프로세스로 되어 동작하기 시작했다. 프로그램들은 필요할 때 메인 메모리로 적재되고 사용이 다 되면 다시 하드디스크로 돌아가게 된다. 이런 작동이 반복되면서 메모리 공간에는 hole이라고 하는 빈 공간이 만들어지게 된다. 이런 빈 공간이 흩어져 있게 되어 총 합으로는 충분한 공간의 빈 메모리 공간이 있을지라도 사용할 수 없는 공간이 되어버린다. 왜냐하면 프로세스는 연속된 공간에서 존재해야 동작했기 때문이다. 이러한 문제를 외부 단편화라고 했다. 그리고 외부 단편화를 해결하고자 노력을 많이 하였다. 연속 메모리 할당을 하는 방식에 차이를 두기도 하고 compaction 기법을 사용하기도 하였다.. 2017. 5. 3.
운영체제 15장 - 메모리 관리(2) : 메모리 낭비 방지 - 운영체제 15장- 메모리 낭비 방지 - 하드디스크에 존재하는 프로그램들은 메모리의 특정 부분에 적재되어 실행이 된다. 프로그램이 만들어지기 까지 소스 파일, 목적 파일, 실행 파일을 거쳐 로더에 의해 메모리에 올려 지게 되는데 적절한 위치에 적재를 해야 실행을 시킬 수 있다. 앞 장에서 MMU의 재배치 레지스터를 이용하면 부분적으로 적절한 위치에 프로그램을 올릴 수 있다. 이번 장에는 이를 더 넘어가서 어떻게 하면 더 효율적으로 프로그램을 올릴 수 있는지, 메모리 보호를 위해서 메모리를 낭비하는 것을 방지하는 어떤 방법을 사용해야 하는지에 대해 학습 할 것이다. MMU가 메모리 관리를 하는 방법에 대해서 조금 더 상세히 들어가 보자. MMU는 프로그램이 동작할 때 필요한 데이터나 동작들을 메모리의 특정 .. 2017. 4. 29.
버퍼 오버플로 & 포맷 스트링 공격 버퍼 오버플로 & 포맷 스트링 공격 버퍼 오버플로는 프로그램이 실행될 때 입력받는 값이 버퍼를 가득 채우다 못해 넘쳐흘러 버퍼 이후의 공간을 침범하는 현상을 말한다. 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점이다. 데이터의 길이에 대한 불명확한 정의를 악용한 덮어쓰기로 인해 발생한다. 컴퓨터 보안과 프로그래밍에서 이는 프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하여 벗어난 데이터는 인접 메모리를 덮어 쓰게 되는데 손상 받은 데이터가 중요한 데이터일 경우 프로그램에 큰 영향을 미치게 된다. 버퍼 오버플로를 일으키는 기본적인 예시는 문자열에 할당된 메모리 용량보다 더 큰 공간을 할당했을 때이다. 예를 들면 8바이트 문자열을 넣을 수 있는 버퍼가 존재.. 2017. 4. 29.
운영체제 14장 - 메모리 관리(1) : 주기억장치(메인 메모리) 개요 - 운영체제 14장- 메모리 관리(1) : 주기억장치(메인 메모리) 개요 - 운영체제의 역할 중에 제일 큰 비중을 차지하는 부분이 프로세스 관리와 메모리 관리이다. 앞의 장들로 프로세스 관리에 대해서 배웠다. 이번 장부터는 메모리 관리에 대해서 학습을 할 것이다. 지금 메모리를 생각하면 반도체인 집적회로 메모리를 생각하게 된다. SRAM은 캐시 메모리에 사용되고 DRAM이 메인 메모리에 사용이 된다. 하지만 이전의 메모리는 한 칩 안에 넣는 것이 아니라 개별적으로 메모리를 가지고 있어서 하나의 메모리에 많은 용량을 넣을 수 없었다. 이러한 형태가 트랜지스터 메모리의 형태이다. 이보다 전의 형태는 진공관 메모리 형태로 크기는 크지만 데이터를 넣을 용량은 더 적은 메모리의 형태이다. 70년대에서는 8bit PC.. 2017. 4. 28.
C++ 강의 7장 - 참조자(Reference) - C++ 강의 7장- 참조자(Reference) - 변수라고 하는 것은 할당된 메모리 공간에 붙여진 이름이다. 우리는 이 이름을 가지고 해당 메모리 공간에 접근이 가능해진다. 그러면 참조자는 무엇일까? 참조자는 할당된 하나의 메모리 공간에 다른 이름을 붙이는 것을 말한다. 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름인 것이다. 쉽게 말하면 별명이라고도 할 수 있을 것 같다. 예시를 통해 설명을 들어보자. num1이라는 변수를 우선 선언해보자. 정수의 값을 가지기 위해 int로 num1을 선언한다. 그러면 메모리의 어느 공간에 num1이라는 이름을 부여한다. 그리고 우리는 그 num1이라는 메모리 공간에 10을 선언한다. 그러면 여기서 num1이라는 메모리 공간에 다른 이름도 부여하고 싶다. 그러.. 2017. 4. 24.
운영체제 2장 - 운영체제 종류와 역할 - 운영체제 2장- 운영체제 종류와 역할 - 운영체제의 종류는 운영체제의 발전 과정을 보면 알 수 있다. 맨 처음의 컴퓨터는 운영체제를 가지고 있지 않았다. 사용자가 일일이 모든 상황을 컨트롤 해야만 컴퓨터를 사용할 수 있었다. 이런 점에서 매우 불편함을 느꼈고 컴퓨터 자체에서 관리를 해주는 프로그램을 만들 필요성을 있었다. 따라서 최초의 운영체제가 탄생했다. 처음에 나온 운영체제는 일괄처리 운영체제이다. 처리해야 할 데이터를 일정 기간 또는 일정량 정리하여 일괄 처리하는 것이었다. 하지만 일괄처리만으로는 불편함을 없앨 수 없었다. 그래서 나온 것이 다중프로세서 운영체제이다. 다중 프로그래밍 시스템에서 메모리에 더 많은 유저 프로그램을 가동시키고 싶었다. 또한 한 명의 유저 프로그램이 쉬면 다른 유저의 프로.. 2017. 4. 14.