내가 잘못 알고 있던 OS 지식
1. 운영체제 입장에서 보면 프로세스도 스레드의 일종이 아닐까? --> NO
헷갈렸던 부분이 커널 레벨 스레드라는 부분을 읽고 프로세스도 스레드의 일종인가?라는 생각을 하게 됐었다.
스레드는 커널 레벨 스레드, 사용자 레벨 스레드로 나눌 수 있다. 커널 레벨 스레드는 OS가 스레드의 존재를 알고 직접 관리하는 스레드이고, 사용자 레벨 스레드는 OS가 스레드의 존재를 모르고 프로세스 자체에서 관리하는 스레드이다. 프로세스가 생성되면 적어도 1개 이상의 커널 레벨 스레드가 생성된다.
각종 설명을 듣고 내가 다시 이해한 부분은 다음과 같다. 커널 레벨 스레드는 프로세스가 커널과 소통하는 창구와 비슷하다고 이해했다. 커널 레벨 스레드가 유효성 있게 사용되는 환경은 멀티코어 환경에서다. CPU는 한 번에 하나의 일만 할 수 있다. 하지만 한 프로세스의 커널 레벨 스레드가 여러 개라면, 커널이 스레드를 관리하기 때문에 여러 CPU에게 커널 레벨 스레드들을 나눠서 일을 시킬 수 있다. 단일 코어에서도 커널 스레드를 통해 더 적은 오버헤드를 가지고 기능 전환이 이루어지기 때문에 한 프로세스에서 커널 레벨 스레드가 여러개 생길 수도 있다.
커널 레벨 스레드라도 OS가 관리하는 스레드이기 때문에 CPU에서 스레드가 바뀔 때, context switch가 일어난다. 하지만, 문맥교환에서 교체되는 데이터의 양이 프로세스인 경우보다 훨씬 적다. 커널 레벨에서 공유하는 자원이 있기 때문에 커널 레벨 스레드 간의 공유하지 않는 자원만 교체되기 때문이다.
사용자 레벨 스레드라면 OS가 존재를 모르고 관여하지 않기 때문에 context switch 자체도 일어나지 않는다. 그렇기 때문에 오버헤드가 줄어든다는 것이다.
프로세스와 스레드의 가장 큰 차이는 독자적인 주소영역을 생성하여 가지는가, 주소 영역 중 일부(code, data, heap 등)를 공유하는 부분이 있는가에 따라 나뉘는 것 같다.
2. Context Switch에 대한 잘못된 이해
어디서 생긴 오해인지 모르겠으나, context switch의 개념을 swapping의 개념이랑 같은 것이라고 이해하고 있었다. 하지만, 문맥 교환과 스와핑은 아예 다른 개념이다.
Context switch는 CPU의 레지스터에서 일어나는 과정이다. 현 프로세스의 문맥을 PCB에 저장해서 메모리에 저장한 후, 다음 프로세스가 사용하던 memory의 주소와 레지스터 값을 레지스터에 올려 실행하는 것이다. Context switch는 메인 메모리에서 일어나는 것이 아니라 CPU 레지스터 단위에서 일어나는 것이다.
물리 메모리에는 메모리 공간이 가능하다면 여러 프로세스가 올라올 수 있다! ( 언제부터인지 물리 메모리에는 프로세스 하나만 올라오고 나머지는 swap area에 있다고 생각했었다. --> NO!! ) 메모리 공간이 가능하다면 여러 프로세스가 올라올 수 있는데 어느 순간 물리 메모리 공간이 부족해지면, 물리 메모리의 확장 개념으로 swap area를 사용하고 swap out 시켜 쫓아내는 것이다. degree of process가 disk IO가 빈번하게 일어나는 것을 방지하기 위해서 물리 메모리에 올라오는 프로세스의 수를 조절하는 것을 의미한다.
3. Virtual Address, Virtual Memory에 대한 잘못된 이해
Virtual memory를 사용하는 개념은 처음 정리할 때 부터 이해가 안 되었다. 그래서 스스로 잘 못 구조화되어 머릿속에 넣게 되었다. virtual address, virtual memory는 swap 영역에 있는 해당 프로세스의 데이터라고 생각했다! --> NO!!! (21.11.13 지금 생각해보면 이 말은 맞는 얘기인 것 같다.. Yes..)
가상 주소, 가상 메모리와 swap area에 있는 데이터는 별개의 개념이다!!
Virtual address는 CPU가 바라보는 프로세스의 메모리 주소이다. 소스코드를 생성한다 -> 컴파일해서 실행 파일을 만든다(실행파일은 디스크에 파일의 형태로 존재한다) -> 파일을 실행하려면 CPU가 참조하여 실행해야 한다(이때, CPU가 바라보는 주소가 virtual address이다.)
여기서 또, 파일이 디스크의 sector에 저장되는 것과 메모리가 저장되는 것은 다른 내용이다! 파일의 위치를 disk에서 찾는 것은 OS가 가진 여러 정보를 가지고 disk IO가 일어나서 찾게 되는 것이고, 그 파일 안에 존재하는 메모리 데이터는 별개의 의미이다. 디스크의 어디엔가 존재하는 파일을 주소 변환하여 물리 메모리로 불러주는 것이다. Virtual memory의 개념을 통해서 각각의 프로세스는 자신이 마치 메인 메모리의 공간을 다 사용하고 있다고 생각하게 된다. 따라서 virtual memory address는 모든 프로세스가 0번지부터 시작할 수 있다.
CPU가 실행하려면 물리 메모리에 올라와야 하는데, MMU에 의해서 CPU가 작업할 수 있게 물리 메모리의 주소로 변환해주는 주소변환이 일어난다. 주소 변환에 사용되는 테이블이 존재하는데 이것은 OS가 프로세스 별로 관리한다. 프로세스가 교체되면 해당 프로세스에 맞는 테이블을 참조하여 주소변환이 일어나는 것이다. 주소변환 시, 빠르게 사용하기 위해서 TLB라는 버퍼를 사용하는데, 프로세스가 바뀌면 TLB를 비워내고 해당 프로세스에 맞게 채워나가게 된다.
Virtual memory의 개념을 통해서 각각의 프로세스는 자신이 메인 메모리의 공간을 다 사용하고 있다고 생각하게 된다. 하지만 실제는 그렇지 않기 때문에 주소변환을 통해서 그렇게 느끼도록 해주는 것이다. 이것의 개념은 virtual CPU 개념과 비슷하다. 단일 코어에서 CPU는 한 번에 하나의 프로세스만 실행할 수 있다. 하지만 CPU에서 프로세스의 실행시간을 매우 작게 만들어 번갈아가며 실행시켜 여러 프로그램이 동시에 실행되는 것처럼 느껴지게 하는 것이 virtual CPU 개념이다.
CPU와 가까운 순서대로 메모리를 나타내면 CPU - register - cache memory - physical memory(Main memory) - secondary memory(Disk) 가 되는데 TLB는 cache memory~physical memory 정도 위치에 존재한다고 들은 것 같다.
2번에서 말했든이 swap area는 physical memory의 공간이 부족해질 때, 그것을 확장해서 사용하는 개념일 뿐이다. 다른 개념들과 헷갈려하지 말자.
- MMU 내용 참고하면 좋은 블로그 : recipes.egloos.com/5232056
OS에 대한 잘못된 개념 지식을 가지고 있는 것들이 많았다. 아마 여전히 잘못 생각하고 있는 것들이 많을 수 있다. 지금 이해한 내용 중에서도 잘못된 내용이 많을 수 있다. 너무 어렵다.😂 앞으로 잘못 이해하고 있는 내용이 발견되면 꾸준히 업데이트해보도록 하겠다! 잘못된 지식을 바로 잡는데 많은 도움을 받았고, 그 과정에서 공부가 많이 되었다.😀