안녕하세요, 환영합니다
네 이 비디오 세션에선 프로세스의 다른 메모리 부분을 얘기해보죠 c 코드를
써서요
이 프로그램은 시현용입니다 특정 사용 사례는 없어요
이 프로그램은 두 개의 전역 변수를 만드는 것으로 시작합니다
하나는 초기화되고 다른 하나는 미기록 상태죠
초기화 변수는 초기화 데이터 세그먼트에 저장됩니다 비증분화된 전역 변수는 비증분화된 데이터 세그먼트에
저장됩니다 ???????
프로그램 실행은 주요 기능부터 시작합니다
네 주요 함수의 모든 지역 변수는 스택으로 밀려오고 함수의 지역 변수는 그 특정 함수의 스택
프레임을 형성합니다 ???
이 경우엔 주요 함수의 모든 로컬 변수가 스택 프레임을 형성합니다
변수인 num1과 num2가 있습니다
케어포인터 p 거리
자동차 포인터와 자동차 배열
쌓아요
배경 음악
완충기 20
이것들은 저장소에 저장됩니다
하지만 여길 보세요
버프 캐스터는 환영줄과 같죠
포인터
버프는 저장소에 저장됩니다
하지만 문자열 환영은 스택에 저장되지 않습니다
텍스트 세그먼트에 저장하고 버프는 welcome string이 저장된 텍스트 세그먼트의 메모리 위치만
가리킵니다
다음 변수 스택_Vuff를 20으로 해 보죠
이 변수는 스택에 저장되고 데이터를 쌓아 데이터로 만듭니다
변수 콘텐츠의 스택 밑줄은 문자열 복사를 하고 새 값에 할당함으로써 변경되거나 변경될
수 있습니다 ,
하지만 버프한테는 안 통해요
둘 다 텍스트 세그먼트를 가리키니까요
텍스트 세그먼트는 우리가 논의한 대로 읽기 전용입니다
텍스트 세그먼트를 조작하려 하면 세그먼트 폴트가 발생합니다
이걸 예로 들어보죠
1이 10이고 2가 20이죠
프로그램을 실행하면요
이 값은 스택에 업데이트되고 __num 함수를 호출하면 이 함수의 로컬 변수가 스택
프레임으로 푸시됩니다 ????
intCount 변수가 있는 게 보이시죠 정적 형식입니다
그래서 count 변수는 스택에 저장되지 않습니다
초기화된 데이터 세그먼트에 저장됩니다
이제 이 함수는 두 개의 숫자를 더하고 처음엔 그 결과를 변수 res에 저장하고
함수에 주소 값을 반환합니다 호출된 거죠
이 경우엔 Adam 함수가 호출된 이 지점으로 반환합니다
하지만 이 기능의 모든 스택 프레임을 반환하기 전에 애덤은 삭제됩니다
즉 밑줄 치기의 모든 스택 변수가 다시 나타나고 스택은 다시
줄어들어서 스택 변수, 즉 스택 프레임만 갖게 됩니다.
좋습니다 다시 $를 추가합니다 num1과 num2라는 다른 값을 이용합니다 num1은 100에 같고 num2는
200에 같습니다
같은 과정이 반복됩니다
그러면 __ 함수를 추가하기 위한 새로운 스택 프레임을 형성하고 __ 함수를
추가하면 모든 스택 프레임이 삭제되고 실행은 호출되었던 지점으로 다시
돌아옵니다
더 가면 말록을 잡을 수 있어요
말록은 동적 기억 할당으로 간주됩니다
그리고 이 20 바이트를 힙 부분에 저장합니다
그리고 문자열로 hello를 입력하면 to the pointer 변수 str은 20 바이트가 할당된
힙 메모리 세그먼트를 가리킵니다 데이터를 문자열로 저장합니다
노드죠
포인터 변수 str은 스택에 저장됩니다 메모리는 할당되어 힙에 저장됩니다
이제 이 프로그램을 컴파일해서 결과를 보죠
프로그램을 정리했습니다
이제 프로그램을 실행하죠
Adam을 두 번 호출했기 때문에 두 번 출력이 나옵니다
코드에서 텍스트 세그먼트를 변경하려고 하는 부분을 활성화합니다
프로그램을 재편집하죠
이제 실행해보죠
보세요 구획화 결함이 발생합니다 텍스트 부분을 변경하려 하기 때문이죠 읽기
전용이에요
네 네 코드 세그먼트나 텍스트 세그먼트 같은 거요 네, 맞습니다
각 부분마다 지시 사항이나 프로그램이 들어 있어요
초기화 데이터 부분과 비증식 데이터 부분이 있습니다
네 로컬 변수를 저장하는 스택 세그먼트와 동적으로 메모리를 할당받는
힙 세그먼트를요
다음 시간에는 프로세스의 가상 메모리의 중요한 개념을 배워 보겠습니다
고마워요