자원(시스템 자원, 리소스) : 프로그램 실행에 마땅히 필요한 요소
운영체제 : 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램
응용 프로그램 (application software) :
사용자가 특정 목적을 위해 사용하는 일반적인 프로그램. 일상적으로 사용하고 있는 워드프로세서, 인터넷 브라우저, 메모장 등
응용 프로그램에 자원을 효율적으로 배분하고, 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리한다.
만약, 운영체제가 없다면 개발자가 직접 하드웨어를 조작하는 코드를 작성해야한다.
구현한 프로그램은 하드웨어가 실행하고, 그 하드웨어를 조작하는 것은 운영체제이기 때문에, 운영체제로 현재 하드웨어의 상태, 코드가 어떻게 실행되었는지, 하드웨어 상에 어떤 문제가 있었는지에 대한 문제 해결의 실마리를 얻을 수 있다.
운영제제의 핵심 기능을 담당
운영체제는 사용자가 실행하는 응용프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다.
운영체제를 통해서만 자원에 접근할 수 있으며, 문지기 역할을 한다.
CPU가 명령어를 실행하는 모드를 두가지 모드로 구분
플래그 레지스터 속 슈퍼바이저 플래그를 통해 CPU가 어떤 모드인지 알 수 있다.
- 커널 모드
- 운영체제 서비스를 제공받을 수 있는 모드 (입출력 가능)
- 자원에 접근하는 명령어를 비롯한 모든 명령어 실행 가능
- 사용자 모드
- 운영체제 서비스를 제공받을 수 없는 모드 (입출력 불가능)
- 커널 영역의 코드를 실행할 수 없는 모드
- 일반적인 응용 프로그램이 실행되는 모드
사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제의 서비스를 제공받기 위해 커널 모드로 전환하는 방법
프로그램은 실행되기 전에는 보조기억장치에 있는 데이터, 메모리에 적재하고 실행하는 순간 프로세스가 된다.
실행 중인 프로그램 (같은 프로그램도 별도의 프로세스가 될 수 있다.)
모든 프로세스는 실행을 위해 CPU를 피료로 하지만 CPU 자원은 한정되어있다.
차례를 돌아가면서 CPU를 이용하고, 시간이 끝날떄 타이머 인터럽트가 발생하면 교체한다.
운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다.
프로세스 제어 블록은 프로세스(PCB)와 관련된 정보를 커널 영역에 저장하는 자료구조이며, 운영체제는 이(PCB)를 통해 여러 프로세스를 관리한다
문맥(context) : 실행을 재개하기 위해 기억해야 할 정보
문맥 교환 : 여러 프로세스들이 번갈아 가면서 실행되는 원리
문맥 교환을 너무 자주하면 오버헤드 발생 가능. 좋은 것만은 아니다.
프로세스가 생성되면 커널 영역에 PCB 생성
프로세스가 생성되면 사용자 영역에 크게 4가지로 나뉘어 배치된다.
주소 중복 방지
힙 영역 : 낮은 주소에서 높은 주소로 할당
스택 영역 : 높은 주소에서 낮은 주소로 할당
정적 할당 영역 : 코드 영역, 데이터 영역
동적 할당 영역 : 힙 영역, 스택 영역
운영체제는 프로세스의 상태를 PCB에 기록하여 관리한다.
대표 적인 프로세스 상태 :
부모 프로세스 : 프로세스가 다른 프로세스를 생성한 경우 프로세스를 생성한 프로세스
자식프로세스 : 생성된 프로세스
부모 프로세스 : 새 프로세스를 생성한 프로세스
자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스
각기 다른 PID를 가진다.
일부 운영체제에서는 자식 프로세의 PCB에 부모 프로세스읜 PID인 PPID가 기록되기도한다.
사용자가 컴포트럴 켜고 로그인 창을 통해 성공적으로 로그인하여 bash 셸로 Vim이라는 문서 편집기 프로그램을 실행한다.
최초의 프로세스
PID가 항상 1번, 모든 프로세스의 최상단에 잇는 부모 프로세스
pstree
명령어를 통해 프로세스 걔층구조 확인 가능
- 유닉스 운영체제 int
- 리눅스 systemd
- macOs launchd
계층적 구조로 프로세스가 생성되는 원리
fork
: 자기 자신 프로세스의 복사본을 자식 프로세스로 생성하는 시스템 호출exec
: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출fork | exec |
---|---|
fork 한 뒤에 부모 프로세스와 자식 프로세스가 exec를 호추하지 않을 경우, 부모/자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 된다.
단일 스레드 프로세스 | 멀티 스레드 프로세스 |
---|---|
모든 프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스 | 프로세스의 스레드들은 실행에 필요한 최소한 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다. |
멀티프로세스 : 여러 프로세스를 동시에 실행
멀티스레드 : 여러 스레드로 프로세스를 동시에 실행하는 것
멀티 프로세스 | 멀티 스레드 |
---|---|
멀티스레드 환경 : 프로세스의 자원을 공유할 경우, 하나으 ㅣ스레드에 문제가 생기면 프로세스 전체에 문제가 생길수 있다.
프로세스 간에도 자원 공유 가능
프로세스 간 통신 (IPC ;Inter -Process Communication)
- 공유 메모리를 통한 통신
- 파이프를 통한 통신
- 네트워크 소켓을 통한 통신
모든 프로세스(및 스레드)는 실행되기 위해 CPU(자원)을 필요로 한다.
운영체제가 공정하고 합리적으로 CPU(자원)을 배분하는 방법을 CPU 스케줄링이라 한다.
CPU자원은 한정되어있으며 실행 중인 프로세스는 여러 개이다.
프로세스는 우선순위를 가지고 있고, 이는 PCB에 명시된다.
대부분 프로세스들은 CPU와 입출력 장치를 모두 사용하며 실행된다.
즉, 프로세스는 실행 상태오 ㅏ대기상태를 반복하며 실행된다.
우선순위의 차이를 보이는 대표적인 프로세스 유형으로는 입출력 집중 프로세스(I/O bound process)와 CPU 집중 프로세스(CPU bound process)가 존재한다.
운영체제는 효율적인 스케줄링을 위해 스케줄링 큐를 사용한다.
준비 큐 : CPU 할당을(이용하기위해) 기다리는 프로세스들을 위한 큐를 의미한다.
대기 큐 : 입출력 장치를 기다리는 프로세스들을 위한 큐를 의미한다.
선점형 스케줄링 : 프로세스가 이용 중인 자원을 빼앗을 수 있다. (타임아웃 기반 문맥 교환)
비선점형 스케줄링 : 프로세스가 이용 중인 자원을 빼앗을 수 없다.
진도: Chapter 09 ~ 11
기본 미션: p. 304의 확인 문제 1번 풀고 인증하기
선택 미션: Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기
선입 선처리 스케줄링은 준비 큐에 삽입된 순서대로 프로세스들을 처리한다.
준비 큐에 A, B, C, D 순으로 삽입되었기 때문에 A, B, C, D 순서로 CPU를 할당 받게된다.
아 이번주는 사실 개인 프로젝트 기능 추가한다고 정말 시간을 많이 썼다.
그래도 혼공컴운은 잊지 않으려고 노력은했는데..크흠!
운영체제 학습 회고글에 개인프로젝트 내용이 웬말이냐 싶지만 너무 뿌듯해서 지금 따로 여기에다가 기록해놓고 싶었다.
혼공컴운 작성 글들도 보완작업을 시작해야겠다.