<링크드리스트와 배열의 차이>

1. Array

: 논리적 순서에 따라 데이터를 입력, 물리적인 주소 또한 순차적이다.

: 인덱스를 가지고 있어 데이터에 쉽게, 한번에 접근 가능(접근 속도가 빠르다)

: 삽입/삭제에 취약 -> 삽입/삭제된 데이터 이후 데이터들 또한 바꾸어줘야하기 때문

 

2. Linked List

: 논리적 순서에 따라 데이터를 입력하지만, 물리적인 주소는 순차적이지 않음

: 인덱스 대신 현재 위치, 다음 위치를 기억한다.

: 인덱스가 없기에 한 번에 데이터에 접근 불가, 링크를 따라가며 접근해야한다.

: 삽입/삭제가 용이 -> 논리적 주소만 바꿔주면 되기 때문에

 

 

<자료구조로써의 스택과 영역으로써의 스택>

1. 자료구조

: 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out)형식의 자료구조

 

2. Stack 영역

: 프로세스의 메모리 공간을 관리하기 위한 알고리즘

: 지역변수, 매개변수, 리턴값 등등이 저장되고 함수 호출시 기록, 종료되면 제거한다.(LIFO방식으로)

: stack영역을 초과할경우 stack overflow에러 발생

 

++ 메모리 영역의 구조(code(text), data, stack, heap)

code(text) (실행할)코드, 함수, 제어문
Data 전역(global) 변수, 정적(static)변수, 정적 구조체 등 컴파일 시 크기가 결정되는 것들
Heap(런타임시 크기 결정) 동적할당(new, malloc등을 통한 동적 할당 객체)
Stack(컴파일시 크기 결정) 지역변수, 매개변수(임시로 사용하는 것들에 대한 영역)
-> 매개변수와 리턴값은 함수 호출 시 생성, 함수 수행 끝나면 반환

사용자가 프로그램 실행 요청  -> 프로그램의 정보를 읽어 메모리에 로드 -> CPU는 프로그램 코드를 가져다 메모리를 관리하고 명령문 실행 -> 동적 메모리가 할당 되면 free store영역 사용(heap: 아래쪽으로 이동) -> 스택 메모리가 할당되면 free store영역 사용(stack: 위로 이동)

++ Heap

Java에서는 가비지 컬렉터가 자동으로 힙영역의 동적 할당 메모리를 해제함.

나머지 언어는 해제해줘야함. 안하면 memory leak발생

메모리 주소값에 의해서만 참조되고 사용되는 영역

 

<Logistic Regression과 Linear Regression의 차이>

Logistic Regression : categorical, 입력 데이터가 주어졌을 때 해당 데이터의 결과가 특정 분류로 나눠짐

(Classification 기법)

Linear Regression: 데이터의 경향을 나타내는 선분을 긋는다.

 

<Activation Function의 개념과 필요성>

Activation Function -> 신경망을 구성하는 각 뉴런 모델에서 임계값을 넘었을 때 출력을 처리하는 함수

 

신호 입력을 받은 후 뉴런에서는 그 값들을 합하여 출력을 만들어 낸다

-> "값들을 합한다"

 

실제 뉴런: 반응을 일으킬 필요가 있는 수준의 자극만 전달 -> 그 수준에 미치지 못하는 신호는 무시

Activation Function이 이런 역할을 하게 된다

-> 조건을 만족하는 경우에만 다음 노드로 신호를 전달하기 위함

 

[종류]

1. Sigmoid Function - binary classification에 적절, 

1.1 Hard Sigmoid Function

1.2 Sigmoid-Weighted Linear Units(SiLU)

1.3 Derivative of Sigmoid-Weighted Linear Units(dSiLU)

2. Hyperbolic Tangent Function(Tanh)

2.1 Hard Hyperbolic Function

3. Softmax Function

4. Softplus Function

5. Softsign

6. Rectified Linear Unit(ReLU) Function 

6.1 Leaky ReLU

6.2 Parametric Rectified Linear Units

6.3 Randomized Leaky ReLU

6.4 S-shaped ReLU

7. Exponential Linear Units(ELUs)

7.1 Parametric Exponential Linear Units(PELU)

7.2 Scaled Exponential Linear Units(SELU)

8. Maxout Function

9. Swish Function

10. ELiSH

 

'공부일지 > CS 기초' 카테고리의 다른 글

[개념 정리] 정리를 또 해보자  (0) 2019.10.22
[개념 정리] 운영체제  (0) 2019.10.18

# QR 코드(Quick Response)

: 작은 공간에 기존 바코드보다 훨씬 많은 데이터를 담을 수 있음

: 오류 정정 기능이 있어, 일부가 손상되어도 복원이 가능

: 360도 어느 방향에서나 읽을 수 있음

 

 

# 닷넷과 자바의 차이

 

# SI/SM

System Integration: 새로운 시스템 구축을 위해 일정기간 프로젝트를 진행, 새로운 IT개발 기술이나 다양한 개발 경험으로 다양한 분야를 접하며 빠르게 성장

 

System Management: 구축된 시스템을 오픈 이후에 사용하며 개선사항/오류사항에 대한 유지 보수

 

#SW개발론

(폭포수) 순차적인 소프트웨어 개발 프로세스

-> 요구사항 분석 - 설계 - 구현 - 테스트 - 유지보수

(애자일) 프로젝트의 방향을 지속적으로 검토, 버그를 고치고 필요한 것을 바꾸며 다시 개발을 진행할 수 있도록 변화에 대처하면서 위험요소를 최소화

(V모델) 폭포수 모델의 확장된 형태, 테스트 단계를 추가, 각 개발 단계 검증에 집중하여 오류를 줄임

(프로토타입 모델) 요구사항 분석 - 프로토타입 설계 - 사용자 평가 - 구현

(나선형 모델) 계획 및 초기 요구 분석 - 1차 위험 분석 - 1차 프로토타입 개발 - 1차 사용자 평가 - 처음으로

 

# 인터넷과 인트라넷

(인터넷) 외부와 광범위하게 연결되어있는 여러 개의 네트워크를 묶은 개념

(인트라넷) 조직이나 단체 내부에서 사용되는 네트워크

(엑스트라넷) 인트라넷과 유사, 특정 조직의 인트라넷을 사용이 허가된 사람 이외에도 고객, 헙력업체 등에서 사용할 수 있도록

 

# 컴포넌트와 모듈

(모듈) 가장 상위에 위치하는 구현의 단위, 실질적으로 구현이 된 단위

(컴포넌트) 런타임 개체를 참조하는 단위, 실제적으로 동작하고 있는 개체

 

# 객체지향과 절차지향

(절차지향) 

1. 루틴 서브루틴 함수(프로시져) 등을 이용한 프로그래밍

2. 프로지셔 콜, 즉 함수 호출을 통해서 재사용성을 얻어내는 것이 본질

3. (장) 함수를 통한 코드의 재활용성, 모듈화와 구조화에 용이

4. (단) 프로시저 호출에 자원 낭비 -> 요즘은 거의 상관없음

 

(객체지향)

1. 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체'라는 기본 단위로 나누고 

# 객체지향 언어의 특징

1. 캡슐화: 객체의 속성(data fields)과 행위(methods)를 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉

2. 상속: 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능

3. 다형성: 어떤 한 요소에 여러 개념을 넣어 놓은 것(오버라이딩, 오버로딩)

4. 추상화: 공통의 속성이나 기능을 묶어 이름을 붙이는 것

 

 

 

 

'공부일지 > CS 기초' 카테고리의 다른 글

헷갈릴때는 정리를 해보자  (0) 2020.06.02
[개념 정리] 운영체제  (0) 2019.10.18

1. 프로세스 VS 쓰레드

 

# 프로그램

- 어떤 작업을 위해 실행할 수 있는 파일

 

# 프로세스

- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스

- 운영체제로부터 자원을 할당받는 작업의 단위

=> 실행된 프로그램 의미

- 프로그램과 프로세스 제어 블록(PCB)로 구성

- 준비/대기/실행/종료/생성

- fork로 생성, exec로 실행

( 부모 프로세스 fork() 호출 -> 자식 프로세스 생성 -> 부모 프로세스 자식 프로세스가 종료될때 까지 wait -> 자식 프로세스 exec호출 -> 자식 프로세스 프로그램 실행 -> 자식 프로세스 종료 -> 부모 프로세스 wake up -> 프롬프트를 생성 후 또 다른 명령어 입력 기다림)

 

[프로그램이 할당받는 시스템 자원의 예]

- CPU 시간

- 운영되기 위해 필요한 주소 공간

- Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역

 

[프로세스 특징]

1. 프로세스는 각각 독립된 메모리 영역을 할당 받음.

2. 프로세스당 최소 1개의 스레드(메인)를 갖고 있음

3. 각 프로세스는 별도의 주소 공간에서 실행, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근 불가

4. 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신 필요(Socket 등)

 

# 쓰레드

- 프로세스 내에서 실행되는 여러 흐름의 단위

- 프로세스가 할당받은 자원을 이용하는 실행의 단위

- 운영체제에서 더 효율적으로 시스템 자원을 관리하기 위해 사용됨

- 쓰레드 간에 자원 공유는 전역변수를 통해 이루어지기에 동기화 문제 신경써야함

 

[쓰레드 특징]

1. 프로세스 내에서 각각 Stack만 따로 할당받고 나머지 영역은 공유

2. 같은 프로세스 내의 여러 쓰레드들은 같은 힙 공간 공유 -> 접근 가능

 

 

 

# Multi Process 대신 Multi Thread 사용 이유

1. 자원의 효율성 증대

- 시스템 콜이 감소(프로세스를 생성하여 자원을 할당하는)

2. 처리 비용 감소 및 응답 시간의 감축

- Stack 영역 제외 모든 메모리 공유

- 프로세스간 전환속도 > 스레드간 전환속도: Context Switching시에 쓰레드는 Stack만 처리

 

 

 

2. 메모리 영역

- 프로그램이 실행되기 위해서는 프로그램이 메모리 영역에 로드 되어야 한다.

- (low  to high)

(1) 코드 영역

- 실행할 프로그램의 코드가 저장되는 텍스트 영역

- CPU는 코드영역에 저장된 명령어를 하나씩 가져가 처리

(2) 데이터 영역

- 전역변수, 정적변수

- 프로그램의 시작과 함께 할당되면 프로그램 종료 시 소멸

(3) 힙영역

- 사용자가 직접 관리할 수 있는 메모리 영역

- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제

- 런타임시에 할당

(4) 스택영역

- 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역

- 함수의 호출과 함께 할당되며 함수의 호출이 종료될 때 해제

- 컴파일 타임에 할당

 

3. 교착상태(Dead Lock)

- 모든 스레드가 락이 풀리기를 기다리고 있음 -> 무한 대기 상태

 

- 프로세스들의 집합이 더 이상 영구적으로 진행을 못하고 영구적으로 블록됨

-> 두 개 이상의 프로세스들이 서로 충돌되는 자원 요구를 할 때 발생

 

임계자원 - 두 개 이상의 프로세스가 동시에 사용할 수 없는 자원

임계영역 - 그 자원을 접근하는 프로그램 코드의 일부분

기아 - 특정 프로세스가 오랜 기간 동안 자우넝르 사용하지 못하는 상태

교착상태 - 자우넝르 제공받기를 기다릴 뿐 갖고 있는 자원을 반납하지 않음, 대기만 되며 수행되지 않음

세마포어 - 프로세스 간에 시근러을 주고받기 위해 사용되는 정수값

다익스트라

-> 두 개 이상의 프로세스들은 간단한 형태의 시그널을 이용해 협동할 수 있다.

= 한 프로세스가 특정 시그널을 수신할 때 까지 정해진 위치에서 중지하고록 강제

 

[교착상태 조건]

(1) 상호 배제(mutual exclusion)

- 한 번에 한 프로세스 만 공유 자원을 사용할 수 있음

- 공유 자원에 대한 접근 권한 제한

- 자원의 양이 제한되어 있더라도 교착상태는 발생할 수 있음

-  한 시점에 단 하나의 프로세스만이 임계영역에 들어감

(2) 점유대기(hold and wait)

- 공유 자원에 대한 접근 권한을 갖고 있는 프로세스가, 그 접근 권한을 양보하지 않은 상태에서 다른 자원에 대한 접근권한을 요구할 수 있음

(3) 비선점(preemption)

- 한 프로세스가 다른 프로세스의 자원 접근 권한을 강제로 취소할 수 없다.

(4) 순환대기(circular wait)

- 두 개 이상의 프로세스가 자원 접근을 기다리는데 그 관계에 사이클이 존재

 

안전한 상태 == 교착상태가 발생하지 않도록 프로세스에게 자원을 할당할 수 있는 경로가 존재하는 상태

 

[교착상태 방지]

- 위 4가지 조건 가운데 하나를 제거

- 1번 조건은 제거하기 어려움: 공유 자원 중 많은 경우가 한 번에 한 프로세스만 사용

- 대부분은 4번 조건 제거

 

교착상태 회피 - 예방에 비해 자원 할당이 더 자유로움, 교착상태 발견에 비해 자원을 선점하고 프로세스 수행의 롤백이 불필요

-> 최대 자원 요구량 알아야 하고 자원 개수 고정, 선점한 채로 종료되어서는 안된다.

 

# 운영체제

- 처리기(CPU) - 메모리와 데이터를 교환

- 주기억장치 - 휘발성

- 입출력 모듈

- 시스템 버스 - 어드레스 버스(메모리 주소 전달), 데이터 버스(데이터 전달), 제어 버스(제어 정보 전달)

 

* 메모리 모듈 = 일련번호로 주소가 부여된 장소들의 집합

* 입출력 모듈 - 외부장치로부터 처리기와 메모리로 데이터를 전송하거나, 그 역방향으로 데이터 전송

 

프로그램은 처리기에 의해 수행, 메모리에 저장된 명령어들의 집합으로 구성

프로그램 카운터는 다음에 가져올 명령어의 주소를 갖고 있으며 순서대로 명령에 반입

반입된 명령어는 처리기 내의 명령어 레지스터로 적재

 

인터럽트: 처리기의 처리율을 향상시키기 위해 제공됨

 

cpu내의 레지스터 > 캐시 > 주기억장치 > 자기디스크> 자기테이프

-> 저속의 메모리에 대한 접근 횟수 줄이는 것 필요

- 주기억장치

: 현재 실행중인 프로그램과 프로그램에 필요한 데이터를 일시적으로 저장

: BYTE 또는 WORD 단위로 분할해 어드레스를 할당

: 주요 기능은 데이터를 저장하는 "쓰기"와 데이터를 읽어오느 "읽기"

: 데이터 입력선 - 데이터의 크기가 1 바이트이므로 1비트 정보가 전송되는 입력선 8개 필요

: 어드레스선 - 0번지부터 1023번지의 1024개의 어드레스를 가지므로 어드레스를 나타내기 위해 10개의 어드레스 선 필요

- 캐시 메모리

: SRAM으로 구성되어, DRAM으로 구현된 주기억장치에 비해 속도가 5~10배 정도 빠름

 

참조 지역성 - 프로그램이 수행되는 동안 명령어와 데이터 둘 다에 대한 처리기의 메모리 참조는 인근 지역으로 몰림

캐시의 원리 - 가장 빠른 메모리 속도에 근접한 메모리를 제공 + 비용이 저렴한 대용량의 메모리를 제공

 

운영체제 - 응용 프로그램의 수행을 제어하고 응용 프로그램과 컴퓨터 하드웨어 사이의 인터페이스 역할

 

준비(Ready) 상태 - 프로세스가 주기억장치에 있고 수행될 수 있음

블록(Blocked) 상태 - 프로세스가 주기억장치에 있고 사건을 기다리고 있음

블록/보류 상태 - 프로세스가 보조기억장치에 있고 사건을 기다리고 있음

준비/보류 - 프로세스가 보조기억장치에 있지만, 주기억장치에 적재되면 즉시 수행 가능

 

메모리테이블 - 주기억장치과 보조기억장치 모두의 자취를 유지하기 위해 사용

입출력테이블 - 입출력 장치와 컴퓨터 시스템의 채널들을 관리하기 위해 os에서 사용

파일테이블

프로세스 테이블

 

프로세스 이미지 - 프로그램, 데이터, 스택, 속성들의 집합

 

멀티프로그래밍 - 단일 처리기(프로세서) 시스템 상에서 다수의 프로세스 관리

멀티 프로세싱 - 멀티 프로세서 시스템 상에서 다수의 프로세스 관리

분산처리 - 다수의 분산된 컴퓨터 시스템들 상에서 수행되는 다수의 프로세스 관리

 

# 멀티 프로세서

- 여러 개의 프로그램을 동시에 실행하거나 하나의 프로그램을 분할해서 동시에 실행하는 것을 병렬 처리라고 하며, 병렬처리를 가능케 하는 것이 멀티프로세서

- 장점: 성능향상, 신뢰성 향상

- (1) 집중 메모리 구조

: CPU마다 메모리를 따로 두지 않고, 버스를 기준으로 CPU 반대쪽에 있음, 버스를 통해 CPU접근

: (단) 통신은 모두 cpu들이 메모리를 공유하기 때문에 일반적으로 공유 변수 사용 -> 메모리 접근 충돌 가능성이 큼

: (보완책) 자주 사용하는 프로그램과 데이터를 캐시 메모리에 저장해두고, 동작하며 메모리에 대한 접근을 줄일 수 있음

- (2) 분산 메모리 구조

: cpu마다 메모리를 따로 두어 메모리 접근에 대한 충돌이 생기지 않음, 캐시 사용 가능

: (통신방법) cpu의 메모리도 접근이 가능하도록 하여 공유 변수를 이용해 통신

 

# 클러스터링

- 서버 여러 대를 하나의 멀티 프로세서처럼 동작하도록 구현

 

경쟁상태 - 다수의 프로세스나 쓰레드가 공유 자원을 동시에 읽거나 쓰려고 하는 상태

 

서로 인식X 프로세스 = 경쟁

서로 간접적으로 인식 = 협력(공유)

서로 직접적으로 인식 = 협력(통신)

 

프로세스의 모든 메모리 참조는 논리주소, 수행시간에 동적으로 물리주소로 변환

주소공간은 여러 블록(페이지 혹은 세그먼트)으로 분할, 주기억장치에 연속영역일 필요 없음

적재집합 = 데이터 중 임의 시점에 주기억장치에 적재되어 있는 부분

주기억장치에 적재되지 않은 논리주소가 참조될 경우 메모리 폴트 발생

 

반입정책

- 선 페이징: 페이지 폴트에 의해 요구된 페이지들 이외의 페이지들도 반입

- 요구 페이징

 

배치 정책

- 어디에 위치할 것 인지

- 성능에 큰 차이는 없음

 

교체정책

- 최적: 미래에 참조될까지의 시간이 가장 긴 페이지

- LRU: 가장 오랫동안 참조되지 않은 주기억장치 상의 페이지 교체

- FIFO: 메모리 상에 가장 오래 머물렀던 페이지를 교체

- 클록

 

페이지버퍼링 - 선정된 페이지를 교체하지 않고 그 페이지가 변경되지 않은 페이지인 경우 가용페이지리스트에, 변경된 페이지인 경우 변경페이지리스트에 연결시켜 관리

 

 

# CPU의 구성

- 제어장치: 프로그램 명령어를 해석, 의미에 따라 연산장치, 메모리 등에게 동작 지시

- 연산장치: 덧셈, 뺄셈 등의 연산을 하는 장치로 제어 장치의 지시에 따라 연산 수행

- 레지스터: 메인 메모리로부터 ㅇ릭어온 명령어나 데이터를 저장하거나 연산된 결과를 저장한느 공간

(1) 어드레스 레지스터 - 메모리로부터 데이터를 읽거나 메모리의 데이터를 쓸 메모리 주소를 저장

(2) 프로그램 카운터 - 다음에 실행될 명령어가 저장된 메모리 주소를 저장

(3) 데이터 레지스터 - 메모리에서 읽어온 데이터를 저장

(4) 명령어 레지스터 - 메모리에서 읽어온 명령어를 저장

(5) 어큐뮬레이터 - 연산에 사용되는 데이터를 저장

 

-  CPU 연산 명령어

(1) LOAD - 메모리 주소와 데이터를 로두하여 어큐뮬레이터에 저장

(2) ADD - 메모리 주소의 데이터를 가져와 어큐뮬레이터에 저장된 데이터와 더해서 저장

(3) STORE - 메모리 주소에 해당 데이터를 저장

'공부일지 > CS 기초' 카테고리의 다른 글

헷갈릴때는 정리를 해보자  (0) 2020.06.02
[개념 정리] 정리를 또 해보자  (0) 2019.10.22

+ Recent posts