c언어를 처음 배우기 위해 교재에 적힌 코드를 MSVC(Microsoft visual c++ compiler)에서 사용하면 다음과 같은 경고 메세지와 함께 컴파일을 거부 당한 경험이 있을 것이다.

‘scanf‘: this function or variable may be unsafe. Consider using scanf_s instead. …(생략)

무엇이 문제인지 검색해보면 보안 문제 때문에 개선된 함수를 사용하라는 경고라고 알려주지만 컴퓨터 구조에 대한 이해가 적을 때는 경고 문구가 와닿지 않아 무시하는 방법을 찾고는 했다.

이번에는 컴퓨터 구조, 원리와 함께 위에서 언급된 보안 문제가 정확히 어떤 문제를 뜻하는지 알아보려고 한다.

<aside> 💡 이번 글은 cpu의 작동 방식 부터 c언어의 함수가 작동하는 방법까지 단계적으로 설명할 것이다. 보통 전공 수업에서도 한번에 배우는 내용은 아니기에, 어렵다면 실습부터 확인해도 무방하다. 그러나 왜 이런 문제가 발생하는지 궁금하다면 천천히 따라오는 것을 권한다.

</aside>

목차

스택의 구조

cpu의 구조 - 캐시

보통 c언어를 공부할 때 cpu가 메모리에 있는 정보를 불러온다고 배우지만 사실 그 중간에 생략된 과정이 있다.

cpu는 ram에서 정보를 불러오지만 ram 또한 정보를 불러오는 속도가 cpu의 속도보다 느리다. 따라서 이를 보완하기 위해 cpu에는 캐시라는 고속 메모리가 있다.

<aside> 💡 데이터를 불러오거나 저장을 할 때 인터럽트(interrupt)라고 불리는 과정이 있다. 이는 cpu의 처리 속도보다 데이터가 이동하는 속도가 현저히 느리기 때문에 저장/불러오기가 완료 될 때 까지 cpu가 대기하는 상황을 이야기한다. 인터럽트가 자주, 길게 존재 할수록 컴퓨터의 처리 속도는 느려질 수 밖에 없다. 따라서 자주 접근하는 데이터는 캐시에 저장하여 속도 문제를 극복하려 한 것이다.

</aside>

캐시는 크기와 속도에 따라 3개로 나누어진다. (각 계층마다 용도도 나누어지지만 다른 글에서 다루겠습니다)

  1. L1 캐시:
  2. L2 캐시:
  3. L3 캐시:

따라서 cpu가 데이터를 레지스터에 저장하는 과정은 다음과 같다.

  1. cpu는 1순위로 L1캐시를 확인한다.
  2. 만약 L1 캐시에 필요한 값이 없다면 L2 캐시를 확인한다.
  3. L2 캐시에 필요한 값이 없다면 L3 캐시를 확인한다.