검색결과 리스트
글
A | ||||||
|
B | ||||||
| ||||||
| ||||||
c |
C | ||||||||||
| ||||||||||
| ||||||||||
|
D | ||||||||||||||
| ||||||||||||||
| ||||||||||||||
e |
E | ||||||||||||
| ||||||||||||
| ||||||||||||
|
F | ||||||||||||||
| ||||||||||||||
| ||||||||||||||
|
G | ||||||||||
| ||||||||||
| ||||||||||
|
H | ||||||
| ||||||
| ||||||
|
I | ||||||||||||
| ||||||||||||
| ||||||||||||
j |
J | ||||||||
| ||||||||
| ||||||||
|
K | ||||
| ||||
| ||||
|
L | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
|
M | ||||||||||||||||||||
| ||||||||||||||||||||
| ||||||||||||||||||||
n |
N | ||||||||
| ||||||||
| ||||||||
|
O | ||
| ||
| ||
|
P | ||||||||||||||||||||||
| ||||||||||||||||||||||
| ||||||||||||||||||||||
q |
Q | ||||
| ||||
| ||||
|
R | ||||||||
| ||||||||
| ||||||||
|
S | |||||||||||||||
swapon 스왑 공간을 초기화하는 데는 swapon 명령을 사용한다. 이 명령은 커널에게 해당 공간을 스왑으로 사용할 수 있다는 점을 알려준다. 이 명령에게는 추가하고자 하는 스왑 공간의 경로를 인수로 전달해 주어야 한다. 임시 스왑 파일을 스왑 공간에 추가하고자 한다면 다음과 같이 한다.
스왑 공간들은 /etc/fstab 파일에 의해서 자동적으로 사용될 수도 있다.
시스템이 시작될 때, 스크립트를 통해서 swapon -a 명령이 실행되는데 이 명령은 /etc/fstab에 나열되어 있는 스왑 공간들을 모두 사용하게 해 준다. 그래서 흔히 swapon 명령은 추가적인 스왑이 필요할 때만 사용되는 것이 보통이다. free 명령을 쓰면 스왑의 사용 상황을 모니터 할 수 있다. 이것은 현재 얼마나 많은 용량의 스왑이 사용되고 있는지 알려준다.
여기서 Mem: 이라고 쓰여진 첫째줄은 실제 물리적 메모리의 상황을 보여주는 것이다.커널은 물리적 메모리를 약 1 megabyte 정도 사용하는데, total이라고 쓰여진 세로줄에서 보여주는 전체메모리 양에는 이 커널이 차지하는 공간이 빠져 있다. used라는 세로줄은 현재 사용중인 메모리 양을 보여주고 있으며(두번째 가로줄은 버퍼 로 사용되는 부분을 제외하고 계산한 양이다), free란 세로줄에서는 전혀 사용되지 않은 양을 보여주고 있다. 또한 shared란 부분은 프로세스간에 공유되고 있는 메모리를 나타내고 있는 것이므로, 그 양이 많은 것은 기쁜 일이다. buffers는 현재 디스크 버퍼 캐쉬로 사용되는 메모리 양을 보여주고 있다. 마지막 줄인 Swap:은 위와 같은 항목을 스왑 공간에 똑같이 적용시킨 내용이다. 이 항목이 모두 제로라면, 스왑 공간이 아예 동작하고 있지 않다는 뜻이다. 같은 정보를 top 명령이나 /proc/meminfo 파일을 통해 얻을 수 있다. 그러나 어느 경우든, 특정한 스왑 공간에 대한 정보를 얻는 것은 좀 어렵다. 스왑 공간은 swapoff 명령으로 기능을 멎게 할 수 있다. 그러나 임시로 잡은 스왑 공간이 아니라면, 스왑을 끌 필요는 없다. 만약 스왑을 끄게되면, 스왑 공간에 들어있던 메모리 페이지들이 먼저 실제 메모리로 들어가야 되는데, 실제 메모리에 여유가 없는 경우에는 또 다른 스왑 공간으로 방출되게 된다. 그런데 이 메모리 페이지들을 모두 수용하기에 가상메모리마저도 부족하다면, 그때부터는 리눅스 시스템이 무진장 버벅대기 시작할 것이다. 시간이 아주 많이 걸린 후에는 좀 잠잠해지겠지만, 여전히 시스템은 사용불능 상태에 있게 된다. 따라서 스왑을 끄기 전에, 충분한 여유 메모리가 있는지 꼭 확인해 보아야만 한다(free 같은 것으로). swapon -a 명령으로 자동적으로 사용되는 스왑 공간들은, 마찬가지로 swapoff -a 명령을 써서 끌 수 있다. 이것도 역시 /etc/fstab 파일에 나열되어 있는 스왑 공간만을 끄기 때문에, 나머지 수동으로 추가시킨 스왑들은 영향을 받지 않는다. 때 때로, 실제 메모리가 많이 비어 있는데도 불구하고 스왑을 아주 많이 쓰고 있는 경우를 보게 될 수가 있다. 보통 이런 일이 발생하는 경우는 이렇다. 어떤 덩치 큰 프로세스가 실제 메모리를 많이 점유하는 바람에 시스템이 스왑을 많이 사용하게 되었다고 하자. 이 프로세스가 종료되면 실제 메모리엔 여유 공간이 많이 남게 되지만, 스왑으로 한번 내려간 데이터는 그것이 당장 필요하지 않는 한 실제 메모리로 불려지지 않는다. 따라서 스왑 영역을 많이 사용하면서도 실제 메모리가 많이 비어있는 현상이 꽤 오래 지속될 수 있는 것이다. 그러므로 이런 현상에 특별히 신경쓸 필요는 없다. 하지만, 최소한 그 원리는 이해하고 있어야 나중에 불안하지 않을 것이다.
| |||||||||||||||
| |||||||||||||||
|
T | ||||||||||||
| ||||||||||||
| ||||||||||||
|
U | ||||||
| ||||||
| ||||||
|
V | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
W | ||||||||||||||||||
| ||||||||||||||||||
| ||||||||||||||||||
|
X | ||||
| ||||
| ||||
|
| ||
| ||
| ||
|
Z | ||
|
'Operating System > Linux' 카테고리의 다른 글
메모리 보호기법 (0) | 2015.08.26 |
---|
설정
트랙백
댓글
글
프로젝트 :
File_Editor
만들게 된 동기 :
얼마 전부터 Python을 배우고 있었고, 동아리에서 스크립트 언어로 간단한 프로젝트를 만들어 오라고 하셨다.
처음엔 스크립트 언어가 뭔지 몰라서 스크립트 언어에 대해 찾아봤는데, 스크립트 언어는 Python 이나 Perl, PHP과
같이 소스코드를 컴파일 하지 않고도 응용프로그램을 실행할 수 프로그래밍 언어를 말한다고 한다.
예를 들면 Python 이 컴파일 하지 않고도 인터프리터에 의해 실행되는 것 처럼 말이다.
프로젝트 설명 :
이 프로젝트는 선택창에서 파일을 입력할 건지, 읽을 것인지, 종료할 건지 선택하게 하여 이에 맞는 명령을 실행하는 프로그램이다.
소스 코드 :
소스 코드 설명 :
이 코드는 매우 간단한 구조를 띄고 있다.
그냥 처음에 List 를 띄어준 뒤, 4 가지의 선택 중 하나를 선택한다.
그 선택에 맞춰 명령을 실행하는 코드 이다.
( 코드를 짠 시간 보다, 외관 상 보기 좋게(?) 만드는 게 더 오래 걸린것 같다..)
실행 결과 : ( 복사하려다가 아무래도 사진이 더 좋은 것 같아서 ... )
만들면서 :
처음에 만들땐 "TextMate"라는 앱을 사용하였는데, 이 앱이 입력을 못 받는 것 같아서 Terminal 로 실행을 한 번 해보았다.
그러나 이상한 에러가 나오는 데 경로가 잘못됬다는 것을 알게 되어, 파일이 있는 디렉토리로 가 실행을 하였다.
설정
트랙백
댓글
글
포인터란 메모리의 주소 값을 담고 있는 변수 ( 또는 상수 ) 입니다.
⚀ 변수의 선언과 메모리의 할당
먼저, 위의 그림과 같이 변수가 선언되었다고 생각해봅시다.
char형은 1byte, int형은 4byte이니 총 6byte가 메모리 공간에 할당되게 됩니다.
위의 그림의 메모리 블록 위에 0x12ff73 과 같은 값들은 메모리 블록의 주소 값을 말합니다.
주소 값은 1byte의 메모리 블록 단위로 할당됩니다.
그럼 위의 그림을 보고 'A'는 0x12ff74에, 'Q'는 0x12ff75에 할당되어있습니다.
그렇다면 int형 변수 num에 담겨있는 7은 0x12ff76 ~ 0x12ff79번지에 할당되었다고 볼 수 있을까요?
답은 '아니오' 입니다. 이유는 C언어에서의 포인터는 시작 번지만으로 위치를 표현하기 때문입니다.
int형은 4byte이므로 시작 주소만 알면 끝 주소는 쉽게 알수 있겠죠?
그렇다면 여러분 int 형 변수 num은 어디에 저장되어 있을까요?
네, 0x12ff76번지에 저장되어 있습니다.
그런데 주소값 0x12ff76 또한 정수이기 때문에 저장이 가능합니다.
그리고 이와 같이 주소값을 저장하기 위해 사용하는 변수가 바로 '포인터 변수' 입니다.
⚁ 포인터 변수를 선언하는 방법
"정수 7이 저장된 int형 변수 num을 선언하고 이 변수의 주소 값 저장을 위한 포인터 변수 pnum을 선언한 뒤 pnum에 num의 주소값을 저장하자"
위의 문장대로 실행하려면 어떻게 해야 할까요? 다음과 같은 코드로 작성하면 됩니다.
위의 코드에서 여러분은 *와 &라는 연산자를 볼 수 있을겁니다.
*와 & 연산자는 어떤 작업을 할까요?
우선 * 연산자는 "변수를 가리키는 연산자"입니다.
좀, 설명이 어려울 수 있겠지만 위와 같이 int * pnum이라고 한다면 int 형 변수를 가리키는 pnum의 선언을 의미합니다.
음.. int 형 변수의 주소 값을 저장할 수 있는 포인터 변수 ( pnum )의 선언이라고 하면 될것 같네요.
다음으로 & 연산자는 "오른쪽에 등장하는 피연산자의 주소 값을 반환하는 연산자" 입니다.
& 연산자는 * 연산자에 비해 이해하기 쉬울것이라고 생각됩니다.
위의 코드와 같이 pnum= &num이라는 코드는 주소 값을 저장할 수 있는 포인터 변수 pnum에 num에 주소 값을 넣어준다고 생각하시면 됩니다.
따라서 위의 코드를 해석해 보자면 num에 7이라는 값을 넣어준 뒤 num의 주소 값을 저장할 포인터 변수 pnum을 선언해 줍니다.
그 뒤, pnum에 num의 주소 값을 넣어주는 것 입니다.
이해 가셨죠?
아! 그리고 포인터 변수를 선언할 때에는 포인터 변수가 가리키고자 하는 변수의 자료형과 포인터 변수의 자료형이 같아야 합니다.
예를 들어, type num이라는 변수의 주소 값을 저장하고 싶을 때에는 type * ptr이라는 포인터 변수를 선언해 주어야 합니다.
이런 식으로 주소 값을 저장할 변수와 포인터 변수의 자료형이 일치해야 하는 이유는 자료형이 달라지면 크기도 달라지기 때문입니다.
예를 들어 int 형 변수는 4byte인데, 1byte인 char형 포인터 변수에 저장을 하면 오류가 생기겠죠?
⚂ Example Question
① 포인터 변수 pnum을 선언합니다.
② pnum에 num 1의 주소 값을 저장합니다.
③ pnum은 num 1이므로 30을 증가시킵니다.
④ pnum이 가리키는 대상을 num2로 변경합니다.
⑤ pnum은 num2 이므로 30을 감소시킵니다.
실행 결과 : num1 : 130, num2 : 70
위의 실행결과를 통해서 pnum에 num이 담겨있었다는 것을 확인할 수 있을 것입니다.
⚠︎ 잘못된 포인터의 사용과 NULL 포인터
▾▾▾▾▾▾ 1번 ▾▾▾▾▾▾
<실행 결과>
The variable 'ptr' is being used without being initialized.
- ptr 이 초기화 되지 않았다고 나옵니다.
포인터 변수를 선언만 하고 초기화 하지 않으면, 포인터 변수는 쓰레기 값으로 초기화됩니다.
즉, 어디를 가리킬지 모르게 됩니다.
이러한 경우 매우 치명적인 결과로 이어 질 수 있습니다.
다행히 요즘의 운영 체제는 잘못된 메모리 접근의 시도가 있을 때, 이를 감지하고 해당프로그램을 중지시켜서 잘못된 메모리의 접근을 방지합니다.
▶︎ 위에 경고창이 그런 경우인것 같습니다.
▾▾▾▾▾▾ 2번 ▾▾▾▾▾▾
1번의 경우와 같지만 125로 초기화 하였습니다.
하지만 125가 메모리 내에서 어디인지를 모르니 이는 결국 쓰레기 값으로 출력 한 것과 같게 됩니다.
▶︎ 그렇다면 올바른 포인터 변수의 초기 값은 무엇인가?
올바른 포인터 변수의 초기 값에는 '0'이나 'NULL'을 써야 합니다.
초기화 하는 값이 0인걸 가리켜 '널 포인터 (NULL Pointer)'라고 합니다.
이는 0을 가리키는게 아닌 '아무데도 가리키지 않는다' 라는 걸 의미합니다.
'Programming > C' 카테고리의 다른 글
Stack과 Queue (0) | 2015.08.26 |
---|---|
Call-by-value 와 Call-by-reference (0) | 2015.08.26 |
2차원 배열 (0) | 2015.08.26 |
동적 할당 (0) | 2015.08.26 |
[ Project ] Pascal (0) | 2015.08.26 |
RECENT COMMENT