꾸준한 개발자

계속적인 성장을 추구하는 개발자입니다. 꾸준함을 추구합니다.

계속 쓰는 개발 노트

분류 전체보기 199

페이지 교체 정책

FIFO 가장 먼저 들어온 페이지를 교체합니다. OPT 최적 페이지 교체 알고리즘으로 앞으로 가장 오랫동안 사용하지 않을 페이지를 교체합니다. 일반 OS에서는 구현 불가능합니다. LRU 가장 오래 전에 사용된 페이지를 교체합니다. LFU 가장 적게 사용한 페이지를 교체합니다. NUR LRU와 마찬가지로 최근에 사용하지 않은 페이지부터 교체합니다. 각 페이지마다 참조 비트(R), 수정 비트(M)를 둡니다. (R,M) -> (0, 0), (0, 1), (1, 0), (1, 1) 순으로 페이지를 교체합니다. 번외-> 스레싱(Thrashing) 반복적으로 페이지 폴트가 발생해서, 과동하게 페이지 교체 작업이 일어나서 실제로는 아무일도 하지 못하는 상황을 스레싱이라 합니다.

운영체제 (OS) 2021.04.23

가상 메모리 - 페이징 시스템

크기가 동일한 페이지로 가상 주소 공간과 이에 매칭하는 물리 주소 공간을 관리합니다. 이를 페이징이라 합니다. 페이징을 하기 위해서는 하드웨어 지원이 필요하며 리눅스의 경우 4KB로 페이징을 나누고 있습니다. 페이지 번호를 기반으로 가상 주소 혹은 물리 주소 매핑 정보를 기록하고 사용합니다. 페이징 시스템 프로세스의 PCB에 Page Table 구조체를 가리키는 주소가 들어있습니다. Page Table에는 가상 주소와 물리 주소 간 매핑 정보가 있습니다. page는 고정된 크기의 block(4KB)을 갖게 됩니다. 프로세스 생성 시, 페이지 테이블 정보를 생성하게 되는데 PCB 등에서 해당 페이지 테이블에 접근 가능하고 관련 정보는 물리 메모리에 적재돼 있습니다. 프로세스 구동 시, 해당 페이지 테이블 ..

운영체제 (OS) 2021.04.22

가상 메모리

리눅스의 경우 하나의 프로세스가 4GB를 갖습니다. 통상 보통 메모리는 8GB 혹은 16GB입니다. 코드는 메모리에 반드시 있어야 되는데, 실제 각 프로세스마다 충분한 메모리를 할당하기에는 메모리 크기가 한계가 있습니다. 이러한 문제를 해결하기 위해 가상 메모리가 나왔습니다. 메모리가 실제 메모리보다 많아 보이게 하는 기술입니다. 주소가 2개가 필요하게 됩니다. virtual address(가상 주소)는 프로세스가 참조하는 주소입니다. 부분적으로 메모리에 올라가는 실제 메모리 주소를 physical address라고 합니다. MMU(Memory Management Unit) 가상 메모리 주소를 물리 주소로 빠르게 변환시켜주는 하드웨어입니다. CPU는 가상 메모리를 다루고, 실제 해당 주소 접근 시 MMU..

운영체제 (OS) 2021.04.22

스레드 교착 상태(Deadlock)와 기아 상태(Starvation)

교착 상태(Deadlock) 무한 대기 상태로, 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있어서 다음 단계로 진행하는 못하는 상태를 말합니다. 1. 상호배제 2. 점유대기 3. 비선점 4. 순환대기 위 4가지 조건이 성립될 때 Deadlock이 발생합니다. 조건 중에 일부를 성립이 안되도록 하면 해결할 수 있습니다. 기아 상태(Starvation) 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태를 말합니다. 교착 상태는 여러 프로세스가 동일 자원 점유를 요청할 때 발생하고, 기아 상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 영원히 자원 할당이 안되는 경우에 주로 발생합니다. 기아 상태를 해결하기 위해서는 우선순위를 변경..

운영체제 (OS) 2021.04.22

스레드 동기화 문제

스레드는 실행 순서가 정해져있지 않습니다. 그렇다보니 순서가 꼬일 수 있는 오류가 있습니다. 이러한 오류를 동기화(synchronization) 이슈라고 합니다. 그래서 스레드 관리가 필요합니다. 동기화 이슈가 생기면 디버깅하기도 어렵습니다. 위 코드는 50개의 스레드를 생성하고 실행합니다. 스레드를 다 실행하고 나서 메인 스레드로 돌아오게 됩니다. join() 함수를 통해서 모든 스레드가 끝날 때까지 기다리게됩니다. 실제로 위 코드를 실행하면 실행할 때마다 결과값이 다릅니다. 만약 스레드 1이 덧셈까지만 동작하고 context switching 되고 다음 스레드 2에서도 덧셈까지만 하고 context switching이 되면서 스레드 1로 돌아오면 그때 g_count를 저장 하고 다시 스레드 2로 돌아..

운영체제 (OS) 2021.04.22

네트워크 용어 정리 (3)

네트워크 계층 네트워크 계층은 다른 네트워크와 통신하기 위한 경로 설정을 위해 라우터를 통한 라우팅을 하며 패킷 전송을 담당합니다. IP (Internet Protocol, 인터넷 프로토콜) 인터넷에 있는 한 컴퓨터에서 다른 컴퓨터로 데이터를 보내는데 사용되는 네트워크 계층 프로토콜입니다. IP 주소 컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신하기 위해 사용하는 주소입니다. IP 주소 클래스 IPv4에서 사용하는 주소 그룹에는 다섯 개가 있습니다. A, B, C 클래스는 네트워크 ID와 호스트 ID로 구성되며, D 클래스는 멀티캐스트 주소로 사용됩니다. E 클래스는 필요에 따라 사용하기 위해 확보해 놓은 것입니다. 라우터 (router) 서로 다른 네트워크를 연결해 주는 장치로 현재의 네트워크에서 ..

네트워크 2021.04.21

스레드

Light Weight Process라고도 부릅니다. 프로세스의 경우에는 프로세스 간에 데이터 접근이 불가능했지만, 스레드의 경우 하나의 프로세스에 여러 개의 스레드를 생성할 수 있고 스레드들은 동시에 실행 가능합니다. 또한 프로세스 안에 있기 때문에 프로세스의 데이터에 모두 접근 가능합니다. IPC 기법이 필요하지 않습니다. 스레드는 stack 영역에 생성되면서 각 스레드 별로 stack pointer와 pc를 갖게됩니다. stack 영역만 스레드 별로 구분되고 heap과 data, code 영역은 같습니다. 그렇기 때문에 IPC 기법 없이도 데이터 공유가 가능합니다. 보통 소프트웨어 병행 처리를 위해서는 multi thread를 사용합니다. 멀티 태스킹은 하나의 cpu에 여러 프로세스를 실행하는 것이..

운영체제 (OS) 2021.04.21

프로세스 총 정리 및 성능 개선 방법

처음에 컴파일을 합니다. 그러면 실행 파일이 만들어집니다. 일반 사용자가 이 실행 파일을 생성하기 위해서는 쉘을 사용합니다. 프로세스 구조(text, data, heap, stack) 맞춰서 데이터가 들어갑니다. 믈론 바로 실행되는건 아닙니다. 프로세스가 ready state에 위치하게 됩니다. 하드웨어로 부터 일정 시간 마다 타이머 인터럽트를 운영체제에 알려줍니다. 인터럽트가 일어나면 CPU는 사용자 모드를 커널 모드로 바꿔주고 IDT에서 0x80에 해당하는 주소(함수)를 찾아서 실행합니다. 그에 해당하는 함수를 실행하게 됩니다. ready state에서 running state로 바뀌게 되면서 이전에 running state에 있던 프로세스의 PCB 정보를 메인 메모리에 저장하고 해당 프로세스 PCB..

운영체제 (OS) 2021.04.21

프로세스간 커뮤니케이션 - signal과 socket

시그널 (signal) 유닉스에서 30년 이상 사용된 전통적인 기법입니다. 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생되었는지를 알려주는 기법입니다. 시그널은 미리 정의된 이벤트입니다. SIGKILL 같은 경우 프로세스를 끝내는 이벤트를 보냅니다. SIGALARM은 알람을 발생시킵니다. 이렇게 운영체제 단에 정의가 돼 있습니다. 프로세스 관련 코드에 관련 시그널 핸들러를 등록해서, 해당 시그널 처리를 실행합니다. PCB에서 해당 프로세스가 블록 또는 처리해야하는 시그널 관련 정보를 관리합니다. 커널 모드에서 사용자 모드로 스위칭 시 시그널을 확인합니다. 소켓 (socket) 소켓은 네트워크 통신을 위한 기술입니다. 기본적으로는 클라이언트와 서버 등 두 개의 다른 컴퓨터 간의 네트워크 기반 ..

운영체제 (OS) 2021.04.20

IPC 기법 (1)

파이프 기본 파이프는 단방향 통신입니다. (부모 -> 자식) fork()로 자식 프로세스를 만들었을 때, 부모와 자식간의 통신이 가능합니다. 데이터는 커널 공간에 위치합니다. 메시지 큐 (message queue) 기본은 FIFO 정책으로 데이터를 전송합니다. 메시지 큐는 fork()를 할 필요없이 key 값을 알고 있으면 됩니다.어느 프로세스간에라도 데이터 송수신이 가능합니다. 즉 양방향 통신이 가능합니다. 공유 메모리(shared memory) 노골적으로 kernel space에 메모리 공간을 만들고, 해당 공간을 변수처럼 쓰는 방식입니다. message queue처럼 FIFO 방식이 아니라, 해당 메모리 주소를 마치 변수처럼 접근하는 방식입니다. 공유 메모리 key를 가지고, 여러 프로세스가 접근 ..

운영체제 (OS) 2021.04.19