7주차 퀴즈 복습

1번 문제

페이징과 세그멘테이션의 정의 및 각각의 장단점에 대해 서술하시오.

[답안]
{개념}
세그멘테이션(Segmentation)과 페이징(Paging)은 컴퓨터 메모리 관리 방법입니다.

세그멘테이션
이는 메모리를 의미 있는 단위인 '세그먼트'로 나누는 방법입니다. 각 세그먼트는 시작 주소와 길이를 가지며, 다른 유형의 데이터(예: 코드, 데이터, 스택)를 위해 사용됩니다. 세그멘테이션은 메모리를 더 유연하게 관리할 수 있게 해주며, 프로그램의 논리적 구조를 반영할 수 있습니다.

페이징
페이징은 메모리를 동일한 크기의 블록, 즉 '페이지'로 나누는 방법입니다. 각
페이지는 가상 메모리 주소와 매핑되며, 페이지 테이블을 통해 물리적 메모리 주소로
변환됩니다. 페이징은 메모리 관리를 단순화하고, 메모리의 낭비를 줄이며, 프로그램 간의
메모리 충돌을 방지합니다.


{장단점}
세그멘테이션
장점

  • 메모리를 논리적 단위로 나누어 프로그램의 구조를 반영함.
  • 세그먼트별 보호와 공유가 용이함.

단점

  • 외부 단편화 발생 가능성이 있음.
  • 메모리 관리가 복잡해질 수 있음.

페이징
장점

  • 외부 단편화 문제를 해결함.
  • 메모리 관리가 상대적으로 단순함.

단점

  • 내부 단편화 발생 가능성이 있음.
  • 페이지 테이블 관리에 추가적인 메모리가 필요함.

2번 문제

메모리에는 다음과 같은 블록들이 있으며, 각 블록의 크기는 괄호 안에 표시되어 있습니다.
메모리 블록: A(10), B(50), C(25), D(30), E(40)

다음 순서로 메모리 요청이 들어옵니다.
요청 순서: 1(30), 2(25), 3(25), 4(10)

First-fit에 대한 예시를 보고, Next-fit과 Best-fit일 때요청에 대한 메모리 할당 순서를 기록하세요.

예) First-fit
1 - B
2 - C
3 - D
4 - A

[답안]
Next-Fit은 최근 할당된 시점으로 바로 다음에 할당한다. 할당만 가능하면 바로 넣는다.
Next-Fit
1 - B
2 - C
3 - D
4 - E

Best-Fit은 최적으로 들어갈 수 있는 메모리 공간에 할당한다. 단편화 최소화한다.
Best-Fit
1 - D
2 - C
3 - E
4 - A


3번 문제

DMA의 기본 개념을 설명하고, DMA가 시스템 성능에 미치는 이점을 두 가지 이상 제시하시오.

[답안]
DMA는 Direct Memory Access의 약자로, CPU의 중재 없이 주변장치가 메모리에 직접 접근하여 데이터를 읽고 쓸 수 있게 해주는 시스템의 한 기능이다. DMA를 사용함으로써, 데이터 전송 과정에서 CPU가 필요하지 않으므로, CPU는 다른 작업을 수행하는 데 더 많은 시간을 할애할 수 있다. 이는 시스템 성능의 향상으로 이어지는데, 특히 I/O 작업이 많은 시스템에서 그 이점이 두드러진다.

첫째, CPU의 부하가 감소하여 전체 시스템의 효율성이 증가한다.
둘째, 데이터 전송 속도가 향상되므로, 전반적인 시스템 응답 시간이 단축된다.


4번 문제

다음 코드의 출력 값을 예측해 보시오.

#include <stdio.h>
int main(int argc, char *argv[])
{
    int arr[2][3] = {1,2,3,4,5,6};
    int (*p)[3] = NULL;
    p = arr;
    
    printf("%d\n", *(p[0] + 1) + *(p[1] + 2));
    printf("%d\n", *(*(p + 1) + 0) + *(*(p + 1) + 1));
    return 0;
}

[답안]
위의 배열 arr은 세로 2줄 가로 3줄인 2차원 배열을 의미합니다. 그러므로 밑에와 같이 나타낼 수 있습니다.

arr[0][0] = 1   arr[0][1] = 2   arr[0][2] = 3
arr[1][0] = 4   arr[1][1] = 5   arr[1][2] = 6

int (p)[3] = NULL; *은 arr이 3개의 int 배열 2개를 가지고 있으므로,
int [2][3] → 배열 이름인 arr은 `int (
)[3]로 decay(변형) 됩니다. 따라서 p = arr;은 타입이 일치합니다. pint (*)[3]이니까 p = arr;`은 유효한 대입입니다.

결론적으로, p는 int[3] 배열을 가리키는 포인터이고,
****p = arr;로 설정하면 p[0] = {1, 2, 3}을 의미하고 p[1] = {4, 5, 6}을 의미합니다.

printf("%d\n", *(p[0] + 1) + *(p[1] + 2)); 해당 출력값은 p[0][1] + p[1][2] 의 값을 구하라는 의미와 같습니다. 2 + 6 = 8 이 출력으로 나오게 됩니다.

printf("%d\n", *(*(p + 1) + 0) + *(*(p + 1) + 1)); 해당 출력값은 p자체에 +1이 붙어 있으므로 p[1][0] + p[1][1] 의 값을 구하라는 의미와 같습니다. 4 + 5 = 9 가 출력으로 나오게 됩니다.

출력값: 8, 9


5번 문제

1 2 4 4 3 5 5 6의 입력이 Do it 알고리즘 책 p.294의 알고리즘에 주어질 때의 상태를 그리면 됩니다. 주어진 입력으로 부터 p.294의 1단계를 거치고 나서 부터 그리면 되고, p.291의 그림을 그릴 때는 좌측의 힙(트리)은 그리지 않아도 됩니다. 배열 상태로 부터 힙은 충분히 그릴 수 있기 때문입니다.

[답안]

위와 같이 전개됩니다.

처음 : 6 4 5 2 3 4 5 1
'0' : 5 4 5 2 3 4 1 6
'1' : 5 4 4 2 3 1 5 6
'2' : 4 3 4 2 1 5 5 6
'3' : 4 3 1 2 4 5 5 6
'4' : 3 2 1 4 4 5 5 6
'5' : 2 1 3 4 4 5 5 6
'6' : 1 2 3 4 4 5 5 6
Final : 1 2 3 4 4 5 5 6

profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글