나의 3번째 공부 기록공간 - 기본 Part : 운영체제 (3)

BE_{Potato.}·2023년 1월 29일
0

< 메모리 >

  • 메모리의 종류: 여러 종류가 있는데
    레지스터,캐시,메인메모리(RAM),보조저장장치(HDD,SSD) 등이 있음.
    (왼쪽으로 갈수록 속도빠름,용량작음,가격이 비쌈. 오른쪽으로 가면 속도느림,용량큼, 가격쌈)
  • 레지스터: 가장 빠른 기억장소로 CPU 내에 존재. 컴퓨터 꺼지면 데이터 날라가는 휘발성 메모리. 32bit, 64bit는 레지스터의 크기를 말함. CPU는 계산을 할 때 메인메모리에 있는 값을 레지스터로 가져와 계산함. 계산결과 다시 메인메모리 가져와 저장함.

  • 캐시: 휘발성 메모리. 메인메모리 안의 데이터를 레지스터로 옮기려면 굉장히 오래 걸리기 때문에 필요할 것 같은 값들을 미리 가져와 캐시에 저장. 성능의 이유로 캐시를 여러 개 둠.

  • 메인메모리(RAM): 실제 운영체제와 다른 프로세스들이 올라가는 공간. 전원이 없으면 데이터 지워지기 때문에 휘발성 메모리. 보조저장장치들보다 빠르지만 가격이 비싸기 때문에 실행중인 프로그램만 올림.

-보조저장장치(HDD,SSD): 가격이 저렴하고 비휘발성 메모리로 데이터들을 저장함.

< 메모리와 주소 >
-멀티프로그래밍 환경에서 여러 프로세스가 올라와 작업이 복잡해져 운영체제는 메모리를 관리하기 위해서 1바이트(8bit) 크기로 구역을 나누고 숫자를 매김. 이 숫자를 '주소'라고 함.
-32bit CPU는 레지스터 크기가 32bit,산술논리연산장치도,데이터가 이동하는 버스도 32bit임. CPU가 다룰 수 있는 메모리는 2의 32승인 4GB임. 64bit도 마찬가지. 64bit CPU가 다룰 수 있는 메모리는 2의 64승인 거의 무한대.

< 물리주소와 논리주소 >
메모리를 컴퓨터에 연결하면 0x0번지부터 시작하는 주소공간이 있는데 이를 "물리주소공간"이라고 부름.
사용자 관점에서 부르는 주소를 "논리주소공간"이라고 부름.
사용자는 물리주소를 몰라도 논리주소로 물리주소에 접근가능함.
운영체제를 위한 공간은 따로 마련해둠. 운영체제와 사용자 공간을 분리시키는 '경계 레지스터'를 만듬.경계 레지스터는 CPU 내에 존재하는 레지스터로 메모리관리자가 사용자 프로세스가 경계 레지스터값을 벗어났다고 판단하면 그 프로세스를 종료시킴.

< 절대주소와 상대주소 >
프로그래머는 프로그램이 실행될 주소를 신경 안 쓰는데 컴파일러가 메모리의 0번지에서 실행할 것이라고 가정해주기 때문. 이 컴파일러가 가정한 주소를 '상대 주소'라 함. 실제 프로그램이 메모리에서 실행되는 메모리관리자가 보는 주소는 '절대 주소'라 함.

  • 상대 주소 = 논리주소 공간 / 절대 주소 = 물리주소 공간
    메모리관리자는 사용자와 CPU가 요청한 상대주소에 재배치 레지스터값을 더한 위치의 데이터를 보내줌.재배치 레지스터에는 프로그램의 시작주소가 저장되어 있음.
    메모리 관리자 덕분에 모든 프로그램은 메모리의 0x0번지에서 시작한다는 가정으로 코딩할 수 있음. 시작영역이 바뀌더라도 재배치 레지스터만 바꿔주면 됨.

< 메모리 할당방식 >
큰 프로그램을 나누어서 실행시킬 부분만 메모리에 올리고 나머지를 하드디스크의 스왑영역에 올리는 것을 '메모리 오버레이'라고 함.
스왑: 스왑영역에 있는 데이터 일부를 메모리로 가져오고 메모리에 있는 데이터를 스왑영역으로 옮기는 것.
오늘날과 같이 멀티프로그래밍 환경에서는 메모리관리가 두가지 방식이 있음.
1.가변분할방식: 프로세스의 크기에 따라 메모리를 나누는 방식.
한 프로세스가 메모리의 연속된 공간에 할당되기 때문에 "연속 메모리 할당"이라 함.
가상 메모리 시스템 단에서는 가변 분할방식을 '세그멘테이션'이라 함.
(장/단점)
장점:메모리 연속되어 할당되기 때문에 프로세스의 크기에 딱 맞게 할당되기 때문에 '내부 단편화'가 없음
단점: '외부 단편화'가 발생. 중간에 프로세스들이 작업을 마치고 메모리에서 내려갈 때 메모리 중간중간에 빈 공간이 생기고 이를 다시 합치는 조각모음 과정에서 오버헤드가 발생하고 현재 실행중인 프로세스도 중단해야 함.
2.고정분할방식: 프로세스의 크기에 상관없이 메모리를 정해진 크기로 나누는 방식. 한 프로세스가 메모리에 분산되어 할당되기 때문에 "비연속 메모리 할당"이라 함.
가상 메모리 시스템단에서 고정 분할방식을 '페이징'이라 함. 책의 페이지처럼 크기가 정해져 있다고 해서 붙은 이름.
(장/단점)
장점: 구현이 간단하고 오버헤드가 적음.
단점: 작은 프로세스도 큰 영역에 할당되어 공간이 낭비되는 '내부 단편화'가 발생. 내부단편화를 해결하는 방법은 없고 분할되는 크기를 조절해 내부 단편화를 최소화시킴.

  • 버디시스템: 가변분할방식과 고정분할방식을 혼합한 방식. 메모리를 2의 제곱 단위로 분할해 메모리를 할당하는 방법. 프로세스의 크기에 따라 유동적으로 메모리를 분할.

< 가상 메모리 >

  • 가상메모리 개요
    : 사용자는 물리메모리의 크기와 프로세스가 메모리의 어느 위치에 올라가는지 신경쓰지 않고 0x0번지에서 실행한다고 가정하고 프로그래밍을 해도 된다. 가상메모리의 크기는 이론상 무한대이지만 실제는 물리메모리의 크기와 CPU 비트수로 결정됨. 가상메모리 시스템은 물리메모리 내용의 일부를 하드 디스크의 스왑영역으로 옮기고 처리가 필요할 때 물리 메모리로 가져와 실행.
    메모리관리자는 물리메모리와 스왑영역을 합쳐서 프로세스가 사용하는 가상주소를 물리주소로 변환함.이를 '동적 주소변환'이라고 함. 동적 주소변환을 거치면 프로세스는 마음대로 사용자 데이터를 물리메모리에 배치할 수 있음.
    가상 메모리시스템에서는 운영체제 영역을 제외한 나머지 영역을 일정한 크기로 나눠서 프로세스에게 할당함. 할당방식은 메모리할당방식과 동일하게 '가변 분할방식'과 '고정 분할방식'으로 나뉨.
    가상메모리 시스템에서 가상주소는 물리메모리나 하드디스크 스왑영역 중 한 곳에 위치함. 메모리 관리자는 가상주소와 물리주소를 일대일 매핑테이블로 관리함.

<세그멘테이션(배치정책)>
:세그멘테이션에서 프로그램은 함수나 모듈 등으로 세그먼트를 구성.
사용자와 프로세스,CPU가 바라보는 주소를 논리주소라 함. 물리주소로의 변환은 메모리관리자가 해줌.
메모리 관리자는 세그멘테이션 테이블을 가지고 있음. 이 테이블은 Base Address와 Bound Address를 가지고 있는데 이를 이용해 물리주소로 변환 가능.Bound Address는 세그먼트의 크기를 나타냄. 메모리관리자는 CPU에서 받은 논리주소와 Bound Address의 크기를 비교하고 크기가 작으면 논리주소+Bound Address를 물리주소로 송출함. 만약 논리주소가 더 크다면 메모리를 침범했다고 판단해 에러 던짐.
-> 세그멘테이션의 장점은 메모리를 가변적으로 분할 가능. 코드영역,데이터영역,스택,힙 영역을 모듈로 처리할 수 있기 때문에 공유와 각 영역에 대한 메모리 접근보호가 편리함.단점은 '외부 단편화' 발생.

<페이징(배치정책)>
:페이징은 메모리를 할당할 때 정해진 크기의 페이지로 나눔. 페이징에서 논리주소 공간도 일정한 크기로 균일하게 나눔. 이것을 '페이지'라고 부름. 물리주소공간도 페이지 크기와 동일하게 나뉘는데 이를 '프레임'이라고 부름. 메모리관리자는 페이지 테이블을 가지고 있다.

  • 세그멘테이션과 페이징의 차이점?
  • 비슷해보이지만 페이지의 크기가 다르다. 세그멘테이션은 프로세스마다 크기가 달라 Bound Address를 가지고 있지만, 페이징은 모든 페이지의 크기가 동일함.(바운드 어드레스 없음).
    세그멘테이션은 논리적인 영역별로 세그먼트를 나눔. 세그먼트마다 크기를 다르게 나눌 수 있기 때문에 코드,데이터,스택,힙영역을 나눌 수 있음.but, 페이징에서는 논리적인 영역으로 나누기 불가. 페이징은 특정영역을 떼서 공유하거나 권한을 부여하는 것이 더 어려움. 페이징에서 가장 신경써야하는 것은 페이지 테이블의 크기.

*메모리 접근권한: 메모리 특정의 특정 번지에 부여된 권한. 읽기,쓰기,실행이 있다.
프로세스에서 코드, 데이터,스택, 힙 영역 각각은
코드: 읽기와 실행 권한.
데이터: 변수가 저장되기 때문에 읽기 권한이 있고 쓰기 권한은 있거나/없음
스택,힙영역: 읽기,쓰기 권한이 있음.
메모리접근권한에 대한 검사는 가상주소에서 물리주소로 변환할 때 일어나는데 이 권한을 벗어났다고 확인되면 에러를 던짐.

< 페이지드 세그멘테이션 >
페이징기법과 세그멘테이션기법을 혼합한 방법. 이 방법의 단점은 메모리에 접근을 두번 해야한다는 점. 세그멘테이션 테이블을 참조할 때와 페이징 테이블을 참조할 때 두번.
이런 단점 때문에 현대 운영체제에서는 페이징과 페이지드 세그멘테이션기법을 적절히 섞어서 사용함.

< 디맨드 페이징(가져오기 정책) >
: 프로세스가 실행될 때 프로세스를 이루는 모듈 모두가 메모리에 올라와 실행되는 것이 아니라 필요한 모듈 일부만 올라와서 실행됨. 지역성 이론에 따라 이루어지는데
지역성 이론은 두가지가 있다.
1.공간의 지역성: 현재 위치와 가까운 데이터에 접근할 가능성이 높음.
2.시간의 지역성: 최근 접근한 데이터가 오래 전 접근한 데이터보다 접근할 가능성 높음.
(프로그램을 작성할 때 되도록 goto문을 쓰지 말라는 것은 지역성 이론에 따라 성능이 좋지 않기 때문임)

이 지역성이론에 따라 쓰일 데이터는 메모리에, 당분간 아닌 것은 하드디스크의 스왑영역에 올려놓음.
디맨드 페이징은 조만간 쓰일것 같은 페이지를 메모리로 가져오는 것.(지역성 이론을 구현)
디맨드페이징은 스왑영역을 보조장치에 저장하는데 성능향상을 위해선 스왑영역으로 데이터를 이동하는 것을 최소화시켜야 함.
스왑영역에서 메모리로 데이터 가져오는 것: 스왑인/
메모리에서 스왑영역으로 데이터 보내는 것: 스왑아웃
스왑인과 스왑아웃을 할 때 어떤 게 적절할지는 운영체제가 결정=>이 판단을 '페이지 교체정책'이라 부름.

< 페이지 교체정책 >
: 메모리가 꽉 찼을 때 어떤 페이지를 스왑영역에 보낼지 결정하는 것.
프로세스는 데이터 접근을 위해 메모리를 참조하는데 해당 데이터가 메모리에 없으면 Page fault 발생. 그리고 해당페이지를 스왑영역에서 메모리로 불러들여야 되는데 메모리가 꽉찼다면 메모리 중 하나를 선택해 스왑영역으로 보내야 함.
Optimum, FIFO, LRU의 방법을 사용함. 이 중에서는 LRU가 가장 좋은데
구현이 힘들어서 이와 유사한 클락 알고리즘을 개발함. 기본값을 0으로 하고 페이지가 참조되었다면 1로 고치고 페이지를 원형으로 놔두는 식. 이렇게 시계방향으로 돌다가 0인 페이지를 만나면 해당 페이지를 스왑영역으로 옮김.

< 스레싱과 워킹셋 >
: 멀티프로그래밍의 정도가 늘어나면 제한된 물리메모리에 모든 프로세스를 올려야하고, 당장 실행되는 프레임이 아닌 프레임은 스왑영역에 저장되고 많은 Page fault가 발생함. 스왑작업이 시간이 더 길어져 CPU 사용률이 떨어지게 됨. 운영체제는 CPU 사용률이 떨어지면 멀티프로그래밍의 정도를 늘리게 되고 CPU 사용률이 0에 가깝게 됨.
=> 이를 '스레싱'이라고 함. 스레싱의 근본적 원인은 물리메모리가 부족하기 때문. 램을 올려주면 스레싱 발생지점이 늦어지기 때문에 성능이 좋아짐.
프로세스가 실행되면 일정량의 페이지를 할당하고 Page fault가 발생하면 더 많은 페이지를 할당함. 반대로 페이지폴트가 너무 발생 안하면 페이지가 과다해 메모리를 낭비한다고 판단해 페이지를 회수함.이렇게 적절한 평균을 구하면 메모리에 올릴 집합을 만드는데 지역성이론을 따라서 구성함.=> 이를 워킹셋이라고 함. 워킹셋은 프로세스가 준비상태에서 실행상태가 되는 컨텍스트 스위칭 때에 사용됨.

< 주변장치 >
: 주변장치는 그래픽카드, 하드디스크, 마우스, 키보드 등.
주변장치는 메인보드에 있는 버스로 연결됨.
주변장치는 캐릭터 디바이스와 블록 디바이스로 나뉨. 데이터 전송단위가 캐릭터(문자)냐 블록이냐의 차이이다.캐릭터 디바이스에는 마우스,키보드,사운드카드,직렬/병렬포트가 있다.
블록 디바이스에는 하드디스크,SSD,그래픽카드 등이 있음. 캐릭터 디바이스는 상대적으로 적은 양의 데이터를 전송하고 블록 디바이스는 데이터양이 큼.

< 파일과 파일시스템 >
파일들은 저장장치에 저장됨. 운영체제는 파일 관리를 위해 파일관리자를 둠.(파일 시스템)
(파일시스템의 기능)
1.파일과 디렉토리 생성
2.파일과 디렉토리 수정/삭제
3.파일 권한 관리
4.무결성 보장
5.백업과 복구
6.암호화

  • 파일은 저장장치에 저장되기 때문에 전송단위가 블록임. 사용자는 파일을 바이트 단위로 접근하는데 이 블록에서 바이트로 변환을 파일관리자가 해줌.
    파일은 '헤더'와 '데이터'로 이루어져 있는데 헤더에는 파일의 속성들이 담김.
    파일은 데이터의 집합으로 볼 수 있는데 이 데이터의 집합을 어떻게 구성하느냐에 따라 종류를 나눌 수 있음.
    그 종류에는 1.순차파일구조: 파일의 내용이 연속적으로 이어진 형태.
    2.직접파일구조: 저장하려는 데이터를 해시함수를 통해 저장하려는 위치를 결정하는 파일구조임. 데이터포맷 중 JSON도 이 구조이다.
    3.인덱스파일구조: 음악을 들을 때에 재생목록과 같이 원하는 노래를 바로 재생할 수 있고, 노래가 연속으로 재생되기도 하는 느낌.

< 디렉토리 >
:관련있는 파일을 모아 놓고, 자식 디렉토리도 가질 수 있음. 최상위 디렉토리를 '루트 디렉토리'라고 함. 디렉토리도 파일이다.디렉토리에는 파일정보가 저장되어있음.

< 파일과 디스크 >
연속할당: 파일을 구성하는 블록들을 디스크에 연속적으로 저장하는 방식. 파일의 시작만 알면 전체를 알 수 있음.
불연속할당: 디스크의 비어있는 공간에 데이터를 분산해 저장하는 방식. 이 블록들은 파일 시스템이 관리함.
파일시스템은 효율적인 관리를 위해 빈 공간을 모아놓은 free block list를 가지고 있음. 만약 특정파일을 삭제한다면 파일은 파일의 모든 데이터를 지우는 것이 아니라 파일 테이블의 헤더를 삭제하고 free block list에 추가시킴. 포렌식으로 찾을 수 있음.


운영체제 강의가 끝났다. 처음 돌려 볼 때에는 내가 이걸 이해할 수 있을까 했었는데 두세번 듣고 블로그에 강의내용을 작성해보면서 들으니까 많이 익숙해졌다. 다음 순서로는 데이터베이스 공부를 해보려고 한다. 백엔드 직무에서 데이터베이스가 굉장히 중요하니까 집중해서 들어야겠다!

profile
항상 '기본'을 중요시하는 예비 백엔드개발자입니다!

0개의 댓글