ultra_dev
운영체제 본문
운영체제 시작
모든 프로그램은 실행을 위해 자원을 필요로 한다.
자원 / 시스템 자원
- 프로그램 실행에 있어 마땅히 필요한 요소
- 이 마땅히 필요한 요소에는 컴퓨터의 네가지 핵심 부품 포함
-
- 자원은 하드웨어만을 자원이라고 하지 않고, 네트워크 패킷이라든지 파일이라든지 이런 것들도 자원에 속한다고 볼 수 있음
운영체제는
- 실행할 프로그램에 필요한 자원을 할당하고
- 프로그램이 올바르게 실행되도록 돕는
- 특별한 프로그램이다.
따라서 운영체제도 메모리에 적재됨!! (커널 영역)
운영체제는 특별한 프로그램이라 커널영역이라는 공간에 따로 저장
그외 나머지 프로그램은 사용자 영역에 저장
운영체제는 커널 영역에 적재되는 프로그램이다!!
예를 들어 워드프로세서를 실행하면 이게 메모리의 2000번지 같은 곳에 저장이 되는데
워드 프로세서는 어떻게 메모리의 2000번지같은 데 저장이 되는걸까
바로 운영체제가 메모리의 어디에 적재할지 결정해준다.
메모리뿐만 아니라 cpu도 운영체제가 관리해줌!
여러 프로그램 중 어떤 프로그램을 먼저 실행할지, 얼마나 오래 실행할지 이런거 결정해준다.
컨텍스트스위칭!
뿐만 아니라 운영체제는 입출력장치도 관리한다.
한번에 하나의 프로세스만 접근 가능한 프린터가 있고
워드 프로세서가 프린터 출력 중이면
메모장은 프린터 이용하면 안되겠지
이런걸 관리해줌
또한 보조기억장치의 정보들을 파일과 폴더로 묶어서 관리해줌
즉, 운영체제는
실행하는 응용프로그램과 하드웨어 사이에 위치해서 연결다리 역할을 하는 프로그램이다!!
하드웨어에 맞닿아서 프로그램에게 적절한 자원을 할당한다.
이러한 운영체제 없이 프로그램을 개발한다면 개발자는 매우 골치가 아플 것임!!!
운영체제 덕분에 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요가 없다!!
ex) 1과 2를 더한 결과를 모니터에 출력하는 간단한 프로그램 조차 운영체제가 없다면
프로그램을 메모리에 적재하는 코드
cpu로 하여금 1과 2를 더하게 하는 코드
모니터 계산 결과를 출력하는 코드 등 여러 절차가 필요할 것..
이런게 필요하면 운영체제한테 해줘 하면 되니까
운영체제는 프로그램을 위한 프로그램이다!!!
운영체제의 심장, 커널
운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나이다.
ex) 리눅스 운영체제는 2800만 줄의 코드로 이루어짐
그렇기에 운영체제가 제공하는 기능은 다양하다
but 가장 핵심적인 서비스는 존재
ex) 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능
→ 이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널(Kernel)이라고 한다.
마치 사람의 심장처럼 운영체제의 핵심기능 담당하는 부분!
이때
운영체제에는 속하는데 커널에는 속하지 않는 기능은?
대표적인 예로 유저 인터페이스(UI, User Interface)가 있음
클릭해서 뭐 하는 gui가 있을 수 있고, 명령어 치는 cli가 있을 수 있고
→ 이런 것들은 사용자와 컴퓨터 간의 통로일 뿐, 운영체제의 핵심기능(커널)은 아니다!
사용자가 실행하는 프로그램(워드 프로세서 등)은 자원(ssd, cpu, 메모리 등)에 직접 접근할 수 있을까?
No !! 자원에 직접 접근은 위험하다.
파워포인트가 cpu쓰려고 하는데 엑셀도 cpu 쓰려고하면 충돌 발생
마찬가지로 ppt가 ssd 저장했는데 엑셀이 실수로 저장해서 덮어씌워지고 문제 발생
따라서 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때
오직 자신을 통해서만 접근하도록 해서 자원을 보호한다!!
운영체제는 자원 접근을 대행하는 일종의 문지기인 셈
메모장이 ssd에 접근하고 싶을 때 운영체제한테 부탁을 해야됨
→ 부탁한다 == 운영체제의 코드를 실행한다.
예를 들어서
응용 프로그램이 하드 디스크에 접근하려면
응용프로그램이 하드 디스크에 저장해달라고 요청 → 운영체제가 하드디스크 저장 코드 실행 → 하드 디스크 저장
이러한 운영체제의 자원 접근 대행은 이중 모드로 구현된다.
이중 모드
- cpu가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식
- 사용자 모드
- 운영체제 서비스를 제공받을 수 없는 실행 모드(운영체제의 도움 없이 실행되는..)
- 커널 영역의 코드를 실행할 수 없는 실행 모드
- 자원 접근 불가
- 커널 모드
- 운영체제의 서비스를 제공받을 수 있는 실행 모드
- 자원 접근을 비롯한 모든 명령어 실행 가능
플래그 레지스터 안의 슈퍼바이저 플래그에서
현재 커널 모드로 실행 중인지, 사용자 모드로 실행중인지를 나타냄.
ex) 슈퍼바이저 플래그가 1일 경우 커널모드로 실행중임을 의미, 0일 경우 사용자모드로 실행중임을 의미
입출력 명령어인데 슈퍼바이저 플래그가 사용자모드이면 실행하면 안된다고 판단하겠지
즉 이중 모드는 cpu가 명령어를 실행하는 모드를 커널모드와 사용자 모드로 구분하는 방식!!
그렇다면 언제 커널모드로 바뀌고 언제 사용자모드로 바뀔까
시스템 호출을 하면 커널 모드로 전환이 된다.
시스템 호출
- 커널 모드로 전환하여 실행하기 위해 호출
- 일종의 소프트웨어 인터럽트
- 시스템 호출이 처리되는 방식은 하드웨어 인터럽트 처리 방식과 유사하다
예를 들어서 응용프로그램 실행하면서 하드디스크같은 자원에 접근해야 한다면
- 시스템 호출 하고
- 하드 디스크에 접근하는 운영체제 코드 실행
- 그리고 기존의 실행 흐름으로 돌아와서 사용자 모드로 실행해나감, 시스템 호출 복귀
운영체제의 핵심 서비스
- 프로세스 관리
- 자원 접근 및 할당
- 파일 시스템 관리
프로세스 관리
- 프로세스 == 현재 실행 중인 프로그램
- 수많은 프로세스들이 동시에 실행
- 동시 다발적으로 생성/실행/삭제 되는 다양한 프로세스들을 일목요연하게 관리
- 프로세스와 스레드, 프로세스 동기화, 교착상태 해결 등
자원 접근 및 할당
- cpu (cpu 스케줄링 : 어떤 프로세스를 먼저, 얼마나 오래 실행할까?)
- 메모리 ( 페이징, 스와핑)
- 입출력장치 (인터럽트 서비스 루틴)
파일 시스템 관리
- 관련된 정보를 파일이라는 단위로 저장 장치에 보관
- 파일들을 묶어 폴더(디렉토리) 단위로 저장 장치에 보관
'혼자 공부하는 컴퓨터구조+운영체제' 카테고리의 다른 글
cpu 스케줄링 (0) | 2023.09.24 |
---|---|
프로세스와 스레드 (0) | 2023.09.21 |
입출력장치 (0) | 2023.09.12 |
보조기억장치 (0) | 2023.09.11 |
메모리와 캐시 메모리 (0) | 2023.09.10 |