< 동기(Synchronous) >

[특징]

a. 한 번에 하나의 작업만 처리한다.
b. 이전 작업이 끝나야 다음 작업이 시작된다.

[일상 예시]

상점에서 손님1이 계산을 하고 있으면, 손님2는 손님1이 계산을 끝내기를 기다려야 한다. 이처럼 한 작업이 끝나야 다음 작업이 시작되는 것을 동기 방식이라고 한다.

 


< 비동기(Asynchronous) >

[특징]
a. 여러 작업을 동시에 처리할 수 있다.
b. 작업들 간에 서로 기다리지 않고 병렬로 진행된다.

[예시]
요리사가 여러 음식을 동시에 준비하는 것과 비슷하다. 비빔면을 조리하는 동안, 짜파게티도 함께 조리할 수 있다.

 

< 장점과 단점 >

동기 :
장점: 코드가 간단하며, 이해하기가 쉽다.
단점: 리소스를 효율적으로 사용하지 못하고, 대기 시간이 길어질 수 있다. (위에서 설명한 것과 같이, 비슷한 예시로 편의점을 생각해봐도 좋다. 계산하시는 분은 원래 한 분이시니, 계산대에 사람이 줄을 서서 기다리고 있는 모습을 상상해보자.)
비동기 :
장점: 리소스를 효율적으로 활용하고, 대기 시간을 줄일 수 있다.
단점: 코드가 복잡해질 수 있고, 디버깅이 어려울 수 있다.

< C# 대표적인 비동기,동기 함수 > 

C#에서 대표적인 비동기 함수는  Async await가 있고 동기 함수는 Sync가 있다.  

비동기 개념중 중요한 개념엔 Task가 있다.

[Async await] :

여러 작업을 동시에 처리할 수 있는 방식.

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        // 커피 만들기 시작
        var coffeeTask = MakeCoffeeAsync();

        // 사용자 입력 받기
        var userInputTask = GetUserInputAsync();

        // 커피 만들기 작업과 사용자 입력 받기 작업이 모두 완료될 때까지 기다리기.
        await Task.WhenAll(coffeeTask, userInputTask);

        // 커피가 만들어지고 사용자 입력이 완료된 후에 실행되는 코드.
        Console.WriteLine("커피가 준비되었고 사용자 입력이 완료되었습니다.");
    }

    static async Task MakeCoffeeAsync()
    {
        Console.WriteLine("Coffee making process started.");

        // 물을 끓이는 작업
        Console.WriteLine("Boiling water...");
        await Task.Delay(2000); // 2초 동안 대기 (물 끓이는 시간)

        // 커피를 내리는 작업
        Console.WriteLine("Brewing coffee...");
        await Task.Delay(2000); // 2초 동안 대기 (커피 내리는 시간)
    }

    static async Task GetUserInputAsync()
    {
        Console.WriteLine("성함 :"); // 사용자에게 이름을 입력받는 안내 메시지를 출력.
        string name = await Task.Run(() => Console.ReadLine()); // 사용자 입력을 비동기적으로 받아오기.
        Console.WriteLine($"Hello, {name}!"); // 사용자의 이름을 출력.
    }
}

 

 

[Sync]

한 번에 하나의 작업만 처리하는 방식.

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Console.WriteLine("Coffee making process started.");
        MakeCoffee();
        Console.WriteLine("Coffee is ready.");
    }

    static void MakeCoffee()
    {
        Console.WriteLine("Boiling water...");
        Thread.Sleep(2000);
        Console.WriteLine("Brewing coffee...");
        Thread.Sleep(2000); 
    }
}

 

[Task] :

async await 구문을 사용할 때 Task를 함께 사용한다.

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 케이크 굽기 시작 (비동기적으로)
        Task bakeCakeTask = BakeCakeAsync();

        // 파스타 만들기 시작 (비동기적으로)
        Task makePastaTask = MakePastaAsync();

        // 샐러드 만들기 시작 (비동기적으로)
        Task makeSaladTask = MakeSaladAsync();

        // 모든 요리가 완료될 때까지 기다림
        await Task.WhenAll(bakeCakeTask, makePastaTask, makeSaladTask);

        Console.WriteLine("모든 요리가 준비되었습니다!");
    }

    static async Task BakeCakeAsync()
    {
        Console.WriteLine("케이크 굽는 중...");
        await Task.Delay(5000); // 케이크 굽는데 5초 걸린다고 가정
        Console.WriteLine("케이크가 완성되었습니다!");
    }

    static async Task MakePastaAsync()
    {
        Console.WriteLine("파스타 만드는 중...");
        await Task.Delay(3000); // 파스타 만드는데 3초 걸린다고 가정
        Console.WriteLine("파스타가 완성되었습니다!");
    }

    static async Task MakeSaladAsync()
    {
        Console.WriteLine("샐러드 만드는 중...");
        await Task.Delay(2000); // 샐러드 만드는데 2초 걸린다고 가정
        Console.WriteLine("샐러드가 완성되었습니다!");
    }
}

요리사가 비빔면을 조리하면서 동시에 짜파게티를 조리하는 코드

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Task cookJjapagettiTask = CookJjapagettiAsync();
        Task cookBibimmyeonTask = CookBibimmyeonAsync();

        await Task.WhenAll(cookJjapagettiTask, cookBibimmyeonTask);

        Console.WriteLine("모든 요리가 완료되었습니다.");
    }

    static async Task CookJjapagettiAsync()
    {
        Console.WriteLine("짜파게티 요리를 시작합니다.");
        await BoilWaterAsync("짜파게티");
        Console.WriteLine("짜파게티 면을 삶습니다.");
        await Task.Delay(2000); // 면을 삶는데 시간이 걸림
        Console.WriteLine("짜파게티를 양념합니다.");
        await Task.Delay(1000); // 양념하는데 시간이 걸림
        Console.WriteLine("짜파게티 요리가 완료되었습니다.");
    }

    static async Task CookBibimmyeonAsync()
    {
        Console.WriteLine("비빔면 요리를 시작합니다.");
        await BoilWaterAsync("비빔면");
        Console.WriteLine("비빔면 면을 삶습니다.");
        await Task.Delay(2000); // 면을 삶는데 시간이 걸림
        Console.WriteLine("비빔면을 양념합니다.");
        await Task.Delay(1000); // 양념하는데 시간이 걸림
        Console.WriteLine("비빔면 요리가 완료되었습니다.");
    }

    static async Task BoilWaterAsync(string dishName)
    {
        Console.WriteLine($"{dishName}을(를) 위해 물을 끓이는 중...");
        await Task.Delay(1000); // 물 끓이는데 시간이 걸림
    }
}

 

 

 

Reference : C#.NET 0.5년차~3년차(파트1)

이 블로그의 모든 내용은 원작자와 출판사로부터 허락을 받아 작성되었습니다.

https://www.inflearn.com/course/lecture?courseSlug=%EB%8B%B7%EB%84%B7-%EC%9C%88%ED%8F%BC-1&unitId=77888&tab=curriculum 

 

학습 페이지

 

www.inflearn.com

 

'C#' 카테고리의 다른 글

크로스 스레드  (0) 2023.06.15
스레드 문제점 해결  (0) 2023.06.14
스레드 동기화(lock,AutoResetEvent)  (0) 2023.06.13
멀티스레드  (0) 2023.06.13
C# 프로퍼티, 객체 초기화  (0) 2023.06.08

스레드를 사용하다 보면, 변수를 스레드끼리 공유해서 사용하는 경우가 있다.

그럴 때, 스레드 동기화를 해주면 둘 이상의 스레드가 서로의 작업을 덮어쓰지 않고 공유 자원에 안전하게 엑세스 할 수 있는 방법이다.

출처 : C#.NET 0.5년차~3년차(파트1)

처음 a값에 변수 5를 가지고 있는데 Thread2에서 a 값을 4로 변경하고 getValue(a)를 통해서 4값을 동기화를 해주면, 4값을 얻을 수 있는데, 만약 동기화가 안되어 있다면 getValue(a)에서 4를 기대했으나, Thread1에 의해서 3으로 변경한 것이 영향을 받게 되어, 3의 값을 얻게 되버린다.

 

Thread2가 a=4;로 선언했으면 Thread2에서 getValue(a)를 했을 시, 4를 얻을 수 있는 영역을 임계영역(Critical section)이라고 한다. 임계 영역은 공유 자원에 Thread Safety하게 접근하는 영역이다.

 

a=5;를 하고

Thread2 에서 a=4;로 변경을 요청한다.

그런데 Thread2을 임계영역으로 두게 된다면 Thread1의 a=3;요청은 뒤로 미뤄지게 되고, Thread2가 독점적으로 임계영역으로 사용하게 되고, Thread2에서 getValue(a)를 하게 되면 4가 출력된다. 그리고 임계 영역이 끝나면, 공유자원에 대한 독점을 해제 함으로써, Thread1이 a를 3으로 변경하게 되는 작업을 하게 된다.

 

 

< 스레드 동기화 문법 >

[lock 키워드]

C#에서는 lock 키워드를 통해 공유 자원에 대해서 서로 작업을 스레드끼리 충돌이 안나게끔 해줄 수가 있게 된다. 

 

먼저 동기화에 사용할 객체를 정의해줘야 한다.ex) object lockObj = new object(); 

 

그 다음에 lock 키워드를 적고 나서 생성한 객체를 소괄호 안에 넣어주면 만든 object에 대해서 상호 베재 잠금을 획득하게 된다.  

< 실습 > 

아래와 같이 코드를 작성하게 되면, Thread2에서는 Thread1의 영향을 받아, Message Box에서는 3이 출력되는 상황이 벌어진다. 

이런 상황에서 서로간에 영향을 안받게 할려면 lock() 키워드를 사용하게 된다는 것이다.

 

lock 키워드 안에는 잠금에 사용할 객체를 만들어 줘야 한다.

잠금에 사용할 객체 생성
상호배제 잠금하기

여기서 While문을 통해서 이런 작업이 반복적으로 일어나도록 할 수 있다.

위와 같이 코드를 작성하면, 의도한 대로 Thread1에 영향을 받지 않고 4가 출력이 된다는 것을 확인할 수 있다. 

Form1 실행 후 4초 뒤 4가 출력되고 확인을 누르면 또 4초뒤에 반복적으로 해당 메세지가 출력된다.

< 코드의 실행 순서 >

Message.show에서 3초 후에 나타나는 줄 알았는데 Thread1의 Thread.Sleep의 시간도 같이 합해지는 이유를 몰랐었다.

이에 대해 친구에게 매우 상세하게 답변을 얻었다.

 

우선 상상을 해야한다.

 

두 명의 사람이 한 대의 컴퓨터를 쓰려고 하는 상황이다.

컴퓨터는 한 번에 한 사람만 사용할 수 있고, 각자 쓰고자 하는 프로그램이 있다고 가정해보자.

사람 1은 컴퓨터를 쓰려고 자리에 앉는다 그리고선 컴퓨터를 사용하기 시작하는데, 갑자기 2분 동안 쉬기로 결정한다.

하지만 사람1은 컴퓨터를 점유한 상태다.
사람 2는 컴퓨터를 사용하고 싶지만, 사람 1이 여전히 컴퓨터 앞에 앉아 있으므로 기다려야 하는 상황이다.
사람 1이 쉬는 것을 끝내고 컴퓨터를 떠나면, 사람 2는 컴퓨터를 사용하기 시작한다. 그러나 이제 사람 2가 컴퓨터를 사용하면서 3분 동안 쉬기로 결정한다.


이 예제에서, 사람 1은 WorkThread 메서드를, 사람 2는 Work2 메서드를, 컴퓨터는 공유 자원인 변수 a를 상징한다.

사람들이 쉬는 시간은 Thread.Sleep 메서드에 해당한다.

MessageBox.Show가 나타나는 시점은 사람 2가 컴퓨터를 사용하기 시작한 이후다.

그러나 사람 2는 사람 1이 쉬는 시간 동안 기다려야 했기 때문에, 실제로는 사람 1의 쉬는 시간 + 사람 2의 쉬는 시간 만큼 기다린 후에 MessageBox.Show가 나타난다.

즉, Work2 스레드는 WorkThread 스레드가 lock을 해제할 때까지 기다려야 하고, WorkThread는 2초 동안 쉰다.

그 후 Work2가 실행되고, 추가로 3초를 기다린 후에 MessageBox가 표시된다. 따라서 총 대기 시간은 2초 + 3초인 5초가 되는 것이다.

 

이런 lock 키워드는 파일 읽고쓰기,네트워크 전송,수신,DB작업 등과 같은 곳에 사용할 수 있다.

 

※< lock keyword 사용할 때 주의점 >

lock(obj)
{
…
  lock(obj)
  {
    …  
  }
…
}//상호배제잠금을해제

위와 같이 lock안에 동일한 객체에 잠금을 요청하게 된다면, lock을 해제 하기 전에 lock을 또 시도하기 때문에

교착상태(DeadLock) 발생할 수 있다.

(위와 같은 코드를 사용한 프로그램 멈출 가능성이 높다. try catch에

잡히지 않기에 원인도 파악하기 힘들다.)


< AutoResetEvent > 

스레드를 동기화 하는 방법 중 두 번째는 AutoResetEvent가 있다. 

 

AutoResetEvent를 사용하게 된다면 Thread간의 실행 순서를 제어할 수 있게 된다.

예를 들어 Thread1이 작업이 끝나야지만 Thread2가 동작이 되게 하게 끔을 할 수 있는 것이다.

 

Thread간의 순서를 둬야할 경우, 위의 그림과 같이 DB에 데이터를 먼저 쓰고 나서

데이터를 읽는 작업을 Thread2에서 한다거나 할 때 AutoResetEvent를 사용하면 효과적이다.

 

또 DB데이터 쓰는 작업이 계속해서 반복 될 때 오래걸리게 되면, Thread2가 오래걸리는 작업을 영향을 안받고 데이터를 읽을 수 있다. 이렇듯 서로의 작업에 영향을 받지 않고 작업을 하는데 단지 먼저 데이터가 쓰여야지만, 읽을 수 있게끔 방법을 만들 수 있다.

 

이 코드를 실행하면 autoResetEvent.WaitOne();이 신호를 받을 때 까지 기다리고 있다가, Thread.Sleep(5000);에 의해 5초를 기다리고 autoResetEvent.set();을 통해 신호가 되었다고 신호를 보내주면, 이제서야 WaitOne();이 신호를 받고, 

MessageBox.Show(""+a);를 통해 a메세지가 출력되는 것이다. 즉, Set()을 보내기 전까지 Thread2의 Set()의 윗코드가 실행된다.

 

또한

이 AutoResetEvent를 true로 바꾸게 되면, 첫번째 신호는 받은 상태로 변경된다. 즉 실행하자마자 변수가 나타나고, 이후 Sleep()등을 통해, 작동 된다.

using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace WinFormsApp1
{
    public partial class Form1 : Form
    {

        int a = 5; //공유 자원
        object lockObj = new object();

        AutoResetEvent autoResetEvent = new AutoResetEvent(true);


        Thread thread = null;
        Thread thread2 = null;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            thread = new Thread(new ThreadStart(WorkThread));
            thread.IsBackground = true;
            thread.Priority = ThreadPriority.Normal;
            thread.Start();

            thread2 = new Thread(new ThreadStart(Work2));
            thread2.IsBackground=true;
            thread2.Priority = ThreadPriority.Normal;
            thread2.Start();
            
        }
        private void WorkThread()
        {
            while (true) //반복문 시작
            {
                autoResetEvent.WaitOne(); //신호를 받을 때 까지 대기하게 된다.

                MessageBox.Show("" + a);
            
            }
        }
        private void Work2()
        {
            while (true)
            {
                a++;
                Thread.Sleep(5000);
                autoResetEvent.Set(); //신호를 보내서, WaitOne()을 실행할 수 있게 된다.
               
            }
        }
    }
}

위와 같이 코드를 작성하게 되면, 코드를 빌드하자마자 바로 5가 출력된다. 이후, a값이 1씩 증가할 수 있는 것을 확인할 수 있다. 

 

 

 

Reference : C#.NET 0.5년차~3년차(파트1)

이 블로그의 모든 내용은 원작자와 출판사로부터 허락을 받아 작성되었습니다.

https://www.inflearn.com/course/lecture?courseSlug=%EB%8B%B7%EB%84%B7-%EC%9C%88%ED%8F%BC-1&unitId=77888&tab=curriculum 

 

학습 페이지

 

www.inflearn.com

 

'C#' 카테고리의 다른 글

스레드 문제점 해결  (0) 2023.06.14
비동기, 동기  (0) 2023.06.14
멀티스레드  (0) 2023.06.13
C# 프로퍼티, 객체 초기화  (0) 2023.06.08
MS-SQL 및 SSMS 설치 방법  (0) 2023.06.04

20230613(화) 울산 맑은샘 헬스

  • 공복 인클라인 트레드밀 런닝머신 40분
  • 랫 풀 다운 60KG 5SET, 50KG 10SET, 40KG 5SET
  • 케이블 시티드 로우 40KG 10SET
  • 머신 숄더 프레스 20KG 5SET

'건강운동관리' 카테고리의 다른 글

헬스  (0) 2023.06.19
헬스  (0) 2023.06.16
헬스  (0) 2023.06.15
헬스  (0) 2023.06.14
헬스  (0) 2023.06.12

< 멀티 스레드 >

멀티스레드란, 하나의 프로그램 안에서 여러 개의 작업 흐름을 동시에 실행하는 것을 말한다.

컴퓨터 프로그램은 기본적으로 순차적으로 실행된다. 즉, 한 번에 하나의 작업만 수행하게 된다.

일반적인 프로그램 실행 순서

하지만 멀티스레드를 사용하면, 여러 작업을 동시에 처리할 수 있어서 프로그램이 훨씬 효율적으로 동작한다.

 

예를 들어, 웹 브라우저를 사용하면서 동영상을 시청하고 있으면, 웹 브라우저는 멀티스레드를 사용하여 동영상을 스트리밍 하는 동안에도 사용자의 입력을 받아 처리할 수가 있는 것이다.

< C# 멀티스레드 문법 >

Thread thread = null;
thread = new Thread(new ThreadStart(GetItemThread));
thread.IsBackground = true;
thread.Priority = ThreadPriority.Normal;
thread.Start();
  • Thread thread = null; : Thread 객체를 선언한다. 여기서 Thread는 새로운 작업 흐름을 나타낸다
  • thread = new Thread(new ThreadStart(GetItemThread));    새로운 Thread 객체를 생성하고, 이 Thread에서 실행할 메서드(GetItemThread)를 지정한다.
  • thread.IsBackground = true;  : 이 Thread를 백그라운드로 설정한다. 백그라운드 스레드는 프로그램이 종료될 때 자동으로 종료된다.
  • thread.Priority = ThreadPriority.Normal   : Thread가 OS 자원을 얼마나 자주 할당받을 것인지 (보통 normal, above를 자주 쓴다.)
  •  thread.Start();   thread를 시작하게 된다. 시작하게 되면 ThreadStart(GetItemThread));에서 GetItemThread 함수가 가장 먼저 실행된다. 

< 실습해 보기 >

위의 코드를 실행하면 Form1의 "AAAA테스트" MessageBox가 5초 후에 나오는 것을 확인할 수 있다.

 

만약 Thread.Sleep()을 Form_Load함수에 넣으면 어떻게 될까?

위 코드를 실행하게 되면 BBB테스트가 먼저 출력이 되고, 확인을 누르면(안 누르면 그다음으로 안 넘어간다.) AAAA테스트 메시지가 찍히고 나서 Form1창이 뜨는 것을 직접 확인할 수 있다. 

실행하면 2초후에 BBB테스트
BBB테스트 누른 후 4초후 AAAA테스트
이후 Form1창이 출력된다.

< Thread 1개 더 생성해 보기 >

이렇게 코드를 작성하게 된다면

Form1이 Load 되고 나서 Thread안에 있는 동작이 이루어지게 된다. BBB테스트가 2초 후에 출력되고, 확인을 누를 필요 없이, Form1 Load 됨과 동시에 5초 후에 AAA테스트 메시지가 나타난다. 즉, 각각의 스레드는 별개로(병렬적) 동작한다는 것을 알 수 있다. 

 

이러한 Thread는 병렬작업과 오래 걸리는 작업에 유용하게 사용된다.(예 네트워크전송, 수신, DB작업)

또한 로딩창, 로딩바를 호출해서 사용자 편의성을 증가시킬 수도 있다. 

< try catch로 감싸기 >

Thread의 함수들을 try catch로 감싸서 오류내용을 메모장 같은 곳에 기록을 할 수 있다.

 

또한 반복문을 통해서, 어떠한 작업이 반복적으로 일어나게 할 수도 있다. 그런데 While문에서 오류를 만나면 While문에서 빠져나오게 된다. 그때 계속 동작을 시키고 싶다면, try catch()로 감싸주면 While문을 빠져나가지 않고  계속 동작할 수 있도록 할 수 있다.

 

< 주의사항 >

Form2가 있다고 가정했을 때, 

Form1_Load 함수에 

Form2 form2 = new Form2();

form2.Show(); 이렇게 작성하면 form2가 개별 Thread로 동작할 것 같지만, 동작하지 않는다.

개별 스레드로 동작하지 않는 코드

만약 Form2에서 어떠한 작업, 개별적으로 실행하고자 한다면

Form2의 Thread로 작성해야 한다.

 

또한, Thread는 여러 개 만들 수 있는 것을 기억해야 한다.

 

 

Reference : C#. NET 0.5년 차~3년 차(파트 1)

이 블로그의 모든 내용은 원작자와 출판사로부터 허락을 받아 작성되었습니다.
https://www.inflearn.com/course/lecture?courseSlug=%EB%8B%B7%EB%84%B7-%EC%9C%88%ED%8F%BC-1&unitId=77886&tab=curriculum 

 

학습 페이지

 

www.inflearn.com

 

'C#' 카테고리의 다른 글

비동기, 동기  (0) 2023.06.14
스레드 동기화(lock,AutoResetEvent)  (0) 2023.06.13
C# 프로퍼티, 객체 초기화  (0) 2023.06.08
MS-SQL 및 SSMS 설치 방법  (0) 2023.06.04
C# 문법 정리 ②  (0) 2023.06.04

20230612(월) 울산 맑은샘 헬스

  • 트레드밀 런닝 1시간 
  • 머신 숄더 프레스 40KG 3set 30KG 10set 20KG 3set 

 

'건강운동관리' 카테고리의 다른 글

헬스  (0) 2023.06.19
헬스  (0) 2023.06.16
헬스  (0) 2023.06.15
헬스  (0) 2023.06.14
헬스  (0) 2023.06.13

< 프로퍼티(Property)란? >

프로퍼티는 공개 데이터 멤버처럼 사용할 수 있지만, 실제로는 접근자(Accessor)라는 특별한 메소드들 이다.

< 프로퍼티의 구조 >

프로퍼티는 get , set Accessor로 구성된다.
get은 프로퍼티의 값을 반환하는데 사용된다. set은 새로운 값을 할당하는데 사용된다.
(C# 9 이후로는 init 액세서를 사용하여 객체 생성 시에만 값을 할당할 수 있다.)
set 또는 init에서는 value 키워드를 사용하여 할당되는 값을 정의한다.

< 백킹 필드와 프로퍼티 >

프로퍼티를 구현하는 기본 패턴 중 하나는 private 백킹 필드를 사용하여 프로퍼티 값을 설정하고 검색하는 것이다.

 

백킹 필드란?

더보기

프로퍼티(Property)는 객체의 상태를 나타내는데 사용되며, 일반적으로 메서드를 통해 값을 가져오거나 설정하는 역할을 한다. 허나 백킹 필드는 이 프로퍼티의 값을 실제로 저장하는 변수라고 할 수 있다.

프로퍼티의 get 또는 set 접근자를 사용하여 값을 가져오거나 설정할 때, 이 접근자들은 내부적으로 백킹 필드를 사용하여 작업을 수행한다. 백킹 필드는 프로퍼티의 값을 저장하고, 프로퍼티의 get 접근자는 이 값을 읽어오며, set 접근자는 이 값을 변경한다.

 

이러한 구조는 프로퍼티가 단순히 값을 반환하거나 설정하는 것 이상의 로직을 수행할 수 있게 해준다. 예를 들어, 값을 설정하기 전에 유효성 검사를 수행하거나, 프로퍼티 값이 변경될 때 이벤트를 발생시키는 등의 작업이 가능하다.

 

public class Person
{
    private string name; // 백킹 필드

    public string Name // 프로퍼티
    {
        get
        {
            return name;
        }
        set
        {
            if (!string.IsNullOrEmpty(value))
            {
                name = value;
            }
        }
    }
}

 

 

위 예제에서 name 변수는 백킹 필드이며, Name은 프로퍼티라고 할 수 있다. Name 프로퍼티를 통해 값을 설정하면, 유효성 검사를 거친 후 name 백킹 필드에 값을 저장한다. 또한, 값을 가져올 때는 name 백킹 필드에서 값을 읽어오는 것.

아래 예시에서 TimePeriod 클래스는 시간 간격을 나타낸다. 내부적으로 이 클래스는 _seconds라는 private 필드를 사용하여 시간 간격을 초 단위로 저장한다. Hours라는 read-write 프로퍼티를 통해 사용자가 시간 간격을 시간 단위로 지정할 수 있다.

public class TimePeriod
{
    private double _seconds;

    public double Hours
    {
        get { return _seconds / 3600; }
        set
        {
            if (value < 0 || value > 24)
                throw new ArgumentOutOfRangeException(nameof(value),
                      "The valid range is between 0 and 24.");

            _seconds = value * 3600;
        }
    }
}

< 표현식 본문 정의 (Expression Body Definitions) >

단일 라인의 문장으로 구성된 프로퍼티 액세서는 표현식 본문을 사용하여 구현할 수 있다.

public class Person
{
    private string _firstName;
    private string _lastName;

    public Person(string first, string last)
    {
        _firstName = first;
        _lastName = last;
    }

    public string Name => $"{_firstName} {_lastName}";
}

< 자동 구현 프로퍼티 (Auto-Implemented Properties) >

get과 set 접근자가 별도의 로직 없이 값을 할당하거나 검색하는 경우, 자동 구현 프로퍼티를 사용하여 코드를 간소화할 수 있다.

public class SaleItem
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

< 필요한 프로퍼티 (Required Properties) (C# 11 이상) >

C# 11부터는 required 키워드를 사용하여 클라이언트 코드가 프로퍼티 또는 필드를 초기화하도록 강제할 수 있다.

public class SaleItem
{
    public required string Name { get; set; }
    public required decimal Price { get; set; }
}

< 메서드, 필드, 프로퍼티의 차이점 >

  • 메서드(Method) : 코드 블록을 캡슐화하여 동작을 수행한다.
  • 필드(Field) : 클래스의 상태를 저장하는 변수.
  • 프로퍼티(Property) : 필드의 값을 조작하거나 반환하는 메서드 쌍(getter, setter)으로, 이를 통해 필드에 직접 접근하는 대신 필요한 로직을 캡슐화할 수 있다.

< 무명 형식 (Anonymous Types) >

무명 형식(Anonymous Types)은 명시적으로 타입을 정의하지 않고도 읽기 전용 프로퍼티들을 하나의 객체로 캡슐화하는 간편한 방법을 제공한다. 이 타입의 이름은 컴파일러에 의해 생성되며 소스 코드 수준에서는 사용할 수 없다. 각 프로퍼티의 타입은 컴파일러에 의해 추론된다.

 

무명 형식은 new 연산자와 객체 초기화자(object initializer)를 함께 사용하여 생성된다. 다음 예제는 Amount와 Message라는 두 개의 프로퍼티로 초기화된 무명 형식을 보여준다.

var v = new { Amount = 108, Message = "Hello" };
Console.WriteLine(v.Amount + v.Message);

무명 형식은 주로 쿼리 표현식의 select 절에서 사용된다. 이를 통해 소스 시퀀스의 각 객체에서 프로퍼티의 부분 집합을 반환할 수 있다. 무명 형식은 하나 이상의 public 읽기 전용 프로퍼티를 포함한다. 메소드나 이벤트와 같은 다른 종류의 클래스 멤버는 허용되지 않는다. 프로퍼티를 초기화하는 데 사용되는 표현식은 null, 익명 함수, 또는 포인터 타입이 될 수 없다.

var productQuery =
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

무명 형식은 var를 사용하여 암시적으로 타입이 지정된 로컬 변수로 초기화하는 경우가 일반적이다.

무명 형식의 이름은 컴파일러만 알 수 있으므로 변수 선언에서 타입 이름을 지정할 수 없다.

var apple = new { Item = "apples", Price = 1.35 };
var onSale = apple with { Price = 0.79 };

무명 형식을 필드, 프로퍼티, 이벤트 또는 메서드의 반환 타입으로 선언할 수 없다. 무명 형식을 메서드에 인수로 전달하거나 저장해야 하는 경우, 일반적으로 명명된 struct 또는 클래스를 사용하는 것이 좋다.

무명 형식은 Equals 및 GetHashCode 메서드를 프로퍼티의 메서드를 기반으로 정의하기 때문에, 모든 프로퍼티가 같은 경우에만 같은 무명 형식의 두 인스턴스가 같다.

< 인터페이스와 추상 클래스에서의 프로퍼티 >

[ 인터페이스에서의 프로퍼티 ]

인터페이스에서 프로퍼티를 선언할 때는 구현을 제공하지 않고, get과 set 접근자만 지정한다.

 

interface IPerson {
    string Name { get; set; }
    int Age { get; set; }
}

[ 추상 클래스에서의 프로퍼티 ]

추상 클래스에서는 프로퍼티에 기본 구현을 제공할 수도 있고, 추상 프로퍼티로 선언하여 하위 클래스에서 구현하도록 할 수도 있다.

abstract class AbstractPerson {
    public abstract string Name { get; set; }
    public int Age { get; set; }
}

 

 

Reference: 

Microsoft Docs - Properties (C# Programming Guide)

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties

 

Properties - C# Programming Guide

A property in C# is a member that uses accessor methods to read, write, or compute the value of a private field as if it were a public data member.

learn.microsoft.com

Microsoft Docs - Anonymous Types (C# Programming Guide)

https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/types/anonymous-types

 

Anonymous Types

Anonymous types in C# encapsulate a set of read-only properties in an object without having to explicitly define a type. The compiler generates a name.

learn.microsoft.com

Microsoft Docs - Interfaces (C# Programming Guide)

https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/types/interfaces

 

Interfaces - define behavior for multiple types

An interface in C# contains definitions for a group of related functionalities that a non-abstract class or a struct must implement. It specifies the members and their signatures for a type that implements the interface.

learn.microsoft.com

 

'C#' 카테고리의 다른 글

스레드 동기화(lock,AutoResetEvent)  (0) 2023.06.13
멀티스레드  (0) 2023.06.13
MS-SQL 및 SSMS 설치 방법  (0) 2023.06.04
C# 문법 정리 ②  (0) 2023.06.04
C# 문법 정리  (0) 2023.06.03

< 단편화란 ? >

"단편화"란 컴퓨터 시스템의 저장소나 메모리에 데이터가 불연속적으로 위치하는 현상을 말한다. 이는 파일이 저장 공간의 여러 부분에 분산되어 저장되는 것을 의미하며, 이는 컴퓨터 성능을 저하시키는 주요 원인 중 하나이다. 따라서 파일이나 메모리 조각을 재조정하고, 파일을 연속된 공간에 저장하는 '디스크 조각 모음' 작업을 정기적으로 수행하는 것이 중요하다.

< 단편화의 원인과 영향 >

단편화는 파일이 저장 공간의 단일 연속 블록에 맞지 않거나, 파일을 저장하기에 충분한 자유 공간이 부족할 때 발생할 수 있다. 시스템이 파일을 열기 위해 개별 조각을 다른 위치에서 검색하고 가져와야 하기 때문에, 단편화는 파일을 읽거나 접근하는 데 문제를 일으킬 수 있다.

단편화의 결과로 시스템 성능이 감소하고 파일에 접근하기 어렵게 된다. 따라서 하드 디스크를 정기적으로 디스크 조각 모음하는 것이 좋다. 

이 프로세스는 디스크의 데이터 블록을 재배열하여 파일이 연속된 블록에 저장되게 하고, 더 빠르게 접근할 수 있도록 한다.


< 단편화의 유형 >

[ 내부 단편화 ]

내부 단편화는 메모리 블록 내에 사용되지 않는 공간이 있을 때 발생한다. 예를 들어, 시스템이 40KB 크기의 파일을 저장하기 위해 64KB 메모리 블록을 할당하면, 그 블록에는 24KB의 내부 단편화가 포함된다. 고정 크기 블록 할당 방식을 사용하는 경우, 이러한 현상이 발생할 수 있다.

위의 다이어그램은 할당된 메모리와 필요한 공간 또는 메모리의 차이를 내부 단편화라고 부르기 때문에 내부 조각화를 명확하게 보여 준다&nbsp; .

[ 외부 단편화 ]

외부 단편화는 하드 디스크 같은 저장 매체가 여러 작은 자유 공간 블록을 산재시킬 때 발생한다. 시스템이 자주 파일을 생성하고 삭제하면 매체에 많은 작은 자유 공간 블록이 남아, 시스템이 새 파일을 저장할 때 충분히 큰 단일 연속 자유 공간 블록을 찾지 못하고, 대신 여러 작은 블록에 파일을 저장해야 할 수 있다. 이렇게 되면 외부 조각화와 성능 문제가 발생할 수 있다.

 

 

실행하기에 충분한 공간(55KB)이 있지만 Fragment가 연속적이지 않다는 것을 알 수 있다. 여기에서는 압축, 페이징 또는 분할을 사용하여 여유 공간을 사용하여 프로세스를 실행한다.


단편화는 시스템 내 다양한 수준에서 발생할 수 있다. 파일 단편화는 파일 시스템 수준에서 발생하며, 파일이 여러 비연속 블록으로 나뉘어 저장 매체에 저장된다. 메모리 단편화는 메모리 관리 수준에서 발생하며, 시스템이 동적으로 메모리 블록을 할당하고 해제한다. 네트워크 단편화는 네트워크를 통해 전송하기 위해 데이터 패킷이 작은 조각으로 나뉘어질 때 발생한다.

< 단편화가 운영체제에 미치는 영향 >

단편화는 디스크의 읽기 및 쓰기 속도를 느리게 만들어, 디스크 헤드가 파일의 조각에 접근하기 위해 여러 위치로 이동해야 한다. 때문에 접근 시간을 증가시키고 시스템의 전반적인 속도를 감소시킨다. 디스크 공간도 낭비되어, 조각이 필요한 공간보다 더 많은 공간을 차지할 수 있다. 이는 디스크 공간 부족을 초래하고, 시스템이 불안정해지며 오류나 충돌에 취약해질 수 있다. 심각한 경우에는 단편화로 인해 시스템이 디스크 공간을 모두 소진하여 데이터 손실을 일으킬 수 있다.

따라서 최적의 성능을 유지하기 위해서는 디스크를 정기적으로 조각 모음하는 것이 중요하다. 디스크 조각 모음은 파일의 조각을 재구성하고, 파일을 저장할 연속된 디스크 공간을 할당한다. 이는 디스크의 읽기 및 쓰기 속도를 향상시키고, 접근 시간을 줄이며, 시스템의 전반적인 속도를 향상시킨다. 디스크를 정기적으로 조각 모음함으로써 운영 체제의 성능을 향상시키고 유지할 수 있으며, 사용자에게 원활하고 효율적인 사용 환경을 제공할 수 있다.

 

< 단편화의 장점과 단점 >

단편화는 컴퓨터의 하드 디스크 또는 기타 저장 매체의 저장 공간을 더 잘 활용하는 등 여러 가지 잠재적인 이점이 있다. 단편화된 파일은 매체의 사용 가능한 자유 공간 블록에 저장할 수 있으며, 이러한 블록이 연속적일 필요는 없다. 이는 매체가 작은 자유 공간 블록을 많이 포함하고 있어 그렇지 않으면 낭비되는 경우 특히 유용하다.

그러나 일반적으로 단편화를 최소화하는 것이 좋다. 단편화는 시스템 성능에 부정적인 영향을 미치고, 파일의 접근 및 관리를 더 어렵게 만들 수 있다.

< 내부 단편화와 외부 단편화의 차이점 >

내부 단편화는 메모리가 고정 크기의 블록으로 분할되었을 때 발생한다. 과정이 메모리보다 작을 때 내부 단편화가 발생한다. 이 문제는 메모리 블록의 크기를 고정시킴으로써 발생한다. 동적 파티셔닝을 사용하여 프로세스에 공간을 할당하면 이 문제를 해결할 수 있다.


외부 단편화는 메모리에 충분한 양의 공간이 있지만 메모리가 비연속적인 방식으로 제공되어 프로세스의 메모리 요청을 충족시킬 수 없을 때 발생한다.  첫 번째 적합 또는 최선의 적합 메모리 할당 전략을 적용하면 외부 단편화가 발생한다.
단편화는 운영체제의 성능을 심각하게 저하시키는 주요 이슈이다.

 

디스크의 읽기 및 쓰기 속도를 느리게 만들어, 디스크 헤드가 파일의 조각에 접근하기 위해 다른 위치로 이동해야 하는 것이 단편화의 주요 역할이다. 이로 인해 접근 시간이 증가하고 시스템의 전반적인 속도가 감소하므로, 시스템 성능이 저하되고 애플리케이션에서 느려짐과 지연이 발생할 수 있다. 또한 단편화로 인해 디스크 공간이 낭비되고, 조각이 필요한 공간보다 더 많은 공간을 차지할 수 있다. 이로 인해 디스크 공간 부족을 초래하고, 시스템이 불안정해지며 오류나 충돌에 취약해질 수 있다.

 

 

Reference : https://www.geeksforgeeks.org/difference-between-internal-and-external-fragmentation/

 

Difference between Internal and External fragmentation - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://www.geeksforgeeks.org/what-is-fragmentation-in-operating-system/

 

What is Fragmentation in Operating System? - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

< 스왑핑(Swapping) >

스왑핑이란, 주 메모리(RAM)에 올라와 있는 프로세스를 일시적으로 하드 디스크 같은 보조 메모리로 옮기는 과정을 말한다. 이렇게 하면 더 많은 프로세스를 동시에 실행할 수 있게 된다. 스왑핑은 '메모리 압축'이라고도 불리는데, 이는 하드 디스크를 메모리의 연장처럼 사용하여 메모리를 효율적으로 활용하기 때문이다.

스왑핑의 구체적인 과정을 살펴보면, 우선 CPU 스케줄러가 어떤 프로세스를 스왑아웃(swap-out)할지, 그리고 어떤 프로세스를 스왑인(swap-in)할지를 결정한다. 우선 순위가 높은 프로세스가 실행을 대기하고 있다면, 우선 순위가 낮은 프로세스를 스왑아웃하고, 높은 우선 순위의 프로세스를 메모리에 로드하여 실행한다. 이렇게 함으로써 CPU는 항상 가장 중요한 작업을 먼저 처리하게 된다.


< 스왑인과 스왑아웃 >


스왑핑은 크게 스왑인과 스왑아웃 두 가지 과정으로 나뉜다. 스왑아웃은 주 메모리에서 프로세스를 하드 디스크로 옮기는 것을 말하며, 반대로 스왑인은 하드 디스크에서 프로세스를 다시 주 메모리로 가져오는 것을 말한다.


< 스왑핑의 장단점 >


[장점]

스왑핑을 통해 프로세스 실행 대기 시간을 줄일 수 있으며, 이는 결국 CPU의 활용도를 높이게 된다.

 

[단점]

프로세스가 주 메모리와 보조 메모리 간을 이동하는 과정은 시스템의 전체 성능을 떨어뜨릴 수 있다.  또한, 스왑핑 과정 중에 시스템이 갑자기 종료되면 스왑아웃된 프로세스의 데이터가 손실될 수 있다.

이 외에도, 스왑핑에 사용되는 알고리즘의 성능이 떨어질 경우 페이지 폴트의 발생 확률이 높아지며, 이는 전체 시스템 성능에 악영향을 미칠 수 있다.

그럼에도 불구하고, 메모리를 효율적으로 활용하기 위해 운영체제는 스왑핑과 같은 메모리 관리 기법을 사용하며, 이는 컴퓨터의 성능을 극대화하는데 중요한 역할을 한다.

 

 

< 메모리 할당 > 

프로세스는 메모리 내의 빈 공간에 적재되어야 한다. 메모리 내에 빈 공간이 여러 개 있다면 프로세스를 어디에 배치해야 할까?  비어 있는 메모리 공간에 프로세스를 연속적으로 할당하는 방식을 알아보자.

 

대표적으로 최초 적합, 최적 접합, 최악 적합의 세 가지 방식이 있다. 이는 그림과 함께 이해하는 것이 좋다. 가령 아래와 같은 상황에서 20MB 크기의 프로세스를 적재하고 싶다고 해보자. 메모리의 사용자 영역은 총 200MB라고 가정해 보자. 프로세스를 적재할 수 있는 빈 공간은 빈 공간 A, 빈 공간 B, 빈 공간 C 세군데가 있다. 

[ 최초 적합 (first fit) ]

최초 적합 은 그 이름에서 알 수 있듯이, 운영체제가 메모리 내의 빈 공간을 순서대로 검색하다가 첫 번째로 발견한 적절한 공간에 프로세스를 배치하는 방식이다. 예를 들어, 운영체제가 A, B, C 순서로 메모리 공간을 검색하다가 프로세스가 적재될 수 있는 첫 번째 빈 공간 A를 발견하면, 해당 공간에 프로세스를 적재한다. 이 방식의 장점은 메모리 할당 속도가 빠르다는 것다. 적합한 공간을 발견하는 즉시 할당을 진행하므로, 불필요한 검색을 최소화할 수 있다.

 

최초 적합 방식은 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식이다.

 

[ 최적 적합 (best fit) ]

최적 적합은 운영체제가 메모리의 모든 빈 공간을 검색한 후, 프로세스가 적재될 수 있는 공간 중에서 가장 작은 공간에 프로세스를 배치하는 방식이다. 예를 들어, 프로세스가 적합하게 적재될 수 있는 여러 빈 공간 중에서 가장 작은 공간이 C라고 하면, 운영체제는 프로세스를 C에 한다. 이 방식의 목표는 메모리 내의 남은 공간(내부 단편화)을 최소화하는 것이다.

 

최적 적합 방식은 프로세스가 적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식

[ 최악 적합(worst fit) ]

최악 적합은 운영체제가 메모리의 모든 빈 공간을 검색한 후, 프로세스가 적재될 수 있는 공간 중에서 가장 큰 공간에 프로세스를 배치하는 방식이다. 위의 예시를 다시 사용하면, 프로세스가 적합하게 적재될 수 있는 여러 빈 공간 중에서 가장 큰 공간이 B라면, 운영체제는 프로세스를 B에 배치한다. 이 방식의 목표는 큰 프로세스의 요청을 처리할 수 있는 큰 메모리 블록을 가능한 유지하는 것이다.

최악 적합 방식은 프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식이다.

 

 

 

 

 

 

Reference: https://www.geeksforgeeks.org/swapping-in-operating-system/

 

Swapping in Operating System - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://www.scaler.com/topics/swapping-in-os/

 

What is Swapping in Operating Systems (OS)? - Scaler Topics

In this article by Scaler Topics, we will be learning about what is Swapping in Operating Systems (OS) along with its advantages and disadvantages.

www.scaler.com

혼자 공부하는 컴퓨터 구조+운영체제

https://product.kyobobook.co.kr/detail/S000061584886

 

혼자 공부하는 컴퓨터 구조+운영체제 | 강민철 - 교보문고

혼자 공부하는 컴퓨터 구조+운영체제 | 혼자 해도 충분합니다! 1:1 과외하듯 배우는 IT 지식 입문서42명의 베타리더 검증으로, ‘함께 만든’ 입문자 맞춤형 도서이 책은 독학으로 컴퓨터 구조와

product.kyobobook.co.kr

 

( 명령어 사이클 [컴퓨터가 명령어를 처리하는 순서] )

 

컴퓨터가 메모리에 있는 명령어를 실행하려면 먼저 CPU가 메모리에서 해당 명령어를 가져와야 한다. 이런 과정을 '인출'이라고 부른다. 그러나 명령어를 CPU로 가져왔다 해도 바로 실행할 수 없는 경우도 있다. 예를 들어, 추가적으로 메모리에 접근해야 하는 경우가 있을 수 있다.

이런 과정들을 "명령어 사이클(instruction cycle)"이라고 한다.

 

 

 

명령어 사이클에는 크게 세 가지가 있다.

 

  • 인출 사이클 (Fetch cycle): 메모리에서 명령어를 CPU로 가져오는 단계.
  • 실행 사이클 (Execution cycle): CPU에서 명령어를 실행하는 단계.  여기서 제어 장치는 명령어 레지스터에 담긴 값을 해석하고 제어 신호를 발생시킨다.
  • 간접 사이클 (Indirect cycle): 명령어를 실행하기 위해 한 번 더 메모리 접근을 하는 과정을 간접 사이클이라고 한다. 간접 주소 지정 방식을 사용하는 경우에 필요한 사이클이다.

 

( 인터럽트: CPU에게 긴급한 일을 알리는 방법 )

명령어 사이클이 원활하게 진행되는 동안, 때때로 CPU는 '인터럽트'라는 메시지를 받는다. 이 메시지는 "CPU야, 지금 다른 일을 하고 있더라도 이건 긴급해서 지금 당장 처리해야 하는 일이야"라는 식의 메시지이다.

인터럽트는 크게 두 가지로 나뉜다.

 

< 동기 인터럽트 (예외) >

CPU가 예기치 못한 상황에 부딪혔을 때 발생한다. 예를 들면, CPU가 접근해야 하는 주소에 접근했는데 메모리가 없거나, 연산 중 오버플로우가 발생하는 경우가 있다. 이런 경우, CPU는 현재의 작업을 중단하고 이러한 예외 상황을 처리한다.

< 비동기 인터럽트 >

인터럽트는 CPU가 다른 작업을 수행하는 도중에 외부에서 발생하는 이벤트에 의해 발생한다. 이들은 주로 입출력 장치(IO devices), 타이머, 그리고 다른 프로세서에서 발생한다. 예를 들어, 키보드가 키 입력을 받았거나, 네트워크 카드가 데이터 패킷을 받았을 때 이런 비동기 인터럽트가 발생할 수 있다. 이러한 인터럽트가 발생하면 CPU는 현재의 작업을 일시 중단하고 이 인터럽트를 처리한다.


인터럽트가 발생하면 CPU는 현재 실행 중인 명령어를 완료한 후 인터럽트 처리를 시작한다. 이는 인터럽트가 발생한 시점의 CPU 상태를 저장하고, 해당 인터럽트를 처리하는 데 필요한 서비스 루틴으로 점프하는 과정을 포함한다. 인터럽트 처리가 완료되면, CPU는 인터럽트가 발생하기 전의 상태를 복구하고, 원래의 작업을 계속 수행한다.

정리하자면, CPU가 메모리에 저장된 명령어를 처리하는 과정은 명령어 사이클을 통해 이루어지며, 때때로 긴급한 작업을 처리해야 할 때는 인터럽트가 발생한다. 이렇게 명령어 사이클과 인터럽트를 통해 CPU는 다양한 작업을 효율적으로 처리하며, 컴퓨터 시스템이 원활하게 작동하도록 돕는다.

 

 

 

Reference : 혼자 공부하는 컴퓨터 구조+운영체제

https://product.kyobobook.co.kr/detail/S000061584886

 

혼자 공부하는 컴퓨터 구조+운영체제 | 강민철 - 교보문고

혼자 공부하는 컴퓨터 구조+운영체제 | 혼자 해도 충분합니다! 1:1 과외하듯 배우는 IT 지식 입문서42명의 베타리더 검증으로, ‘함께 만든’ 입문자 맞춤형 도서이 책은 독학으로 컴퓨터 구조와

product.kyobobook.co.kr

 

< CPU 레지스터란? >

레지스터는 컴퓨터의 중앙 처리 장치(CPU) 내부에 있는 매우 빠른 메모리 장치이다.

연산과 프로그램의 실행을 효율적으로 수행하기 위해 사용되며, 이를 위해 컴퓨터 메모리와 상호 작용하는 여러 가지 레지스터가 있다.

레지스터의 핵심 목적은 데이터를 빠르게 CPU로 가져오는 것이다. RAM에서 명령어를 가져오는 것은 하드 드라이브보다 빠르지만, CPU에게는 못 미친다.(속도 : RAM < CPU)

 

레지스터는 메모리의 일종이지만, 흔히 이야기하는 RAM과는 다르다.

RAM이라는 용어는 주로 CPU 외부에 위치한 주 메모리를 가리킨다. 반면, 레지스터는 CPU 내부에 위치하며, 아주 빠른 속도로 데이터에 액세스할 수 있는 작은 메모리 장치( 레지스터는 매우 작은 용량을 가졌기에, 이런 작은 용량 덕분에 레지스터는 매우 빠른 속도로 데이터에 액세스하고 처리할 수 있다.)다.

레지스터는 작고, 빠르기에 CPU가 연산을 수행하는 데 필요한 중요한 정보(예: 명령어, 데이터, 주소 등)를 임시 저장한다.


< 레지스터의 종류와 기능 >



Accumulator  : 데이터를 메모리에서 가져와 저장하는 데 가장 자주 사용되는 레지스터이다.

Memory Address Registers (MAR): 메모리의 접근할 위치의 주소를 가지고 있는 레지스터.

MAR와 MDR(Memory Data Register)이 함께 작동하여 CPU와 주 메모리 간의 통신을 지원한다.

Memory Data Registers (MDR) : 주소 지정된 위치에서 읽어야 할 데이터 또는 기록해야 하는 데이터를 포함한다.

General Purpose Registers : 임시 데이터를 저장하는 데 사용되며, 어셈블리 프로그래밍에서 그 내용에 액세스 할 수 있다. 현대의 CPU 아키텍처는 레지스터 대 레지스터 주소 지정을 더 많이 사용할 수 있도록 더 많은 일반 목적 레지스터를 사용하는 경향이 있다.

Program Counter (PC) : 프로그램의 실행을 추적하는 데 사용된. 이는 다음에 가져올 명령어의 메모리 주소를 포함한다.

Instruction Register (IR): 바로 실행될 명령어를 가지고 있다. PC에서 가져온 명령어가 IR에 저장되며, IR에 명령어가 위치하자마자 CPU는 명령어를 실행하기 시작하고 PC는 다음에 실행될 명령어를 가리킨다.


< 레지스터의 장점과 단점 >

 

레지스터는 매우 빠르며, 메인 메모리보다 훨씬 빠르게 데이터에 액세스할액세스 할 수 있다. 또한, 효율적으로 작은 양의 데이터만 저장하도록 설계되었으며, 이는 CPU가 쉽게 액세스 할 수 있게 한다.

 

그러나 레지스터에는 일부 단점도 있다. 레지스터는 소량의 데이터만 저장할 수 있어 일부 애플리케이션에서 문제가 발생할 수 있으며, 높은 속도의 메모리 셀로 만들어져 있어 CPU의 비용이 증가한다.


Reference : https://www.prepbytes.com/blog/digital-electronics/registers-in-computer-architecture/

 

Registers in Computer Architecture

We will see what are registers in computer architecture, the types of registers with their explanation, along with the advantages and disadvantages.

www.prepbytes.com

https://www.geeksforgeeks.org/different-classes-of-cpu-registers/

 

Different Classes of CPU Registers - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

+ Recent posts