프로그램과 프로세스, 스레드
면접에서 중요하단다. 기초적인 것!
우리가 맥북으로 음악도 듣고, 블로그도 쓰고, 유튜브도 켜고, 개발도 하고 동시에 여러개의 작업을 할 수 있는 이유
예전에는 게임을 다운 받는 동안에 화면이 멈추고 다 다운 받고서야 움직일 수 있는 그런 환경이었음
운영체제는 프로세스에 적절한 메모리를 할당한다.
운영체제 = 관리자
CPU = 일꾼
메모리 = 공장부지
프로세스 = 일감
관리자는 해당 일을 공장부지 어느 곳에 하면 좋을지 할당하는 것임
그러면 장난감공장의 곰인형담당일꾼은 곰인형일을 하고,
세부적으로 곰인형의 눈을 붙이는 일 / 곰인형의 팔을 붙이는 일 .. 이렇게 하는 것임
- 프로세스는 컴퓨터에서 실행 중인 프로그램, 프로그램으로부터 인스턴스화된 것, 메모리에 올라가 있는 프로그램, 디스크에 저장되어 있는 프로그램은 프로세스가 아니다.
- 스레드는 프로세스 내 작업의 흐름이며 실행 가능한 가장 작은 단위
네이버 보면 한쪽 배너는 광고가 휙휙 바뀌고, 다른 쪽에서는 입력창 띄우고, 한쪽 배너에서 동영상이 자동 재생되고 등의 것들이 결국 네이버라는 메인 사이트를 구성하는 일인데 이것들이 결국 프로세스가 된다.
이 작은 각각의 일들을 하나의 실행 단위로 세분화해서 관리하면 장점이 있는데
우선, 여기서 네이버 메인 사이트라는 큰 틀은 프로세스고, 작은 하나하나의 일은 스레드다.
또 다른 예시로
햄버거에 야채, 패티, 빵, 치즈를 올리는 걸 각각 다른 조리대에서 차례 차례 만들어서 합치는 것보다
하나의 조리대에서 합치는 게 더 효율적인 것임
맘스터치에서 햄버거를 만드는 작업 / 치킨을 만드는 작업 / 감자튀김을 만드는 조리대는 다 다르겠지만
햄버거를 위해 야채, 패티, 빵, 치즈 올리는 것
치킨을 위해 닭을 튀기고, 튀김옷을 입히는 것
감자튀김을 위해 감자를 튀기고, 소금을 묻히는 것은 각각의 같은 조리대에서 이뤄진다는 것임
여기서
맘터 알바생은 프로세서,
조리대는 메모리이며 ,
햄버거, 치킨, 감튀는 프로세스를 말하고
내부의 하나하나 작업들은 스레드를 말한다.
맘터에서 여러개의 메뉴를 팔 수 있는 것 = 멀티태스킹 (여러 프로세스가 동시에 작업하는 것)
각 프로세스 내에 여러개의 스레드가 있는 것 = 멀티스레드
프로세스
위에서부터 스택, 힙, 데이터, 코드로 나눠진다.
스택은 위 주소부터 할당되고, 힙은 아래 주소부터 할당된다.
스택 (동적)
- 위에서부터 주소가 할당
- 지역변수, 매개변수, 함수가 저장
- 컴파일 시에 크기가 결정됨
- 재귀함수 호출 시에 동적으로 크기가 늘어날 수 있기 때문에 스택과 힙의 메모리 영역 사이를 둔 것
힙 (동적)
- 아래에서부터 주소가 할당
- 런타임 시에 크기가 결정
- 벡터 등
데이터 영역 (정적)
- static 변수, 전역변수(함수 외부 구역에 선언한 것)가 저장
- 프로그램이 종료되면 사라지는 변수들이 들어있음
- BSS Segment : 초기화가 되지 않은 변수
- Data Segment : 초기화를 한 변수 / 0이 아닌 다른 값을 할당된 변수
코드 영역 (정적)
- 프로그램에 내장되어 있는 소스 코드가 있음
- 수정이 불가능한 기계어로 저장
스레드
CPU 수행단위
싱글 스레드 프로세스 : 하나의 스레드만 가지고 있는 프로세스
멀티 스레드 프로세스 : 여러개의 스레드를 가지고 있는 프로세스
[프로세스 내에서 메모리를 공유하는 스레드]
스레드는 프로세스 내의 스택 메모리 영역을 제외한 다른 메모리 영역을 프로세스 내 다른 스레드들과 공유한다.
프로세스는 메모리 내에서 다른 프로세스 간의 작업 공간을 공유하지 못하고,
스레드는 프로세스 내에서 공유한다. (스택 제외하고 걸쳐져있잖아)
[장단점]
스레드는 이렇게 메모리 내에서 공유하기 때문에 다른 스레드와 정보공유가 쉽다.
그러나 동시에 동기화 문제도 발생한다.
메모리 영역을 공유하니까 한 스레드가 문제가 발생하면 다른 스레드에도 영향을 미친다.
[멀티스레드 - 동시성]
멀티스레드인 경우에는 하나의 스레드가 망가져도(block) 다른 스레드가 살아있기 때문에(running) 중단되지 않는 빠른 처리가 가능하다.
PCB Process Control Block
프로세스의 정보를 담고 있는 친구(데이터)
프로세스의 중요한 정보를 포함하고 있는 메타데이터를 저장한 데이터
따라서 일반 사용자들이 접근하면 안되기에 운영체제에서도 커널의 스택이라는 가장 중요한 핵심 영역에서 관리되고 있다.
즉, 운영체제가 관리하고 있는 프로세스의 데이터임
*메타데이터? : 데이터를 설명하는 작은 데이터
[PCB의 구조]
- OS가 프로세스를 관리하기 위해 사용하는 정보
- 프로세스 스케줄링 상태 (준비, 실행, 대기, 보류 등의 상태)
- 프로세스 아이디 (고유한 정수 번호, 다른 프로세스와 구별하기 위해 사용)
- CPU 우선순위 값 (스케줄링 할 때 사용되는 우선순위)
- 프로세스 문맥을 나타내기 위한 CPU 수행 관련 하드웨어 값 - PC register, register
- 메모리 관련 - 코드, 데이터, 스택이 메모리 어디에 위치해 있는가
- 파일 관련 - 프로세스가 사용하고 있는 파일들
Context Switching 문맥 교환
PCB를 교환하는 과정
[발생이유]
하나의 프로세스에 할당된 시간이 끝나거나, 인터럽트에 의해 발생한다.
싱글코어를 기준으로 설명 시에, 컴퓨터는 한 시점에 하나의 프로세스만 실행하는데 우리가 멀티프로세스라고 느끼는 이유는 컨텍스트 스위칭이 빠르게 일어나기 때문이다.
근데 요새는 쿼드코어,, 이러잖아? 싱글코어를 쓰는 바보는 없음. 여튼 설명이 그렇다는 것임.
[과정]
CPU를 뺏기는 프로세스 상태의 문맥을 해당 프로세스의 PCB에 저장한다.
CPU를 새롭게 얻는 프로세스의 상태의 문맥을 해당 프로세스의 PCB에서 읽어온다.
[Context Switching 시에는 캐시를 꼭 비워야 한다]
운영체제는 CPU의 가용성을 늘리고자 한다. 컨텍스트 스위칭이 일어날 때, 캐시에 있는 정보를 다 비워줘야 잘못된 주소 변환이 일어나지 않는다. (캐시미스라고 하는데 캐시 클리어 과정이 있어야 한다고 함)
[스레드의 Context Switching]
스레드는 스택 영역을 제외한 모든 메모리를 공유하기 때문에 프로세스의 PCB 컨텍스트 스위칭보다 비용이 더 적고, 시간도 더 적게 걸린다.
* 시스템 콜이나 인터럽트가 들어온다고 무조건 Context Switching이라고 바라보는 것은 아님
프로세스와 컴파일 과정
프로그램은 컴파일러가 컴파일 과정을 거쳐서
컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 되는 것을 말한다.
(C언어 기반의)프로그램의 컴파일 과정은 전처리 - 컴파일러 - 어셈블러 - 링커
전처리 : 소스 코드의 주석을 제거하고 헤더 파일을 병합해 매크로를 치환
컴파일러 : 오류 처리, 코드 최적화 작업을 해 어셈블리어로 변환
어셈블리어 : 목적 코드로 변환 (리눅스에서의 확장자는 .O)
링커 : 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합해 실행 파일을 만든다. 확장자 (.exe / .out)
정적 / 동적 라이브러리
정적 라이브러리 : 프로그램 빌드 시에 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
장 : 외부 의존도가 낮음, 실행 파일이 직접 연결되어 런타임 시에 속도 빠름
단 : 코드 중복 등 메모리 효율성이 떨어짐
동적 라이브러리 : 프로그램 빌드 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하는 방식
장 : 메모리 효율성 높음
단 : 외부 의존도가 높음
'⭐️ Computer Science > 운영체제' 카테고리의 다른 글
[운영체제] 운영체제에 들어가기 앞서 (0) | 2022.09.06 |
---|---|
[운영체제] 질문1. 프로세스와 스레드 (0) | 2022.08.27 |
[운영체제] 2. 메모리계층, 가상메모리, 스와핑, 페이지폴트, 스레싱 (0) | 2022.08.21 |
[운영체제] 1. 운영체제와 컴퓨터, 인터럽트, 시스템콜과 modebit (0) | 2022.08.21 |
[운영체제] 28. Disk Management & Scheduling 2 (0) | 2022.08.14 |