꾸준한 개발자

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

계속 쓰는 개발 노트

운영체제 28

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

처음에 컴파일을 합니다. 그러면 실행 파일이 만들어집니다. 일반 사용자가 이 실행 파일을 생성하기 위해서는 쉘을 사용합니다. 프로세스 구조(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

프로세스간 커뮤니케이션

왜 필요할까? 프로세스들이 서로의 공간에 쉽게 접근하기 어렵습니다. 즉, 다른 프로세스의 주소에 접근하는 방법은 없습니다. 이에 프로세스간 통신을 할 수 있도록 했는데 이러한 기법을 IPC (Inter Process Communication)라 합니다. 프로세스간 통신은 성능을 높이기 위해 여러 프로세스를 동시에 실행할 때 필요합니다. 또한 웹서버로 요청이 올 때마다 프로세스를 따로 만들어서 응답할 때 상태값을 공유할 때도 필요합니다. 코드 간의 접근은 안되지만 저장매체는 공유가 가능합니다. 이러한 것도 IPC 기법이 될 수 있습니다. 하지만 파일을 통한 IPC 기법은 한계가 있습니다. file을 사용하면, 실시간으로 직접 원하는 프로세스에 데이터 전달이 어렵습니다. IPC 기법 종류 1. file 사용..

운영체제 (OS) 2021.04.19

프로세스와 컨텍스트 스위칭

스케줄러가 하나의 응용 프로그램의 A 프로세스를 running 상태로 바꿔주다가 어느순간 B 프로세스를 running 상태로 바꿔주는 것이 컨텍스트 스위칭입니다. 전환할 때 PC와 SP의 데이터를 PCB라는 저장 메모리에 따로 저장합니다. 그 후 컨텍스트 스위칭이 이루어집니다. 다시 이전의 프로세스를 running 시킬 때, PCB 메모리를 확인합니다. 그 값을 CPU 레지스터 값에 덮어씌웁니다. PCB (Process Control Block)에는 Process ID, Register 값, Scheduling Info (Process State), Memory Info (메모리 사이즈 limit) 등이 저장됩니다. 정리해서 PCB는 프로세스가 실행 중인 상태를 캡쳐 / 구조화해서 저장하는 메모리 공간입..

운영체제 (OS) 2021.04.19

프로세스 구조와 스택 오버플로우

DATA 영역은 BSS와 DATA로 구분됩니다. BSS는 초기화되지 않은 전역변수, DATA는 초기값이 있는 전역변수가 저장됩니다. 스택 오버 플로우는 스택 포인터가 스택의 경계를 넘어설 때 일어납니다. (위키백과 참조) 데이터를 저장할 때 해당 데이터가 스택 메모리 사이즈보다 더 많은 스택 메모리를 사용하면서 발생하는 에러 상황입니다. 스택 메모리 사이즈보다 많은 데이터를 저장할 때는 다른 stack의 메모리 공간에 덮어 씌어지면서 저장됩니다. 만약 해커가 자신이 원하는 함수의 위치로 저장시키면서 공격을 할 수 있습니다.

운영체제 (OS) 2021.04.18

프로세스와 컨텍스트 스위칭 - 프로세스 구조

CODE 영역에 컴파일러된 코드가 저장됩니다. DATA 영역에는 변수로 선언된 데이터가 저장됩니다. STACK 영역에는 함수의 return address 값과 인자, 변수 데이터가 저장됩니다. STACK 부분은 계속 저장돼있지 않고 실행이 완료되면 차례로 삭제된 후 CODE 영역에서 다음 코드를 진행합니다. HEAP 영역은 동적으로 생성되는 데이터들이 저장됩니다. 정리를 하면 프로세스는 다음과 같이 구성됩니다. TEXT(CODE): 코드 DATA: 변수/초기화된 데이터 STACK: 임시 데이터(함수 호출, 로컬 변수 등) HEAP: 코드에서 동적으로 만들어지는 데이터 * stack에는 함수가 실행될 때마다 EBP 레지스터에 저장된 주소값이 상단에 들어가게 되는데, 오류가 났을 때 어느 함수에서 문제가 발..

운영체제 (OS) 2021.04.18

프로세스와 스케줄러의 이해 - 인터럽트 내부 동작

시스템 콜 인터럽트 시스템 콜 실행을 위해서는 강제로 코드에 인터럽트 명령을 넣어, CPU에게 실행시켜야 합니다. eax 레지스터에 시스템 콜 번호를 넣고, ebx 레지스터에는 시스템 콜에 해당하는 인자값을 넣고, 소프트웨어 인터럽트 명령을 호출하면서 0x80값을 넘겨줍니다. 그 후 CPU는 사용자 모드를 커널 모드로 바꿔줍니다. IDT에서 0x80에 해당하는 주소를 찾아서 실행합니다. system_call() 함수에서 eax(시스템 콜 번호)로부터 시스템 콜 번호를 찾아서, 해당 번호에 맞는 시스템 콜 함수로 이동합니다. 해당 시스템 콜 함수를 실행한 후, 다시 커널 모드에서 사용자 모드로 변경하고, 프로세스의 다음 코드를 진행합니다. 인터럽트와 IDT 인터럽트는 미리 정의되어 있어서 각각 번호와 실행..

운영체제 (OS) 2021.04.18

스케줄링 알고리즘 (3) - 인터럽트

인터럽트란 CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생해서 처리가 필요할 경우에 CPU에 알려서 처리하는 기술입니다. 만약 block state 단계에 들어있는 응용 프로그램은 wait 작업이 끝나면 CPU에 끝났다고 알려줘야 됩니다. 그러한 역할을 하는 것이 인터럽트입니다. 인터럽트 필요 이유 선점형 스케줄러의 경우 프로세스 running 중에 스케줄러가 이를 중단시키고, 다른 프로세스로 교체하기 위해서 현재 프로세스 실행을 중단시킬 때 사용됩니다. 즉, 스케줄러 코드가 실행되서 현 프로세스 실행을 중단시키는 것이 인터럽트입니다. IO Device에서는 저장매체에서 데이터 처리 완료 시, 프로세스를 block state에서 ready state로 이동됩니다...

운영체제 (OS) 2021.04.17

프로세스와 스케줄러의 이해 (1) - 선점형과 비선점형 스케줄러

선점형 스케줄러 하나의 프로세스가 다른 프로세스 대신에 CPU를 차지할 수 있습니다. 비선점형 스케줄러 하나의 프로세스가 끝나지 않으면 다른 프로세스는 CPU를 사용할 수 없습니다. 선점형과 비선점형 스케줄러 차이 비선점형은 프로세스가 자발적으로 blocking 상태로 들어가거나, 실행이 끝났을 때만, 다른 프로세스로 교체 가능합니다. 선점형의 경우, 프로세스 running 중에 스케줄러가 중단시키고, 다른 프로세스로 교체 가능합니다. 비선점형보다 선점형이 쾌적의 스케줄링을 할 수 있습니다. 최근에는 대부분 선점형 스케줄러를 사용하고 있습니다. 알아본 FIFO, SJF, Priority-based는 어떤 프로세스를 먼저 실행시킬지에 대한 알고리즘입니다. 비선점형 스케줄러에 가깝습니다. RoundRobin..

운영체제 (OS) 2021.04.16