2022.09.19 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 1-1. 디자인 패턴(1)
2022.09.20 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 1-1. 디자인 패턴(2)
2022.09.20 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 1-2. 프로그래밍 패러다임(함수형,객체지향,절차적프로그래밍)
2022.09.22 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 2-1. 네트워크의 기초(토폴로지&성능분석 명령어)
2022.09.23 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 2-2. TCP/IP 4계층 모델
2022.09.27 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 2-3. 네트워크 기기(스위치 등)/IP주소
2022.10.02 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 2-4.HTTP
2022.10.04 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 3-1. 운영체제의 구조와 역할 및 컴퓨터의 구조
2022.10.07 - [소소한 CS 지식/면접을 위한 CS 전공지식 노트] - 3-2. 메모리계층 및 메모리 관리
3-1. 프로세스와 컴파일 과정
프로세스(process) | 컴퓨터에서 실행되고 있는 프로그램, CPU 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 사용 |
운영체제에 의해 메모리 공간을 할당받아 CPU에서 실행/제어 되고 있는 프로그램 | |
프로그램으로부터 인스턴스화 된 것(프로그램이 메모리에 적재되면 프로세스가 되는 인스턴스화가 일어나고, 후에 운영체제의 CPU 스케줄러에 따라 CPU가 프로세스를 실행한다. | |
스레드(thread) | 프로세스 내 작업의 흐름 |
프로세스(process) | 프로그램(program) |
메모리 구조를 이루고, 현재 어떤 자원을 사용하는지에 대한 관련 정보가 들어있는 동적인 개체 | 컴파일한 코드, 초기화 전역변수, 문자열과 문자열 상수 등 정적 데이터를 포함하는 정적인 개체 |
- ex) 프로그램 = 구글 크롬 프로그램(chrome.exe)과 같은 실행 파일이며, 이를 두 번 클릭하면 구글 크롬 '프로세스'가 시작되는 것이다.
프로그램의 컴파일 과정
프로그램은 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 되는 것을 의미한다.
여기서 말하는 프로그램이란 C 언어 기반의 프로그램을 의미하며, 이는 별도의 컴파일 과정없이 한 번에 한 줄씩 읽어들여서 실행하는 프로그램인 인터프리어 언어(파이썬 등)로 된 프로그램과는 다르다.
1. 전처리(Preprocessor) - 전처리기(cpp)
소스 코드의 주석 제거 및 헤더 파일(#include)을 병합해 매크로를 치환한다.
- #include, #define 등 #으로 시작하는 문법 사항이 적절히 전처리된 C 언어 '소스파일' 생성
2. 컴파일러(Compilation) - 컴파일러(cc1)
오류처리, 코드 최적화 작업을 하며 C언어를 어셈블리어로 변환한다.
- C 언어 소스파일은 컴파일 과정을 거쳐 '어셈블리 소스 파일'이 된다.
3. 어셈블(Assemble) - 어셈블러(as)
어셈블리어는 목적 코드(object code)로 변환
- 어셈블리 소스 파일은 어셈블 과정을 거쳐 '목적 파일(object code)'이 된다.
- 확장자는 운영체제마다 다름(리눅스는 .o)
4. 링크(Linking) - 링커(Id)
프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일을 만든다.
- 목적 코드는 라이브러리와 링크되어 '실행 가능한 파일(binary file)'이 된다.
- 실행 파일의 확장자는 .exe 또는 .out 이라는 확장자를 갖는다.
컴파일 후 링킹 과정을 거치며, 결과물은 컴퓨터가 이해할 수 있는 바이너리 파일(Binary file)로 만들어지며 이 파일을 실행하면 주기억장치(RAM)로 적재되어 시스템에서 동작하게 된다.
정적 라이브러리와 동적 라이브러리
라이브러리는 재사용이 필요한 기능이 반복적인 코드 작성을 하지 않고 언제든지 필요한 곳에서 호출해 사용한다!!
링크될 수 있도록 보통 컴파일 된 형태인 목적 코드(object code) 형태로 존재해 미리 컴파일 되어 있기 때문에 컴파일 시간도 단축된다.
- 정적 라이브러리와 동적 라이브러리의 가장 큰 차이점: 실행파일에 링킹되는 시점(되고, 된다.)
- 자주 라이브러리를 로드하는 실행파일이면 정적으로 하는게 좋다. (동적은 라이브러리 로드/언로드에 시간이 소요하게 되므로)
정적 라이브러리(static library) | 동적 라이브러리(dynamic library) |
정적 라이브러리는 컴파일 시 함수가 실행파일에 포함 | 동적 라이브러리는 실행(런타임)시 함수가 실행파일에 포함 |
프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식 | 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하는 방식(동적으로 링크해 사용하는 라이브러리) |
라이브러리의 동작 코드가 이를 사용하는 실행 바이너리 속에 포함되서 별도의 추가 작업 없이, 독립적으로 라이브러리 함수들을 사용할 수 있다. => 시스템 환경 등 외부 의존도가 낮다. |
실행파일에는 호출할 함수의 정보만 포함되고 실제 함수 코드는 복사되지 않아서 실행파일의 크기가 작아진다. => 메인 메모리의 공간 효율성이 높다. |
코드 중복으로 인해 불필요하게 실행 파일들의 크기가 커지고, 메인 메모리의 공간 효율이 떨어진다. | 실행 파일은 함수에 대한 정보만 가지고 있을 뿐 실제 코드를 가지고 있지 않아서 프로그램 실행 시 항상 dll 파일이 존재해야 한다. => 외부 의존도가 높아진다. |
.a : 리눅스 / .lib : 윈도우 | .so : 리눅스 / .dll 윈도우 |
ex) 실행파일이 1메가, 라이브러리가 100메가의 용량이 있을 때, 컴파일 시 라이브러리가 실행파일에 포함되어서 컴파일 후 실행파일의 용량이 101메가가 된다. | ex) 실행파일이 1메가, 라이브러리가 100메가의 용량이 있을 때,실행파일은 그대로 1메가, 라이브러리 100메가로 따로 존재하게 된다. |
즉 실행파일이 101메가 이므로, 실행 시작부터 종료시까지 101메가의 메모리를 사용한다. | 즉 실행파일이 1메가 이어서, 메모리를 1메가만 사용하고 필요시 100메가의 라이브러리를 로드하고 불 필요시 100메가 반환한다. |
3-2. 프로세스의 상태
1. 생성 상태(create)
프로세스가 생성된 상태, 작업을 커널에 등록하고, PCB를 할당한다.
- fork( ) 또는 exec( ) 함수를 통해 생성한다.
- 가용 메모리 공간 체크, 할당받을 수 있는 메모리가 있는지 확인한다.
- 메모리가 할당되면, 대기(ready)상태로, 할당받을 수 있는 메모리가 없으면 대기 중단 상태(ready suspended)로
fork( ) | exec( ) |
부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수 | 새롭게 프로세스를 생성하는 함수 |
주소 공간만 복사할 뿐 부모 프로세스의 비동기 작업 등을 상속하지는 않는다. |
2. 대기상태(ready) : '자원'만 있는 상태
프로세서를 할당받으려고 기다리고 있고, 프로세서를 할당받으면 즉시 실행이 가능한 상태, 즉 CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태
- 대기 상태에 있는 프로세서에 CPU가 할당되면 디스패치(Dispatch)라고 하며, 해당 프로세스는 '실행 상태(running)'로 바뀌게 된다.
- 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기
3. 실행 상태(running) : 자원 + CPU
프로세서를 점유해 명령어가 실행되는 상태(필요한 자원 및 프로세서를 모두 할당받음) 즉, 프로세스가 CPU를 차지하고 실행하고 있는 상태
- CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태이며, CPU burst가 일어났다고도 표현함
- 할당된 CPU 시간을 초과 사용시 타임아웃(Timeout)이 발생함
- 타임아웃이 발생하면 운영체제가 프로세서 제어권을 갖게 되어 '실행 상태(running)'의 프로세서를 '대기 상태(ready)'로 변경함
4. 중단 상태(blocked) : CPU 없음, 자원 일부 없음
이벤트나 입출력 대기 신호 발생을 기다리며 프로세스가 차단된 상태. 즉, CPU를 할당해주어도 실행할 수 없는 상태(I/O request, 다른 프로세스가 끝날 때까지 대기 등등)
- 프로세서에서 실행을 하다 입출력 연산 or 새로운 자원 요청 등의 문제가 발생하면 '실행 상태(running)'에서 '중단 상태(blocked)'로 변경됨 => event wait
- I/O 디바이스에 의한 인터럽트로 이런 현상이 많이 발생하기도 한다.
- 자원을 할당받게 되면 '중단 상태(blocked)'에서 다시 '대기 상태(ready)'로 변경된다. => event occurs
- ex) 프린트 인쇄 버튼을 눌렀을 때 프로세스가 잠깐 멈춘 듯할 때의 상태
5. 대기 중단 상태(ready suspended)
다른 자원을 할당 받은 상태이지만 프로세서 및 메모리를 할당 받지 못한 상태, I/O 작업이나 요청한 작업이 끝났지만 메모리에 자리가 없어 여전히 하드디스크에 있는 상태
Suspended: 메모리에서 꺼내서 하드디스크로 옮기는 것, Queue에 있는 프로그램의 포인터를 이용해서 옮긴다.
6. 일시 중단 상태(blocked suspended)
프로세스, 메모리, 기타 자원 모두 할당받지 못한 상태
- 요청한 작업이 끝나지 않았고, 메모리에 있던 프로세스들이 Swaping으로 인해 하드디스크로 내려간 상태
7. 종료 상태(terminated)
프로세스 수행이 끝난 상태 즉, 프로세서, 메모리 등 모든 자원을 반납한다.
- 자연스럽게 종료되는 것도 있지만 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료(abort)도 있다.
- (1)자식 프로세스에 할당된 자원의 한계치를 넘어서거나 (2)부모 프로세스가 종료되거나 (3)사용자가 process, kill 등 여러 명령어로 프로세스를 종료할 때 발생한다.
- 커널 내 일부 PCB 정보를 남겨, 프로세스 관리를 위한 정보 수집하기 위한 단계로 이 단계가 끝나면 프로세스는 삭제, 소멸된다.
Blocked(중단) -> Blocked Suspended(일시 중단) |
메모리에 올라와 있는 프로세스들이 모두 요청한 작업을 하느라 block 상태고, 하드디스크에 Swapped 되었던 프로세스들을 메모리에 올려야 한다. |
그러기 위해 메모리에 있던 프로세스들을 하드디스크와 Swapped Area로 옮긴다. | |
Blocked Suspended(일시 중단) -> Blocked(중단) |
요청한 작업이 다 끝나지 않았지만 공간이 충분히 있을 경우 다시 메모리로 올라갈 수 있다. |
Blocked Suspended(일시 중단) -> Ready Suspended(대기 중단) |
요청한 작업이 다 끝났지만 메모리에 공간이 없는 경우 Ready Suspended 상태로 옮긴다. |
Ready Suspended(대기 중단) -> Read(대기) |
Ready Suspended 상태에서 대기하던 중 메모리에 공간이 생겨 다시 Ready 상태로 변경한다. |
Ready(대기) -> Ready Suspended(대기 중단) |
여러 suspend 이유로 Ready에서 Ready Suspended로 옮겨질 수 있다. |
ex) 프로세스의 우선순위 때문에 메모리에 공간을 만들어야 할 경우 Ready Suspended 상태로 옮겨진다. | |
Create -> Ready Suspended(대기 중단) |
만약 메모리가 가득 차 있는 경우라면 OS는 New 상태에서 Ready Suspended 상태로 Admit 한다. |
3-3. 프로세스의 메모리 구조
운영체제는 프로세스에 적절한 메모리를 할당하는데 다음 구조를 기반으로 할당한다.
위에서부터 스택(stack), 힙(heap), 데이터 영역(BSS segment, Data segment), 코드 영역(code segment)으로 나누어진다. =>> 이러한 주소 공간을 가상 메모리 (또는 논리적 메모리: logical memory)라고 부른다.
스택은 위 주소부터 할당(위에서 아래로)되고 힙은 아래 주소(아래에서 위로)부터 할당된다.
스택(stack): 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴값)
지역변수, 매개변수, 함수등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역, 컴파일 시에 크기가 결정되며 '동적'인 특징을 갖는다.
- 함수 호출 시 할당되고 함수 반환 시 소멸된다.
- 컴파일 시 data, stack 영역의 크기를 계산해 메모리 영역을 결정한다.
- 스택 영역은 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데, 이때 힙과 스택의 메모리 영역이 겹치면 안되기 때문에 힙과 스택 사이의 공간을 비워 놓는다.
힙(heap): 프로그래머가 필요할 때 사용하는 공간
동적 할당할 때 사용되며 런타임 시 크기가 결정된다.
- 메모리 주소 값에 의해서만 참조되고 사용되는 영역
- 자바에서는 객체가 heap 영역에 생성되고 Garbage Collect에 의해 정리된다.
- ex) 벡터 같은 동적 배열은 힙에 동적 할당된다. 힙은 '동적'인 특징을 가진다.
데이터 영역(data): 프로그램이 사용하는 데이터 공간 / 전역변수, 정적변수
전역변수, 정적변수가 저장되고, 정적인 특징을 갖는 프로그램이 종료되면 사라지는 변수가 들어 있는 영역
- 전역변수 또는 static 값을 참조한 코드는 컴파일이 완료되면 data 영역의 주소값을 가르키도록 바뀐다.
- 전역변수가 변경될 수도 있어 Read-Write로 되어있다.
BSS 영역(Bloc Stated Symbol segment) | Data 영역(Data segment) |
초기화 되지 않은 전역 변수가 0으로 초기화되어 저장 | 0이 아닌 다른 값으로 할당된 변수들이 저장 |
코드 영역(code): 사용자가 작성한 프로그램 함수
프로그램에 내장되어 있는 소스 코드가 들어가는 영역
- 실행할 프로그램의 코드가 저장되고, CPU는 이 영역에서 명령을 하나씩 가져와 처리한다.
- 수정 불가능한 기계어로 저장되어 있고 정적인 특징을 가진다.
- 중간에 코드를 바꿀 수 없게 Read-Only로 되어있다.
3-4. PCB(Process Control Block)
운영체제에서 프로세스를 제어하기 위해 정보를 저장해 놓는 곳으로, 프로세서의 상태 정보를 저장하는 자료구조
- 메타데이터를 저장한 '데이터', 프로세스 제어 블록이라고도 한다.
- 프로그램이 실행(1)되면 프로세스가 생성(2)되고 프로세스 주소 값들에 앞서 설명한 스택, 힙 등의 구조를 기반으로 메모리가 할당(3)된다. 즉, 프로세스가 생성되면 운영체제는 해당 PCB를 생성하고 프로세스가 완료되면 PCB는 제거된다.
- 프로세스의 메타데이터들이 PCB에 저장되어 관리된다. => 프로세스의 중요한 정보를 포함하고 있어서 사용자가 접근하지 못하게 커널 스택의 가장 앞부분에서 관리된다.
메타데이터: 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터, 대량의 정보 가운데에서 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터
PCB의 구조
프로세스 식별자(Process ID) | 해당 프로세스의 자식 프로세스 ID |
프로세스 (스케줄링) 상태(Process State) | 생성, 준비, 실행, 대기, 완료 상태 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태 |
프로그램 계수기(Program Counter) | 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터 |
CPU 레지스터 및 일반 레지스터 | 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보 |
CPU 스케줄링 정보 | 우선 순위, 최종 실행시각, CPU 점유시간, CPU 스케줄러에 의해 중돤된 시간 등에 대한 정보 |
메모리 관리 정보 | 해당 프로세스의 주소 공간 등 |
프로세스 계정 정보 | 프로세스에 실행된 CPU 사용량, 유저의 정보, 페이지 테이블, 스케줄링 큐 포인터 등 |
I/O 상태 정보 | 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등 |
프로세스 권한 | 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보 |
컨텍스트 스위칭(context switching)
스케줄러가 기존 실행 프로세스를 우선순위 때문에 미루고 새 프로세스로 교체해야 할 때 프로세스 상태 값을 교체하는 작업 즉, PCB를 교환하는 과정
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생한다. (입/출력을 요청할 때, CPU 사용시간이 만료되었을 때, 자식 프로세스를 만들 때, 인터럽트 처리를 기다릴 때)
- CPU가 어떤 프로세스를 실행하고 있는 상태인데
- 운영체제의 스케줄러가 인터럽트를 진행해서 더 높은 우선순위를 가진 프로세서가 실행되어야 할 때
- 스케줄러가 레지스터에 저장된 기존 프로세스 정보 값이나 기존 프로세스 상태 값을 커널 내부에 존재하는 PCB에 저장한다.
- 새 프로세스(더 높은 우선순위를 가짐)의 정보 값이나 새 프로세스 상태 값을 PCB에서 다시 가져와 교체하는 작업
스케줄러(scheduler) | 어떤 프로세스에게 자원을 할당할지 순서와 방법을 결정하는 운영체제 커널의 모듈 |
커널(kernal) | 메모리에 상주하는 운영체제의 부분 |
콘텍스트(context) | CPU가 해당 프로세스를 실행하기 위한 프로세스의 정보 |
- 컴퓨터는 많은 프로그램을 동시에 실행하는 것처럼 보이지만 어떠한 시점에서 실행되고 있는 프로세스는 단 한 개이다. 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문에 프로그램이 동시에 실행되는 것처럼 보인다.
- 현대 컴퓨터는 멀티코어의 CPU를 가지기 때문에 한 시점에 한 개의 프로그램이라는 설명은 틀린 설명이지만 컨텍스트 스위칭을 설명할 때는 싱글코어를 기준으로 설명한다.
콘텍스트 스위칭 단점 - 오버헤드(Overhead)로 인한 성능 저하
콘텍스트 스위칭이 잦게 발생할수록 오버헤드(사용된 시간과 사용된 메모리의 양) 비용이 발생하여 성능이 떨어진다.
p0의 PCB를 저장(save state into PCB0) -> p1의 PCB를 로드(reload state from PCB1) -> 인터럽트 또는 시스템 콜(interrupt or system call) -> p1의 PCB를 저장(save state into PCB1) -> p0의 PCB를 로드(reload state from PCB0)
- 한 개의 프로세스 p0이 실행하다 멈추고, 프로세스 p0의 PCB를 저장하고 다시 프로세스 p1를 로드해 실행한다.
- 다시 프로세스 p1의 PCB를 저장하고 다시 p0의 PCB를 로드한다.
- 컨텍스트 스위칭이 일어날 때 위처럼 유휴 시간(idle time)이 발생하는 것을 볼 수 있다.
위에서 프로세스 p0이 실행 중인 상태(executing)에서 유후 상태(idle)가 될 때 프로세스 p1이 곧바로 executing되지 않고 idle을 좀 더 하다가 executing 된다.
이 과정을 거치는 이유는 p0의 상태를 PCB에 저장하고 프로세스 p1의 상태를 PCB에서 가져오기 때문이다.
이 과정에서 PCB를 저장하고 가져올 때 CPU는 아무 일도 하지 못하게 된다. 따라서 아무 일도 하지 못하게 되는 상황이 잦을 수록 성능 저하로 이어진다.
비용: 캐시미스
컨텍스트 스위칭에 드는 비용
- 컨텍스트 스위칭이 일어날 때 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생기기 때문에 캐시클리어 과정을 겪게 되고 이 때문에 캐시미스가 발생한다.
스레드에서의 컨텍스트 스위칭
이 컨텍스트 스위칭은 스레드에서도 일어난다. 스레드는 스택 영역을 제외한 모든 메모리를 공유하기 때문에 스레드 컨텍스트 스위칭의 경우 비용이 더 적고 시간도 더 적게 걸린다.
https://velog.io/@narangke3/%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EA%B3%BC%EC%A0%95
https://velog.io/@narangke3/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%83%81%ED%83%9C
https://slidesplayer.org/slide/15694233/
https://nostressdev.tistory.com/16
https://jaeyung1001.tistory.com/4
https://hsunnystory.tistory.com/109
https://sublivan.tistory.com/6
https://zangzangs.tistory.com/107
https://jwprogramming.tistory.com/16
'cs > 면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
3-4. CPU 스케줄링 알고리즘 (0) | 2022.10.24 |
---|---|
3-3. 프로세스와 스레드(2): 멀티프로세싱 (0) | 2022.10.14 |
3-2. 메모리계층 및 메모리 관리 (0) | 2022.10.07 |
3-1. 운영체제의 구조와 역할 및 컴퓨터의 구조 (0) | 2022.10.04 |
2-4.HTTP (0) | 2022.10.02 |