본 포스팅은 '면접을 위한 CS 전공지식 노트'를 기반으로 작성되었습니다.
프로세스
- 컴퓨터에서 실행되고 있는 프로그램
- CPU 스케쥴링의 대상이 되는 작업(task)와 거의 같은 의미
쓰레드
- 프로세스 내 작업의 흐름 지칭
프로세스와 컴파일 과정
- 프로세스는 프로그램이 메모리에 올라가 인스턴스화된 것을 말함.
- ex) 구글 프로그램은 구글 크롬 프로그램(chrome.exe)과 같은 실행 파일, 이를 두 번 클릭하면 구글 크롬 프로세스로 변환됨
전처리
- 소스 코드의 주석을 제거하고 #include 등 헤더 파일을 병합하여 매크로로 치환
컴파일러
- 오류 처리, 코드 최적화 작업, 어셈블리어로 변환
어셈블러
- 어셈블리어를 목적 코드(object code)로 변환
- 이 때 확장자는 운영체제마다 다름. 리눅스는 .o 파일
링커
- 프로그램 내 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행파일을 만듦.
- .exe 또는 .out이라는 확장자를 가짐.
정적라이브러리와 동적라이브러리
정적라이브러리
- 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식으로 라이브러리를 쓰는 것
- 장점: 외부 의존도가 낮다.
- 단점: 코드 중복 등 메모리 효율성이 떨어진다.
동적 라이브러리
- 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조해서 라이브러리를 쓰는 방법
- 장점: 메모리 효율성
- 단점: 외부 의존도 높아짐.
프로세스의 상태
생성 상태(create)
- 프로세스가 생성된 상태
- fork(), exec() 함수를 통해 생성
- 이 때 PCB가 할당됨
더보기
fork()
- 부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수.
- 주소 공간 만 복사 부모 프로세스의 비동기 작업 등을 상속하지는 않음
exec()
- 새롭게 프로세스를 생성하는 함수
대기 상태(ready)
- 메모리 공간이 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기
- CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태
대기 중단 상태(ready suspended)
- 메모리 부족으로 일시 중단된 상태
실행 상태(running)
- CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태
- CPU burst가 일어났다고도 표현
중단 상태(blocked)
- 어떤 이벤트 발생 이후 기다리며 프로세스가 차단된 상태
- I/O디바이스에 의한 인터럽트로 이런 현상이 많이 발생
- 프린트 눌렀을 때
일시 중단 상태(blocked suspended)
- 대기 중단과 유사
- 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
종료 상태(terminated)
- 메모리와 CPU소유권을 모두 놓고 가는 상태
- 자연스럽게 종료되는 것도 있지만 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료(abort)도 있음
- 자식 프로세스에 할당된 자원의 한계치를 넘어서거나 부모프로세스가 종료되거나, 사용자가 process kill 등의 여러 명령어로 프로세스를 종료할 때 발생
프로세스의 메모리 구조
- 운영체제는 프로세스에 적절한 메모리를 할당.
- 위의 구조처럼
스택과 힙
- 동적할당: 런타임 단계에서 메모리를 할당받는 것을 말함
스택
- 지역 변수, 매개변수, 실행되는 함수에 의해 늘어나거나 줄어드는 메모리 영역
힙
- 동적으로 할당되는 변수를 담음.
- malloc, free 함수를 통해 관리할 수 있음
- 동적으로 관리되는 자료구조의 경우 힙영역을 사용. ex) vector
데이터 영역과 코드영역
- 정적 할당: 컴파일 단계에서 메모리를 할당
- BSS segment, Data segment, code/text segment로 나뉨
BSS segment
- 전역 변수 또는 static, const로 선언되어 있고 0으로 초기화 또는 초기화가 어떠한 값으로도 되어 있지 않은 변수들이 할당
Data segment
- 전역 변수 또는 static, const 선언되어 있고 0이 아닌 값으로 초기화된 변수 할당
code segment
- 프로그램의 코드가 들어감.
PCB(Process Control Block)
- 운영체제에서 프로세스에 대한 메타데이터를 저장한 '데이터'를 말함
- 프로세스 제어 블록이라고도 함.
- 프로세스가 생성되면 운영체제는 해당 PCB를 생성
- PCB는 중요한 정보를 포함하기 때문에 일반 사용자가 접근하지 못하도록 커널 스택의 가장 앞부분에서 관리
PCB의 구조
- 프로세스 스케줄링 상태: ‘준비’, ‘일시중단’ 등 프로세스가 CPU 에 대한 소유권을 얻은 이후의 상태
- 프로세스 ID: 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
- 프로세스 권한: 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
- 프로그램 카운터: 프로세스에서 실행해야할 다음 명령어의 주소에 대한포인터
- CPU 레지스터: 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
- CPU 스케줄링 정보:CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
- 계정 정보: 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
- I/O 상태 정보: 프로세스에 할당된 I/O 디바이스 목록
컨택스트 스위칭(context switching)
- PCB를 교환하는 과정
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
- 컴퓨터가 많은 프로그램을 동시에 돌리는 것처럼 보이나 어떠한 시점에서 실행되고 있는 프로세스는 단 한개. 그렇게 보이는 것은 컨텍스트 스위칭이 빠르게 일어나기 때문(싱글 코어 기준)
- 컨텍스트 스위칭이 일어날 때 유휴 시간(idle time)이 발생
- 또한 컨텍스트 스칭에 드는 비용이 존재 -> 캐시 미스
비용: 캐시미스
- 컨텍스트 스위칭이 일어날 때 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소변환이 생김
- 따라서 캐시클리어 과정을 겪게 되고 이 때문에 캐시 미스 발생
스레드에서의 컨텍스트 스위칭
- 컨텍스트 스위칭은 스레드에서도 일어남
- 스레드는 스택 영역을 제외한 모든 메모리 공유
- 따라서 스레드 컨텍스트 스위칭의 경우 비용이 더 적고 시간도 더 적게 걸림
멀티 프로세싱
- 멀티프로세스를 통해 동시에 두가지 이상의 일을 수행
- 하나 이상의 일을 병렬로 처리할 수 있고 특정 프로세스의 메모리, 프로세스 중 일부에 문제가 발생되더라도 다른 프로세스를 이용해서 처리할 수 있으므로 신뢰성이 높다.
웹 브라우저
- 브라우저 프로세스: 주소 표시줄 북마크 막대, 뒤로 가기 버튼, 앞으로 가기 버튼 등을 담당하며 네트 워크 요청이나 파일 접근 같은 권한을 담당합니다.
- 렌더러 프로세스: 웹 사이트가 ‘보이는’ 부분의 모든 것을 제어합니다.
- 플러그인 프로세스: 웹 사이트에서 사용하는 플러그인을 제어합니다
- GPU 프로세스:GPU 를 이용해서 화면을 그리는 부분을 제어합니다.
IPC(Inter Process Comunication)
- 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
- 멀티프로세스는 IPC가 가능
- IPC의 종류: 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐, 클라이언트 서버의 통신
- 이들은 모두 메모리가 완전히 공유되는 스레드보다는 속도가 떨어짐
공유 메모리(shared memory)
- 여러 프로세스에 동일한 메모리 블록에 대한 접근권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 메모리를 생성해서 통신하는 것을 말함
- 기본적으로 각 프로세스의 메모리를 다른 프로세스가 접근 불가능
- IPC 방식 중 어떠한 매개체를 통해 데이터를 주고받는 것이 아닌 메모리 자체를 공유하기 때문에 불필요한 오버헤드가 발생하지 않아 가장 빠르며 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화 필요.
파일(file)
- 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터를 말함. 이를 기반으로 프로세스 간 통신을 함.
소켓(socket)
- 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미하며 TCP와 UDP가 있다.
익명 파이프(unamed pipe)
- 프로세스 간에 FIFO방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받음
- 단방향 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
명명된 파이프(named pipe)
- 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 양방향 파이프
- 클라이언트/서버 통신을 위한 별도의 파이프를 제공하며, 여러 파이프를 동시에 사용할 수도 있음.
- 컴퓨터의 프로세스끼리 혹은 다른 네트워크상의 컴퓨터와도 통신을 할 수 있다.
메세지 큐(message queue)
- 메시지를 queue 데이터 구조 형태로 관리하는 것을 의미
- 다른 IPC방식에 비해 사용 방법이 직관적이고 간단
- 공유 메모리를 통해 IPC를 구현할 때 쓰기 및 읽기 빈도가 높으면 동기화 때문에 기능을 구현하는 것이 복잡한데, 이때 대안으로 메세지 큐를 사용하기도 함.
스레드와 멀티 스레딩
스레드
- 프로세스의 실행 가능한 가장 작은 단위
- 프로세스는 여러개의 스레드를 가질 수 있음.
- 각 영역을 따로 생성하는 프로세스와 달리 스레드는 코드, 데이터, 힙은 서로 공유
멀티 스레딩
- 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법
- 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높음, 동시성(독립적인 작업들을 나누고 동시실행하는것처럼 보여주는)에도 장점
- 그러나 한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있는 단점.
- ex) 웹 서버의 경우 훨씬 적은 리소스 를 소비하며, 한 스레드가 중단(blocked) 되어도 다른 스레드는 실행(running) 상태일 수 있기 때문에 중단되지 않은 빠른 처리가 가능
공유 자원과 임계 영역
공유 자원(shared resource)
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수등을 의미
- 공유 자원을 두개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 race condition 이라고 함.
- 동시에 접근을 시도 할 때 결괏값에 영향을 줄 수 있는 상태
임계 영역(critical section)
- 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이류로 결과가 달라지는 코드 영역
- 해결 방법: 뮤텍스, 세마포어, 모니터
- 위 방법들은 상호 배제(mutual exclusion), 한정 대기(deadlock), 융통성(starvation) 조건 만족
- lock 사용
뮤텍스(mutex)
- 프로세스나 스레드가 공유자원을 lock 을 통해 잠그고 사용한 후에는 unlock을 통해 해제하는 객체
- 뮤텍스는 잠금 또는 잠금 해제의 상태만 가짐.
세마포어(semaphore)
- 일반화된 뮤텍스
- 간단한 정수 값과 두가지 함수 wait(P 함수), signal(V 함수)로 공유 자원에 대한 접근 처리
- wait(): 자신의 차례가 올때까지 기다리는 함수
- signal() : 다음 프로세스로 순서를 넘겨주는 함수
- 세마포어는 조건 변수 없다.
- 프로세스나 스레드가 세마포어값을 수정할 때 다른 프로세스나 스레드는 동시에 세마포어 값을 수정할 수 없음.
바이너리 세마포어
- 0과 1의 두가지 값만 가질 수 있는 세마포어
- 구현의 유사성으로 인해 뮤텍스는 바이너리 세마포어라 할 수 있지만 엄밀히말하면 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 잠금 메커니즘
- 세마포어는 신호를 기반으로 상호배제가 일어나는 신호 메커니즘
카운팅 세마포어
- 여러개의 값을 가질 수 있는 세마포어, 여러 자원에 대한 접근을 제어하는 데 사용
모니터
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공
- 세마포어 보다 구현하기 쉬우며 상호 배제또한 자동으로 일어남
- 세마포어는 상호 배제를 명시적으로 구현해야 함.
교착 상태(deadlock)
- 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
교착상태의 원인
- 상호 배제: 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능합니다.
- 점유 대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태입니다.
- 비선점: 다른 프로세스의자원을 강제적으로 가져올 수 없습니다.
- 환형 대기: 프로세스 는 프로세스의 자원을 요구하고, 프로세스는 프로세스 의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황을 말합니다.
교착 상태의 해결 방법
- 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계합니다.
- 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 ‘은행원 알고리즘’을 씁니다.
- 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지옵니다.
- 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서 교착 상태가 발생하면 사용자 가 작업을 종료합니다. 현대 운영체제는 이 방법을 채택했습니다. 예를 들어 프로세스를 실행시키다 ‘응 답 없음’이라고 뜰 때가 있죠? 교착 상태가 발생한 경우에 이와 같은 경우가 발생하기도 합니다.
'CS 기본 > OS' 카테고리의 다른 글
CPU 스케줄링 알고리즘 (0) | 2023.09.24 |
---|---|
메모리 (0) | 2023.09.17 |
운영체제와 컴퓨터 (0) | 2023.09.14 |