운영 체제(OS, Operating System)
사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 시스템 소프트웨어
하드웨어를 관리하고, 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 응용 프로그램과 하드웨어 간의 인터페이스로써 다른 응용 프로그램이 유용한 작업을 할 수 있도록 환경을 제공해줌.
ex) Windows, Linux, UNIX, MS-DOS 등
운영체제에서 작동하는 응용 프로그램을 관리하는 기능
- 프로세스
- 스케줄링
- 동기화
- IPC 통신
프로세서(CPU)를 관리하는 것, 현재 CPU를 점유해야할 프로세스를 결정하고, 실제로 CPU를 프로세스에 할당하며, 이 프로세스 간 공유 자원 접근과 통신 등을 관리.
1차 저장장치에 해당하는 메인 메모리와 2차 저장장치에 해당하는 하드디스트, NAND 등을 관리하는 기능
- 메모리 관리
- 가상 메모리
- 파일 시스템
FAT, NTFS, EXT2, JFS, XFS
등 많은 파일 시스템들이 개발되어 사용 중TCP/IP 기반의 인터넷에 연결하거나, 응용 프로그램이 네트워크를 사용하려면 운영체제에서 네트워크 프토콜을 지원해야함.
현재 상용 OS들은 다양하고 많은 네트워크 프로토콜을 지원.
- TCP/IP
- 기타 프로토콜
운영체제는 한 컴퓨터를 여러 사람이 사용하는 환경 지원해야함. 따라서, 운영체제는 각 계정을 관리할 수 있는 기능이 필요.
- 계정 관리
- 접근 권한 관리
사용자 별로 프라이버시와 보안을 위해 개인 파일에 대해선 다른 사용자가 접근할 수 없도록 해야함, 파일이나 시스템 자원에 접근권한을 지정할 수 있도록 지원해야함.
운영체제 안에 하드웨어를 추상화하는 계층
운영체제는 시스템의 자원, 하드웨어를 관리함. 시스템에는 여러 하드웨어가 붙어 있는데, 이들을 운영체제에서 인식하고 관리하게 만들어 응용 프로그램이 하드웨어를 사용할 수 있게 해야함.
- 순차접근 장치
- 임의접근 장치
- 네트워크 장치
하드웨어의 종류가 많은 만큼, 운영체제 내부의 디바이스도 많이 존재
- 프로세스 : 프로그램을 메모리 상에서 실행 중인 작업
- 스레드 : 프로세스 안에서 실행되는 여러 흐름의 단위
기본적으로 프로세스마다 최소 1개의 스레드 소유(메인 스레드 포함)
프로세스는 각각 별도의 주소공간에 할당 (독립적)
스레드는 Stack만 따로 할당 받고 나머지 영역은 서로 공유
하나의 프로세스가 생성될 때, 기본적으로 하나의 스레드 같이 생성
프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하는데 반해, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용하는 차이
하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
프로세스의 상태 정보를 저장하고 복원하는 일련의 과정
동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순번의 프로세스가 동작하면서 이전에 보관했던 프로세스 상태를 복구하는 과정
-> 프로세스는 각 독립된 메모리 영역을 할당받아 사용되므로, 메모리 초기화와 같은 무거운 작업이 진행되었을 때 오버헤드가 발생할 문제가 존재함
하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것
스레드들이 공유 메모리를 통해 다수의 작업을 동시에 처리하도록 해줌
상호 배제, 진행, 한정된 대기를 충족해야함
프로그램이 CPU에 의해 실행됨 -> 프로세스 생성, 메모리에 프로세스 주소 공간 할당됨
최대한 데이터를 공유하여 메모리 사용량을 줄여야 함.
Code는 같은 프로그램 자체에서는 모두 같은 내용이기 때문에 따로 관리하여 공유
StacK & Data는, 스택 구조의 특성과 전역 변수의 활용성을 위해 나눔
프로그램의 함수와 지역 변수는, LIFO 특성을 가진 Stack에서 실행
따라서, 이 함수들 안에서 공통으로 사용하는 '전역 변수'는 따로 지정해주면 메모리 아낄 수 있음.
프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고, 발생된 상황에 대한 우선 처리가 필요함을 CPU에게 알리는 것
지금 수행 중인 보다 더 중요한 일이 발생하면 그일을 먼저 처리하고 나서 하던 일을 계속해야함.
CPU의 하드웨어 신호에 의해 발생
전원 이상, 기계 착오, 외부 신호, 입출력
0으로 나누기, 오버플로우, 명령어 잘못 입력(Exception)
명령어 수행에 의해 발생
주 프로그램이 실행되다가 인터럽트가 발생했다.
현재 수행 중인 프로그램을 멈추고, 상태 레지스터와 PC 등을 스택에 잠시 저장한 뒤에 인터럽트 서비스 루틴으로 간다.
만약 인터럽트 기능이 없었다면, 컨트롤러는 특정한 어떤 일을 할 시기를 알기 위해 계속 체크를 해야 한다. (이를 폴링(Polling)이라고 한다)
폴링을 하는 시간에는 원래 하던 일에 집중할 수가 없게 되어 많은 기능을 제대로 수행하지 못하는 단점이 있었다.
즉, 컨트롤러가 입력을 받아들이는 방법(우선순위 판별방법)에는 두가지가 있다.
사용자가 명령어를 사용해 입력 핀의 값을 계속 읽어 변화를 알아내는 방식
인터럽트 요청 플래그를 차례로 비교하여 우선순위가 가장 높은 인터럽트 자원을 찾아 이에 맞는 인터럽트 서비스 루틴을 수행한다. (하드웨어에 비해 속도 느림)
인터럽트 방식
마이크로컨트롤러(MCU) 자체가 하드웨적으로 변화를 체크하여 변화 시에만 일정한 동작을 하는 방식
인터럽트 방식은 하드웨어로 지원을 받아야 하는 제약이 있지만, 폴링에 비해 신속하게 대응하는 것이 가능하다. 따라서 실시간 대응이 필요할 때는 필수적인 기능이다.
즉, 인터럽트는 발생시기를 예측하기 힘든 경우에 컨트롤러가 가장 빠르게 대응할 수 있는 방법이다.