인프런의 [그림으로 쉽게 배우는 운영체제] 강의를 듣고 정리한 내용이다.
간단하게 들은 내용을 정리한 것으로, 더 자세한 내용을 원한다면 위 강의를 구매하는 것을 추천한다.
짧은 강의 형태로 단시간에 운영체제를 배우고 싶은 사람, 쉽게 운영체제를 배우고 싶은 사람에게 적합하다고 생각한다.
✏️ 프로그램(Program)
- 하드 디스크와 같이 저장장치에 저장된 명령문의 집합체 (.exe)
✏️ 프로세스(Process)
- 프로세스 = 실행 중인 프로그램
- 하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 실행 중인 프로그램
- 능동적인 존재
- Code, Data, Heap, Stack 영역으로 구성
- Code 영역 - 자신을 실행하는 코드
- Data 영역 - 전역, 정적 변수 저장
- Heap 영역 - 동적으로 메모리를 할당하는데 쓰임(프로그래머)
- Stack 영역
✏️ 컴파일 과정
파일(.c) → 전처리기(.i) → 컴파일(.s) → 어셈블러(.o) → 링커 → (.exe)
✏️ 프로그래밍 & 프로세싱
📌 멀티프로그래밍과 멀티프로세싱이 공존
- 유니프로그래밍 - 메모리에 단 하나의 프로세스가 올라가 있는 것(메모리 관점)
- 멀티프로그래밍 - 메모리에 여러 개의 프로세스가 올라가 있는 것(메모리 관점)
- 멀티프로세싱 - CPU가 여러 개의 프로세스를 처리하는 것(CPU 관점)
✏️ PCB(Process Control Block)
- 프로세스의 정보 저장
- 연결 리스트 자료구조 형태로 저장 → 운영체제는 프로세스 종료 시 연결 리스트에서 해당 프로세스의 PCB 제거(연결 리스트
- PCB의 구조
- 포인터 - 부모와 자식 프로세스에 대한 포인터와 할당된 자원에 대한 포인터 저장. 효율적인 접근을 위해 사용.
- 프로세스 상태 - 생성, 준비, 실행, 대기, 완료 상태 저장
- 프로세스 ID - 프로세스를 식별하기 위한 숫자가 저장됨
- 프로그램 카운터 - 다음에 실행될 명령어의 주소를 포함
- 레지스터 정보 - 프로세스가 실행할 때 사용했던 레지스터 값 저장. 프로그램 카운터와 마찬가지로 CPU를 뺏기고 다시 시작할 때 이전에 사용했던 값을 복구하기 위한 용도
- 메모리 관련 정보 - 프로세스가 메모리에 있는 위치 정보, 메모리 침범을 막기 위한 경계 레지스터 값 등이 저장됨
- CPU 스케줄링 정보 - CPU 스케줄링에 필요한 우선순위, 최종 실행시간, CPU 점유시간 등이 포함
✏️ 프로세스 상태
- 프로세스는 시분할 처리를 위한 다섯 가지 상태를 가지고 있음
- 생성(New), 준비(Ready), 실행(Running), 대기(Waiting), 완료(Terminated) 상태가 있음
- 생성(New) - PCB 생성, 메모리에 프로그램 적재를 요청한 상태
- 준비(Ready) - 프로그램 적재를 승인받은 상태. CPU를 사용하기 위해 기다리고 있음.(추후 CPU 스케줄러에 의해 할당 받음)
- 실행(Running) - 준비상태에 있는 프로세스가 CPU 스케줄러에 의해 CPU를 할당받아 실행되는 상태. 실행상태에 있는 프로세스의 수는 CPU의 개수만큼. 부여된 시간만큼만 CPU 사용 가능하며, 시간이 오버되면 CPU 스케줄러는 CPU를 뺏음. (준비상태로 - 인터럽트)
- 대기(Waiting) - CPU는 매우 빠르나, 입출력 작업은 매우 느린 작업. 입출력 작업이 다 끝날 때까지 CPU를 가만히 내버려두는 것은 매우 비효율적인데, 이때 입출력 요청을 한 프로세스를 대기상태로 두고 다른 프로세스에게 CPU를 할당. 후 대기 상태에 있던 프로세스에게 CPU를 할당시켜 효율적으로 일함
- 완료(Terminated) - 프로세스가 종료된 상태로, 프로세스가 사용했던 데이터를 메모리에서 제거하고 생성된 PCB도 제거
✏️ 컨텍스트 스위칭
- 프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해, 현재 실행 중인 프로세스를 저장하고 다른 프로세스의 상태 값으로 변경하는 작업(다른 프로세스의 PCB 내용대로 CPU 세팅)
- PCB의 값이 변경됨 - 프로세스 상태, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보
- 프로세스 A의 할당 시간 초과 → 프로세스 A의 일 중단 → 현재 CPU의 레지스터 값 등을 PCB A에 저장 → PCB.B를 참조해 CPU의 레지스터 값 조정 → 프로세스 B의 실행 → 프로세스 B의 할당 시간 초과 → 프로세스 B의 일 중단 → PCB B에 현재 상태 저장 → 프로세스 A 실행
- 메모리의 모든 프로세스들은 컨텍스트 스위칭을 함
- CPU 점유 시간이 다 되었거나 I/O 요이 있거나 다른 종류의 인터럽트 발생 시 컨텍스트 스위칭 발생
✏️ 프로세스의 생성과 종료
- 프로세스 생성 과정 - OS는 해당 프로그램의 코드 영역과 데이터 영역을 메모리에 로드하고, 빈 스택과 빈 힙을 만들어 공간을 확보. 이 프로세스를 관리하기 위한 PCB를 만들어 값을 초기화.
- 0번 프로세스는 운영체제 부팅과 동시에 생성 (딱 한번 생성) - 부모 프로세스
- 나머지 프로세스들은 생성 대신 0번 프로세스를 복사하여 사용(fork()) - 새로 생성보다 복사가 더 빠르기 때문; 자식 프로세스
- 자식 프로세스는 부모 프로세스의 코드 영역, 데이터 영역, 스택 영역과 PCB의 내용을 전부 복사
- fork() 함수 실행 후 exec() 함수를 실행하면, 부모를 복사한 자식 프로세스의 코드와 데이터 영역을 원하는 값으로 덮어쓰게 됨 - 부모 프로세스와 다른 프로세스 실행
- exit() - 부모 프로세스에게 자식 프로세스의 작업이 종료됐음을 알림. 메모리에 계속 살아있는 상태를 좀비 상태라고 일컬음.
✏️ 쓰레드
- 운영체제가 작업을 처리하는 단위는 프로세스
- 사용자가 운영체제에게 작업을 요구하면, 그만큼 프로세스의 수가 늘어나며, PCB, 코드, 데이터, 스택, 힙 영역의 수도 늘어남. → 메모리를 너무 많이 차지함
- 쓰레드는 프로세스 내 존재하는 것으로, 한 개 이상 존재 가능하며, 스택 외 PCB, 코드, 데이터, 힙 영역을 공유함.
- 쓰레드는 각각 쓰레드 ID와 스택을 가짐
- 쓰레드를 관리하기 위한 TCB(Thread Control Block)이 있음
- 구글의 크롬 - 프로세스 한개 생성, 탭 생성 - 쓰레드 생성
- 안정성 - 프로세스는 독립적. 쓰레드는 프로세스 내에 있기에 프로세스에 문제가 생기면 쓰레드 모두에 문제가 생김. 프로세스 방식이 쓰레드 방식보다 더 우수함.
- 프로세스 간 통신은 IPC 통신을 하는데, 이는 오버헤드가 크고 속도가 느림
'운영체제' 카테고리의 다른 글
3. 프로세스 동기화 (0) | 2022.05.14 |
---|---|
2. CPU 스케줄링 (0) | 2022.05.07 |
0. 운영체제 들어가기 (0) | 2022.05.06 |
23. Disk Management & Scheduling 1, 2 (3) | 2022.04.23 |
22. File System Implementations 1 & 2 (0) | 2022.04.09 |