개발의변화
프로세스와 스레드 본문
프로세스(process): 컴퓨터에서 실행되고 있는 프로그램을 말하며 CPU 스케줄링의 대상이 되는 작업이라는 용어와 같은 의미
(CPU 스케줄링: 언제 어떤 프로세스에 CPU를 할당할지 결정하는 작업)
하드디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라간다.
이 순간부터 프로세스라고 불린다
컴파일 언어의 컴파일 과정
1.전처리: 소스 코드의 주석을 제거하고 헤더 파일을 병합하여 매크로를 치환합니다.
(매크로란 C언어로 예를 들자면 #define같이 특정한 함수명을 선언한다는가 변수명을 선언하여 문자열로 치환하는 것)
2. 컴파일러: 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환시킵니다.
3. 어셈블러: 어셈블리어는 목적 코드(프로그램이 실행 가능한 코드)로 변환됩니다. 이때 확장자는 운영체제마다 다른데 리눅스에서는 .o입니다.
4. 링커: 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일을 만든다
라이브러리와 프레임워크의 차이 (React, Node.Js)
라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다.
단지 동작하는 중에 필요한 기능이 있을 때 능동적으로 라이브러리를 사용할 뿐이다.
반면에 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다.
프레임워크에는 분명한 [제어의 역전] 개념이 적용되어 있어야 한다.
애플리케이션 코드는 프레임워크가 짜 놓은 틀에서 수동적으로 동작해야 한다.
- 토비의 스프링中
인터프리터 언어란?
인터프리터(interpreter)란 프로그래밍 언어의 원시코드를 바로 실행하는 컴퓨터 프로그램을 말합니다. 앞서 원시코드는 고급 프로그래밍 언어라고 했는데, 인터프리터는 원시코드의 내용을 한번에 한줄씩 읽어들여서 실행합니다.
프로세스의 상태
create) : 사용자가 요청한 작업이 커널에 등록되고 PCB가 만들어져 프로제스가 생성된 상태
create-> ready: 메모리 공간을 검사하여 충분한 공간이 있으면 메모리를 할당하고 대기 상태로 바꾼다
create-> ready suspended: 준비 상태였다가 메모리를 뺏긴 상태
대기(ready): CPU를 할당 받기 위해 기다리고 있는 상태. CPU만 주어지면 바로 실행할 준비가 된 상태
ready->running(dispatch): CPU를 할당 받으면 실행 상태로 바뀌고 실행된다
ready->suspended Ready: 준비 상태였다가 메모리를 빼앗긴 상태
실행(running): CPU를 할당받아 실행 중인 상태
running-> ready (timeout) : CPU를 받아 실행하다가 시간 할당량을 소진하여 빼앗긴 상태
running -> blocked: 실행 상태의 프로세스가 입출력이 필요하게 되어 시스템 호출을 하고, 입출력 처리의 종료를 기다리는 상태
이 때 CPU는 바로 준비 상태의 프로세스 하나를 선택해 실행한다
running -> suspended ready : 높은 우선순위의 대기 중단 상태 프로세스가 준비 상태가 되어, 실행 상태의 프로세스로부터 CPU를 뺏는 경우
중단(Blocked): 프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보될 수 없는 자원을 요청하면 CPU를 양도하고 요청한 일이 완료되기를 기다린다.
blocked -> ready: 입출력이 완료되어 CPU 할당을 기다리는 상태
blocked -> suspended blocked: 메모리의 여유 공간 확보를 위해 중단 상태에서 메모리를 빼앗겨 일시 중단 상태로 바뀜
종료(terminated): 프로세스가 종료될 때 아주 잠시 거치는 상태, 모든 자원이 회수됙 PCB를 삭제한다
대기 중단(suspended ready): 생성된 프로세스가 바로 메모리를 받지 못할 떄, 대기 또는 실행 상태에서 메모리를 잃게 될 떄,
충분한 메모리 공간의 확보를 위해 준비 상태의 프로세스를 대기시키는 경우
suspended ready -> ready : 다시 메모리를 받는 경우
일시 중단(suspended blocked): 중단 상태일 때 메모리 공간을 잃은 상태
suspended blocked -> blocked: 메모리가 확보되어 중단 상태 된 경우
suspended blocked-> suspended ready: 메모리가 확보되지 않고 계속중단되어 대기 중단 상태로 된 경우
프로세스의 메모리 구조
동적 영역(할당):
동적 할당은 런타임 단계에서 메모리를 할당받는 것을 말함
런타임단계: 컴파일 과정을 마친 응용 프로그램이 사용자에 의해서 실행되어 지는 '때(time)'을 의미한다
스택: 지역 변수, 매개변수, 실행되는 함수에 의해 늘어나거나 줄어드는 메모리 영역
함수가 호출될 때 복귀할 주소 및 데이터 및 환경을 임시 저장하는 공간으로 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 많이 가지고 있다면 stack overflow가 발생한다
힙: 동적으로 할당되는 변수,데이터를 할당하는 영역, 메모리 주소 값에 의해서만 참조되고 사용되는 영역(참조형의 데이터가 들어간다), 런타임 환경에 따라 메모리 크기를 할당받음
정적 영역(할당): 컴파일 단계에서 메모리를 할당하는 것을 말함
프로그램이 종료되면 소멸된다
데이터 영역:
BSS segment: 전역 변수, static,const로 선언되어 있고 0으로 초기화 또는 초기화가 어떠한 값으로도 되어 있지 않은 변수들이 이 메모리 영역에 할당
data segment: 전역 변수,static,const로 선언되어 있고 0이 아닌 값으로 초기화된 변수가이 메모리 영역에 할당
코드 영역:
프로그램의 코드가 들어감
CPU는 코드 영역에 저장된 명령을 하나씩 가져가서 처리한다
프로그램이 시작되고 종료될 때까지 메모리에 계속 남아있는다
PCB
운영체제에서 프로세스에 대한 메타데이터를 저장한 '데이터'
메타데이터? => HTML에 있는 <meta> 태그와 비슷한 의미 , 데이터를 설명하기 위한 데이터로 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터
프로그램이 실행되면 프로세스가 생성되고 프로세스 주소 값들에 앞서 스택,힙등의 구조에 대한 메모리 할당이 이루어짐 그리고 이 프로세스의 메타데이터들이 PCB에 저장되어 관리함
프로세스 ID : 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
프로세스 스케줄링 상태: '준비', '일시중단' 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태
프로그램 카운터: 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터
레지스터 정보: 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
CPU 스케줄링 정보: CPU스케줄러에 의해 중단된 시간 등에 대한 정보
계정 정보: 프로세스 실행에 사용된 CPU 사용량
I/O 상태 정보: 프로세스에 할당된 I/O 디바이스 목록
컨텍스트 스위칭
: PCB를 교환하는 과정, 여러개의 프로세스가 실행되고 있을 때 기존에 실행되던 프로세스를 중단하고 다른 프로세스 실행
한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
많은 프로그램을 동시에 실행하는 것처럼 보이지만 어떠한 시점에서 실행되고 있는 프로세스는 단 한 개, 많은 프로세스가 동시에 구동되는 것처럼 보이는 것은 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문
A라는 프로세스가 running(실행) 상태이고 B라는 프로세스가 ready 상태 일 떄
1. 스케줄러가 A 프로세스의 실행을 중단하고 B 프로세스를 실행할 것을 요청
2. A프로세스에서 Stack의 데이터 위치를 가리키고 있는 SP의 값과 다음 실행해야하는 코드의 주소값을 가지고 있는 PC(Program counter)의 값을 PCB에 저장함
3. A프로세스는 ready 또는 block 상태로 바뀌고, CPU에서 B프로세스를 실행함. 이 과정을 통해 B프로세스의 상태가 ready에서 running으로 바뀌는데 이 작업을 디스패치(dispatch)라고 한다
4. 반대로 다시 B프로세스에서 A프로세스로 컨텍스트 스위칭을 할 경우, B 프로세스의 SP값과 PC값을 PCB에 저장하고 A프로세스의 PCB에서 SP값과 CP값을 찾아 SP와 PC에 덮어씌움
컨텍스트 스위칭은
1. I/O interrupt
2.CPU 사용시간 만료
3.자식 프로세스 생성
4. interrupt 처리를 기다릴 때
interrupt란? 인터럽트는 CPU가 프로그램을 실행하고 있을 때 실행중인 프로그램 밖에서 예외 상황이 발생하여 처리가 필요한 경우 CPU에게 알려 예외 상황을 처리할 수 있도록 하는 것
컨텍스트 스위칭 동시에 계속해서 메모리 주소가 변환하므로 캐시클리어 과정을 겪게되고 캐시미스가 발생한다
캐시미스: 캐시 메모리에 찾는 데이터가 존재하지 않음을 발생
캐시미스가 발생하면, 필요한 데이터를 찾아 캐시 메모리에 새롭게 로드한다
멀티프로세싱
여러 개의 '프로세스' 즉 멀티프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것을 말한다
이를 통해 하나 이상의 일을 병렬로 처리할 수 있으며 특정 프로세스의 메모리, 프로세스 중에 일부가 문제가 발생하더라도 다른 프로세스를 이용해서 처리할 수 있으므로 신뢰성이 높은 강점이 있다
웹 브라우저
브라우저 프로세스, 렌더러 프로세스, 플러그인 프로세스, GPU 프로세스
IPC(INTER PROCESS COMMUNICATION): 프로세스끼리 데이터를 주고 받고 공유 데이터를 관리하는메커니즘
공유 메모리
여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신 할 수 있도록 공유메모리를 생성하여 통신
어떠한 매개체를 통해 데이터를 주고 받는 것이 아니라 메모리 자체를 공유하기 때문에 데이터 복사의 오버헤드가 발생하지 않아
매우 빠르며, 여러 프로세스가 공유하므로 동기화가 필요합니다
오버헤드 :프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 , 추가적으로 시간,메모리,자원이 사용되는 현상
파일:
파일은 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
소켓
동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미
익명 파이프
프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어 작동하는 방식
명명 파이프
명명된 파이프는 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 양방향 파이프를 말합니다.
파이프는 오직 부모, 자식 프로세스 간에서만 사용 가능
메시지 큐
메시지 큐는 메시지를 큐 데이터 구조 형태로 관리하는 것을 의미
이는 커널의 전역변수 형태 등 커널에서 전역적으로 관리되며 다른 IPC방식에 비해서 사용 방법이 매우 직관적이고 간단하며 다른 코드의 수정 없이 단지 몇 줄의 코드를 추가시켜 간단하게 메시지 큐에 접근할 수 있는 장점이 있음
스레드:
스레드는 프로세스의 실행 가능한 가장 작은 단위
코드,데이터,힙은 스레드 끼리 서로 공유하고 나머지는 각각 생성
멀티스레딩:
프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법
스레드끼리 서로 자원을 공유하기 때문에 효율성이 높음
웹 요청을 처리할 때 새 프로세스를 생성하는 대신 스레드를 사용하는 웹 서버의 경우 훨씬 적은 리소스를 소비하며, 한 스레드가 중단되어도 다른 스레드는 실행 상태일 수 있기 때문에 중단되지 않는 빠른 처리가 가능
단점:
한 스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있는 단점
공유 자원
시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수 등을 의미한다.
경쟁 상태
두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
임계 영역
둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
해결 방법
상호 배제: 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다
한정 대기: 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다
융통성: 한 프로세스가 다른 프로세스의 일을 방해해서는 안 된다
뮤텍스
프로세스나 스레드가 공유자원을 잠금 설정하고 사용한 후 잠금 해제하는 객체
뮤텍스는 잠금 또는 잠금 해제라는 상태만을 가짐
세마포어
일반화된 뮤텍스
간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리함
wait: 자신의 차례가 올 때까지 기다리는 함수
signal: 다음 프로세스로 순서를 넘겨주는 함수
모니터
둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공
모니터 큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리함
교착 상태(deadlock)
두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
원인:
1) 상호배제: 자원은 한번에 한 프로세스만 사용가능
2) 점유 대기: 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프프로세스가 존재해야함
3) 비선점:
다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없음
4) 환형 대기:
프로세스의 집합에서 순환 형태로 자원을 대기하고 있어야 함
이 4가지 모두 성립해야 deadlock 발생
교착 상태 해결 방법
1. 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계
2. 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘'
은행원 알고리즘(Banker's Algorithm):은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래함
프로세스가 자원을 요구할 때, 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지 사전에 검사하여 교착 상태 회피안정 상태면 자원 할당, 아니면 다른 프로세스들이 자원 해지까지 대기
3. 교착 상태가 발생하면 사이클이 있는지 찾아보고 이에 관련된 프로세스를 한 개씩 지운다
4. 교착 상태는 매우 드물게 일어나기 때문에 이를 처리하는 비용이 더 커서 교착 상태가 발생하면 사용자가 작업을 종료
-> 현대 운영체제는 이 방법을 채택함, 프로세스를 실행시키다 '응답 없음' -> 교착 상태가 발생한 경우에 이와 같은 경우가 발생하기도 함
'운영체제' 카테고리의 다른 글
운영체제 문제풀이 (0) | 2024.04.16 |
---|---|
운영체제 정리1 (0) | 2024.04.15 |
3. 프로세스 스케줄링 (0) | 2023.03.31 |
2. 메모리 관리 (0) | 2023.03.30 |
1.운영체제 기초 활용 (0) | 2023.03.30 |