검색결과 리스트
분류 전체보기에 해당되는 글 42건
- 2015.08.27 연결 리스트 ( Linked List )
- 2015.08.27 구조체 ( Struct )
- 2015.08.26 Stack과 Queue
- 2015.08.26 Call-by-value 와 Call-by-reference
- 2015.08.26 2차원 배열
- 2015.08.26 동적 할당
- 2015.08.26 [ Project ] Pascal
- 2015.08.26 커널모드와 유저모드의 차이점
- 2015.08.26 메모리 보호기법
- 2015.08.26 리눅스 명령어
글
연결 리스트란 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식이다.
Ⅰ. 연결 리스트의 구성
연결 리스트는 노드로 이루어져 있다. 노드란 자료 하나를 담고있는 것을 말한다.
노드는 자기 자신의 값과 다음 노드를 가리키는 노드 포인터로 구성된다.
( 처음 부분의 노드를 Head 마지막 부분의 노드를 Tail 이라고 한다 )
아래 그림들의 연보라 색과 하늘색과 같이 각 노드는 값을 가지고 그 옆에 다음 노드로 가는 주소값을 가져 서로 연결되게 된다.( 연보라 부분이 값을 담는 부분, 하늘색 부분이 다음 노드로 넘어가는 주소 부분이다)
노드를 연결한 방법에 따라 단순 연결 리스트, 이중 연결 리스트, 원형 연결 리스트로 구분된다.
① 단순 연결 리스트
위의 그림과 같이 각 노드에 자료 공간과 한 개의 포인터 공간이 있고, 각 노드의 포인터는 다음 노드를 가리킨다.
② 이중 연결 리스트
위의 그림과 같이 단순 연결 리스트와 비슷하지만, 포인터 공간이 앞과 뒷 부분에 2개가 있어
각각의 포인터는 앞의 노드와 뒤의 노드를 가리킨다.
③ 원형 연결 리스트
위의 그림과 같이 일반적인 연결 리스트에 마지막 노드와 처음 노드를 연결시켜 원형으로 만든 구조 이다.
Ⅱ. 링크드 리스트 구현
#include <stdio.h>
#include <stdlib.h>
typedef struct member
{
char name[20];
int age;
struct node *NEXT;
}MEM;
int main(void)
{
int nop=0,i;
printf("사람은 몇 명입니까? : ");
scanf("%d",&nop);
MEM* name=(MEM*)malloc(sizeof(MEM));
MEM* age=(MEM*)malloc(sizeof(MEM));
for(i=0;i<nop;i++)
{
printf("%d번째 사람의 이름은? : ",i+1);
scanf("%s",name[i].name);
printf("%d번째 사람의 나이는? : ",i+1);
scanf("%d",&age->age);
printf("\n\n\n이름 : %s\n나이: %d\n\n\n",name[i].name,age->age);
}
}
'Programming > C' 카테고리의 다른 글
[ Project ] Wild! (0) | 2015.08.27 |
---|---|
[ Project ] Stack_Linked List (0) | 2015.08.27 |
구조체 ( Struct ) (0) | 2015.08.27 |
Stack과 Queue (0) | 2015.08.26 |
Call-by-value 와 Call-by-reference (0) | 2015.08.26 |
설정
트랙백
댓글
글
구조체란 서로 관련있는 하나 이상의 변수들을 묶어 사용하는 것을 말합니다.
예를 들면 변수 중에 신원 정보를 파악할 수 있도록 이름, 나이, 성별등을 입력하는 변수들을 하나로
묶어 사용하는 것을 말합니다.
Ⅰ. 구조체 정의
구조체를 정의 할때의 형식은 아래와 같은 형식으로 정의합니다.
struct identity{
int age;
char name[20];
char gender[6];
};
identity란 구조체 명을 의미하고 안에 있는 변수들은 identity라는 구조체에 포함된 변수들입니다.
Ⅱ. 구조체의 선언
구조체를 선언하는 방식에는 여러가지의 방법들이 있습니다.
①
struct identity{
int age;
char name[20];
char gender[6];
} iden;
②
struct identity{
int age;
char name[20];
char gender[6];
};
struct identity iden;
③
struct identity{
int age;
char name[20];
char gender[6];
};
typedef struct identity IDEN;
IDEN iden;
④
typedef struct identity{
int age;
char name[20];
char gender[6];
}IDEN;
IDEN iden;
위와 같이 여러가지의 선언 방법이 있습니다.
③번과 ④번에 나온 typedef라는 것은 구조체 뿐만 아니라 다른 곳에서도 유용하게 널리쓰입니다.
typedef의 기능은 변수를 선언할 때 자료형의 이름을 사용자의 임의대로 바꿔줄 수 있습니다.
예를 들어 unsigned int * 와 같이 긴 자료형을 일일이 칠려면 귀찮기도 하고 불편합니다.
이때 typedef unsigned int* P_UNIT; 를 입력하여 unsigned int*을 P_UNIT로
바꿔줄 수 있습니다.
위와 같이 typedef를 사용하실 때에는 typedef (변경할 자료형)(변경후 자료형)형식으로 사용 합니다.
Ⅲ. 구조체 사용
구조체를 사용할 때는 아래와 같이 사용 합니다.
#include <stdio.h>
struct identity{ // 구조체의 정의
int age;
char name[20];
char gender[6];
} iden; // 구조체의 식별자
int main (void){
struct identity iden; // 구조체 변수의 선언
printf("Name? : "); scanf("%s",iden.name);
// 구조체를 사용할 때는 구조체 명.변수 명 으로 사용
printf("Age? : "); scanf("%d",&iden.age);
printf("Gender? : "); scanf("%s",iden.gender);
}
위의 주석에서의 설명과 같이 다른 함수내에서 사용하기 위해 구조체를 선언 해줍니다.
main 함수에서 iden.name 같은 형식은 구조체를 사용하기 위한 형식으로 (구조체 명.변수명)으로
사용합니다.
★ 구조체를 사용하여 함수의 인자로 전달과 반환 대입연산은 가능하지만 사칙연산은 안됩니다.
'Programming > C' 카테고리의 다른 글
[ Project ] Stack_Linked List (0) | 2015.08.27 |
---|---|
연결 리스트 ( Linked List ) (0) | 2015.08.27 |
Stack과 Queue (0) | 2015.08.26 |
Call-by-value 와 Call-by-reference (0) | 2015.08.26 |
2차원 배열 (0) | 2015.08.26 |
설정
트랙백
댓글
글
Ⅰ. Stack
Stack 은 LIFO ( Last In First Out ) 으로 늦게 들어온 게 먼저 나오는 형태입니다.
(Ex) 1, 2, 3 순으로 들어가면 3, 2, 1 순으로 나온다.
< 코드 설명 >
1. Stack 에서 데이터를 넣는 것을 푸시 ( Push ) , 빼내는 것을 팝 ( Pop ) 이라고 합니다.
2. Top 이라는 위치에서 데이터의 입력과 출력이 일어납니다.
< Stack 예제 >
< 실행 결과 >
Ⅱ. Queue
Queue 는 FIFO ( First In First Out ) 으로 먼저 들어온 게 먼저 나오는 형태입니다.
(Ex) 1, 2, 3 순으로 들어가면 1, 2, 3 순으로 나온다.
Stack는 입력을 받는 곳에서 출력이 되지만 Queue 입력을 받는 곳과 출력을 하는 곳이 다르기 때문에
Rear에서 입력이, Front에서 출력이 됩니다.
< Queue 예제 >
전에 만들어 놓은 코드의 Push() 함수 부분에 큰 오류가있어서 다시 만들었습니다..
< 출력 결과 >
구분하기 쉽게 " . " 으로 구분할 수 있게 하였습니다.
'Programming > C' 카테고리의 다른 글
연결 리스트 ( Linked List ) (0) | 2015.08.27 |
---|---|
구조체 ( Struct ) (0) | 2015.08.27 |
Call-by-value 와 Call-by-reference (0) | 2015.08.26 |
2차원 배열 (0) | 2015.08.26 |
동적 할당 (0) | 2015.08.26 |
설정
트랙백
댓글
글
Ⅰ. Call-by-value
- 함수를 호출 할 때 단순히 값을 전달하는 형태의 함수호출
< 예제 >
#include <stdio.h>
void change(int n1, int n2){
int temp= n1;
n1=n2;
n2=temp;
printf("(After) Number 1 : %d, Number 2 : %d \n",n1,n2);
}
int main(void){
int num1=10;
int num2=20;
printf("(Before) Number 1 : %d, Number 2 : %d \n",num1,num2);
change(num1,num2);
//printf("Number 1 : %d, Number 2 : %d \n",num1,num2);
-> 사용시 num1과 num2가 바뀌지 않는다 (위에 함수를 int형으로 바꾼뒤 return n1,n2;)
return 0;
}
< 출력결과 >
(Before) Number 1 : 10, Number 2 : 20
(After) Number 1 : 20, Number 2 : 10
Ⅱ.Call-by-reference
- 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수 호출
< 예문 >
#include <stdio.h>
void change(int *ptr1, int *ptr2){
int temp = *ptr1;;
*ptr1 = *ptr2;
*ptr2 = temp;
}
int main(void){
int num1=10;
int num2=20;
printf("Number 1 : %d, Number 2 : %d \n",num1,num2);
change(&num1,&num2);
printf("Number 1 : %d, Number 2 : %d \n",num1,num2);
return 0;
}
< 출력 결과 >
Number 1 : 10, Number 2 : 20
Number 1 : 20, Number 2 : 10
sourced by "윤성우 열혈 C 프로그래밍 강의"
'Programming > C' 카테고리의 다른 글
구조체 ( Struct ) (0) | 2015.08.27 |
---|---|
Stack과 Queue (0) | 2015.08.26 |
2차원 배열 (0) | 2015.08.26 |
동적 할당 (0) | 2015.08.26 |
[ Project ] Pascal (0) | 2015.08.26 |
설정
트랙백
댓글
글
2차원 배열
- 2차원 배열은 1차원 배열과는 다르게 첨자 2 개를 사용하는 배열이다. 같은 데이터형의 변수가
행( row )과 열( column )을 나타내는 데 , 첫 번째 첨자는 행을, 두 번째 첨자는 열을 나타낸다.
Ⅰ. 행과 열
1차원 배열에서는 변수이름 [ 열 ]로 표현했지만 , 2차원 배열에선 변수 이름 [행] [열] 로 표현한다. 옆에 그림과 같이 표현한다.
Ⅱ. 2차원 배열의 크기
변수이름 [i:n][j:m] 의 크기는 i와 j 가 첫 번째 요소의 행과 열의 첨자이고, n과 m은 마지막 요소의 행과 열의 첨자이다.
따라서, 배열의 크기를 구하는 공식은 ( n-i+1) x ( m-j+1) 이다.
(ex) 위의 그림 처럼 첫 번째 요소의 행과 열은 [0][0]이므로 i 와 j 는 0이고, 마지막 요소의 행과 열은 [2][1]이므로 n은 2,
m은 1이다. 따라서 위의 그림의 배열의 크기는 (2-0+1) x (1-0+1) 으므로 3x2는 6이되어,
위 그림의 2차원 배열의 크기는 6이다.
Ⅲ. 2차원 배열의 저장 방식
2배원 배열에는 행 중심 저장 방식과 열 중심 저장 방식이 있다. 행 중심 저장 방식은 1번째 행,
2번째 행 .. 순으로 저장하고 열 중심 저장 방식은 마찬가지로 1번째 열, 2번째 열.. 식으로 저장 한다.
☞ 2차원 배열 arr[n][m]에서 첫 번째 요소의 행과 열의 첨자가 a이고 시작주소가 base, 요소의 크기가 size라고 할 때 ,
arr[i][j]의 주소를 구하는 공식은 다음 과 같다
① 행 중심 저장 방식
arr[i][j] 의 주소 = base + (m x (j-a)) x size
② 열 중심 저장 방식
arr[i][j] 의 주소 = base + (n x (j-a)) x size
(ex) 위의 사진을 예로 들면 시작 주소는 200이고 각 요소의 크기는 4이니.. ▼
① 행 중심 저장 방식의 arr[2][0]
200 + (2 x (2-0) + (0-0)) x 4 = 216
② 열 중심 저장 방식의 arr[2][0]
200 + (3 x (0-0) + (2-0)) x 4 = 208
두 결과 모두 원하는 결과를 출력하고 있다.
sourced by "NAVER"
'Programming > C' 카테고리의 다른 글
Stack과 Queue (0) | 2015.08.26 |
---|---|
Call-by-value 와 Call-by-reference (0) | 2015.08.26 |
동적 할당 (0) | 2015.08.26 |
[ Project ] Pascal (0) | 2015.08.26 |
포인터 ( Pointer ) (0) | 2015.06.14 |
설정
트랙백
댓글
글
- 컴파일을 실행하기 전에 메모리의 크기가 정해져 할당되어 있는 정적 할당과 달리 프로그램 실행 중에
Ex) 1 ~ 100을 입력하는 배열에서는 크기를 100으로 줘야 하는데 그럼 20을 입력하면 80이 쓸데없게 된다.
1. malloc 함수
- Memory Allocation의 약어로 "메모리 할당" 이라는 뜻이다. 메모리의 크기를 설정 하기 위해 사용 한다.
형식 : 포인터 변수명 = (자료형 *) malloc ( sizeof( 자료형 ))
2. calloc 함수
- Clear Allocation의 약어로 "깔끔한 할당" 이라는 뜻이다. 메모리의 크기를 초기화 한 뒤 메모리의
형식 : 포인터 변수명 = (자료형 *) calloc ( 메모리에 곱할 수, sizeof( 자료형 ))
3. realloc 함수
- Re Allocation의 약자로 "재할당"이라는 뜻이다. 동적 메모리 할당을 해제하지 않고 다시 설정하여
형식 : 포인터 변수명 = (자료형 *) realloc ( 재설정할 변수 명 , sizeof( 자료형 ))
II. 동적 할당을 끝낼 땐..
- 동적 할당을 끝내고 싶을 땐 free (포인터 변수)를 입력하면 된다.
'Programming > C' 카테고리의 다른 글
Stack과 Queue (0) | 2015.08.26 |
---|---|
Call-by-value 와 Call-by-reference (0) | 2015.08.26 |
2차원 배열 (0) | 2015.08.26 |
[ Project ] Pascal (0) | 2015.08.26 |
포인터 ( Pointer ) (0) | 2015.06.14 |
설정
트랙백
댓글
글
프로젝트 : Pascal
프로젝트 설명 :
- 1 <- 왼쪽과 같이 위에 두 수를 더해 아래에 출력하는 프로그램이다.
1 1
1 2 1
1 3 3 1
소스코드 :
#include <stdio.h>
int main(void){
int arr[10][10]={0,};// 2차원 배열은 통해 판을 만들고 0으로 초기화 하였다.
int i , j, num=1; // i = 행 , j = 열
for(i = 0 ; i < 10 ; i ++ ){
for(j = 0 ; j < num ; j ++ ){
if( j == 1 ){ // 모든 줄의 첫번째 행에는 1을 넣는다.
arr[j][i]=1;
}
else if( i == 2 ){ // 2번째 줄의 모든 열에는 1을 넣는다.
arr[j][i]=1;
}
if(j>1&&i>2){ //위의 경우를 둘다 만족하지 않을 경우.
arr[j][i]=arr[j-1][i-1]+arr[j][i-1];
}
}
num++;
}
for( i = 0 ; i < 5 ; i ++ ){ // 출력을 위한 for 문
for( j = 1 ; j < i+1 ; j ++ ){
printf("%d ",arr[j][i]);
}
printf("\n");
}
}
'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 |
포인터 ( Pointer ) (0) | 2015.06.14 |
설정
트랙백
댓글
글
커널 모드 : 유저모드로는 접근 할 수 없도록 되어있는 시스템역역(커널)에 접근하기 위해 동작되는 실행모드.
유저 모드 : 유저가 접근할 수 있는 OS 영역 내에서 동작되는 실행 모드.
모드를 나누는 목적 : 보안성과 안전성의 확보
유저들이 마음대로 접근해도 되는 영역에 대해서 유저 모드로 접근이 되도록 하고 커널에 요청해서 처리할 문제가 있을때만 일시적으로 커널 모드로 전환해서 커널 내의 처리 요청을 처리하고 일을 마치면 다시 유저 모드로
전환되어 실행이 된다.
유저 애플리케이션이 치명적인 운영체제 데이터에 접근하거나 수정하지
못하게 막기 위해 운영체제는 두 가지 프로세서 접근모드를 사용한다.
유저 애플리케이션 코드는 유저 모드에서 실행되고, 운영체제 코드는 커널 모드에서 실행된다.
커널 모드는 모든 시스템 메모리와 모든 *CPU 인스트럭션에 접근이 허가된 프로세서의 실행 모드를 말한다.
프로세서는 운영체제 소프트웨어에 애플리케이션 소프트웨어가 가진 것보다 높은 특권 레벨을 제공함으로써
오동장을 유발하는 애플리케이션이 시스템 전체의 안정성을 해치지 않게 보장할 수 있는 필수 기반을 운영체제
설계자에게 제공한다.
* CPU instruction : CPU 명령어
[ 특징 ]
+ 유저모드 +
1. 사용자 애플리케이션 코드가 실행한다.
2. 시스템 데이터에 제한된 접근만이 허용되며 하드웨어를 직접 접근할 수 없다.
3. 유저 애플리케이션은 시스템 서비스 호출을 하면 유저 모드에서 커널 모드로 전환된다.
4. CPU는 유저 모드 특권 수준으로 코드를 실행한다.
5. 유저 모드에서 실행하는 스레드는 자신만의 유저 모드 스택을 가진다.
+ 커널모드 +
1. 시스템의 모든 메모리에 접근할 수 있고 모든 CPU 명령을 실행할 수 있다.
2. 운영체제 코드나 디바이스 드라이버와 같은 커널 모드 코드를 실행한다.
3. CPU는 커널 모드 특권 수준에서 코드를 실행한다.
출처 : http://karasix.tistory.com/115
설정
트랙백
댓글
글
▶ 메모리 보호란?
컴퓨터 메모리의 사용을 제어하는 방법이며, 모든 운영 체제에서 중요한 쟁점 사항 중 하나이다.
운영 체제에서 실행하고 있는 프로세스가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것이
메모리 보호의 주된 목적이다. 이를 통해 프로세스 내의 버그가 다른 프로세스의 동작에 영향을 미치는 것을
예방하며, 악성 소프트웨어가 허가되지 않은 접근권한을 갖고, 시스템에 영향을 끼치는 것을 막아준다.
Ⅰ. ASLR
Address Space Layout Randomization 의 약자로,
메모리 상의 공격을 방어하기 위해서, 주소 공간 배치를 난수화 시키는 기법.
( 스택, 힙, 라이브러리 등의 데이터 영역 주소등을 난수화 시킨 주소로 프로세스 주소 공간에 배치하는 것. )
*PIE 가 걸려있지 않을땐 binary 영역이 정적이므로 binary 영역을 이용해 우회할 수있다. 주로 *ROP를 사용한다.
* PIE : Position Independent Executable 의 약자로, 바이너리에 적용되는 ASLR을 일컫는다.
PIE는 바이너리 영역이 배치된 주소를 알아낼 수 있는 메모리 릭 취약점이 존재할 경우 이를 알아온 후 ROP로 익스플로잇이 가능하다.
* ROP : Return Oriented Programming 의 약자로, 취약한 프로그램 내부에 있는 기계어 코드 섹션
( *Gadget ) 들을 이용하여, BOF 공격 시 특정 명령을 실행시키는 방법을 말한다.
이러한 ROP는 메모리 보호기법들을 우회할 수 있기 때문에 Fedora core 13( kernel 2.6.33.3-85 )에서
BOF 공격이 가능하다.
L ROP는 RTL, Chaning RTL calls, GOT overwrite의 3가지 특징적인 기술을 사용한다.
*Gadget : Gadget은 함수 끝에 기술되어 있는 ret 명령어를 포함한 상위 몇가지 명령어들의 집합이며,
이를 이용하여 단 한번의 실패없어 한번에 공격을 성공 할 수 있다.
Ⅱ. Stack Canary
gcc 4.1 버전 이후부터는 Stack Overflow를 방지하기 위해 SSP (stack-smashing protector) 기능이 내장되어 있다.
SSP는 함수 진입 시 스택에 Return address 와 frame pointer 정보를 저장할 때, 이 정보를 보호하기 위해
( Canary라고 부르는 ) 특정한 값을 기록해두고 함수에서 반환할 때 기록된 값이 변경되지 않았는지 검사한다.
만약 악의적인 사용자가 buffer overflow 등의 공격을 통해 스택 내의 정보를 덮어쓰려면,
canary 값을 먼저 덮어써야 하기 때문에, canary 값만 보면 공격이 일어났는지 볼 수 있다.
Canary 는 Window 에서의 메모리 기법인 Stack Cookie 와 같은 개념으로, Buffer 와 RET 사이에서 스택의 BOF를 모니터링 하는 역할을 담당한다.
Ⅲ NX ( DEP )
Non-eXecutable 의 약자로, 메모리 상의 보호를 위해 Stack 과 Heap 에서 코드가 실행되는 것을 막는 기법.
write 권한과 execute 권한을 동시에 갖지 않도록 메모리 페이지의 권한을 설정합니다.
공격자가 BOF 공격을 일으키면 옛날엔 그 메모리에 쉘코드를 넣고 Return Address를 쉘코드를
가르키게 하는 것이 가능했는데, DEP 가 적용된 상태에서는 실행 권한이 없으므로,
쉘코드가 있어도 프로그램에 대한 예외 처리가 발생되고 종료된다.
'Operating System > Linux' 카테고리의 다른 글
리눅스 명령어 (0) | 2015.08.26 |
---|
설정
트랙백
댓글
글
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 |
---|
RECENT COMMENT