1.1.1 운영체제(⭐️)
운영체제란 하드웨어 위에 설치되어 하드웨어 계층과 다른 소프트웨어 계층을 연결하는 소프트웨어 계층이다.
컴퓨터 시스템의 자원을 관리하고, 사용자가 컴퓨터를 사용할 수 있는 환경을 제공하는 역할을 수행한다.
여기서 얘기하는 컴퓨터 시스템의 자원은 CPU, 메모리 등을 말한다. 이러한 자원들은 한정되어 있다.
1.1.2 운영체제의 목적(⭐️)
한정된 컴퓨터 자원을 관리하는 시스템이 바로 운영체제이다.
이러한 역할에 기반해 OS는 4가지 목적이 있다.
1. 처리 능령 향상: OS는 자원 관리를 통해 일정 시간 내에 시스템이 처리하는 일의 양을 향상한다.
2. 반환 시간 단축: OS는 사용자가 시스템에 요청한 작업을 완료할 때까지 소요되는 시간을 단축시킨다.
3. 사용 가능도 향상: 사용 가능도는 시스템 자원을 얼마나 빨리 제공할 수 있는가를 의미한다. OS는 사용자가 컴퓨터를 사용해야 할 때 자원을 즉시 사용할 수 있게 한다.
4. 신뢰도 향상: 신뢰도는 시스템이 주어진 문제를 정확하게 푸는지를 의미한다. OS는 입력 값에 대한 정확한 결과 값을 줄 수 있도록 신뢰도를 향상해야 한다.
1.1.3 CPU와 메모리 구조(⭐️⭐️)
컴퓨터 하드웨어의 구성
CPU(Central Processing Unit)
우리가 흔히 말하는 "중앙처리장치"가 바로 CPU이다. 다른 말로 프로세서(processor)라고도 한다.
컴퓨터에서 프로그램을 실행하는 데 필요한 연산을 처리하고 수행한다.
CPU는 컴퓨터 프로그램의 실행에 있어서 핵심적인 역할을 담당한다.
메인 메모리(Main Memory)
램(RAM)이라는 저장장치로 구성되는 메인 메모리는 컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역이라고 정의할 수 있다.
예를 들어 아주 재미있는 게임 하나를 인터넷을 통해 내려받았다고 가정해 보자. 이 게임은 당연히 하드디스크에 저장된다. 이 게임을 실행하기 위해서 Window 탐색기를 띄운 다움, 저장된 디렉터리로 찾아 들어가서 더블클릭을 한다. 그러면 해당 프로그램은 메인 메모리로 올라가서 실행된다. 즉, 메인 메모리는 프로그램 실행을 위해 존재하는 메모리라고 생각하면 된다.
메모리에는 휘발성 메모리인 주 기억장치와 비휘발성 메모리인 보조 기억장치가 있다.
- 주 기억장치(휘발성[전원 공급이 중단되면 저장된 정보 삭제됨] 메모리)
- 보조 기억장치(비휘발성 메모리): SSD(solid State Drive), HDD(Hard Disk Drive) 등
입, 출력 버스(Input/Output Bus)
입. 출력 버스는 컴퓨터를 구성하는 구성요소 사이에서 데이터를 주고받기 위해 사용되는 경로이다. 주고받는 데이터의 종류와 역할에 따라서 어드레스 버스(Address Bus) , 데이터 버스(Data Bus) , 컨트롤 버스(Control Bus) 이렇게 세 가지로 구분이 된다.
하드디스크, 메인 메모리, CPU 등등이 모두 버스에 연결되어 있다. 때문에 이러한 버스 시스템을 기반으로 하드디스크에 있는 데이터를 메인 메모리로, 메인 메모리에 있는 데이터를 하드디스크로 전송하는 것이 가능하고, 메인 메모리와 CPU 사이에서의 데이터 입. 출력도 가능하다.
메모리의 계층 구조
- register: CPU가 사용자 요청을 처리하는 데 필요한 데이터를 임시로 저장하는 기억장치. CPU 내부에 존재, 접근 속도 빠름
- cache memory: CPU와 RAM 사이의 속도 차이를 해결하기 위한 기억장치. CPU 내부에 위치, 접근 속도가 레지스터 다음으로 빠름
- RAM(Random Access Memory): 컴퓨터에서 프로그램을 실행할 때 필요한 정보를 저장. CPU에서 접근 속도가 하드 디스크보다 빠르고, 휘발성 기억장치. 보통 메모리라고 할 때 이를 의미
- hard disk: 사용자가 필요한 데이터와 프로그램을 저장. 비휘발성 기억장치
프로그램을 실행하면 OS가 디스크에 있는 프로그램을 메모리로 load(프로그램을 메모리에 올려 공간을 할당하는 것) 한다.
메모리에 로드한 프로그램을 프로세스라고 하며, CPU가 처리한다.
CPU는 하나의 프로세스만 처리할 수 있어서 멀티 프로세스 환경에서는 OS가 스케줄링을 통해 CPU에 프로세스를 할당한다.
1.1.4 커널과 시스템 콜(⭐️⭐️⭐️)
kernel
- OS의 핵심 요소이다.
- 컴퓨터 하드웨어와 프로세스의 보안, 자원 관리, 하드웨어 추상화 같은 중요한 역할 수행한다.
- 특히 자원관리를 위해 CPU 스케줄링, 메모리 관리, 입출력 관리, 파일 시스템 관리 등을 담당한다.
커널의 위치
운영체제는 커널에서 관리하는 중요 자원에 사용자가 쉽게 접근하지 못하도록 커널 모드와 사용자 모드를 나눈다.
- kernel mode(커널 모드): 하드웨어에 직접 접근해 메모리, CPU와 같은 자원을 사용할 수 있음
- user mode(사용자 모드): 사용자 모드에서는 커널 모드의 자원에 접근할 수 없게 제한을 둔다.
- 사용자 모드에서 실행된 프로세스가 자원에 접근하려면 시스템 콜을 호출해 커널에 요청해야 함
시스템 콜(system call)
사용자 모드에서 커널 모드에 접근해 필요한 기능을 수행할 수 있게 하는 시스템 함수이다.
커널은 시스템 콜로 받은 요청을 처리한 후 다시 시스템 콜로 결과 값을 반환한다.
시스템 콜을 사용해 프로세스 제어, 파일 조작, 장치 관리, 데이터의 유지 보수, 통신, 보호 가능
시스템 콜 대표 예
- 프로세스를 생성한느 fork()
- 부모 프로세스가 자식 프로세스의 수행을 기다리는 wait()
시스템 콜에서 커널에 매개변수를 전달하는 3가지 방법
- 매개변수를 CPU의 레지스터에 직접 전달하는 방식. 단, 이 방식은 매개변수의 개수가 레지스터의 개수보다 많은 경우에 문제가 될 수 있어 권장 X
- 매개변수를 메모리에 저장한 후 메모리 주소 값을 레지스터에 저장하는 방식
- 매개변수를 프로그램의 stack에 push 하고 OS에서 pop 해 매개변수를 전달하는 방식
추가 내용
Stored Program Concept(폰 노이만 아키텍처)
프로그램이라는 것은 메모리에 저장이 되어야 한다는 소리다.
프로그램이 메모리에 저장이 되어야 한다는 그런 컨셉으로 컴퓨터 구조가 디자인 되어야한다는 개념이다(폰 노이만이 얘기함)
명령어는 메모리에 저장이 되어서 CPU에 의해 1. Fetch 되고 2. Decode 되고 3. Execution 되어야 한다.
- Fetch
- 메모리 상에 존재하는 명령어를 CPU로 가져오는 작업
- 위 그림에서 보면 메모리 상에 존재하는 명령어 A를 CPU로 이동시키고 있다.
- 버스 인터페이스, I/O 버스를 통해서 CPU 내부로 명령어가 이동
- 읽어온 명령어는 CPU의 명령어 레지스터(Instruction Register, IR)에 저장된다.
- Decode
- 명령어 레지스터에 가져다 놓은 명령어를 CPU가 해석하는 단계이다.
- 다시 말해 무슨 일을 하는 명령어인지 분석하는 단계이다.
- 컨트롤 유닛에 의해 명령어가 해석 된다.
- Execution
- 해석된 명령어의 명령대로 CPU가 실행하는 단계이다.
- 연산이라는 것은 CPU가 하는 궁극적인 일이다.
- 그래서 좀 더 범위가 크지만 ALU에 의해서 연산이 이뤄진다 라고 간결하게 생각해도 좋다
- ALU가 중심이 되어서 요소요소간 협력을 통해 연산이 진행된다.
결국, 프로그램의 기본 실행은 Fetch , Decode , Execution 단계를 거친다고 말할 수 있다.
명령어
명령어는 CPU 디자인에 있어서 상당히 중요한 의미를 지닌다.
0011은 CPU가 덧셈으로 인식하겠다고 디자인 해보자 뺄셈 곱셈 등 다른 명령어들도 덧셈과 같이 디자인한다. 그럼이제 0011이 CPU에 들어가면 컨트롤 유닛에 의해서 덧셈으로 인식이 된다. 하지만 0011과 같이 이런 숫자를 조합해서 프로그램을 개발하기에는 어렵다
그래서 사람들이 쉽게 인식하기 위해 0011은 ADD로 0010은 MIN으로 이렇게 문자를 붙여준다. 이러한 명령어들을 가지고 컴퓨터 프로그래밍을 하는것을 어셈블리 프로그래밍이라 한다. 그래서 저런 어셈블리 언어를 컴퓨터가 이해하도록 이진수 코드로 바꾸는게 어셈블러이다.
전처리기에 의한 치환 작업 후 컴파일러는 프로그래밍 언어(C, C++ 등)를 어셈블리 언어로 바꿔주는게 컴파일러다.
링커는 프로그램 내에서 참조하는 함수나 라이브러리들을 하나로 묶는 작업을 말한다.
이 과정이 끝나면 실제로 실행 가능한 실행파일이 생성된다.
물론 이 실행파일은 컴퓨터가 실행해야 하는 바이너리 코드로 구성된다.
어셈블러를 통해 만들어진 바이너리와 라이브러리가 묶여서 실행파일이 만들어지고 이런 실행파일을 만드는게 링커다.
실행파일이 메모리 공간에 올라가고 난 다음 CPU에 의해서 실행되기 시작한다. 메모리 공간에 올라가는 명령어들은 CPU에 의해서 순차적으로 실행된다. 폰 노이만 아키텍처 그림에서 보면 메모리상에 명령어 A , 명령어 B , 그리고 명령어 C가 올라가 있다. 이 명령어들은 CPU에 의해서 순차적으로 실행되는 데, 메모리상에서 실행되는 것이 아니라 CPU 내부로 하나씩 이동한 다음 실행하게 된다.
이미지 & 내용 참고
'CS > 기술 면접 대비 CS 전공 핵심요약집' 카테고리의 다른 글
1.2 프로세스 (0) | 2024.07.06 |
---|