혼공학습단13기 3주차 활동의 일환으로 혼자공부하는 컴퓨터구조 + 운영체제 학습 내용을 정리해보는 포스팅입니다.
오늘은 챕터9 운영체제 시작하기, 챕터10 프로세스와 스레드, 챕터11 CPU 스케줄링을 정리해보겠습니다.
[목차]
인프런 강의를 통해 들었을 때 조금
헷깔린 부분들도 있었는데
확실히 책으로 다시 정리해보니
이해가 잘 되었던 것 같습니다.
드디어 컴퓨터 구조가 끝났네요.
이번 시간부터는 운영체제를 시작합니다!
1. 운영체제 시작하기
1)운영체제를 알아야 하는 이유
운영체제는 우리가 흔히 쓰는
윈도우같은 것들을 말합니다.
이런 운영체제가 왜 필요할까요?
예전에 관련업종이 아니었을 때는
단순히 GUI를 통해 유저가 편히 쓰도록
도와주는 프로그램 정도로 생각했습니다.
그러나 실제로 운영체제는 내부적으로
많은 일을 합니다.
실제로 운영체제란 실행할 프로그램에
필요 자원을 할당하고 프로그램들이 올바르게
실행될 수 있도록 돕는 특별한 프로그램입니다.
이 운영체제는 특별한 프로그램이라
메모리에 올라가긴 하지만 특별한 영역인
커널 영역에 올라갑니다.
일반적인 응용 프로그램 등은 사용자 영역에
올라가서 구분이 됩니다.
이 응용 프로그램들을 적재적소의 주소로
배치하는 것이 운영체제입니다.
그리고 불필요한 프로그램을 메모리에서
삭제하는 것도 운영체제의 일입니다.
또 여러 프로그램들이 CPU라는 자원을
동시에 사용할 수 없기 떄문에
어떤 프로그램부터 사용할지
순서도 정해주는 역할도 합니다.
운영체제를 정부에 비유할 수 있겠습니다.
땅,인력,돈 등의 자원을 효율적으로 배분하고
나라를 관리하듯이, 운영체제라는 정부는
CPU관리, 프로세스관리, 파일시스템관리 등의
기능으로 나눠져서 관리를 돕습니다.
개발자가 운영체제를 알아야 하는 이유는
우리가 개발하는 프로그램들이
하드웨어가 실행하고, 이 하드웨어를
조작하는 프로그램이 운영체제이기 떄문입니다.
그래서 운영체제를 잘 알아두면
개발시 발생하는 오류나 이슈들을 좀 더
딥하게 파악할 수 있고 문제해결 능력에
도움이 된다네요!
2) 운영체제의 큰 그림
운영체제의 중요한 개념들이 있습니다.
그 중 커널이라는 것이 있는데요.
운영체제=커널로 이해해도 된다고 합니다.
우리가 실행하고 개발하는 프로그램들을
안전하게 실행하고 자원에 접근, 조작하도록 돕는
운영체제의 핵심 서비스를 담당하는 부분입니다.
운영체제가 제공하는 영역 중
커널에 포함되지 않는 영역도 있습니다.
대표적으로 사용자 인터페이스(UI)가 있고,
UI는 또 그래픽기반의 GUI, 명령어기반의 CLI로
나눌 수 있습니다.
그리고 또 중요한 개념으로
이중모드와 시스템 호출이 있습니다.
응용프로그램이 하드웨어 자원에
직접 접근한다면 어떻게 될까요?
응용 프로그램들끼리 마음대로 접근해서
자원 관리가 제대로 안 되고 비정상적인
자원 공유로 오류가 발생할 것입니다.
그래서 운영체제는 이런 프로그램들이
자원에 접근할 때 자신을 통해서만
접근할 수 있도록 합니다.
메모장이 하드디스크에 데이터 저장을 하고싶으면
운영체제는 커널 영역 내의 하드디스크에 데이터를 저장하는
코드를 실행하여 작업을 대신 수행해줍니다.
그래서 이중모드란 CPU가 명령어를 실행하는 모드를
커널모드와 사용자모드로 구분하는 방식을 말합니다.
사용자모드는 운영체제 서비스를 제공받을 수 없는 실행모드로
커널영역 코드를 실행할 수 없습니다.
이 영역에서 실행되면 일반적인 응용 프로그램은
자원 접근이 불가능합니다.
반면 커널모드는 운영체제 서비스를 제공받을 수 있어서
커널 영역 코드 실행이 가능한 모드입니다.
운영체제는 커널 모드로 실행되기에 자원 접근이 가능합니다.
응용 프로그램이 자원에 접근하려면 운영체제에 요청을 보내서
커널 모드로 전환되어야 하며,
이 요청을 시스템호출(시스템콜)이라고 합니다.
시스템호출은 인터럽트의 일종으로 소프트웨어적 인터럽트입니다.
운영체제의 핵심 서비스들은 어떤게 있을까요?
아래의 표와 같이 정리해볼 수 있습니다.
핵심 서비스 | 서비스 내용 |
프로세스 관리 | -실행 중인 프로그램(프로세스)들은 여러 개가 있음 -이 프로세스들이 동시에 실행되는 환경을 운영체제가 관리 -컨텍스트 스위칭을 통해 빠르게 프로세스들이 번갈아 가며 실행되기 때문에 이런 우선순위 등을 정해줌 |
자원 접근 및 할당 | -모든 프로세스는 실행을 위해 자원 필요 -메모리에 여러 프로세스가 적재, 하나의 CPU는 한번에 하나의 프로세스만 실행 가능하기에 CPU 스케줄링을 통해 어떤 CPU를 이용하고 얼마나 오래 이용할지 등을 결정해줌 -메모리 관리도 도와줌 -입출력장치 때 배운 인터럽트 서비스 루틴도 커널영역에서 관리함 |
파일 시스템 관리 | -파일, 폴더 등 파일 시스템도 운영체제 핵심서비스 |
2. 프로세스와 스레드
1)프로세스 개요
프로그램을 메모리에 올려서
실행중인 프로그램을
프로세스라고 합니다.
보조기억장치의 데이터 덩어리를
메모리로 적재하여 실행하는 것이죠.
사내 운영 업무를 하시는 분들은 잘 아시겠지만
리눅스 서버에서 ps -ef 명령어로
프로세스들을 볼 수 있습니다.
프로세스들은 몇 가지 종류로 나뉠 수 있는데요.
사용자 앞에서 직접 상호작용 하는 포그라운드 프로세스,
사용자가 보지 못하는 뒷편에서 실행되는
백그라운드 프로세스가 있습니다.
백그라운드 프로세스 중에서도 사용자와
상호작용이 없는 데몬이라고 부르는 프로세스가 있습니다.
(리눅스 기준)
프로세스들은 실행을 위해 CPU가 필요한데
프로세스가 여러 개이기 때문에 어떤 프로세스부터
실행될지 판단이 필요합니다.
빠르게 여러 프로세스가 순서대로 번갈아 가면서 실행되는데,
이를 구분해서 실행,관리하기 위해 프로세스마다
프로세스 제어 블록(PCB)가 있습니다.
여기에는 프로세스 관련 정보가 담긴 자료구조로
옷 구매시 태그같은 역할을 합니다.
PCB는 메모리에서도 커널 영역에 생성됩니다.
PCB는 프로세스 생성시 만들어지고 실행이 끝나면 폐기됩니다.
이 PCB에 담기는 정보들은 여러가지가 있어 아래와 같이 간단히 정리해 보았습니다.
PCB에 담기는 정보명 | 내용 |
프로세스ID | -프로세스를 식별하기 위한 고유 번호 |
레지스터값 | -자신의 실행 차례 때 이전까지 사용했던 레지스터 중간값들 -프로그램 카운터 등 |
프로세스상태 | -현재 프로세스가 어떤 상태인지에 대한 기록(입출력장치를 사용하기 위한 상태인지, CPU 사용을 기다리고 있는 상태인지 등) |
CPU 스케줄링 정보 | -언제, 어떤 순서로 CPU를 할당받을지에 대한 정보 |
메모리 관리 정보 | -베이스 레지스터, 한계 레지스터 값 등 -페이지 테이블 정보 |
사용한 파일과 입출력장치 목록 | -어떤 파일을 쓰는지, 어떤 입출력장치가 이 프로세스에 할당되었는지 정보들이 PCB에 기록 |
하나의 프로세스에서 다른 프로세스로 실행 순서가 넘어갈 때,
직전까지 실행되던 프로세스는 프로그램 카운터, 레지스터값들, 메모리 정보 등
모두 백업해야 합니다. 이를 문맥이라고 하며 PCB에 표현되어 있습니다.
PCB에 기록되는 정보들을 문맥이라 봐도 됩니다.
새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를
실행하는 것을 문맥교환이라고 합니다.
프로세스는 커널영역에 생성되고 PCB도 커널영역에 생성됩니다.
이 프로세스가 사용자영역에 있을 때는 어떻게 배치가 될까요?
하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로
나뉘어 저장됩니다.
코드영역은 기계어로 이루어진 명령어가 저장됩니다. 그래서 쓰기 금지고 읽기 전용 공간입니다.
데이터영역은 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간입니다. 전역변수가 대표적입니다.
위의 두 영역은 그 크기가 변하지 않기에 정적 할당 영역이라고도 부릅니다.
반면 힙 영역과 스택 영역은 프로세스 실행 과정에서 그 크기가 변할 수 있는 영역으로,
동적 할당 영역이라고도 부릅니다.
힙 영역은 프로그래머가 직접 할당할 수 있는 저장 공간입니다. 그래서 메모리를 언젠가 반환해야 합니다.
이를 반환하지 않고 냅두면 메모리가 낭비되고 메모리 누수 문제를 마주하게 됩니다.
스택 영역은 데이터를 일시적으로 저장하는 공간입니다. 함수 실행동안의 매개변수, 지역변숙 대표적입니다.
2)프로세스 상태와 계층 구조
프로세스에는 여러 상태가 있는데 대표적인 상태들을 알아봅니다.
상태 | 내용 |
생성 상태 | 이제 막 메모리에 적재되어 PCB를 할당받은 상태 |
준비 상태 | 당장 CPU를 할당 받아 실행할 수 있지만 아직 자신의 차례가 아닌 대기 상태 |
실행 상태 | CPU를 할당 받아 실행중인 상태. 할당 시간을 모두 사용한다면(타이머 인터럽트 발생) 다시 준비 상태가 됨 |
대기 상태 | 입출력 작업은 CPU에 비해 처리 속도가 느려서 입출력 작업을 요청한 프로세스는 입출력작업이 끝날때까지 기다려야 함. 이 기다리는 상태를 대기상태라고 하며 입출력 작업 완료 후 다시 준비상태로 CPU 할당 기다림 |
종료 상태 | 프로세스가 종료된 상태. 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리 정리 |
프로세스는 계층 구조를 가지고 있고 시스템호출을 통해 새 프로세스를 생성할 수 있습니다.
새 프로세스를 자식 프로세스, 새 프로세스를 생성한 프로세스를 부모 프로세스라고 합니다.
자식 프로세스의 PCB에는 PPID(Parent PID)가 기록되기도 합니다.
프로세스를 생성할 때는 fork, exec 시스템호출을 사용합니다.
fork는 자기 자신의 프로세스 복사본을 만드는 시스템호출입니다.
fork를 통해 복사본을 만들고, 이 자식 프로세스는
exec 시스템호출로 새로운 프로그램으로 전환됩니다.
3) 스레드
스레드는 실행의 단위고 프로세스를 구성하는 실행 흐름의 단위입니다.
하나의 프로세스는 여러 스레드를 가질 수 있습니다.
그래서 하나의 프로세스에서 여러 스레드를 실행할 수 있습니다.(멀테스레드 프로세스)
멀티스레드에서 스레드들은 프로세스 내에서 일부는 각각 쓰고, 일부 자원은 공유합니다.
프로그램 카운터 값, 스택은 각각 사용하지만 나머지 자원 등(코드, 힙, 데이터, 파일)은 공유합니다.
스레드들끼리 자원이 공유되기 때문에 동시성 문제가 발생할 수 있습니다.
3. CPU 스케줄링
여행 복귀 후 몸이 좀 안 좋아서..공부한 흔적(?)으로 임시 대체합니다.
4. 마무리
2주간 여행에서 어제밤에 도착하고 시차적응을 못하고 오후 3시에 기상을 해버렸습니다.
저와 아내 모두 후반에 몸이 안 좋아져서 겨우 도착했는데 책을 보니 글자가 둥둥 떠다닙니다.
그래서 CPU 스케줄링 파트는 미리 공부했던 흔적으로 야매 인증(..)하겠습니다.
체력이 복귀되면 다시 재정리를 해보겠습니다ㅋㅋ
감사합니다!
'개발자 일지 > 컴퓨터구조, 운영체제' 카테고리의 다른 글
[혼공컴운] 6주차 가상 메모리, 파일 시스템 (0) | 2025.02.23 |
---|---|
[혼공컴운] 혼공학습단13기 활동 회고 (0) | 2025.02.19 |
[혼공컴운] 5주차 프로세스 동기화, 교착상태 (0) | 2025.02.14 |
[혼공컴운] 3주차 메모리와 캐시 메모리, 보조기억장치, 입출력장치 (0) | 2025.01.19 |
[혼공컴운] 2주차 CPU의 작동 원리, CPU 성능 향상 기법 정리 (0) | 2025.01.14 |
[혼공컴운] 1주차 컴퓨터 구조 시작하기, 데이터, 명령어 정리 (0) | 2025.01.09 |