개발자는 코드만 잘 짜면 되는 거 아닌가? 프로그래밍 문법을 공부해야 겠지..?
프로그래밍 언어 뿐 아니라 컴퓨터의 근간[동작 = 구조, 운영체제]
을 알아야 한다.
분명 코드를 제대로 작성했는데 왜 동작하지 않는 거지? 같은 코드인데도 동작하는 사람이 있다.
내가 만든 프로그램이 어떻게 동작하는지를 알아야 한다. 컴퓨터를 미지의 대상이 아니라 분석의 대상으로 봐야 하는 능력을 길러야 한다.
즉, 컴퓨터의 내부 동작
을 들여다봐야 한다. 그러니까 내가 만든 코드가 컴퓨터의 가장 밑단부터 어떻게 차근차근 실행되는 지를 알 수 있어야 한다. 개발자들이 말하는 분석하는 능력을 길러야 한다는 의미가 여기서부터 시작된다고 볼 수 있다.
미지의 대상에서 분석의 대상
으로 바라볼 수 있는 힘과 컴퓨터를 관조할 수 있는
능력을 늘려서 문제를 해결할 수 있는 개발자가 될 수 있다.
개발에서 가장 중요한 이야기 중 하나, 애플리케이션 개발 시 대규모 트래픽 처리라던지.. 빠른 처리라던지.. 등등과 같이 중요한 것이다.
클라우드 서비스를 이용하더라도 CPU, 메모리, 저장 용량을 직접 선택해야 한다. 그것에 따라 가격, 성능, 용량이 달라진다. 이러한 부분은 프로그래밍 언어의 기초 문법만으로는 해결하기 어려운 문제이다.
즉, 컴퓨터 구조
는 결국 성능, 용량, 비용에 대한 이야기
정보
모든 프로그램은 컴퓨터가 이해하는 정보는 두 개이다.
명령어라는 건 1과 2를 더하라 ⇒ 1과 2를 데이터
물론, 실제로 CPU가 실행하는 명령어는 0과 1로 이루어져있다. 컴퓨터는 0과 1만 이해할 수 있다.
기계어
: 명령어들의 집합어셈블리어
컴퓨터가 이해하는 언어를 사람이 읽기 쉽게 한 번 변환해준 것이자 컴퓨터가 동작시키는 실질적인 정보인 명령어를 말한다.
관리자 역할을하는 운영체제의
커널
이 프로그램을 메모리에 올려 프로세스로 만들면 일꾼은 CPU가 처리
ALU(산술 논리 연산장치)
: 계산기, 계산을 위한 회로들의 모음레지스터
: CPU 내부의 작은 임시기억저장장치, CPU는 자체적으로 저장할 방법이 없기 떄문에 레지스터를 거쳐 데이터 전달제어장치
: 제어 신호를 내보내고, 명령어를 해석하는 장치, 데이터 처리를 위한 순서 결정↔ 여기서 제어 신호 : 컴퓨터들을 관리하고 작동시키기 위한 전자장치(메모리 읽기 신호, 메모리 쓰기 신호)
레지스터
로 가져오게 된다.입터럽트란 어떤 신호가 들어왔을 때 CPU를 잠깐
정지
시키는 것
키보드, 마우스 등 IO 디바이스로 인한 인터럽트, 0으로 숫자를 나누는 산술 연산에서의 인터럽트, 프로세스 오류 등으로 발생하며, 발생 시 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서 인터럽트 핸들러 함수 실행
그렇다면..
인터럽트 핸들러 함수
란?
인터럽트가 발생했을 때, 이를 핸들링하기 위한 함수. 커널 내부의 IRQ를 통해 호출되며, request_irq( )
를 통해 인터럽트 핸들러 함수 등록 가능
🥐 하드웨어 인터럽트
키보드를 연결한다거나 마우스를 연결하는 일 등의 IO 디바이스에 발생하는 인터럽트를 말한다.
🥐 소프트웨어 인터럽트
트랩이라고도 하며, 프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동한다.
어디에 저장되었는지.. 위치 정보도 필요하다 번지란
위치 정보
현재 실행되는
프로그램의 명령어와 데이터를 저장하는 부품🥕 RAM
즉, 메인보드에 연결된 부품은
버스
를 통해 정보를 주고 받으며,버스
는 컴퓨터의 부품끼리 정보를 주고받는 일종의통로
이며, 다양한 종류가 있다.
- 시스템 버스의 내부 구성
- 주소 버스 : 주소를 주고받는 통로
- 데이터 버스 : 명령어와 데이터를 주고받는 통로
- 제어 버스 : 제어 신호를 주고받는 통로
- 메모리 읽기
하드웨어 장치
리눅스, 윈도우, 안드로이드, IOS, macOs
운영체제 또한 특별하지만 프로그램이기 때문에 마찬가지로 메모리에 저장, 다만 특별하기에 커널 영역에서 실행
실행 중인 프로그램
[=프로세스]을 관리하는 특별한 프로그램예를 들어 내가 인터넷 브라우저에 들어가면 사용자 영역에 1500번지에 적재해주는데 누가 해주는 걸까?
A. 그게 바로 운영체제
의 역할
즉, 한정된 메모리에 어떤 프로세스에 얼만큼 할당해야 하는지를 관리한다.
Q. 어떤 프로세스를 먼저, 얼마나 오래 실행할까?
메모리에 저장되어 있는 다양한 프로세스가 실행하려면 CPU가 있어야 한다. 실행되기 위해서는 CPU가 사용되어야 한다.
그렇다면… 어떤 프로세스를 어떤걸 먼저.. CPU를 쓰며,얼마나 오래 쓸지를 결정해주는 것이 바로 운영체제
이다.
즉, CPU의 소유권을 어떤 프로세스에게 할당할지, 프로세스의 생성과 삭제, 자원할당 반환 관리 한다.
Q. 이렇게 많은 프로그램들이 동시에 실행되는데, 누가 일목요연하게 실행을 관리해주지..?
여러 많은 프로그램들이 동시에 실행되도 문제 없게 정리해주는 이것 또한 운영체제가 해줌…
개발자 입장에서 공부해야 하는 가장 큰 이유가 운영체제가 프로세스를 어떻게 관리하는지를 알아야 함
수 많은 프로세스들이 자원에 마구 직접 접근해도 괜찮을까?
프로세스가 제대로 실행되려면 자원(CPU, SSD 등)이 필요
A. 원래대로라면 NO! 자원을 보호할 수 있는 수단이 필요하다 이런 문지기 역할 하는 것이 운영체제
시스템 호출 [= 시스템 콜]이라고 하는 것을 통해
자원 이용 시 자원 문지기 역할자원(컴퓨터의 4가지 부품 + 실행에 필요한 요소들)
을 어떻게 효율적으로 관리하고 보호받을 수 있는지운영체제
이다.운영체제는 그 속에서 프로그램이 실행되는 환경을 제공해 준다.
리눅스
의 경우 GUI(단순 명령어 창이 아닌 아이콘을 마우스로 클릭하는 단순한 동작으로 컴퓨터와 상호작용)말고 CUI(명령어로 처리하는 인터페이스)만 있다.
여기서 드라이버
란 하드웨어를 제어하기 위한 소프트웨어이다.
운영체제는 사용자를 위한 프로그램이 아니다. 그저 컴퓨터를 이용하기만 할 때는 알지 몰라도 상관없다. 만들고 실행하는 프로그램에게 여러 기능을 주는 프로그램이 운영체제이다.
프로그램을 만드는 개발자는 운영체제를 알아야 한다. 어떻게 내가 만들고자 하는 프로그램이 도움을 받고 있는지 동작하는지를 이해 해야한다.
운영체제는 즉, 그 속에서 프로그램이 실행할 수 있도록 하는 환경을 제공