readonly

변수 앞에 위치하면 해당 변수는 읽기 전용이 되어 해당 변수가 정의된 클래스나 구조체, 메서드 등에서만 수정이 가능하며 readonly로 선언된 변수는 선언할 때 또는 생성자에서 값을 할당해야한다.

 

public class MyClass
{	
	readonly int myReadOnlyInt;
    public MyClass(int value)
    {
    	myReadonlyInt = value;
    }
}

위 코드에서 myReadOnlyInt는 읽기 전용으로 선언되었기 때문에 생성자에서 값을 할당한 이후에는 변경이 불가능하다.

 

상수를 선언한다는 점에서 const와 비슷한데 둘의 차이를 비교할 필요가 있다.

 

const vs readonly

초기화 방법

const와 readonly는 초기화 방법에서부터 차이가 있다.

// 반드시 선언과 동시에 초기화 필요
const int constNum = 10;

// 선언에서 뿐만 아니라 생성자에서 값을 할당해서 초기화 할 수 있다.
readonly int readonlyNum_1 = 10;
readonly int readonlyNum_2;
public MyClass(int value)
{
	readonlyNum_2 = value;
}

 

사용 범위

const는 클래스 멤버 또는 데이터 형식 멤버로 선언할 수 있지만 클래스 멤버 중에서도 인스턴스 멤버는 const 키워드를 사용할 수 없다. 즉 인스턴스 변수, 인스턴스 메서드 등에서는 const 키워드 사용이 불가능하다.

public class MyClass
{
    public const int number = 10;
    public void Test()
    {
        int test = number;
    }
}

public static class MyStaticClass
{
    public const int number = 20;
    public static void Test()
    {
        int test = number;
    }
}

public class OtherClass()
{
    public void TestMethod()
    {
        MyClass instance = new MyClass();
        // 접근 불가능함
        int test1 = instance.number;
        
		// static 클래스 인스턴스화 안됨
        //MyStaticClass staticInstance = new MyStaticClass();
        // 직접 호출가능
        int test2 = MyStaticClass.number;
    }
}

 

실행시간

const는 컴파일 시간에 값이 결정되기 때문에 런타임 성능이 상대적으로 좋다.

readonly는 런타임에 값을 할당할 수 있기 때문에 const보다는 조금 더 느릴 수 있다. 

그렇기 때문에 런타임에 값을 결정해야할 경우에만 readonly를 사용하고 그 이외에는 const를 사용하는게 낫다.

 

public class MyClass
{
    public const int number = DateTime.Now.Year; // 컴파일 에러 발생
    public readonly int year = DateTime.Now.Year; // 실행 시간에 값이 결정됩니다.
}

 

const와 readonly의 가장 큰 차이점은 값이 결정되는 시점이다.

const는 컴파일 타임 readonly는 런타임

 

따라서 애초에 고정된 값이라면 const를 사용하지만 인스턴스가 생성될 때 값을 할당하고 그 이후에 변경되지 않도록하려면 readonly를 사용하면된다.

728x90
반응형

Partial

클래스, 구조체, 인터페이스 등의 선언에 사용된다.

partial 제한자로 선언된 클래스, 구조체, 인터페이스 등은 여러 파일에 나누어 작성할 수 있다.

 

public class Person
{
	public string FirstName { get; set; }
    public string LastName { get; set; }
    
    public void SayHello()
    {
    	Console.WriteLine($"Hello, my name is {FirstName} {LastName}.");
    }
}

Person이라는 클래스가 하나의 파일에 선언되고 작성되어 있다. 이 클래스를 여러 파일로 나누어 선언하기 위해 partial 키워드를 사용하면 다음과 같이 사용할 수 있다.

 

// Person.cs
public partial class Person
{
	public string FirstName { get; set; }
    public string LastName { get; set; }
}

// Person_SayHello.cs
public partial class Person
{
	public void SayHello()
    {
    	Console.WriteLine($"Hello, my name is {FirstName} {LastName}.");
    }
}

 

Person.cs 파일과 Person_SayHello.cs 파일은 같은 네임스페이스 안에 있으며 partial 키워드를 사용해 클래스를 선언하였기 때문에 다른 파일에서 Person 클래스를 동일하게 partial 키워드를 사용해 선언하면 이 클래스는 하나의 클래스로 인식된다. partial로 선언된 클래스는 컴파일 시점에 자동으로 하나의 클래스로 합쳐지기 때문에 별도의 참조가 필요하지 않다.

 

이러한 기능은 특히 협업에서 용이하게 사용이 가능하다.

큰 규모의 코드를 개발하기 위해서 여러 개발자가 협업을 하게 된다면 동시에 하나의 클래스나 구조체를 작성하는 상황이 있다. 이런 상황에서 partial 키워드를 사용하여 하나의 클래스를 여러 파일에 나누어 각자 작성할 수 있고 이렇게 하면 동시에 작성을 각자가 코드를 작성하더라도 서로 영향을 주지 않고 작업을 진행할 수 있다.

 

양이 많은 코드의 경우 하나의 파일에 모두 작성하게 되면 보기나 수정이 힘들어진다. 이때 partial 키워드를 사용하면 코드를 작은 단위로 분할하여 작성할 수 있기 때문에 코드 가독성도 좋아지고 유지보수도 편리해진다. 

728x90
반응형

글을 작성하다 보면 제목이나 본문을 설정하거나 글자의 스타일을 바꾸는 등 마우스를 잡아야 하는 일이 많아졌다.

따라서 마우스와 키보드를 왔다 갔다 하는 동선을 줄여서 글을 작성하는 시간을 단축시키기 위해 티스토리에서 지원하는 단축키를 정리해 놓기로 한다.

 

블로그 단축키

이전 글  A
다음 글  S
관리자 페이지 이동 :  Q

 

추가 단축키

추가 단축키의 경우 스킨마다 적용된 게 다를 수 있기 때문에 스킨 편집 > html에서 단축키를 확인해 보는 게 정확하다.

현재 사용하고 있는 스킨의 경우 W, E, R, H의 추가 단축키가 있다.

 

글쓰기  W
스킨편집하기  E
홈으로  H
//추가 단축키
var key = new Array();
key['w'] = "/admin/entry/post/";
key['e'] = "/manage/design/skin/edit#/";
//key['r'] = "/admin/plugin/refererUrlLog/";
key['h'] = "/";

단축키를 누르면 해당 키에 할당된 문자열을 주소창에 넣고 페이지를 이동하는 방식으로 원하는 대로 커스텀이 가능하다.

스킨에서 기본으로 설정한 단축키 중에서 R의 기능이 불분명하다. 문맥상 관리자 페이지에서 plugin 항목의 refererUrlLog로 지정된 페이지로 이동하는 것 같은데 현재는 admin/plugin부터가 이동이 되지 않기 때문에 일단 주석처리하기로 한다.

 

 

글쓰기

글쓰기에서 사용할 수 있는 단축키는 글쓰기 페이지에서 더 보기를 통해 확인할 수 있다.

티스토리 글쓰기 단축키

단축키 목록 ctrl + /
실행 취소 ctrl + Z
다시 실행 ctrl + shift + Z or ctrl + Y

 

스킨마다 다를 수도 있지만 현재 블로그 기준으로는 이렇게 동작한다.

제목 1, 2, 3 - html 태그 h2, h3, h4

본문 1, 2, 3 - 폰트 사이즈 18, 16, 14이다.

 

제목 변경  ctrl + alt + 1 (제목 1 > 제목 2 > 제목 3 > 제목 1...)
본문 변경 ctrl + alt + 2(본문 1 > 본문 2 > 본문 3 > 본문 1...)

 

태그변경

<h1 ~ h6>  alt + shift + 1 ~ 6
<p> alt + shift + 7
<div> alt + shift + 8
인용 변경 ctrl + alt + 3
서체 변경 ctrl + alt + T
목록 변경 ctrl + alt + 4
정렬 ctrl + alt + 5
굵게 ctrl + B
기울임 ctrl + I
밑줄  ctrl + U
취소선  ctrl + alt + J
글자색  ctrl + alt +[
배경색  ctrl + alt + ]
링크 삽입 ctrl + K
코드 블록 ctrl + alt + ,
특수 문자 ctrl + alt +.
이모티콘 ctrl + alt + E

 

728x90
반응형

'Life' 카테고리의 다른 글

오랜만에 만족스러운 영화관람! 슈퍼 마리오 브라더스  (0) 2023.05.08
베트남 콘삭 커피  (0) 2023.04.09
장 줄리앙 전시회 - 그리고 거기  (1) 2023.03.27
재벌집 막내아들  (0) 2023.01.08
러버덕과 러버덕  (0) 2023.01.07

virtual

가상 메서드를 정의할 때 사용되는데 이 키워드를 통해서 메서드를 재정의할 수 있도록 허용한다.

class Base
{
	public virtual void Print()
    {
    	Console.WriteLine("Base class");
    }
}

 

override

상속 관계에서 부모 클래스에 정의된 메서드를 자식 클래스에서 다시 정의할 때 사용된다.

class Derived
{
	public override void Print()
    {
    	Console.WriteLine("Derived class");
    }
}

 

override 키워드를 사용하여 부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의하면 자식 클래스의 인스턴스에서 호출할 때 부모 클래스와 자식 클래스의 구현 차이를 쉽게 반영할 수 있다.

 

Base base = new Base();
base.Print();
// "Base class"

Derived derived = new Derived();
derived.Print();
// "Derived class"

Base base2 = new Derived();
base2.Print();
// "Derived class"
728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# 읽기 전용 키워드 : readonly  (0) 2023.03.30
C# 코드 분할 키워드 : partial  (0) 2023.03.30
C# 인스턴스 생성 키워드 : new  (0) 2023.03.30
Interoperability  (0) 2023.02.02
Managed, Unmanaged, Native Code  (0) 2023.02.02

new

Instance

객체를 생성할때 사용한다.

C#에서는 내장 클래스인 string, int, double 등을 포함한 모든 클래스 object를 상속받기 때문에  new 키워드를 사용해서 객체를 생성할 수 있다. 

int n = new int();
string s = new string();
MyStruct structInstance = new MyStruct();
MyClass classInstance = new MyClass();

하지만 내장 클래스들은 구조체로 정의되어 있기 때문에 구조체 변수를 생성할 때 new를 사용하지 않고 객체를 바로 생성할 수 있다.

int n = 0;
float f = 1.0f;

string의 경우 .Net에서 특별히 내부적으로 string literal로 정의되어 있는데 때문에 일반적인 참조 타입과는 다르게 직접 변수를 할당하여 객체가 생성이 가능하다.  

 

* string literal : 문자열 상수는 소스 코드 상에 고정된 문자열 값이다.

 

Inherit

new 키워드는 상속과 관련해서도 사용이된다.

상속 관계에 있는 클래스에서 메서드, 프로퍼티, 이벤트 등의 멤버를 재정의할 때 사용되는데 일반적으로 멤버의 재정의에는 override 키워드를 사용하지만 new키워드를 통해서도 멤버의 재정의가 가능하다.

 

class BaseClass
{
	public void Print()
    {
    	Console.WriteLine("Base class");
    }
}

class DerivedClass : BaseClass
{
	public new void Print()
    {
    	Console.WriteLine("Derived class");
    }
}

여기서 new 키워드를 사용하여 재정의된 메서드는 부모 클래스에서 정의된 멤버와 자식 클래스에서 정의된 멤버가 모두 유지되는데 이는 덮어쓰는 override와 다르게 두 개의 멤버가 서로 다른 것으로 재정의된 메서드는 부모 클래스의 멤버와는 관계가 없는 새로운 멤버로 취급된다.

DerivedClass obj = new DerivedClass();
obj.Print();
// "Derived class" 출력

BaseClass obj = new DerivedClass();
obj.Print();
// "Base class" 출력

 

 

728x90
반응형

Operating System

운영체제

운영체제는 컴퓨터 시스템의 CPU, 메모리, 입출력 장치, 저장 장치 등의 자원을 효율적으로 관리하고 다른 소프트웨어나 사용자가 이용할 수 있도록 관리하는 인터페이스 역할을 하는 소프트웨어를 말한다. 

 

Resource Management

자원관리, 운영체제는 컴퓨터의 자원을 효율적으로 관리하고 할당하는 역할을 한다.

대표적인 자원으로는 CPU, 메모리, 저장장치, 입출력 장치가 있다.

 

CPU

프로세스 스케줄링을 통해 CPU 자원을 할당하고 여러 프로세스 간의 경쟁 상황을 해결한다.

CPU를 효율적으로 사용하기 위해 실행 중인 여러 프로세스들 사이에서 CPU의 사용권을 어떻게 배분할지 결정하여 CPU의 사용률을 높이고 응답 시간을 최소화하며 프로세스의 우선순위를 지정하여 경쟁 상황 해결 및 효율적인 시스템 동작을 유지한다.

 

스케줄링 알고리즘에는 FCFS, SJF, Priority Scheduling, Round-Robin Scheduling 등이 있다.

 

FCFS, First Come First Served

프로세스 스케줄링의 가장 간단한 형태 중 하나이다. 

준비 큐에 도착한 순서대로 프로세스를 처리하는 방식으로 매우 직관적이기 때문에 구현이 간단하지만 실행 시간이 긴 프로세스가 먼저 도착하면 그 이후에 도착한 짧은 실행 시간을 가진 프로세스들이 대기 시간이 길어지기 때문에 평균 대기 시간과 평균 반환 시간이 크게 증가할 수 있는 문제가 있다.

* Average Waiting Time : 평균 대기 시간, 프로세스가 대기하는 시간의 평균값

* Average Turnaround Time : 평균 반환 시간, 프로세스가 큐에서 대기하고 CPU를 사용하는 시간의 합의 평균값

* 일반적으로 두 지표가 작을수록 좋은 스케줄링 알고리즘으로 판단한다.

 

먼저 도착한 프로세스가 먼저 실행되기 때문에 CPU를 먼저 사용하는 프로세스는 대기 시간이 짧고, 나중에 사용하는 프로세스는 대기 시간이 길어진다. 따라서 평균 대기 시간과 평균 반환 시간은 프로세스 도착 순서에 따라 크게 달라진다. 또한 FCFS는 선점형 스케줄링이 아니기 때문에 한 번 시작된 프로세스는 CPU를 반환하기 전까지 계속 실행된다. 따라서 이 알고리즘은 대화형 시스템과 같이 응답 시간이 중요한 시스템에서는 적합하지 않다.

 

SJF, Shortest Job First

다음에 실행할 프로세스를 선택할 때 CPU Burst Time이 가장 짧은 프로세스를 선택하는 알고리즘이다.

CPU 버스트 시간이 짧은 작업이 먼저 실행되면 해당 작업이 빠르게 완료되면 자원을 빨리 반환할 수 있고 다른 작업도 빠르게 실행될 수 있기 때문에  때문에 평균 대기 시간을 줄일 수 있다는 장점이 있다.

 

Priority Scheduling

FCFS와 SJF 알고리즘은 일괄적으로 대결에서 작업을 처리하기 때문에 일부 작업이 너무 오래 실행되거나 대기하는 경우 다른 작업들은 계속해서 대기열에 쌓이게 되는 문제가 있다. 이렇게 필요한 만큼의 CPU 자원을 할당받지 못하고 대기하게 되는 상태를 Starvation라고 한다.

 

이 문제는 대기 시간이 긴 프로세스에게 우선순위를 부여하여 대기 시간이 길어질수록 우선순위가 높아지게 하는 방법을 통해 해결할 수 있다. 그중 Aging 기법은 SJF 알고리즘에서 버스트 타임이 높은 작업을 우선순위로 두어 문제를 해결하는 기법이다.

 

우선순위 스케줄링은 자원이나 시간이 많이 필요한 작업을 우선 순위로 두고 먼저 처리시켜 다음 작업을 진행할 때 자원이나 시간이 부족하여 대기 상태에 빠지지 않도록 한다. 이때 동일한 우선순위의 경우 해당 알고리즘을 통해서 처리하여 기아 상황에서도 공정한 작업 스케줄링이 가능하게 한다.

 

Round-Robin Scheduling

CPU 스케줄링에서 가장 일반적으로 사용되는 알고리즘이다. 

시분할 시스템에서 사용되며 각 프로세스가 동일한 시간 할당량(Quantum)을 갖는다는 특징이 있으며 할당된 시간 이내에 작업이 끝나지 않으면 다른 프로세스에게 CPU를 양보하고 대기열의 끝으로 이동하는 과정을 반복한다.

* 시분할 시스템 : CPU 시간을 작은 단위로 분할하여 다수의 사용자가 동시에 컴퓨터를 사용할 수 있도록하는 기술이다.

 

주로 대화식 시스템에서 사용되는 것이 일반적이며 사용자가 프로세스를 시작하면 해당 프로세스는 대기열에 추가되는데 CPU는 대기열에서 가장 앞에 있는 프로세스에게 할당되고 일정한 시간 후에 다른 프로세스로 넘어가고 이 과정을 대기열이 비어 있을 때까지 반복한다.

FCFS와 마찬가지로 간단하며 쉽게 구현이 가능하지만 모든 프로세스에게 동일한 기회를 부여하기 때문에 더 공정한 스케줄링이 가능하다. 다만 할당된 시간이 작은 경우에는 자주 Context Switch이 발생하기 때문에 오버헤드 문제가 있을 수 있다. 또한 할당된 시간이 큰 경우에는 대기열에 있는 다른 프로세스들이 오랫동안 기다려야 하기 때문에 적절한 시간 할당량을 결정하는 것이 중요하다.

* Context Swtich : 문맥 교환, CPU가 현재 실행 중인 프로세스에서 다음으로 실행할 프로세스로 제어를 양도하는 과정

 

Memory

프로세스가 사용할 메모리 공간을 할당하고 메모리 공간을 관리한다.

운영체제에서 메모리 공간은 일반적으로 세 가지 방식으로 할당 및 관리된다.

 

Single Fixed Partition Allocation

단일 고정 분할 할당

메모리를 고정 크기의 분할로 나누고 각 분할을 프로세스에 할당한다.

분할 크기는 운영체제가 미리 정해놓은 것으로 프로세스의 크기가 이것보다 작아야한다.

단순한 방식이지만 메모리 이용률이 낮다는 단점이 있다. 

Paing 기어

Variable Partition Allocation

가변 분할 할당

메모리를 동적으로 분할하며 프로세스에 할당하는 방식이다.

프로세스의 크기에 맞춰서 할당되기 때문에 메모리 이용률이 향상된다. 프로세스의 크기가 불규칙적이고 할당과 해제에 따른 Memory Fragment 문제가 발생할 수 있다.

 

Memory Fragment 

메모리 단편화

메모리에서 사용 가능한 공간이 작은 조각으로 나뉘어 큰 용량의 프로세스가 할당되지 못하고 남는 작은 조각들이 늘어나는 문제를 말한다. 메모리를 효율적으로 사용하지 못하게 만들어 시스템 성능을 저하시키게 된다.

메모리 단편화는 Internal Fragment와 External Fragment 두 종류가 있다.

Internal Fragment

내부 단편화, 메모리 할당 시 요청한 프로세스크기보다 더 큰 메모리 공간을 할당하게 되어 할당된 메모리 공간 중 일부가 사용되지 않는 문제

External Fragment

외부 단편화, 메모리에서 사용 가능한 공간이 작은 조각으로 나뉘어 큰 용량의 프로세스가 할당되지 못하는 문제 

 

이러한 메모리 단편화 문제를 해결하기 위해서 Paing과 Segmentation 기법이 사용된다.

Paging : 물리적인 메모리를 고정 크기의 블록으로 분할하여 가상 주소와 물리 주소를 매핑한다. 

Segmentation : 프로그램을 논리적인 단위인 세그먼트로 분할하여 가상 주소와 물리 주소를 매핑한다. 페이징 보다 프로그램의 논리적 구조를 반영하기 쉽다.

 

Virtual Memory

가상 메모리

물리적인 메모리보다 큰 용량의 가상 메모리 공간을 프로세스에게 할당하여 사용하는 방식이다.

프로세스가 필요로 하는 부분만 메모리에 올려서 실행하고 나머지 부분은 디스크에 저장한다. 이 방식은 물리적인 메모리보다 큰 용량의 프로그램을 실행할 수 있게 되며 프로세스 간의 메모리 공유도 가능하다.

 

 

Storage

하드디스크 등의 저장장치를 관리하고 File System을 통해 파일을 관리한다.

* File System : 운영체제에서 파일과 디렉터리를 저장하고 검색할 수 있는 구조

 

파일이나 디렉토리를 저장하기 위한 블록의 할당, 디스크 공간 관리, 파일 접근 권한 관리, 파일 백업 및 복구 등의 역할을 수행하는데 일반적으로 파일 시스템은 파일과 디렉토리를 계층 구조로 구성하며 각 파일과 디렉터리는 고유한 이름을 가지고 있다. 

 

디렉터리와 파일을 구분하는 특별한 기능을 수행하기 위한 파일을 사용하기도 하는데 이 파일은 파일 시스템의 일부이지만 일반 파일과 다른 속성을 가지고 있다. 예를 들어 리눅스에는 /dev 디렉터리에 하드웨어와 상호 작용하기 위한 특별한 파일들이 존재하는데 이러한 파일들은 일반 파일과는 달리 디바이스 파일로서 하드웨어 디바이스에 대한 인터페이스 역할을 한다. Windows에는 레지스트리 파일이 이러한 파일로 분류되며 운영체제 설정 정보를 포함하고 운영체제 및 애플리케이션의 구성을 제어하는 데 사용된다. 

 

 

Input/Output

키보드, 마우스, 모니터, 프린터 등의 입출력 장치의 관리, 디바이스 드라이버를 통해 입출력을 처리한다.

 

Device Driver Management

장치 드라이버 관리

각각의 입출력 장치에 대해 운영체제는 해당 장치와 상호작용할 수 있는 드라이버를 관리한다. 이 드라이버는 해당 장치와 통신할 수 있는 인터페이스를 제공하며 운영체제와 프로그램 간의 데이터 전송을 담당한다.

 

I/O Request Management

프로그램이 입출력을 요청하면 운영체제는 이를 관리하며 각각의 입출력 요청에 대해 우선순위를 결정하여 처리한다. 이를 위해서 운영체제는 입출력 요청 큐를 유지하고 요청에 따라 적절한 장치를 할당하여 요청을 처리한다.

 

I/O Buffering

입출력 장치의 속도는 프로그램의 실행 속도와 차이가 있기 때문에 입출력 요청에 대한 응답을 기다리는 동안에는 다른 작업을 수행할 수 있도록 버퍼링을 수행한다. 이를 위해 운영체제는 입출력 데이터를 임시로 저장할 수 있는 입출력 버퍼를 유지한다.

 

Interrupt Process

입출력 작업 중에는 다양한 상황에서 인터럽트가 발생할 수 있는데 이를 위해 운영체제는 인터럽트 처리 루틴을 유지하여 각각의 인터럽트에 대해 적절한 처리를 수행한다.

 

I/O Protection

 입출력 장치를 공유하는 다양한 프로그램이 동시에 실행될 경우 장치 접근에 대한 충돌이 발생할 수 있는데 이를 방지하기 위해 운영체제는 입출력 보호 기능을 수행하여 각각의 프로그램이 입출력 장치를 안전하게 사용할 수 있도록 보장한다.

 

입출력 보호 기능은 장치에 대한 접근 권한을 제어하는 기능으로 보안과 안정성을 유지한다. 사용자 프로세스가 입출력 장치를 임의로 사용하지 못하도록 하고 운영체제가 입출력 장치에 대한 접근 권한을 부여하고 사용자 프로세스는 해당 권한을 가지지 못한 상태에서는 장치에 접근할 수 없도록 한다.

728x90
반응형

'Computer > Engineering' 카테고리의 다른 글

아키텍처  (0) 2023.03.27
데이터 경로와 제어 유닛  (0) 2023.03.17
메모리  (0) 2023.03.17
명령 사이클과 명령어 집합 구조  (0) 2023.03.17
레지스터  (0) 2023.03.17

Architecture

하드웨어와 소프트웨어의 구성 요소, 기능, 상호작용 등을 설계하고 구성하는 방식이나 규칙으로 컴퓨터 시스템 전반에 대한 설계와 구조를 의미한다.

 

Von Neumann Architecture

폰 노이만 아키텍처

1940년대 말에 알렌 튜링과 존 폰 노이만 등이 제안한 아키텍처로 컴퓨터 시스템의 아키텍처 중 가장 널리 사용되는 구조 중 하나이다. 현대 컴퓨터 시스템의 대부분이 이 아키텍처를 기반으로 설계되었다.

Von Neumann 아키텍처는 메모리, CPU, 입/출력 장치, 버스 등의 하드웨어 요소로 구성되며 이 중에서 CPU가 가장 핵심적인 구성 요소이다. CPU는 명령어를 순차적으로 처리하며, 프로그램의 명령어를 주기억장치에서 읽어와서 해석하고 실행한다. 따라서 명령어와 데이터를 모두 주기억장치에 저장하고 명령어와 데이터를 순차적으로 읽어오는 방식을 사용한다. 이를 '프로그램과 데이터의 저장공간이 동일하다'라는 의미에서 '단일 저장 장치(Single Memory)'라고 한다.

 

명령어와 데이터를 같은 메모리 공간에 저장하기 때문에 명령어와 데이터의 접근 시간이 동일하다는 것으로 명령어와 데이터를 주기억장치에서 읽어오는 시간이 줄어들어 전체적인 성능을 향상시킬 수 있다. 또한 프로그램의 수정이나 변형이 용이하다는 장점을 가진다. 하지만 주기억장치와 CPU 사이의 데이터 전송이 병목현상을 유발할 수 있으며 이를 해결하기 위해 캐시 메모리 등의 보조 기억장치를 사용하는 등의 방법이 고안되었다. 

 

Havard Architecture

하버드 대학에서 개발되었다는 것에서 이름이 유래되었다.

Von Neumann 아키텍처와 달리 프로그램과 데이터가 동일한 메모리 공간에 저장되지 않고 각각 다른 메모리 공간에 저장한다. 이러한 구조를 가지는 컴퓨터 시스템은 두 개의 메모리 버스를 사용한다. 하나는 프로그램을 저장하는 코드 메모리 버스이고, 다른 하나는 데이터를 저장하는 데이터 메모리 버스이다. 이 두 개의 버스는 병렬로 동작하여 CPU가 동시에 코드와 데

이터를 읽을 수 있도록 한다.

 

이 아키텍처의 장점은 프로그램과 데이터가 각각 다른 메모리 공간에 저장되기 때문에 프로그램과 데이터를 동시에 읽을 수 있다. 따라서 프로그램 실행 시간이 더욱 빨라진다. 그리고 프로그램과 데이터를 분리하여 저장하기 때문에 데이터의 비인가된 접근을 막을 수 있어 보안성이 Von Neumann 아키텍처보다 높다. 하지만 각각 다른 메모리 공간에 저장되어 있기 때문에 프로그램 수정 시 코드 메모리와 데이터 메모리를 모두 수정해야하기 때문에 프로그램의 수정이나 변형이 불편하며 이러한 구조를 가지는 컴퓨터 시스템은 하드웨어 구조가 복잡하다.

 

Von Neumann 아키텍처와 Harvard 아키텍처 두 아키텍처의 차이는 명령어와 데이터를 메모리에서 어떻게 처리하느냐에 따라 달라지며, 이는 컴퓨터 아키텍처의 성능과 기능을 결정한다. 

 

Instruction Set Architecture(ISA)

명령어 세트 아키텍처

컴퓨터에서 실행되는 명령어 집합과 해당 명령어의 동작을 정의하는 인터페이스 즉, 소프트웨어 개발자와 하드웨어 엔지니어 사이의 인터페이스 역할을 한다.

 

명령어 세트 아키텍처는 프로그래밍 언어와 컴퓨터 아키텍처 사이의 중개자 역할을 하며, 어떤 프로그래밍 언어를 사용하더라도 ISA에서 정의된 명령어 집합을 사용하여 작성된 프로그램은 모든 ISA 호환 컴퓨터에서 실행될 수 있다. 또한 ISA는 명령어의 크기, 명령어의 수행 방법, 레지스터의 개수와 종류, 주소 지정 방식 등과 같은 하드웨어 구성 요소를 규정하여, 하드웨어 제조업체들이 ISA를 준수하여 호환성을 보장할 수 있도록 한다.

RISC

Reduced instruction Set Computing 

명령어의 수를 줄이고 명령어 실행 시간을 일정하게 유지하는 것에 초점을 두고 설계된 아키텍처이다.

CISC

Complex Instruction Set Computing

 복잡한 명령어 집합과 다양한 주소 지정 방식 등을 지원하여 프로그래머가 작성한 코드의 길이를 줄이고 복잡한 작업을 더 쉽게 처리할 수 있도록 설계되었다.

 

Microarchitecture

ISA에서 정의된 명령어 세트를 하드웨어로 구현하는 방법에 대한 아키텍처이다. 마이크로 아키텍처는 ISA와 하드웨어 구현 사이의 중간 계층으로 ISA에 정의된 명령어 세트를 하드웨어에서 처리하기 위한 방법과 기술적인 세부 사항을 다룬다.

 

마이크로 아키텍처는 CPU의 내부 동작 방식을 설명하며 ALU, 레지스터, 캐시 등과 같은 하드웨어 요소들이 어떻게 조합되어 명령어를 실행하는지를 나타낸다. 이는 프로세서의 처리 속도와 성능에 직접적인 영향을 미친다.

 

예를 들어 Intel의 x86 아키텍처는 하나의 ISA를 여러 가지 버전의 마이크로 아키텍처를 통해 구현하는 방법이 다르며 이러한 버전에는 Pentium, Core, Atom 등이 있다.

 

ISA와 달리 마이크로 아키텍처는 하드웨어에 종속적이며 같은 ISA를 가진 두 개의 CPU라 하더라도 각각의 마이크로 아키텍처에 따라서 성능과 기능이 달라진다. 이러한 이유로 마이크로 아키텍처는 하드웨어 설계자들이 CPU를 개발할 때 매우 중요한 역할을 한다.

VLIW

Very Long Instruction Word Architecture

하나의 명령어로 여러 개의 연산 명령어들을 패킹하여 동시에 처리하는 방식을 사용하는 마이크로 아키텍처이다.

각 연산 명령어의 종류와 크기는 사전에 고정되어 있어야 하며 이렇게 하나의 명령어에 여러 개의 연산 명령어를 패킹하면 하나의 명령어를 실행하는데 필요한 클럭 사이클 수를 줄 일 수 있어 실행 효율성이 높아진다.

 

하지만 이러한 패킹 작업이 복잡하고 명령어에 들어갈 연산 명령어의 종류와 크기를 고정해야 하기 때문에 하드웨어 구현이 복잡해지고 설계 및 프로그래밍이 어렵다.

 

EPIC

Explicitly Parallel Instruction Computing

인텔에서 개발한 아키텍처로 VLIW의 한 종류이다. 명령어와 함께 해당 명령어를 실행하기 위한 하드웨어 리소스를 명시적으로 지정하여 병렬 처리를 구현한다. 이를 위해 명령어를 여러 개 묶어 하나의 Attention Point로 지정하고 해당 포인트에서 동시에 실행 가능한 명령어를 실행하는 방식을 사용한다. 이를 통해 프로그램 내의 병렬 처리 가능한 부분을 미리 식별하여 처리할 수 있기 때문에 성능 향상을 기대할 수 있다.

 

대표적인 예시로 인텔의 Itanium 프로세서가 있다. 명령어 세트가 복잡하고 처리 방식이 복잡하기 때문에 초기에는 호환성 문제 등으로 실패했지만 대용량 데이터 처리 등에서 높은 성능을 발휘하였다. 그러나 x86 아키텍처에 비해 생태계가 덜 발달하고 소프트웨어 호환성 문제도 있어 현재는 사용되지 않고 있다.

 

 

SIMD

Single Instruction Multiple Data

여러 개의 데이터가 동시에 처리하기 때문에 대규모 데이터 병렬 처리에 유리하다.

벡터 프로세싱이라고도 불리며 벡터 레지스터라는 별도의 레지스터를 사용하여 데이터를 저장하고 벡터 명령어를 사용하여 데이터를 처리한다. 

 

예를 들어 4개의 데이터를 더하는 연산을 할때 일반적으로 4번의 덧셈 연산을 수행해야 하지만 SIMD 아키텍처에서는 한 번의 명령어로 4개의 데이털르 한꺼번에 연산할 수 있다. 따라서 SIMD 아키텍처는 더 빠르고 효율적인 데이터 처리가 가능하기 때문에 그래픽 카드나 디지털 신호 처리 등의 분야에서 많이 사용된다.

 

Intel의 MMX, SSE, AVX, ARM의 NEON 등이 이 아키텍처를 기반으로 한다.

728x90
반응형

'Computer > Engineering' 카테고리의 다른 글

OS  (0) 2023.03.28
데이터 경로와 제어 유닛  (0) 2023.03.17
메모리  (0) 2023.03.17
명령 사이클과 명령어 집합 구조  (0) 2023.03.17
레지스터  (0) 2023.03.17

2023.12.30에 관람한 전시

글은 이제야 올린다.

 

인터넷 서핑을 하다가 우연히 알게 된 전시회였다.

안 그래도 무료했던 일상에 뭐라도 해보자 생각하던 중이었기 때문에 더욱 관심이 갔다.

 

평소에 큰 관심을 가지지 않던 분야였기 때문에 이왕 보는 거 재밌게 보고 싶었기 때문에 내 취향에 맞는지 사전 조사를 했는데 만족스럽다는 후기들과 재밌어 보이는 작품들 때문에 바로 예매를 했다.

 

장소는 동대문 디지털 플라자

수도권으로 이사 온 후 가보고 싶은 곳들이 많이 생겨서 생각날 때마다 기록해 두었지만 막상 쉬는 날이 되면 집에만 있었다.  하지만 이렇게 구실을 만들어서라도 나가는 게 분위기 전환도 할 수 있기 때문에 전시회는 나에게 더 좋은 기회였다.

동대문 역시 리스트에 있던 장소 중 하나였다.

 

 

전시회는 처음부터 끝까지 지루할 틈 없이 재미있게 이어져갔다.

작가에 대해서 아무 정보도 없이 보았음에도 전시회를 보면서 장 줄리앙이 어떤 사람인지 대강 짐작이 갔다. 초입에 그려져 있던 벽에 그려진 스케치는 작가가 직접 전시회를 준비하면서 하나하나 그려놓은 것이었고 그 과정 또한 영상으로 전시회에서 볼 수 있었다. 처음에는 그림들을 보면서 작가가 실력이 없지만 위트가 있어서 유명해진 건가 싶었지만 그 생각도 정말 잠시였다. 곧이어 전시된 작품들을 보면서 그냥 이 사람은 그림을 잘 그리는데 스타일이과 개성이 짙은 거구나 생각했다.

 

그리고 함께 전시된 장 줄리앙이 실제로 사용했던 노트들에는 일상에서 보고 느끼고 생각났던걸 그림과 글로 표현되어 있었는데 작가의 섬세함과 장난스러움 그리고 개성을 가장 잘 나타났다. 노트들을 모두 한 면만 볼 수밖에 없는 게 아쉽긴 했다. 

 

작가는 여러 상업 일러스트 작품들을 많이 만들었는데 그것들 또한 작품으로 전시되어 있었다. 전시의 처음에는 사방에 스케치를 한 걸로 보이는 종이들이 그리드로 붙어있었는데 무슨 생각으로 그린 걸까 어떤 의미를 담은 걸까 하면서 하나하나 살펴보게 되었다. 그 스케치들은 전시회의 다음 구역으로 넘어갈 때마다 완성되어 갔는데 그게 전시회를 끝까지 재밌게 볼 수 있었던 점으로 전시할 때 작품을 어떻게 배치하고 또 구역을 어떻게 나누는 것이 중요하구나 느꼈다.

 

스케치만 되어있던 그림들이 채색이 들어갔을 때 그리고 실제 사용된 책자, 표지, 굿즈 등으로 완성된 모습에서 또 새로운 느낌을 받았다. 

 

작가의 색을 가장 잘 느낄 수 있는 일러스트도 좋았지만 가장 마음에 들었던 건 유화들이다. 

 

일러스트의 색을 넣었을 때도 느꼈지만 장 줄리앙은 색을 정말 잘 표현한다. 

뭔가 심플하면서도 디테일하고 비어 보이지만 꽉 찬 느낌을 받았고 유화들을 전시한 코너에서는 벽의 색상도 분홍색 계열로 구분했는데 이게 유화들과 너무 잘 어울렸고 작품을 더 돋보이게 해 주었다. 유화들은 나같이 그림이 관심 없는 사람도 소장하고 싶다는 느낌이 들 정도로 감명을 준다. 유화들은 여운이 남아서 한번 더 둘러보기도 했다.

 

전시가 끝나고 나서는 굿즈들을 파는데 정말 여유만 있다면 전부 사서 수집하고 싶었지만 꾹 참고 엽서만 샀다.

 일러스트와 유화 중 고민하다가 그래도 더 장 줄리앙 느낌을 받을 수 있는 일러스트를 골랐는데 유화도 살걸 그랬다.

퇴근

 

그렇게 오래간만에 문화활동을 마쳤다.

나중에 알고 보니 야외에도 전시작품이 있다고 하는데 그건 아쉽지만 사진으로 보는 걸로 만족할 수밖에 없었다.

 

정말 만족스러운 전시회였다.

오래간만에 외출도 하고 평소에 가보고 싶었던 장소도 구경해 보고 그림 그리기라는 새로운 취미에도 눈을 뜨고 좋은 경험이었다.

 

 

728x90
반응형

'Life' 카테고리의 다른 글

베트남 콘삭 커피  (0) 2023.04.09
티스토리 단축키  (0) 2023.03.30
재벌집 막내아들  (0) 2023.01.08
러버덕과 러버덕  (0) 2023.01.07
2023-01-07 시작  (0) 2023.01.07

데이터 경로(Data Path)

데이터 경로는 프로세서 내에서 데이터가 이동하는 통로를 뜻한다.

프로세서 내에서 데이터가 이동하고 처리되는 구성 요소들과 이들 간의 연결을 말하며 데이터 경로는 컴퓨터가 명령어를 실행하는 과정에서 필요한 연산을 수행하고, 결과를 저장하는 데 사용된다. 레지스터, ALU, 다양한 버스 등으로 구성되어있으며 데이터 경로의 구성 요소와 연결 방식은 프로세서의 성능과 효율에 큰 영향을 미친다.

1. 레지스터

데이터 경로 내에서 데이터를 임시로 저장하는 작은 메모리이다.

레지스터는 데이터를 빠르게 처리할 수 있도록 돕고 ALU와 같은 다른 구성 요소들과 데이터를 교환한다.

 

2. 산술 논리 연산 장치(ALU, Arithmetic Logic Unit)

ALU는 데이터 경로에서 가장 중요한 연산을 수행하는 구성 요소이다. 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈 등) 및 논리 연산(AND, OR, NOT, XOR 등)을 처리한다.

 

3. 버스(Bus)

버스는 프로세서 내에서 레지스터, ALU, 메모리 등의 구성 요소들 간에 데이터를 전송하는 통로이다. 버스는 주로 데이터 버스, 주소 버스, 제어 버스로 구분된다.

 

Data Path

데이터 경로 동작

1. 명령어 가져오기(Fetch)

    프로그램 카운터가 가리키는 메모리 위치에서 명령어를 가져온다.

 

2. 명령어 디코딩(Decode)

    제어 유닛이 가져온 명령어를 분석하여 해당 연산을 수행하는 데 필요한 제어 신호를 생성한다.

 

3. 피연산자 가져오기(Operand Fetch)

    디코딩된 명령어에 따라 필요한 피연산자를 레지스터 또는 메모리에서 가져온다.

 

4. 연산 수행(Execute)

    ALU가 피연산자를 사용하여 명령어에서 지정한 연산을 수행한다.

 

5. 결과 저장(Store)

    연산 결과를 레지스터 또는 메모리에 저장한다.

 

데이터 경로의 구성과 동작 방식은 프로세서의 성능과 효율성에 결정적인 영향을 미치기 때문에 효율적인 데이터 경로 설계를 통해 프로세서의 처리 속도를 높이고 전력 소모를 줄일 수 있다.

#파이프라이닝 #슈퍼스칼라 #VLIW(Very Long Instruction Word)

 

제어 유닛(Control Unit)

CPU 내에 위치하며 명령어를 해석하고 필요한 연산을 수행하기 위해 필요한 제어 신호를 생성하는 역할을 한다.

명령어 실행 과정에서 데이터 경로의 구성 요소들을 제어함으로써 프로세서의 전체 동작을 조율한다.

동작은 데이터 경로와 비슷한 단계를 거친다. 

 

1. 명령어 가져오기(Fetch)

 

2. 명령어 디코딩(Decode)

 

3. 제어 신호 생성(Control Signal Generation)

디코딩된 명령어를 기반으로 데이터 경로 내 구성 요소들을 제어하기 위한 신호를 생성한다. 이 신호들은 레지스터,    ALU, 메모리 등과 같은 구성 요소들을 제어하여 명령어를 실행하는 데 필요한 동작을 수행하도록 한다.

 

제어 유닛은 명령어 집합 구조(ISA)를 기반으로 작동하며 ISA에 따라 다양한 연산들을 처리할 수 있다. 일반적으로 제어 유닛은 하드웨어 또는 마이크로프로그램 방식으로 구현된다.

 

하드웨어 제어 유닛

디코딩 논리 회로를 사용하여 명령어를 직접 해석하고 제어 신호를 생성하는 방식이다. 

이 방식은 빠른 처리 속도를 가지지만 회로 복잡성이 높고 유연성이 떨어진다.

 

마이크로프로그램 제어 유닛

명령어를 해석하고 제어 신호를 생성하기 위해 내부적으로 사용하는 작은 프로그램인 마이크로코드를 실행하는 방식이다. 회로 설계가 단순하고 유연하지만 처리 속도가 하드웨어 제어 유닛에 비해 상대적으로 느리다.

 

728x90
반응형

'Computer > Engineering' 카테고리의 다른 글

OS  (0) 2023.03.28
아키텍처  (0) 2023.03.27
메모리  (0) 2023.03.17
명령 사이클과 명령어 집합 구조  (0) 2023.03.17
레지스터  (0) 2023.03.17

메모리

컴퓨터 메모리는 시스템의 핵심 구성 요소 중 하나이다.

데이터와 명령어를 저장하고 CPU와 상호 작용하여 프로그램 실행을 가능하게 한다.

 

컴퓨터 메모리에는 다양한 종류가 있으며 각기 다른 용도와 특성을 가지고 있다. 

Memory Layount

1. 주기억장치(Primary Memory)

컴퓨터의 메인 메모리로 RAM과 ROM이 포함된다.

주기억장치는 CPU와 직접 통신하며 빠른 속드를 요구한다. 

 

RAM

임시 데이터 저장소로, 읽기와 쓰기가 모두 가능한 메모리이다. 컴퓨터가 켜질 때마다 프로그램과 데이터가 RAM에 로드되며, 전원이 꺼지면 RAM의 데이터는 사라진다.

 

ROM

시스템의 기본 설정 및 부팅 과정에서 사용되는 정보를 저장하는 메모리이다. 일반적으로 읽기만 가능하며, 데이터는 전원이 꺼져도 유지된다.

 

2. 보조기억장치(Secondary Memory)

데이터를 영구적으로 저장하는 메모리로, 하드 드라이브, SSD, CD, DVD 등이  포함된다. 보조기억장치는 주기억장치보다 느리지만, 대용량의 데이터를 저장할 수 있다.

 

계층 구조(Memory Hierachy)

메모리 계층 구조는 컴퓨터 시스템에서 사용되는 다양한 메모리 기술을 속도, 용량, 비용, 접근 시간 등의 특성에 따라 계층적으로 구성한것이다.

계층 구조는 데이터를 처리하고 저장할 때 발생하는 효율성과 성능의 균형을 이루기 위해 만들어졌다.

 

1. 레지스터(Register) 

CPU 내부에 위치한 가장 빠르고 작은 메모리

연산에 직접 사용되는 데이터와 주소를 저장한다.

 

2. 캐시 메모리(Cache Memory)

CPU에 가까운 고속의 작은 메모리

주기억장치에서 자주 사용되는 데이터와 명령어를 저장해, CPU의 성능 향상을 도모한다. 캐시 메모리는 종종 여러 레벨로 구성되기도 한다.

 

3. 주기억장치(Primary Memory)

RAM과 ROM으로 구성된 메모리로 CPU가 직접 접근할 수 있는 메모리이다.

RAM은 주로 프로그램 실행에 필요한 데이터와 명령어를 저장하고 ROM은 시스템 부팅과 관련된 정보를 저장한다.

 

4. 보조기억장치(Secondary Menory)

하드 드라이브, SSD, CD, DVD 등으로 구성된 대용량의 영구적인 저장장치이다. 주기억장치보다 느리지만 대영량 대이터를 저장할 수 있다.

 

5. 오프라인 저장 장치(Offline Storage)

테이프 드라이브, 광학 저장 매체 등을 포함하는 컴퓨터 시스템과 직접 연결되지 않은 저장 장치이다. 백업과 아카이빙에 주로 사용된다.

 

6.

728x90
반응형

'Computer > Engineering' 카테고리의 다른 글

아키텍처  (0) 2023.03.27
데이터 경로와 제어 유닛  (0) 2023.03.17
명령 사이클과 명령어 집합 구조  (0) 2023.03.17
레지스터  (0) 2023.03.17
CPU  (0) 2023.03.17

+ Recent posts