-
OS
- 운영체제
- 하드워어 자원들을 관리하는 프로그램들의 집합
- 응용프로그램들을 위한 System service provider
- 하드웨어와 응용프로그램들을 이어주는 연결부
- 운영체제의 서비스에 접근하기 위한 인터페이스 = 시스템 콜
- 커널
- 운영체제의 핵심이 되는 프로그램 중 하나로 시스템의 모든 것을 통제한다.
- 커널은 부팅하는 동안 메모리를 로드하는 운영체제의 첫 부분이다.
- Kernel은 컴퓨터의 전체 세션동안 메모리에 남아있으며, 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 서비스 제공
- 역할
- 운영체제는 소프트웨어 자원 뿐만 아니라 주변 기기를 포함한 하드웨어 또한 관리한다.
- 전력 문제, 프린터 용지 부족, 네트워크 연결 실패 등의 에러 처리를 담당한다.
- Command interpreter
- 운영 체제나 프로그래밍 언어의 환경에서 해석하는 입력된 명령어를 읽고 실행하는 프로그램
- 사용자 or 명령어 --> 시스템 호출로 변환 --> 실행
- 커널에 포함되지 않는다.
- 운영 체제의 자원 관리
- CPU 자원에서는 시분할 (Time division) multiplexing [ ex : CPU Scheduliung ]
- 메모리 자원에서는 공간 분할 (Space division) multiplexing [ ex : 물리적 메모리 관리를 위한 고정 분할 or 가변 분할 ]
- Uniprocessor System : 한 번에 하나의 프로세스의 실행만 허용하는 시스템
- 운영체제에서 각 프로세스는 자신의 해당하는 구조체를 갖는다.
- 구조체의 이름 : Process Control Block (PCB)
- 특정 프로세스가 관리할 필요가 있는 정보를 포함
- 프로세스 상태 + 프로그램 카운터 + 범용 레지스터 + 프로세스에서 연 파일 정보 + 시그널 핸들러, PID 등
- Fork : 프로세스를 복사하는 시스템 콜이며 Unix에서 새로운 프로세스를 만드는 역할을 한다.
- wait : 자식 프로세스가 동작 중이면 상태를 얻어올 때까지 대기하며 종료된 후 상태를 얻음.
- 프로세스 상태
- Create : 프로세스가 생성되는 중
- Running : 프로세스가 CPU를 차지하여 명령어를 실행하고 있다.
- Ready : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태, CPU 할당을 기다리는 상태
- Waiting : Block이라고 부르며 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태
- Terminated : 프로세스의 실행이 종료되었다.
- Inter-Process Communication (IPC)
- 두 프로세스 간의 통신
- 자원을 공유해서 사용하는 방법(Shared Memory)과 각자 독립적으로 처리하는 방법 (Message Passing)이 있다.
- Shared Memory
- 공유되는 공간이 존재 --> System Call 호출할 필요 없음 --> Kernel 의존성 낮음(Overhead 감소) --> 속도가 빠름
- Message Passing
- 메세지 요청에 대해 동기적으로 처리할지 비동기적으로 처리할지 결정해야 한다.
- Race Condition
- 여러 프로세스가 같은 데이터를 동시에 접근할 때 실행 결과가 접근 순서에 의존하는 상황
- Critical Section
- 운영체제가 지원하는 동기화 방법의 하나로 공유 자원의 독점을 보장하는 역할을 한다.
- 이를 위해 프로세스 혹은 스레드가 Critical Section에 들어가거나 나올때는 Semaphore와 같은 동기화 매커니즘을 사용
- Critical Section이 사용 중일 때 다른 프로세스가 사용할 수 없는 상태를 Mutual Exclusion(Mutex)이라 한다.
- 커널 객체를 사용하지 않으며 서로 다른 프로세스간에 접근이 불가능하다.
- 내부적으로 Inter-Lock 함수를 사용한다.
- Semaphore
- 두 개의 원자적 함수로 조작되는 정수 변수
- Multi-Programming 환경에서 공유 자원에 대한 접근을 제한하는 방법으로 사용
- 모든 교착 상태를 해결하지 못한다.
- 프로세스 동기화
- Critical section을 기반으로 한 프로세스 선점 제어는 H/W와 S/W에서 모두 이루어질 수 있다.
- Software Level : OS Scheduling
- Hardware Level : Interrupt를 일시적으로 disable 시키거나 lock 제어를 위한 compare-and-swap을 hardware instruction level로 제공
- Boot Loader ( = Bootstrap Code )
- 운영체제가 시동되기 이전에 미리 실행되어 커널이 올바르게 시동되기 위해 필요한 모든 작업을 마무리하고 운영 체제를 시동
- 저장 매체의 가장 앞 부분에 존재 [ ex : 하드 디스크의 MBR(Master Boot Recoder)라는 하드 디스크의 첫 섹터에 존재 ]
- Software Interrupt
- 인터럽트는 수행되고 있는 프로세스들에 직접적으로 영향을 줄 수 있어, 운영체제 레벨에서 관리되도록 사용자가 직접 호출 X
- 시스템 콜을 통해서만 가능하도록 설계됨
- CPU가 BUS를 통해 시그널을 받는 것은 Hardware Interrupt
- Trap이란?
- 어떤 프로세스가 특정 시스템 기능을 사용하려고 할 때 그 기능을 운영체제에게 요청하는 방법
- 인터럽트는 하드웨어적인 흐름의 변화이며, 트랩은 소프트웨어적인 흐름의 변화이다.
- Exception [ 메모리 참조 오류, division by 0, Overflow 등의 경우에 발생하는 인터럽트 ]
- System Call : 사용자가 의도적으로 일으킨 인터럽트
- Interrupt Handler
- Interrupt Service Routine (ISR)
- 인터럽트 접수에 의해 발생되는 인터럽트에 대응하여 특정 기능을 처리하는 기계어 코드
- Interrupt Vector
- 인터럽트가 발생했을 때, 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간.
- ISR 수행 동작 : 현재 컨텍스트 저장 --> 인터럽트 벡터가 가리키는 서비스 루틴 실행 --> 처리 끝 --> 저장된 컨텍스트로 복귀
- 범용 레지스터 ( General Register )
- CPU내에 위치하며 연산처리, 연산결과, 복귀주소 등 작은 데이터를 저장하는 레지스터
- 프로그램 카운터 (PC)
- 명령어 포인터라고도 불린다.
- 레지스터 중의 하나로 다음에 실행될 명령어의 주소를 가지고 있어 실행할 기계어 코드의 위치를 지정한다.
- Deadlock 조건
- 상호배제 (Mutual Exclusion)
- 점유대기 (Hold and wait)
- 비선점 (No Preemption)
- 순환대기 (Circular Wait)
- 프로세스 스텍
- 콜 스택 (Call Stack)이라고 하며 실행 중인 컨텍스트를 저장하고 제어하기 위해 사용
- 주 용도 중 하나는 함수의 호출과 복귀
- Throughput
- CPU가 단위 시간당 처리하는 프로세스의 개수
자료 구조
- Abstract Data Type (ADT)
- 자료들과 그 자료들에 대한 연산들을 명기한 것
- 구현 방법을 명시하지 않고 있다는 점에서 자료 구조와는 같다고 볼 수 없다. --> 시간 복잡도 X
- 인터페이스와 구현을 분리하여 추상화 계층을 둔다.
- 회문 (Palindrome)
- 앞에서 부터 읽을 때와 뒤에서 부터 읽을 때 동일하게 읽히는 단어 혹은 문장
- 이를 찾기 위해 가장 적합한 자료구조는 Last-In-Fisrt-Out(LIFO)으로 동작하는 Stack이다.
- C언어의 프로세스 메모리 공간
- 코드 영역 : 프로그램의 실행 코드 혹은 함수를 저장하는 공간
- 스택 영역 : 잠깐 사용하고 메모리에서 소멸 시킬 데이터를 저장하는 공간 // 지역변수, 매개변수
- 데이터 영역 : 전역변수와 정적변수가 저장되는 공간
- 힙 영역 : 데이터를 동적으로 할당할 수 있는 공간
- 클래스 / 객체 / 인스턴스
- 클래스 : 객체를 만들어 내기 위한 설계도 / 연관되어 있는 맴버 변수와 메서드 들의 집합
- 객체 : 'Class의 Instance'라고도 부르며, 객체는 모든 Instance를 대표하는 포괄적인 의미를 갖는다.
- 인스턴스 : 설계도를 바탕으로 소프트웨어에 실체화 하면 그것을 'Instance'라고 부른다. 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부르고, 실행 프로세스는 프로그램의 인스턴스라고 부르기도 한다.
- 클래스 VS 객체
- 클래스는 설계도, 객체는 설계도로 구현한 모든 대상을 의미한다.
- 객체 VS 인스턴스
- Class의 타입으로 선언되었을 때 객체라 부르고, 그 객체가 메모리에 할당되어 사용될 때 인스턴스라고 부른다.
- 객체는 실체, 인스턴스는 관계에 초점을 맞춘다.
네트워크
- OSI 7 layer : 통신 접속에서 완료까지의 과정을 7단계로 정의한 통신 표준 규약
- 응용계층 : 사용자와 직접 상호작용하는 응용 프로그램들이 포함된 계층
- 표현계층 : 데이터의 형식을 정의하는 계층
- 세션계층 : 컴퓨터끼리 통신하기 위해 세션을 만드는 계층
- 전송계층 : 최종 수신 프로세스로 데이터의 전송을 담당하는 계층
- 네트워크 계층 : 패킷을 목적지까지 가장 빠른 길로 전송하기 위한 계층
- 데이터링크 계층 : 데이터의 물리적인 전송과 에러 검출, 흐름 제어 담당하는 계층
- 물리계층 : 데이터를 전기 신호로 바꾸어주는 계층
CS
- 절차지향 / 객체지향 / 함수형 프로그래밍
- 절차지향 프로그래밍
- 일이 진행되는 순서대로 프로그래밍하는 방법
- 장점 : 코드를 따라가며 읽기 쉬우며 작성하기도 쉬운편, 컴퓨터의 처리구조와 비슷해 실행속도가 빠름
- 단점 : 각각의 코드가 순서에 민감하게 연결되어 유지보수와 프로그램 분석이 어려움.
- 대표적인 언어 : C언어
- 객체지향 프로그래밍
- 객체를 먼저 작성하고 함수를 작성하는 형태로, 객체간의 상호작용으로 동작한다.
- 장점 : "(객체)는 (메소드)다"와 같이 사람이 생각하는 방식과 닮아있다. 코드 재사용 가능, 분석과 설계의 전환이 쉬움
- 단점 : 처리 속도가 상대적으로 느리다. 설계에 많은 시간이 소요되고 설계를 잘못하면 처음으로 돌아가야 한다. 테스트가 어렵다.
- 대표적인 언어 : JAVA, C++, C#, Javascript
- 함수형 프로그래밍
- 함수를 먼저 작성하는 형태로 함수를 먼저 만들고 함수에 맞는 데이터를 세팅하는 방식 ( 상태가 없다 )
- 장점 : 사이드이펙트를 미연에 방지한다. 객체지향보다 코드가 간결하다. 비절차형이라 평가 시점이 중요하지 않다. 테스트가 쉽다. 데이터형에 구애받지 않는다.
- 단점 : 상태를 조작할 수 없다.
- 대표적인 언어 : Scalar, Haskel
- Overloading & Overriding
- Overloading
- 같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수를 다르게 하여 메소드를 구분하는 기술
- Overriding
- 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의하여 사용하는 기술