폰노이만 구조에서 메모리는 유일한 작업 공간이며 모든 프로그램은 메모리에 올라와야 실행할 수 있다. 모든 프로그램은 하드디스크나 SSD같은 보조 저장장치에 보관되어 있다. 프로그램이 실행되어 프로세스가 된다는 것은 저장장치에 있던 프로그램이 메모리로 올라온다는 것이다.

 

메모리 이해하기

메모리의 구조는 1바이트(B) 크기로 나뉜다. 1B로 나뉜 각 영역은 주소(address)로 구분되는데 보통 0번지부터 시작한다.

<메모리 주소>

메모리는 매우 빠른 장치 같지만, CPU입장에서 보면 느린 장치다. CPU 안에 있는 레지스터에 접근하는 속도보다 메모리에 접근하는 속도가 몇 배 이상 느리다. 이러한 속도 차이를 극복하기 위해 CPU 안에 캐시(cache)를 만들어두고 메모리의 일정 부분을 미리 가져와(prefetch) 작업한다. 

<메모리 계층 구조>

메모리 관리의 이중성

메모리 관리는 운영체제를 비롯해 여러 작업을 동시에 처리할 때 메모리를 어떻게 관리하는가에 관한 문제이다. 이처럼 복잡한 메모리 관리는 메모리 관리 시스템(MMS:Memory Management System)이 담당한다. 일괄 처리 시스템에서는 한 번에 한 가지 작업만 처리했기 때문에 메모리 관리가 어렵지 않았다. 그러나 시분할 시스템에서는 운영체제를 포함한 모든 응용 프로그램이 메모리에 올라와 실행되기 때문에 메모리 관리가 복잡하다.

프로세스 입장에서는 메모리를 독차지하려고 하고, 메모리 관리자 입장에서는 관리를 효율적으로 하고 싶어 하는데 이를 메모리 관리의 이중성이라 한다.

 

메모리 관리 작업

메모리 관리 작업은 크게 가져오기(fetch), 배치(placement), 재배치(replacement)로 구분된다.

  • 메모리 가져오기(fetch): 실행할 프로세스와 데이터를 메모리로 가져오는 작업이다.
  • 메모리 배치(placement): 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업이다. 메모리를 같은 크기로 자르는 것페이징(paging)이라 하고, 프로세스의 크기에 맞게 자르는 것세그먼테이션(segmentation)이라고 한다.
  • 메모리 재배치(replacement): 꽉 찬 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업

메모리 주소

메모리에 접근할 때는 주소를 이용한다. 메모리 주소는 물리 주소와 논리 주소로 나뉜다.

32bit CPU와 64bit CPU의 차이

CPU를 나타낼 때의 비트(bit)는 CPU가 한 번에 다룰 수 있는 데이터의 최대 크기를 의미한다. 32bit CPU는 한 번에 다룰 수 있는 데이터의 최대 크기가 32bit, 64bit CPU는 64bit다.

32bit CPU의 경우 메모리 주소를 지정하는 레지스터인 메모리 주소 레지스터(MAR)의 크기가 32bit이므로 표현할 수 있는 메모리 주소의 범위는 0~2^32-1, 총개수는 2^32개다. 이는 약 4GB이며 32bit CPU 컴퓨터는 메모리를 최대 4GB까지 사용할 수 있다. 64bit CPU 컴퓨터는 거의 무한대에 가까운 메모리를 사용할 수 있다.

32bit CPU든 64bit CPU든 컴퓨터에는 메모리가 설치되고 각 메모리에는 주소 공간이 있다. 메모리의 주소 공간을 물리 주소 공간(physical address space)이라고 하는데 이는 하드웨어 입장에서 바라본 주소 공간으로 컴퓨터마다 그 크기가 다르다. 반대로 사용자 입장에서 바라본 주소 공간을 논리 주소 공간(logical address space)이라고 한다.

 

메모리 영역의 구분

메모리 관리를 설명하기 위해 단순 메모리 구조를 살펴보자. 메모리 관리자는 메모리를 운영체제 영역과 사용자 영역으로 나누어 관리한다. 운영체제는 시스템을 관리하는 중요한 역할을 하기 때문에 사용자가 운영체제를 침범하지 못하도록 분리해서 관리한다. 그림에서는 운영체제가 0~359번지를 사용하고 사용자가 360~999번지를 사용한다. 사용자 프로세스는

운영체제를 피해서 메모리에 적재되는데, 운영체제 영역을 399번지까지 사용한다면 사용자 프로세스가 400번지부터 적재되어야한다. 

<단순 메모리 구조>

사용자 영역이 운영체제 영역으로 침범하는 것을 막으려면 하드웨어의 도움이 필요한데, 이는 CPU 내에 있는 경계 레지스터가 담당한다. 경계 레지스터운영체제 영역과 사용자 영역 경계 지점의 주소를 가진다. 메모리 관리자는 사용자가 작업을 용청할 때마다 경계 레지스터의 값을 벗어나는지 검사하고, 만약 경계 레지스터를 벗어나는 작업을 요청하는 프로세스가 있으면 그 프로세스를 종료한다.

<운영체제와 경계 레지스터>

논리 주소와 물리 주소의 변환

문자형 변수 alp를 선언하고 해당 변수에 대문자 A를 저장하는 경우를 살펴보자. 다음 코드가 실행되면 메모리의 어딘가에 문자 A가 저장된다. 그 주소를 40번지라 하자.

char alp = 'A'; 

실행을 위해 프로세스가 메모리에 올라오면 이 메모리는 빈 공간에 배치된다. 40번지는 물리 메모리의 주소 400번지가 된다고 하자. 여기서 400번지는 물리주소이다. 물리주소는 메모리의 입장에서 바라본 주소다. 즉, 메모리 주소 레지스터가 사용하는 주소로, 컴퓨터에 꽂힌 램 메모리의 실제 주소를 말한다. 40번지는 논리 주소이며, 이는 시작점을 0으로 놓았을 때 40번지의 위치에 있는 주소를 말한다. 논리 주소는 사용자 프로세스 입장에서 바라본 주소다. 기억할 것은 프로그램이 실행될 때마다 물리 주소는 매번 바뀐다는 점이다. 논리 주소 공간은 항상 0번지부터 시작하며 컴퓨터가 허용하는 최대의 주소 크기를 가진다. 논리 주소로 이루어진 프로세스를 실행하면 이를 물리 주소로 변환하는 작업이 필요하다. 이 작업은 메모리 관리 유닛(MMU: Memory Management Unit)이 담당한다. 메모리 관리 유닛은 CPU 안에 존재하며 프로세스가 논리 주소에 접근할 때마다 이를 물리 주소로 변환하는 작업을 한다.

<논리 주소를 물리 주소로 변환하는 과정>

위의 그림에서 재배치 레지스터는 주소 변환의 기본이 되는 주소 값을 가진 레지스터로, 메모리에서 사용자 영역의 시작 주소 값이 저장된다.

'Programming > 운영체제' 카테고리의 다른 글

[운영체제]교착상태  (2) 2023.06.06

교착 상태란?

2개 이상의 작업이 동시에 이루어지는 경우, 다른 작업이 끝나기만 기다리며 작업을 더 이상 진행하지 못하는 상태이다.

 

교착 상태의 필요조건

- 교착 상태는 아래의 네 가지 조건을 동시에 만족해야만 교착 상태가 발생한다.

  • 상호 배제: 한 프로세스가 사용하는 자원은 다른 프로세스와 공유할 수 없는 배타적인 자원이어야 한다.
  • 비선점: 한 프로세스가 사용 중인 자원은 중간에 다른 프로세스가 빼앗을 수 없는 비선점 자원이어야 한다.
  • 점유와 대기: 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 기다리는 상태여야 한다.
  • 원형 대기: 점유와 대기를 하는 프로세스 간의 관계가 원을 이루어야 한다.

교착 상태 해결 방법

교착 상태를 해결하는 방법은 예방, 회피, 검출이며, 추가적으로 교착 상태가 발견된 후에 자원을 회복하는 방법도 있다.

교착 상태 예방

교착 상태를 유발하는 네 가지 조건 중 하나라도 예방하여 교착 상태를 처리하는 방법으로 다음과 같이 네 가지 예방법이 있다.

  1. 상호 배제 예방: 시스템 내에 있는 상호 배타적인 모든 자원, 즉 독점적으로 사용할 수 있는 자원을 없애버리는 방법이다.
  2. 비선점 예방: 모든 자원을 빼앗을 수 있도록 만드는 방법이다.
  3. 점유와 대기 예방: 프로세스가 자원을 점유한 상태에서 다른 자원을 기다리지 못하게 하는 방법이다.
  4. 원형 대기 예방: 점유와 대기를 하는 프로세스들이 원형을 이루지 못하도록 막는 방법이다.
교착 상태 회피

프로세스에 자원을 할당할 때 어느 수준 이상의 자원을 나누어주면 교착 상태가 발생하는지 파악하여 그 수준 이하로 자원을 나눠주는 방법이다.

교착 상태 검출

타임아웃을 이용한 교착 상태 검출: 일정 시간 동안 작업이 진행되지 않은 프로세스를 교착 상태가 발생한 것으로 간주하여 처리하는 방법이다.

자원 할당 그래프를 이용한 교착 상태 검출: 교착 상태를 검출하는 또 다른 방법은 자원 할당 그래프를 이용하는 것이다.

  • 교착 상태가 없는 자원 할당 그래프: 사이클이 존재하지 않는 자원 할당 그래프이다.
  • 교착 상태가 있는 자원 할당 그래프: 사이클이 존재하는 자원 할당 그래프이다.
교착 상태 회복

교착 상태가 검출되면 교착 상태를 푸는 후속 작업을 하는데 이를 교착 상태 회복이라고 한다. 교착 상태 회복 단계에서는 교착 상태를 유발한 프로세스를 강제로 종료한다. 프로세스를 강제로 종료하는 방법에는 다음과 같이 두 가지가 있다.

  • 교착 상태를 일으킨 모든 프로세스를 동시에 종료한다.
  • 교착 상태를 일으킨 프로세스 중 하나를 골라 순서대로 종료한다.

'Programming > 운영체제' 카테고리의 다른 글

[운영체제]물리 메모리 관리  (0) 2023.06.06

* 클래스

 class 클래스명:

     이 부분에 관련 코드 구현

 

ps. class에는 변수, 함수, 리스트를 넣을 수 있다.

 

- 클래스를 실제로 생성해서 만드는 것을 객체(인스턴스)라고 한다.

  클래스는 설계도에 비유하고 객체는 설계도를 통해 만든 제품에 비유된다.

 

- 인스턴스 생성

  ex) Car 클래스가 있다면 myCar = Car()와 같이 참조변수에 인스턴스를 담아서 생성한다.

 

- 생성자

  생성자는 인스턴스를 생성하면 무조건 호출되는 메서드이다.

  def __init__(self):

     이 부분에 초기화할 코드 입력

 

- 생성자에 매개변수를 넣고자 한다면 아래와 같이 하면 된다.

  def __init__(self, value1, value2):

     이 부분에 초기화할 코드 입력

 

- 인스턴스 변수

  인스턴스가 생성되어야만 사용할 수 있는 변수이다.

  '인스턴스.인스턴스변수명'으로 사용가능하다.

 

- 클래스 변수

  클래스 안에 공간이 할당된 변수를 의미한다.

  클래스 변수를 만드는 방법은 인스턴스 변수와 동일하다. 하지만 크래스 변수에 접근할 때는 '클래스명.클래스변수명' 또는 '인스턴스.클래스변수명' 방식으로 접근해야 한다.

 

- 인스턴스 변수와 클래스 변수가 형식이 동일한데 파이썬은 어떻게 구분하는가?

  인스턴스 변수와 클래스 변수 선언 시점에서는 구분할 수 없다. 

  클래스 안에서 필드(변수)에 접근할 때 self를 붙이면 인스턴스 변수이고, 클래스명을 붙이면 클래스 변수를 생성한다.

 

- 상속

  클래스의 상속은 기존 클래스에 있는 필드와 메서드를 그대로 물려받는 새로운 클래스를 만드는 것이다.

  상속받은 후에는 새로운 클래스에서 추가로 필드나 메서드를 만들어 사용해도 된다.

  - 상위 클래스 = 슈퍼_클래스 or 부모_클래스

  - 하위 클래스 = 서브_클래스 or 자식_클래스

  class 서브_클래스(슈퍼_클래스):

      이 부분에 서브 클래스의 내용 코딩

 

- 메서드 오버라이딩

  메서드 오버라이딩은 상위 클래스의 메서드를 서브 클래스에서 재정의하는 것이다.

 

'Programming > Python' 카테고리의 다른 글

[Python]함수, 모듈  (0) 2023.06.01
[Python]리스트  (0) 2023.06.01
[Python]반복문  (0) 2023.06.01
[Python]조건문  (0) 2023.06.01
[Python]변수, 연산자  (0) 2023.06.01

* 함수

- def 함수명(매개변수):

     수행할 문장

 

def add(a, b):
    print(a + b)

a, b = 1, 2

add(a, b)

* 모듈

- 모듈은 한마디로 함수의 집합이라고 할 수 있다.

위에서 만든 add(a, b) 함수를 다른 프로그램에서도  사용하고 싶다면, 일일이 add(a, b)함수를 선언해 주어도 되지만, add(a, b)함수를 예를 들어 Module.py라는 파일에 만들어 놓고, 함수를 사용하고자 하는 프로그램 파일에서 

import Module을 추가함으로써 add(a, b)함수를 사용할 수 있다.

- Module.py

def add(a, b):
    print(a + b)

- main.py

import Module

a, b = 1, 2

Module.add(a, b)

'Programming > Python' 카테고리의 다른 글

[Python]클래스  (0) 2023.06.02
[Python]리스트  (0) 2023.06.01
[Python]반복문  (0) 2023.06.01
[Python]조건문  (0) 2023.06.01
[Python]변수, 연산자  (0) 2023.06.01

* 리스트

- 리스트명 = [값1, 값2, 값3, ....]

list = [1, 2, 3, 4, 5]

ps. 리스트 값의 인덱스는 0부터 시작한다. ex) print(list[0]) -> 1이 출력

 

- 리스트에 값 추가

  리스트명.append(값)

list.append(6)

- 리스트의 생성과 초기화

  aa = []  -> 빈 리스트 생성

  bb = [10, 20, 30]  -> 정수로만 구성된 리스트

  cc = ['python', 'study']  -> 문자열로만 구성된 리스트

  dd = [10, 20, 'python']  -> 다양한 데이터형이 섞인 리스트

 

ps. 파이썬의 리스트는 다른 프로그래밍 언어의 배열과 달리 다양한 데이터형을 섞을 수 있다.

 

 

 

'Programming > Python' 카테고리의 다른 글

[Python]클래스  (0) 2023.06.02
[Python]함수, 모듈  (0) 2023.06.01
[Python]반복문  (0) 2023.06.01
[Python]조건문  (0) 2023.06.01
[Python]변수, 연산자  (0) 2023.06.01

* for문

for 변수 in range(시작값, 끝값+1, 증가값):

   이 부분을 반복

for i in range(0, 5, 1):
    print("hello world!")

* while문

while 조건문:

   이 부분을 반복

a = 5
while a < 10:
    print("hello world!")
    a = a + 1

* break문

-> 무조건 반복문을 빠져나온다.

while True:
    print("hello world!")
    break

* continue문

-> continue문을 만나면 블로의 남은 부분을 무조건 건너뛰고 반복문의 처음으로 돌아간다.

a = 3
while a < 5:
    print("hello world!")
    a = a + 1
    continue
    print("hiiiiiiiiii")

'Programming > Python' 카테고리의 다른 글

[Python]함수, 모듈  (0) 2023.06.01
[Python]리스트  (0) 2023.06.01
[Python]조건문  (0) 2023.06.01
[Python]변수, 연산자  (0) 2023.06.01
[Python]입출력  (0) 2023.06.01

* if문

if 조건식:                                                              

  실행할 문장

if a < 10:
    print("10보다 작군요.")

* else if문

  if 조건식:

    실행할 문장1

  else:

    실행할 문장2

if a < 10:
    print("10보다 작군요.")
else:
    print("10보다 크군요.")

* if~elif~else문

if 조건식:

  실행할 문장1

elif 조건식:

  실행할 문장2

else:

  실행할 문장3

if a < 10:
    print("10보다 작군요.")
elif a > 10:
    print("10보다 크군요.")
else:
    print("해당사항 없음")

  ps. 파이썬에서는 switch문이 존재하지 않는다.

'Programming > Python' 카테고리의 다른 글

[Python]함수, 모듈  (0) 2023.06.01
[Python]리스트  (0) 2023.06.01
[Python]반복문  (0) 2023.06.01
[Python]변수, 연산자  (0) 2023.06.01
[Python]입출력  (0) 2023.06.01

* 변수의 선언

-> 파이썬에서 변수의 데이터 형식은 값을 넣는 순간마다 변경될 수 있는 유연한 구조이다.

ex) value =10 -> 정수형, value = 10.0 -> 실수형, value = "10" -> 문자열

*산술 연산자

+ 더하기 a + b = 30
- 빼기 a - b = -10
* 곱하기 a * b = 200
/ 나누기 b / a = 2.0
% 나머지 b % a = 0
** 제곱 a ** c = 1000
// a // c = 3

 * 논리 연산자

- and(논리곱) : 그리고

- or(논리합) : 또는

- not(부정) : 부정

'Programming > Python' 카테고리의 다른 글

[Python]함수, 모듈  (0) 2023.06.01
[Python]리스트  (0) 2023.06.01
[Python]반복문  (0) 2023.06.01
[Python]조건문  (0) 2023.06.01
[Python]입출력  (0) 2023.06.01

python의 특징

  • 라이브러리가 풍부하다.
  • 스크립트 언어(인터프리터 언어)로써 실행 속도가 컴파일러 언어보다는 느리다.

 

문자열 입력: input() 함수

  • 사용자의 입력을 받는다. ( print 함수처럼 문자열 출력 가능( ex. input("숫자를 하나 입력하시요: ") )
  • 문자열로 취급한다.
  • 사용자의 입력을 반환한다.
  • 입력은 엔터가 입력될 때 엔터 전까지를 모두 받는다.
  • 자료형을 변환하고 싶을 경우 형변환 함수 사용 ( ex. 정수형으로 형변환 -> int(input("10")) )

출력: print() 함수

print() 함수 사용 방법

print("안녕")
print(123)
print([1, 2.5])
print({"이름": None, "관리자": True})

출력

안녕
123
[1, 2.5]
{'이름': None, '관리자': True}

print() 함수는 문자열을 출력하지만 입력값으로 문자열을 넘기도록 강제하지는 않습니다.

문자열이 아닌 다른 자료형의 데이터가 입력으로 들어오면 print() 함수는 내부적으로 넘어온 데이터를 상대로 str() 함수를 호출한 결과를 출력합니다.

예를 들어, print() 함수에 정수가 인자로 넘어오면,

print(123)

실제로는 print() 함수는 다음과 같이 동작하게 됩니다.

print(str(123))

서식문자 사용

  -정수: %d

  -실수: %f

  -문자열: %s

ex) print("%d" %10), print("%f" %1.5), print("%s" %"Python")

'Programming > Python' 카테고리의 다른 글

[Python]함수, 모듈  (0) 2023.06.01
[Python]리스트  (0) 2023.06.01
[Python]반복문  (0) 2023.06.01
[Python]조건문  (0) 2023.06.01
[Python]변수, 연산자  (0) 2023.06.01

단타의 종류에는 크게 스캘핑(초단타), 데이 트레이딩, 스윙 이렇게 세 가지의 경우가 있다.

 

-스캘핑: 하루에 매우 많은 거래를 하며, 매수 뒤 몇 분, 빠르면 몇 초안에 팔아서 차익을 내는 기법. 인간이 할 수 있는 매매 중 가장 짧은 시간안에 이루어진다.


-데이 트레이딩: 하루 안에 매수와 매도를 끝낸다. 하루 한번 매수/매도를 하기도 하고 여러 번 매매하기도 한다. 스캘퍼보다 매매 빈도가 낮고 보유시간도 좀 더 길다. 여기까지가 당일매매 단타에 속한다.


-스윙 트레이딩: 단타 매매 중 하루를 넘겨 보유하되 중장기 투자만큼 오래 보유하지는 않는 매매이다.

 

 

+ Recent posts