Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- OPENPATH
- KDT
- 국비지원취업
- Java
- Be
- Spring
- UXUI챌린지
- 백엔드개발자
- 국비지원교육
- 내일배움카드
- UXUIPrimary
- 오픈챌린지
- 디자인챌린지
- 티스토리챌린지
- 내일배움캠프
- 오픈패스
- baekjoon
- mysql
- 디자인강의
- 부트캠프
- 디자인교육
- 패스트캠퍼스
- 국비지원
- 환급챌린지
- UXUI기초정복
- 백준
- 백엔드 부트캠프
- 객체지향
- 백엔드
- 오블완
Archives
- Today
- Total
군만두의 IT 공부 일지
[스터디3] 운영체제 - 03. 프로세스와 스레드 본문
목차
이번에는 3.3 섹션 위주로 운영체제에 대해 학습하려고 합니다. 운영체제 또한, 네트워크와 마찬가지로 배웠던 내용이어도 새롭게 느껴지는 게 많았습니다.
3장 운영체제
3.1 운영체제와 컴퓨터
3.1.1 운영체제의 역할과 구조
- 운영체제의 역할
- CPU 스케줄링과 프로세스 관리
- 메모리 관리
- 디스크 파일 관리
- I/O 디바이스 관리
- 운영체제의 구조
- 유저 프로그램
- (GUI
- 시스템콜
- 커널
- 드라이버) → 괄호 친 부분이 운영체제를 지칭함.
- 하드웨어
3.1.2 컴퓨터의 요소
- 컴퓨터는 CPU, DMA 컨트롤러, 메모리, 타이머, 디바이스 컨트롤러 등으로 구성됨.
- CPU(Central Processing Unit): 산술논리연산장치, 제어장치, 레지스터로 구성되어 있는 컴퓨터 장치
- 제어장치(CU: Control Unit): 프로세스 조작을 지시하는 CPU의 한 부품
- 레지스터: CPU 안에 있는 매우 빠른 임시기억장치
- 산술논리연산장치(ALU: Arithmetic Logic Unit): 덧셈, 뺄셈 같은 두 숫자의 산술 연산과 배타적 논리합, 논리곱 같은 논리 연산을 계산하는 디지털 회로
- 하드웨어 인터럽트: 키보드를 연결하거나 마우스를 연결하는 등의 IO 디바이스에서 발생하는 인터럽트
- 소트트웨어인터럽트: 트랩(trap). 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동함.
- DMA 컨트롤러: I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치
- 메모리(memory): 전자회로에서 데이터나 상태, 명령어 등을 기록하는 장치
- 타이머(timer): 몇 초안에는 작업이 끝나야 한다는 것을 정하고, 특정 프로그램에 시간 제한을 다는 역할을 함.
- 디바이스 컨트롤러(device controller): 컴퓨터와 연결되어 있는 IO 디바이스들의 작은 CPU
- 로컬 버퍼: 각 디바이스에서 데이터를 임시로 저장하기 위한 작은 메모리
- CPU(Central Processing Unit): 산술논리연산장치, 제어장치, 레지스터로 구성되어 있는 컴퓨터 장치
3.3 프로세스와 스레드
- 프로세스(process): 컴퓨터에서 실행되고 있는 프로그램
- CPU 스케줄링의 대상이 되는 작업(task)이라는 용어와 같은 의미로 쓰임.
- 스레드: 프로세스 내 작업의 흐름
3.3.1 프로세스와 컴파일 과정
- 프로세스: 프로그램이 메모리에 올라가 인스턴스화된 것
- 예) 프로그램은 구글 크롬 프로그램(chrome.exe)와 같은 실행 파일이고, 클릭하면 구글 크롬 프로세스로 변환됨.
- 예) 프로그램을 만드는 과정: C 언어 기반 프로그램의 경우, 컴파일러가 컴파일 과정을 통해 기계어로 번역하여 실행할 수 있는 파일을 만듦.
- 컴파일 과정
- 전처리: 소스 코드의 주석을 제거하고 #include 등 헤더 파일을 병합하여 매크로를 치환함.
- 컴파일러: 오류 처리, 코드 최적화 작업을 하여 어셈블리어로 변환함.
- 어셈블러: 목적 코드(object code)로 변환함. 확장자는 운영체제마다 다름.
- 예) 리눅스에서는 .o임.
- 링커: 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일을 만듦. 실행 파일의 확장자는 .exe 또는 .out라는 확장자를 가짐.
- 라이브러리
- 정적 라이브러리: 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식으로 라이브러리를 쓰는 방법
- 장점: 시스템 환경 등 외부 의존도 낮음.
- 단점: 코드 중복 등 메모리 효율성 떨어짐.
- 동적 라이브러리: 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하여 라이브러리를 쓰는 방법
- 장점: 메모리 효율성
- 단점: 외부 의존도 높아짐.
- 정적 라이브러리: 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식으로 라이브러리를 쓰는 방법
3.3.2 프로세스의 상태
- 생성 상태(create): 프로세스가 생성된 상태
- fork() 또는 exec() 함수를 통해 생성하며, 이때 PCB가 할당됨.
- fork(): 부모 프로세스의 주소 공간을 그대로 복사하며, 새로운 자식 프로세스를 생성하는 함수
- exec(): 새롭게 프로세스를 생성하는 함수
- fork() 또는 exec() 함수를 통해 생성하며, 이때 PCB가 할당됨.
- 대기 상태(ready): 메모리 공간이 충분하면 메모리를 할당받고, 아니면 아닌 상태로 대기하고 있으며 CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태
- 대기 중단 상태(ready suspended): 메모리 부족으로 일시 중단된 상태
- 실행 상태(running): CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태
- 중단 상태(blocked): 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
- 일시 중단 상태(blocked suspended): 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태. (≒ 대기 중단 상태)
- 종료 상태(terminated): 메모리와 CPU 소유권을 모두 놓고 가는 상태
- 자연스럽게 종료되는 것 + 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료로 종료되는 것
3.3.3 프로세스의 메모리 구조
스택(stack)
- 지역 변수, 매개변수, 실행되는 함수에 의해 늘어나거나 줄어드는 메모리 영역
- 함수가 호출될 때마다, 재귀 함수가 호출될 때마다 스택이 사용됨.
- 스택은 위 주소부터 할당되고, 힙은 아래 주소부터 할당됨.
- 스택과 힙은 동적 할당이 됨.
- 동적 할당: 런타임 단계에서 메모리를 할당받는 것
힙(heap)
- 동적으로 할당되는 변수들을 담음.
- malloc(), free() 함수를 통해 관리할 수 있음.
- 동적으로 관리되는 자료 구조는 힙을 사용함.
데이터 영역(BSS segment, Data segment)
- BBS segment와 Data segment, code/text segment로 나뉘어서 저장됨.
- BBS segment는 전역 변수 또는 static, const로 선언되어 있고 0으로 초기화 또는 초기화되지 않은 변수들이 할당됨.
- Data segment는 전역 변수 또는 static, const로 선언되어 있고 0이 아닌 값으로 초기화된 변수가 할당됨.
- 데이터 영역과 코드 영역은 정적 할당됨.
- 정적 할당: 컴파일 단계에서 메모리를 할당하는 것
코드 영역(code segment)
- 프로그램의 코드가 들어감.
3.3.4 PCB
- PCB(Process Control Block): 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터
- 프로세스 제어 블록이라고 함.
- 프로세스가 생성되면 운영체제는 해당 PCB를 생성함. 프로그램이 실행되면 프로세스가 생성되고, 프로세스 주소 값들에 스택, 힙 등의 구조를 기반으로 메모리가 할당됨. 이 프로세스의 메타데이터들이 PCB에 저장되어 관리됨.
- PCB의 구조
- 프로세스 스케줄링 상태: 준비, 일시중단 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 상태
- 프로세스 ID: 프로세스 ID, 해당 프로세스의 자식 프로세스 ID
- 프로세스 권한: 컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
- 프로그램 카운터: 프로세스에서 실행해야 할 다음 명령어의 주소에 대한 포인터
- CPU 레지스터: 프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
- CPU 스케줄링 정보: CPU 스케줄러에 의해 중단된 시간 등에 대한 정보
- 계정 정보: 프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
- I/O 상태 정보: 프로세스에 할당된 I/O 디바이스 목록
- 컨텍스트 스위칭(context switching): PCB를 기반으로 프로세스의 상태를 저장하고 로드시키는 과정
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생함.
- (싱글코어 기준) 컴퓨터가 많은 프로그램을 동시에 실행하는 것처럼 보이는 이유는 어떠한 시점에서 실행되는 프로세스는 한 개이지만, 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문임.
- 프로세스가 가지고 있는 메모리 주소가 그대로 있으면, 잘못된 주소 변환(→캐시클리어)이 생기면서 캐시미스가 발생함.
- 스레드 컨텍스트 스위칭은 비용과 시간이 더 적음.
3.3.5 멀티프로세싱
- 멀티프로세싱: 여러 개의 프로세스(멀티프로세스)를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것
- 특정 프로세스의 메모리, 프로세스 중 일부에 문제가 발생해도 다른 프로세스를 이용해서 처리할 수 있어 신뢰성이 높음.
- 멀티프로세스는 IPC(Inter Process Communication)가 가능함.
- IPC: 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
- 웹 브라우저: 멀티프로세스 구조를 가짐.
- 브라우저 프로세스
- 렌더러 프로세스
- 플러그인 프로세스
- GPU 프로세스
- 공유 메모리(shared memory): 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어, 프로세스가 서로 통신할 수 있도록 공유 메모리를 생성해서 통신하는 것
- 파일: 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
- 소켓: 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터. TCP와 UDP가 있음.
- 익명 파이프(unnamed pipe): 프로세스 간 FIFP 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터를 주고받으며, 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식. 부모, 자식 프로세스 간에만 사용할 수 있으며, 다른 네트워크상에서는 사용할 수 없음.
- 명명된 파이프(named pipe): 파이프 서버와 하나 이상의 파이프 클라이언트 간 통신을 위한 명명된 단방향 또는 양방향 파이프. 컴퓨터의 프로세스끼리 또는 다른 네트워크상의 컴퓨터와도 통신할 수 있음.
- 메시지 큐: 큐(queue) 데이터 구조 형태로 관리하는 것. 커널에서 전역적으로 관리되며 다른 방법에 비해 직관적이고 간단함.
3.3.6 스레드와 멀티스레딩
- 스레드: 프로세스의 실행 가능한 가장 작은 단위
- 코드, 데이터, 힙을 각각 생성하는 프로세스와는 달리 스레드는 코드, 데이터, 힙을 공유함.
- 멀티스레딩: 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법
- 스레드끼리 자원을 공유하기 때문에 효율성이 높음.
- 한 스레드가 중단되어도 다른 스레드는 실행 상태일 수 있어 중단되지 않은 빠른 처리가 가능함.
- 동시성에도 장점이 있음.
- 하지만 한 스레드에 문제가 생기면 다른 스레드에 영향을 끼쳐 스레드로 이루어진 프로세스에 영향을 줌.
- 스레드끼리 자원을 공유하기 때문에 효율성이 높음.
3.3.7 공유 자원과 임계 영역
- 공유 자원(shared resource): 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수 등
- 경쟁 상태(race condition): 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
- 임계 영역(critical section): 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
- 해결 방법(상호 배제, 한정 대기, 융통성 3가지 조건 만족)
- 뮤텍스(mutex): 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고, 사용한 후에는 unlock()을 통해 잠금 해제하는 객체. 잠금 또는 잠금 해제 상태만을 가짐.
- 세마포어: 일반화된 뮤텍스. 간단한 정수 값과 두 가지 함수 wait(P 함수) 및 signal(V 함수)로 공유 자원에 대한 접근을 처리함. 상호 배제를 명시적으로 구현해야 함.
- wait(): 자신의 차례가 올 때까지 기다리는 함수
- signal(): 다음 프로세스로 순서를 넘겨주는 함수
- 바이너리 세마포어: 0과 1의 두 가지 값만 가질 수 있는 세마포어
- 카운팅 세마포어: 여러 개의 값을 가질 수 있는 세마포어
- 모니터: 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공함. 세마포어보다 구현 쉬움. 모니터에서 상호 배제는 자동임.
- 해결 방법(상호 배제, 한정 대기, 융통성 3가지 조건 만족)
3.3.8 교착 상태
- 교착 상태(deadlock): 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
- 교착 상태의 원인
- 상호 배제: 한 프로세스가 자원을 독점하고 있으며 다른 프로세스들은 접근이 불가능함.
- 점유 대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점: 다른 프로세스의 자원을 강제적으로 가져올 수 없음.
- 환형 대기: 프로세스 A는 프로세스 B의 자원을 요구하고, 프로세스 B는 프로세스 A의 자원을 요구하는 등 서로가 서로의 자원을 요구하는 상황
- 교착 상태의 해결 방법
- 자원을 할당할 때 조건이 성립되지 않도록 설계함.
- 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 은행원 알고리즘을 사용함.
- 교착 상태가 발생하면 사이클이 있는지 찾아봄. 관련된 프로세스를 하나씩 지움.
- 교착 상태는 드물게 일어나기 때문에 이를 처리하는 비용이 더 큼. 교착 상태가 발생하면 사용자가 작업을 종료함. 현대 운영체제가 채택한 방법임.
이 글은 『 면접을 위한 CS 전공지식 노트 』 책을 학습한 내용을 정리한 것입니다.
'학습일지 > CS 지식' 카테고리의 다른 글
[스터디3] 데이터베이스 - 06. 트랜잭션과 무결성 (1) | 2025.01.03 |
---|---|
[스터디3] 데이터베이스 - 05. ERD와 정규화 과정 (0) | 2025.01.03 |
[스터디3] 운영체제 - 04. CPU 스케줄링 알고리즘 (1) | 2025.01.01 |
[스터디3] 네트워크 - 02. 네트워크 기기 (0) | 2024.12.23 |
[스터디3] 네트워크 - 01. 네트워크 (0) | 2024.12.16 |
Comments