1.
Component ONE 최신버젼, 도구모음 등록안되는 형상(?)


2.
license.licx 증명서가 삭제되었을때에, 다시 발급받아야 하는가,ㅡ,ㅡ(?)


3.
참조) 라이선스 에러 발생시 대처 방법 안내 - 마이그레이션 방법

license.licx 를 여러개의 프로젝트에서 사용할때에, 즉 여러개의 license.licx가 존재할경우에,

삭제된 프로젝트에 다른 프로젝트의 license.licx를 가져와서 복사 & 붙여넣기해서 재사용이 가능한가,ㅡ,ㅡ(?)


4. 프로젝트의 참조에 사용중인 DLL버젼과 도구모음에 등록되어진 DLL버젼이 틀린경우에 어떤 현상이 나타나는가(?)

단순 편집만 안되는지, 실행하는데는 문제는 없는가,ㅡ,ㅡ(?) 일단 편집은 안되는걸로 확인이 됩니다.

https://dev.mescius.co.kr/bbs/board.php?bo_table=component_faq&wr_id=25&page=1











/*
KEYPOINT) DateTime now = DateTime.ParseExact(MANUAL_DT, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);
*/


using System;
using System.Timers;
using System.IO;


class Program
{
    public static void Main()
    {
        CHKNMNM nmm = new CHKNMNM();
        nmm.CALCCHK();
        nmm.REALCHK();
        nmm.DISPCHK();
    }
}

class CHKNMNM
{
    string[] HOLIDAY = new string[]
    {
        "2024-01-01",
        "2024-02-09",
        "2024-02-12",
        "2024-03-01",
        "2024-04-10",
        "2024-05-01",
        "2024-05-06",
        "2024-05-15",
        "2024-06-06",
        "2024-08-15",
        "2024-09-16",
        "2024-09-17",
        "2024-09-18",
        "2024-10-03",
        "2024-10-09",
        "2024-12-25",
    };
    string[] HOLIDAYNM = new string[]
    {
        "2024-01-01(신정)",
        "2024-02-09(구정)",
        "2024-02-12(구정)",
        "2024-03-01(삼일절)",
        "2024-04-10(선거일)",
        "2024-05-01(노동절)",
        "2024-05-06(어린이날대체)",
        "2024-05-15(부처님오신날)",
        "2024-06-06(현충일)",
        "2024-08-15(광복절)",
        "2024-09-16(추석)",
        "2024-09-17(추석)",
        "2024-09-18(추석)",
        "2024-10-03(개천절)",
        "2024-10-09(한글날)",
        "2024-12-25(크리스마스)",
    };
    string[] YOIL = new string[]
    {
    "MONDAY",
    "TUESDAY",
    "WEDNESDAY",
    "THURSDAY",
    "FRIDAY",
    "SATURDAY",
    "SUNDAY",
    };
    string[] RANDOMNM = new string[]
    {
    "CHO","PARK","JIN",
    };
    string CHKDateFormat = "yyyy-MM-dd";

    const int MAX_CNT = 1024;
    string[] CHKNM = new string[MAX_CNT];
    string[] CHKDT = new string[MAX_CNT];
    string[] CHKYO = new string[MAX_CNT];
    string[] CHKRM = new string[MAX_CNT];

    string MANUAL_DT = "20230101121212";

    public void CALCCHK()
    {
        int ii = 0; //(1-MON, 7-SUNDAY)
        int day = 0;
        int mm = 0;
        int kk = 0;

        DateTime now = DateTime.ParseExact(MANUAL_DT, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);

        DateTime calcnow;

        //POINT:CHKRM's INCREASE ITSELF
        //POINT:RANDOMNM's INCREASE ITSELF
        //POINT:CHKRM's INCREASE ITSELF
        //POINT:RANDOMNM's INCREASE ITSELF

        while (true)
        {
            calcnow = now.AddDays(day);
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) < 20231231)
            {
                day++;
                continue;
            }
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) == 20250101) break;
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) == 20231231) ii = 7;




            int check = 0;
            for (int ff = 0; ff < HOLIDAY.Length; ff++)
            {
                if (calcnow.ToString(CHKDateFormat) == HOLIDAY[ff])
                {
                    check = 100;
                    break;
                }
            }


            if (check == 0)
            {
                if (ii == 4) CHKRM[kk++] = RANDOMNM[mm++ % 3];
                else if (ii == 5) CHKRM[kk++] = RANDOMNM[mm++ % 3];
            }
            else
            {
                if (ii == 1) CHKRM[kk++] = "PARK";
                else if (ii == 2) CHKRM[kk++] = "JIN";
                else if (ii == 3) CHKRM[kk++] = "CHO";
                else if (ii == 4) CHKRM[kk++] = RANDOMNM[mm++ % 3];
                else if (ii == 5) CHKRM[kk++] = RANDOMNM[mm++ % 3];
            }

            day++;
            ii++;

            if (ii == 8) ii = 1;
        }
    }
    public void REALCHK()
    {
        int ii = 0; //(1-MON, 7-SUNDAY)
        int day = 0;
        int kk = 0;
        int sum = 0;

        DateTime now = DateTime.ParseExact(MANUAL_DT, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);
        DateTime calcnow;

        while (true)
        {
            calcnow = now.AddDays(day);
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) < 20231231)
            {
                day++;
                continue;
            }
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) == 20250101) break;
            if (Convert.ToInt32(calcnow.ToString(CHKDateFormat).Replace("-", "")) == 20231231) ii = 7;




            int check = 0;
            for (int ff = 0; ff < HOLIDAY.Length; ff++)
            {
                if (calcnow.ToString(CHKDateFormat) == HOLIDAY[ff])
                {
                    check = 100;
                    break;
                }
            }


            if (check == 0)
            {
                if (ii == 1)
                {
                    CHKNM[sum] = "PARK";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 2)
                {
                    CHKNM[sum] = "JIN";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 3)
                {
                    CHKNM[sum] = "CHO";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 4)
                {
                    CHKNM[sum] = CHKRM[kk++];
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 5)
                {
                    CHKNM[sum] = CHKRM[kk++];
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 6)
                {
                    CHKNM[sum] = "HOLIDAY";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
                else if (ii == 7)
                {
                    CHKNM[sum] = "HOLIDAY";
                    CHKYO[sum] = YOIL[ii - 1];
                    CHKDT[sum] = calcnow.ToString(CHKDateFormat);
                }
            }
            else if (check == 100)
            {
                CHKYO[sum] = YOIL[ii - 1];
                CHKDT[sum] = calcnow.ToString(CHKDateFormat);

                int subcheck = 0;
                for (int ff = 0; ff < HOLIDAY.Length; ff++)
                {
                    if (CHKDT[sum] == HOLIDAY[ff])
                    {
                        CHKNM[sum] = HOLIDAYNM[ff];
                        subcheck = 100;
                        break;
                    }
                }
                if (subcheck == 0)
                {
                    CHKNM[sum] = "SPECIAL";
                }
            }

            day++;
            ii++;
            sum++;

            if (ii == 8) ii = 1;
        }
    }
    public void DISPCHK()
    {
        int kk = 0;
        int ____park_k = 0, ____jin_k = 0, ____cho_k = 0;

        while (true)
        {
            string dateTxt = "";
            string nameTxt = "";

            int check = 0;
            for (int ii = 0; ii < 7; ii++)
            {
                dateTxt += CHKDT[kk] + " ";
                nameTxt += CHKNM[kk] + " ";

                if (CHKNM[kk] == "PARK") ____park_k++;
                else if (CHKNM[kk] == "JIN") ____jin_k++;
                else if (CHKNM[kk] == "CHO") ____cho_k++;

                if (CHKDT[kk] == "2024-12-31")
                {
                    check = 100;
                    break;
                }

                kk++;
            }
            Console.WriteLine(dateTxt);
            Console.WriteLine(nameTxt);

            if (check == 100) break;
        }
    }
}







'c# 언어 > 초급과정' 카테고리의 다른 글

프로세스.종료  (0) 2024.03.16
DispatcherTimer 활용사례  (0) 2024.03.12
SetWindowLong 함수란 무엇인가  (0) 2024.01.30
Windows Form 실행시에 Message 순서출력  (0) 2024.01.06
공백여러개를 하나로 정리하기  (0) 2023.12.13

Compute Unified Device Architecture

NVIDIA가 만든 GPGPU 플랫폼 및 API 모델이다.

CUDA 플랫폼은 GPU의 가상 명령어셋을 사용할 수 있도록 만들어주는 소프트웨어 레이어이며, NVIDIA가 만든 CUDA 코어가 장착된 GPU에서 작동한다. 발빠른 출시 덕분에 수 많은 개발자들을 유입시켜, 사실상 엔비디아 생태계의 핵심으로 불린다. 물론 GPU 성능 차이도 있지만, 딥러닝이 각각 2012년[2]과 2016년[3]에 제대로 터지기 전부터 빠른 선구안을 취하여 업계 개발자들을 해당 플랫폼에 락인시킨 것이 매우 크다.[4]

2006년 11월에 G80 마이크로아키텍처와 함께 처음 발표된 후, 2007년 6월 23일에 CUDA SDK가 처음 배포되었다. 초기에는 C, C++만 지원했지만 10여 년이 지난 지금은 포트란이나 C#등 다양한 언어에서 사용이 가능하다. 그러나 기본적인 구조 자체는 CUDA를 설치할 때 설치되는 전용 CUDA 컴파일러가 cuda 코드 파일을 컴파일하고, 그 다음에 C++나 C# 같은 기존 언어 컴파일러에 결과물을 투입하는 방식. 버전 정보는 이곳에서 확인할 수 있다.

새로운 마이크로아키텍처 혹은 새로운 GPU가 나올 때마다 CUDA Compute Capability가 올라갔기 때문에 오래된 GPU의 경우 CUDA Compute Capability가 낮아서 일부 CUDA 기반 응용프로그램과 호환이 안될 수 있으나, 과거에 개발된 CUDA 기반 응용프로그램은 최신 GPU에서도 잘 작동한다. 또한, CUDA가 대두되면서 2007년에 GPGPU 전용인 TESLA[5] 제품군이 나왔는데, TESLA 제품군은 ECC 메모리를 탑재하여 메모리 오류를 정정하며, GeForce에서 쓰이는 같은 아키텍처 칩셋이라도 추가 명령어 몇 개를 더 지원한다. 다만 차세대 아키텍처의 GeForce에선 이전 세대의 CUDA 명령어를 전부 흡수하여 지원하는 경향이 있으므로 최신 GeForce 제품을 써도 이전 세대의 Tesla 전용 명령어를 쓸 수 있다.

GPU에 따른 CUDA Compute Capability는 이 링크를 참고하면 되며, 아래는 아키텍처 또는 GPU별로 대략적으로 정돈하였다. CUDA SDK 버전과는 다르므로 구분할 때 주의할 것.
G80 : 1.0
G84, G86, G92, G94, G96, G98 : 1.1
GT215, GT216, GT218 : 1.2
GT200 : 1.3
Fermi : 2.0~2.1
Kepler 1.0 : 3.0~3.7
Kepler 2.0 : 3.5~3.7
Maxwell 1.0 : 5.0~5.3
Maxwell 2.0 : 5.2~5.3
Pascal : 6.0~6.2
Volta : 7.0
Turing : 7.5
Ampere: 8.0

CUDA와 비슷한 GPGPU 기술로 OpenCL과 DirectCompute가 있지만 이들은 표준을 기준으로 만들어졌기 때문에 로우 레벨 API의 하드웨어에 있는 고급 기능까지 사용하여 한계까지 성능을 끌어내긴 어렵다. 즉, 다른 기술은 D3D API 등을 경유하기 때문에 시간이 걸리지만 쿠다는 바로 하드웨어에 엑세스하여 컨트롤할 수 있다.

하지만 이는 쿠다의 단점으로 이어지는데, 그래픽 기능과의 연동을 전제로 만들어진 DirectCompute에 비해 그래픽 출력 용도로 사용시 오버헤드가 커진다.

그래픽 카드의 GPU는 대량의 데이터에 한 가지 연산을 적용하는 경우가 많기 때문에 단순화된 연산 유닛(코어)을 천여 개씩 탑재하고 있다.[6] 따라서 SIMD(Single Instruction Multiple Data) 형태의 병렬화가 가능한 연산에 GPU를 활용해서 속도를 올리려는 시도는 예전부터 있어 왔다. 그러나 원래 그래픽을 처리하라고 설계된 그래픽스 파이프라인을 가지고 일반적인 병렬 연산을 수행하는 것은 매우 골치아픈 일이었다. 프로그래머가 일일이 GPU의 세부 사항을 다 신경써야 했기 때문이다.

CUDA 프로그램은 스트림 프로세싱[7]에 기반하며, 그 작성에는 C/C++ 언어에 동시에 실행할 쓰레드 개수 등을 선언하는데 사용되는 CUDA 전용 문법을 추가한 언어를 사용한다. CUDA 코드는 대략 GPU 안에서만 돌아가는 함수(커널이라고 부른다)를 호스트(CPU)에서 호출하는 형태로 되어 있다.

CUDA는 GPU의 메모리 모델을 추상화해서 좀 더 편하게 GPU를 이용할 수 있도록 했다. 하지만 여전히 CUDA로 최대한의 속도 증가를 얻으려면 GPU의 메모리 구조에 대해서 잘 알아야 한다. 윈도우 한정으로 CUDA 프로그래밍의 귀찮음을 덜어 주기 위해서 만들어진 BSGP(Bulk-Synchronous GPU Programming)라는 녀석이 존재한다. BSGP는 CUDA의 기계어 명령번역을 사용한 별도 언어다. 레이 트레이싱 류의 coherence가 낮은 작업에선 CUDA보다 성능향상이 있다. 다만 BSGP가 만능은 아니다. 반대로 메모리 참조 연속성이 강한 작업에선 CUDA보다 성능이 낮아진다.

최근에 CUDA를 더 보완한 OpenACC라는 게 나왔다. 좀 더 추상화가 돼있어서 코딩하기 더 편하다고 한다. 마이크로소프트에서는 C++ AMP라는 걸 만들었는데 OpenACC의 DirectCompute 버전 정도라 볼 수 있다. 그래도 아직은 일반 프로그래머가 사전지식 없이 덤빌 만한 난이도는 아니다. 단지 전에 비해 진입장벽이 많이 낮아졌을 뿐.

R337 드라이버 이후부터는 Geforce 제품군에서의 CUDA 기반 비디오 인코딩/디코딩 라이브러리가 삭제되었다. NVENC[8]를 밀기 위해서라는데(이전의 쿠다 인코더를 대체) Tesla나 Quadro 제품군은 정상적으로 사용이 가능하다. 이에 CUDA 가속을 사용하는 코덱의 사용이 불가능해지거나, 이전의 라이브러리 파일을 따로 넣지 않으면 미디어 편집 프로그램들에서의 호환성에 문제가 생겼다. 황사장: 꼬우면 쿼드로 사시든가

딥러닝을 도와주는 여러 라이브러리도 CUDA와 함께 제공된다. cuDNN, Convolution 연산을 더 빠르게 만들어주는 cuFFT[9], 선형대수 모듈인 cuBLAS 등 사실상 필요한 라이브러리들은 대부분 구현되어 있다. 하지만 그래도 사용은 어렵다. TensorFlow나 PyTorch 프레임워크가 이와 같은 라이브러리들을 사용한다.

인공지능을 위한 GPU(CUDA 설치)

 인공지능, 블록체인, GPU
"인공지능 코드를 테스트해보려면 GPU가 좋아야 해.', '인공지능을 위해 개발된 GPU'
'비트코인으로 인한 GPU 대란' 등의 이야기를 심심찮게 들어봤을 것이다. 인공지능와 블록체인에는 왜 GPU로 연산을 하는 것일까?

인공지능과 블록체인은  '쉬운 연산을 엄청나게 많이' 해야 하기 때문이다.
다음 영상을 보면 아주 쉽게 이해될 것이다.

인공지능은 행렬 연산을 엄청나게 많이 해야 하고 블록 체인은 엄청나게 많은 무작위 숫자(난수)를 대입해야 한다. 따라서 좋은 GPU는 연산 시간을 줄이는데 매우 유용하다.
 GPGPU(General-Purpose computing on Grphics Processing Unit)
원래 GPU의 목적은 CPU의 보조 장치로써 그래픽 처리만 담당했다. 하지만 이후 GPU가 행렬과 벡터 연산에 유용하게 쓰일 수 있다는 점에서 착안해 CPU 대신 GPU로 그래픽 처리 뿐만 아니라 행렬, 벡터 처리까지 가능하도록 만든 것이다. 이렇게 일반적인 목적의 연산(General-Purpose computing)도 처리하는 GPU를 GPGPU 라고 부른다.
그 덕분에 인공지능 학습 속도가 과거에 비해 크게 향상되었다.
필자도 인공지능 공부를 위해 좋은 GPU를 구입해서 파이토치를 구동시켜봤다.
GPU가 일을 하고 있나 확인하기 위해 작업관리자로 확인을 해봤다.

사실 GPU를 사용하기 위해서는 GPU를 사용하기 위한 프로그램을 설치해야 한다.
우리가 GPU를 사용하자고 컴퓨터에 알려주지 않았기 때문에 러닝을 돌리면 컴퓨터는 CPU로 연산을 한다.
아래부터는 CUDA라는 프로그램을 설치하는 방법에 대한 글입니다. 현재 설치할 계획이 없으시다면 건너뛰어도 괜찮습니다! 단순 호기심에 설치하다가는 하루를 그냥 날려버릴 수도 있어요!


CUDA
GPU로 러닝을 돌리기 위해 사용하는 프로그램이 바로 이 CUDA이다.
CUDA는 GPU 제조회사로 유명한 'NVIDIA' 회사용 프로그램이다. (GPU가 NVIDIA 외 다른 회사라면 다른 프로그램을 사용해야 함.)
아래는 설치방법이다. 그 외에도 설치방법은 인터넷에 검색하면 쉽게 찾을 수 있다.

꼭 드라이버 설치 → CUDA 설치 → cuDNN 설치 순서로 진행하자.
설치 전에 설치할 tensorflow 버전, 파이썬 버전, CUDA버전, cuDNN버전이 서로 호환되는지 꼭 확인하고 설치하자!! (정말 매우매우 중요하다. 이거 잘못하면 삽질의 늪에 빠진다.)

GPU 드라이버 호환 확인
GPU 드라이버 설치 후 cmd 창에 nvidia-smi 라고 쳤을 때 Driver Version 값이 높을 수록 좋다. (여기서 (Driver Version에 나오는 숫자는 최대로 설치할 수 있는 버전을 의미한다.
텐서플로우와 호환성을 따져보고 더 낮은 버전을 설치해도 괜찮다.)
예를들어 CUDA11.4.0GA 버전의 툴킷은 Driver Version 값이 471.11(윈도우 기준) 이상이어야 설치해도 문제 없다는 의미이다.

나머지 버전 호환
본인이 설치할 수 있는 CUDA 버전을 확인한 후 그에 맞게 텐서플로우, 파이썬, cuDNN 버전을 맞추면 된다. 
(가능하면 conda 가상환경에서 사용하는 것을 추천한다.)
설치가 잘 되었다면 nvcc -V 명령어로 잘 설치되었는지 확인할 수 있다. 
이 명령어가 실행되지 않으면 잘못 설치한 것이다.

정리
개발환경을 세팅하는 것은 귀찮고 어렵다. 특히 CUDA같은 경우 인공지능 프레임워크와 GPU간의 호환이 전부 맞아 떨어져야 사용이 가능하다. 
필자도 다시 지우고 깔기를 엄청 반복했다.
좋은 GPU를 사놓고 CUDA 설정을 못해서 CPU로 인공지능 공부하는 사람이 없어야 한다.

[DirectX 12] 기본지식 - CPU / GPU 동기화


한 시스템에 CPU와 GPU가 병렬로 실행되다 보니 동기화 문제가 발생한다. 
예를 들어 그리고자 하는 어떤 기하구조의 위치를 R이라는 자원에 담는다고 하자. 
그 기하구조를 위치 p1에 그리려는 목적으로 CPU는 위치 p1을 R에 추가하고, R을 참조하는 그리기 명령 C를 명령 대기열에 추가한다.

명령 대기열에 명령을 추가하는 연산은 CPU의 실행을 차단하지 않으므로, CPU는 계속해서 다음 단계로 넘어간다. 
만약 GPU가 그리기 명령 C를 실행하기 전에 CPU가 새 위치 p2를 R에 추가해서 R에 있던 기존 p1을 덮어쓰면, 기하구조는 의도했던 위치에 그려지지 않게 된다.

이런 문제의 해결책은 GPU가 명령 대기열의 명령들 중 특정 지점까지의 모든 명령을 다 처리할 때까지 CPU를 기다리게 하는 것이다. 
대기열의 특정 지점까지의 명령을 처리하는 것을 가리켜 명령 대기열을 비운다 또는 방출한다(Flush)라고 말한다.

이때 필요한 것이 바로 울타리(Fence)이다. 
울타리(펜스)는 ID3D12Fence 인터페이스로 대표되며, GPU와 CPU의 동기화를 위한 수단으로 쓰인다. 
다음은 펜스 객체를 생성하는 메서드이다.


사용 예)
m_pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, 
__uuidof(ID3D12Fence), (void**)&m_pd3dFence);

펜스 객체는 UINT64 값 하나를 관리한다. 이 값은 시간상의 특정 펜스 지점을 식별하는 정수이다. 이 값을 0으로 두고, 새 펜스 지점을 만들 때마다 이 값을 1씩 증가시킨다. UINT64의 최대값은 엄청나게 큰 값이기 때문에(약 1.8천경 정도 된다) 아무리 많은 시간동안 게임을 실행하며 이 값을 1씩 증가시킨다고 해도 이 값이 최대 값을 넘어간다는 걱정은 하지 않아도 된다.

다음은 펜스를 이용해서 명령 대기열을 비우는 방법을 보여주는 코드이다.
// 현재 펜스 지점까지의 명령들을 표시하도록 펜스 값을 전진
m_nFenceValue++;

// 새 펜스 지점을 설정하는 명령을 명령 대기열에 추가한다.
m_pd3dCommandQueue->Signal(m_pd3dFence, m_nFenceValue);

// GPU가 이 펜스 지점까지의 명령들을 완료할 때까지 기다린다.
if(m_pd3dFence->GetCompletedValue() < m_nFenceValue)
{
// GPU가 현재 펜스 지점에 도달했으면 이벤트를 발동시킨다.
m_pd3dFence->SetEventOnCompletion(m_nFenceValue, m_hFenceEvent);

// GPU가 현재 펜스 지점에 도달했음을 뜻하는 이벤트를 기다린다.
::WaitForSignalObject(m_hFenceEvent, INFINITE);
}
이 코드를 도식화하면 다음과 같다.(생략)


위 숫자 순으로 보면 어떤 순서로 돌아가는지 알 수 있을것이다. 
GPU는 현재 프레임에서 필요한 명령들을 완료하면 펜스 객체의 값을 하나 증가시키는 명령을 실행하게 된다. 
CPU는 그 작업을 하기 전까지 대기하는 것이다.

반응형

(adsbygoogle = window.adsbygoogle || []).push({});

window.ReactionButtonType = 'reaction';
window.ReactionApiUrl = '//lipcoder.tistory.com/reaction';
window.ReactionReqBody = {
entryId: 54
}

GC(Garbage Collection)는 객체가 더 이상 사용되지 않을 때 자동으로 메모리에서 제거하는 기능입니다. 하지만 GC에도 몇 가지 문제점이 있습니다.

  1. 성능 저하: GC는 메모리를 정리하기 위해 일정 시간 동안 애플리케이션의 실행을 중단 시키며, 이로 인해 애플리케이션의 성능이 저하 될 수 있습니다. 특히 대용량 데이터를 처리하는 경우에는 GC로 인한 성능 저하가 더욱 두드러질 수 있습니다.
  2. 메모리 누수: GC가 모든 객체를 완벽하게 제거하지 못할 경우 메모리 누수가 발생할 수 있습니다. 메모리 누수는 애플리케이션이 사용할 수 있는 메모리를 감소시키고, 시스템의 성능을 저하시킬 수 있습니다.
  3. 예측 불가능성: GC의 실행 시점은 예측하기 어렵습니다. 이로 인해 애플리케이션의 안정성이 떨어질 수 있습니다.
  4. 과도한 메모리 사용: GC는 메모리를 자동으로 관리하기 때문에 개발자가 메모리 사용량을 정확하게 제어하기 어렵습니다. 이로 인해 과도한 메모리 사용이 발생할 수 있습니다.

이러한 문제점을 해결하기 위해서는 적절한 GC 알고리즘을 선택하고, 메모리 사용량을 모니터링하고, 메모리 관리 전략을 수립하는 등의 노력이 필요합니다.

Sample.File.Explorer/Source

*.Designer.cs 부분 소스
this.treeView1.BeforeCollapse += new Systehttp://m.Windows.Forms.TreeViewCancelEventHandler(this.treeView1_BeforeCollapse);
this.treeView1.BeforeExpand += new Systehttp://m.Windows.Forms.TreeViewCancelEventHandler(this.treeView1_BeforeExpand);
this.treeView1.NodeMouseClick += new Systehttp://m.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick);

 

 

      

 

*.cs 부분 소스

private void Form1_Load(object sender, EventArgs e)
        {
            //현재 사용자 정보 표시
            System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
            label1.Text = "현재 사용자  :" + identity.Name;

            //현재 로컬 컴퓨터에 존재하는 드라이브 정보 검색하여 트리노드에 추가
            DriveInfo[] allDrives = DriveInfo.GetDrives();

            foreach (DriveInfo dname in allDrives)
            {
                if (dname.DriveType == DriveType.Fixed)
                {
                    if (dname.Name == @"C:\")
                    {
                        TreeNode rootNode = new TreeNode(dname.Name);
                        rootNode.ImageIndex = 0;
                        rootNode.SelectedImageIndex = 0;
                        treeView1.Nodes.Add(rootNode);
                        Fill(rootNode);
                    }
                    else
                    {
                        TreeNode rootNode = new TreeNode(dname.Name);
                        rootNode.ImageIndex = 1;
                        rootNode.SelectedImageIndex = 1;
                        treeView1.Nodes.Add(rootNode);
                        Fill(rootNode);
                    }
                }
            }

            //첫번째 노드 확장
            treeView1.Nodes[0].Expand();

            //ListView 보기 속성 설정
            listView1.View = View.Details;

            //ListView Details 속성을 위한 헤더 추가
            listView1.Columns.Add("디렉토리.이름", listView1.Width / 5, HorizontalAlignment.Left);
            listView1.Columns.Add("이름", listView1.Width / 5, HorizontalAlignment.Left);
            listView1.Columns.Add("수정한 날짜", listView1.Width / 5, HorizontalAlignment.Left);
            listView1.Columns.Add("유형", listView1.Width / 5, HorizontalAlignment.Left);
            listView1.Columns.Add("크기", listView1.Width / 5, HorizontalAlignment.Left);

            //행 단위 선택 가능
            listView1.FullRowSelect = true;
        }
        /// <summary>
        /// 트리를 마우스로 클릭할 때 발생하는 이벤트
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            try
            {
                //기존의 파일 목록 제거
                listView1.Items.Clear();
                DirectoryInfo dir = new DirectoryInfo(e.Node.FullPath);

                int DirectCount = 0;
                //하부 데렉토르 보여주기
                foreach (DirectoryInfo dirItem in dir.GetDirectories())
                {
                    //하부 디렉토리가 존재할 경우 ListView에 추가
                    //ListViewItem 객체를 생성
                    ListViewItem lsvitem = new ListViewItem();

                    //생성된 ListViewItem 객체에 똑같은 이미지를 할당
                    lsvitem.ImageIndex = 2;
                    lsvitem.Text = dirItem.Name;

                    //아이템을 ListView(listView1)에 추가
                    listView1.Items.Add(lsvitem);
                    listView1.Items[DirectCount].SubItems.Add("");

                    listView1.Items[DirectCount].SubItems.Add(dirItem.CreationTime.ToString());
                    listView1.Items[DirectCount].SubItems.Add("폴더");
                    listView1.Items[DirectCount].SubItems.Add(dirItem.GetFiles().Length.ToString() + " files");
                    DirectCount++;
                }

                //디렉토리에 존재하는 파일목록 보여주기
                FileInfo[] files = dir.GetFiles();
                int Count = 0;
                foreach (FileInfo fileinfo in files)
                {
                    listView1.Items.Add(fileinfo.FullName);
                    listView1.Items[Count].SubItems.Add(fileinfo.Name);

                    if (fileinfo.LastWriteTime != null)
                    {
                        listView1.Items[Count].SubItems.Add(fileinfo.LastWriteTime.ToString());
                    }
                    else
                    {
                        listView1.Items[Count].SubItems.Add(fileinfo.CreationTime.ToString());
                    }
                    listView1.Items[Count].SubItems.Add(fileinfo.Attributes.ToString());
                    listView1.Items[Count].SubItems.Add(fileinfo.Length.ToString());
                    Count++;
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show("에러 발생 : " + ex.Message);
            }
            treeView1.Nodes[0].Expand();
        }

        private void Fill(TreeNode dirNode)
        {
            try
            {
                DirectoryInfo dir = new DirectoryInfo(dirNode.FullPath);
                //드라이브의 하위 폴더 추가
                foreach (DirectoryInfo dirItem in dir.GetDirectories())
                {
                    TreeNode newNode = new TreeNode(dirItem.Name);
                    newNode.ImageIndex = 2;
                    newNode.SelectedImageIndex = 2;
                    dirNode.Nodes.Add(newNode);
                    newNode.Nodes.Add("*");
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show("에러 발생 : " + ex.Message);
            }
        }
        /// <summary>
        /// 트리가 확장되기 전에 발생하는 이벤트
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node.Nodes[0].Text == "*")
            {
                e.Node.Nodes.Clear();
                e.Node.ImageIndex = 3;
                e.Node.SelectedImageIndex = 3;
                Fill(e.Node);
            }
        }
        /// <summary>
        /// 트리가 닫히기 전에 발생하는 이벤트
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
        {
            if (e.Node.Nodes[0].Text == "*")
            {
                e.Node.ImageIndex = 2;
                e.Node.SelectedImageIndex = 2;
            }
        }

C++ 언어는 메모리를 직접 관리해야 하는 프로그래밍 언어 중 하나입니다.

C++ 언어는 메모리를 직접 할당하고 해제하는 것뿐만 아니라, 메모리의 접근 권한을 설정하고, 메모리의 상태를 모니터링하는 등의 작업을 직접 수행해야 합니다.

C++ 언어는 객체지향 프로그래밍 언어로, 객체의 생성과 소멸을 직접 관리해야 합니다. 객체의 생성과 소멸은 메모리의 할당과 해제와 밀접하게 연관되어 있기 때문에, C++ 언어에서는 객체의 생성과 소멸을 신중하게 관리해야 합니다.

C++ 언어는 메모리를 직접 관리하는 것이 복잡하고 어렵기 때문에, 초보자에게는 어려울 수 있습니다. C++ 언어에서는 메모리를 직접 관리하는 것 외에도, 자동으로 메모리를 관리해주는 기능도 제공합니다.

프로그래밍을 할 때는 메모리를 직접 관리하는 것과 자동으로 관리하는 것을 적절하게 사용해야 합니다. 이를 위해서는 메모리 관리에 대한 이해와 지식이 필요합니다.

C# 언어는 메모리를 자동으로 관리하는 프로그래밍 언어 중 하나입니다.

C# 언어에서는 메모리를 직접 할당하고 해제하는 것이 아니라, .NET 프레임워크가 메모리를 자동으로 관리합니다. .NET 프레임워크는 메모리를 할당하고, 필요한 경우 메모리를 자동으로 해제합니다.

C# 언어는 가비지 컬렉션(Garbage Collection)이라는 기능을 제공하여 사용되지 않는 메모리를 자동으로 탐지하고 제거합니다. 가비지 컬렉터는 메모리를 자동으로 관리하여 메모리 누수를 방지하고, 프로그램의 안정성을 높입니다.

C# 언어는 메모리를 자동으로 관리하기 때문에, 메모리를 직접 관리하는 것보다 쉽고 편리합니다. 하지만, 메모리를 자동으로 관리하는 것은 메모리 관리에 대한 이해와 지식이 필요하지 않다는 것은 아닙니다. C# 언어에서도 메모리를 효율적으로 사용하고, 메모리 누수를 방지하기 위해서는 메모리 관리에 대한 이해와 지식이 필요합니다.

Java 언어는 메모리를 자동으로 관리하는 프로그래밍 언어 중 하나입니다.

Java 언어에서는 메모리를 직접 할당하고 해제하는 것이 아니라, Java 가상 머신(JVM)이 메모리를 자동으로 관리합니다. JVM은 메모리를 할당하고, 필요한 경우 메모리를 자동으로 해제합니다.

Java 언어는 가비지 컬렉션(Garbage Collection)이라는 기능을 제공하여, 사용되지 않는 메모리를 자동으로 탐지하고 제거합니다. 가비지 컬렉터는 메모리를 자동으로 관리하여 메모리 누수를 방지하고, 프로그램의 안정성을 높입니다.

Java 언어는 메모리를 자동으로 관리하기 때문에, 메모리를 직접 관리하는 것보다 쉽고 편리합니다. 하지만, 메모리를 자동으로 관리하는 것은 메모리 관리에 대한 이해와 지식이 필요하지 않다는 것은 아닙니다. Java 언어에서도 메모리를 효율적으로 사용하고, 메모리 누수를 방지하기 위해서는 메모리 관리에 대한 이해와 지식이 필요합니다.

C언어는 메모리를 직접 관리해야 하는 프로그래밍 언어 중 하나입니다.

C언어는 메모리를 직접 할당하고 해제하는 것뿐만 아니라, 메모리의 접근 권한을 설정하고, 메모리의 상태를 모니터링하는 등의 작업을 직접 수행해야 합니다.

메모리를 직접 관리하는 것은 메모리 누수를 방지하고, 프로그램의 안정성을 높이는 데 중요합니다. 하지만, 메모리를 직접 관리하는 것은 복잡하고 어렵기 때문에, 초보자에게는 어려울 수 있습니다.

C언어에서는 메모리를 직접 관리하는 것 외에도, 자동으로 메모리를 관리해주는 기능도 제공합니다. 대표적인 예로는 malloc() 함수와 free() 함수를 이용한 메모리 할당과 해제, 그리고 C++의 스마트 포인터 등이 있습니다.

프로그래밍을 할 때는 메모리를 직접 관리하는 것과 자동으로 관리하는 것을 적절하게 사용해야 합니다. 이를 위해서는 메모리 관리에 대한 이해와 지식이 필요합니다.

가비지 컬렉터(GC) 없이 메모리 안전성을 제공하는 대표적인 언어로는 다음과 같은 것들이 있습니다.

      1. 러스트(Rust)

  • 모질라 재단에서 개발되고 있는 언어로, 메모리 안전성과 성능 및 편의성에 중점을 두고 있습니다.
  • 데이터 레이스나 널 포인터 등의 메모리 관련 오류를 사전에 방지할 수 있습니다.

    2. 스칼라(Scala)
  • JVM 기반의 언어로, 메모리 안전성을 제공합니다.
  • 가비지 컬렉션을 사용하지만, 메모리 안전성에 초점을 맞춘 언어입니다.

    3. 고(Go)
  • 구글에서 개발한 언어로, 메모리 안전성을 제공합니다.
  • 가비지 컬렉션을 사용하지 않고, 자동 메모리 관리 기능을 제공합니다.

    4. C++
  • C언어를 기반으로 객체 지향 프로그래밍을 지원하도록 설계된 언어입니다.
  • 메모리를 직접 관리해야 하기 때문에 메모리 관련 오류가 발생하기 쉬우며, 이를 방지하기 위해 메모리 안전성을 고려한 프로그래밍이 필요합니다.

    5. 오브젝티브-C(Objective-C)
  • C언어에 스몰토크의 메시지 전송 기능을 추가한 언어입니다.
  • 메모리 안전성을 제공하기 위해 가비지 컬렉션을 사용합니다.

마이크로소프트가 Rust 개발자를 모집하는 것으로 보아 Rust 채택이 가속화되고 있음
전년 대비 2% 감소한 인력에도 불구하고, 마이크로소프트는 C#에서 벗어나 Rust 기반 플랫폼으로의 이동을 위한 팀 구성을 지속중
Microsoft 365의 주요 소프트웨어 아키텍트 직무에는 Rust 컴포넌트 라이브러리, SDK, 기존의 C# 기반 서비스를 Rust로 재구현하는 기술적 방향, 설계 및 구현 가이드가 포함됨
마이크로소프트는 Rust 프로그래밍 언어 채택을 기반으로 전 세계적인 규모의 플랫폼 서비스를 현대화하기 위한 새로운 팀을 구성 중임
마이크로소프트는 메타, AWS와 함께 Rust 재단의 플래티넘 멤버로, 메모리 안전한 프로그래밍에 대한 열정이 증가함에 따라 이러한 움직임은 놀랍지 않음
오랫동안 Rust에 관심을 가지고 있었으며, 2023년에는 윈도우즈 커널에 Rust가 도입되었음을 발표함
Rust는 여러 해 동안 여러 컴포넌트에 점차적으로 통합되고 있음
마이크로소프트는 공개적으로는 여전히 C#에 전념하고 있지만, 지난 몇 년간의 행동과 채용 공고는 회사가 옵션을 열어두고 있음을 시사함

러스트 언어

러스트(Rust)는 모질라 재단에서 개발되고 있는 프로그래밍 언어로, 메모리 안전성과 성능 및 편의성에 중점을 두고 있습니다.

가비지 컬렉터 없이 메모리 안전성을 제공하는 대표적인 언어이며, C++의 대체재로 등장했습니다. 현대적인 프로그래밍 언어의 특징을 가지고 있으면서도 저수준 프로그래밍 언어의 특징도 가지고 있어서 시스템 프로그래밍에 적합합니다.

다음은 러스트 언어의 특징입니다.

메모리 안전성: 메모리 안전성에 초점을 맞춘 언어로, 데이터 레이스나 널 포인터 등의 메모리 관련 오류를 사전에 방지할 수 있습니다.
병렬성: 안전하게 병렬 처리를 할 수 있는 기능을 제공합니다. 스레드 간 데이터 경합을 방지하고 안전하게 병렬 처리를 할 수 있습니다.
속도와 효율성: 고성능 시스템 프로그래밍에 적합한 언어로, 빠른 실행 속도와 높은 효율성을 제공합니다. 메모리 관리 오버헤드가 적고, 효율적인 코드 작성이 가능합니다.
함수형 및 객체지향 프로그래밍 지원: 함수형 프로그래밍과 객체지향 프로그래밍을 모두 지원합니다. 사용자의 선호에 따라 선택하여 사용할 수 있습니다.
커뮤니티: 활발한 커뮤니티를 가지고 있습니다. 다양한 라이브러리와 도구를 제공하며, 개발자들 간의 정보 공유와 협업이 활발하게 이루어집니다.
러스트는 안전하고 효율적인 프로그래밍을 위한 언어로, 시스템 프로그래밍부터 웹 개발까지 다양한 분야에서 사용될 수 있습니다.

1. [C#] 가비지 컬렉션(Garbage Collection)

개요)
C#은 CLR(Common Language Runtime)에 의해 코드가 실행되고 관리된다.
CLR에서 가비지 컬렉터(Garbage Collector)는 자동 메모리 관리자 역할을 한다. 애플리케이션에서 메모리 할당 및 해제를 자동으로 관리한다.

장점)
개발자가 수동으로 메모리를 관리할 일이 줄어든다. -> 개발 능률 Up
관리되는 힙(managed heap)에 메모리 할당이 효율적으로 이루어진다.
객체가 다른 객체에 할당된 메모리 자체에 사용할 수 없도록 하여 메모리 보안을 제공한다.

메모리 할당)
사용자에 의해 새 프로세스가 시작되면 런타임에서는 메모리에 인접한 주소 공간 영역을 예약한다.
이 예약된 주소 공간을 관리되는 힙(managed heap)이라고 한다.
관리되는 힙에서는 객체가 할당될 주소의 포인터를 관리한다.
모든 참조 형식(reference type)은 관리되는 힙에 할당된다.

과정)
애플리케이션에서 참조 형식을 처음 만드는 경우, 이 참조 형식에 대한 메모리는 관리되는 힙의 기본 주소로 할당된다.
애플리케이션이 다음 개체를 만들 때 런타음은 처음 만든 객체 바로 다음 주소 공간에 메모리를 할당한다.
이러한 방식을 반복하여 새 객체에 대한 메모리 공간을 계속 할당한다.
관리되는 힙은 관리되지 않는 힙(unmanaged heap)에서 할당하는 것보다 속도가 더 빠르다.
런타임에서 포인터에 값을 더하여 객체의 메모리를 할당하기 때문에, 스택에서 메모리를 할당하는 속도만큼 빠르다.
또한, 연속으로 할당된 새 객체는 인접한 주소를 통해 빠른 속도로 액세스할 수 있다.

메모리 해제)
가비지 컬렉터의 최적화 엔진은 수행 중인 할당에 따라 수집을 수행하기에 가장 적합한 시간을 결정한다.
애플리케이션에서 더 이상 사용되지 않는 객체에 대한 메모리를 해제한다.
애플리케이션의 루트를 검사하여 더 이상 사용되지 않는 개체를 결정한다.
애플리케이션 루트에는 다음이 포함된다.

정적 필드(static field)
스택 객체
CPU 레지스터 등

GC는 이 목록을 사용하여 루트를 통해 연결할 수 있는 모든 객체 그래프를 생성한다.
그래프에 연결되지 못한 객체는 가비지 컬렉터에서 가비지로 간주하고 할당을 해제한다.

가비지 컬렉션)
가비지 컬렉션은 다음 조건 중 하나가 충족될 경우 발생한다.
시스템 메모리 부족
관리되는 힙의 할당된 객체에 사용되는 메모리가 허용되는 최대치를 초과
GC.Collect 메서드 호출

세대)
관리되는 힙은 세대별로 나눠져 관리된다. 주로 0세대, 1세대, 2세대로 나뉜다.

0세대
새로 할당된 객체의 메모리 영역으로, 주로 이 세대에서 가비지 컬렉션이 자주 발생한다.
대부분의 객체는 0세대에서 정리되며 다음 세대까지 남아있지 않는다.
0세대가 가득 찼을 때 새 객체가 할당될 경우, 먼저 0세대 영역에서 검사가 이루어진다.

1세대
0세대 컬렉션을 수행한 후 살아남은 메모리를 압축하여 1세대로 승격한다.
컬렉션이 0세대에서 충분한 공간을 확보하지 못한 경우, 1세대와 2세대에서 수행한다.

2세대
가장 오랫동안 살아남은 객체들이 저장되는 공간이다.
대량 객체 힙(3세대)의 객체는 2세대에서도 컬렉션이 이루어진다.
관리되지 않는 리소스
대부분의 객체는 자동으로 관리되지만, 명시적인 정리가 필요한 관리되지 않는 리소스가 존재한다.

Dispose
이런 경우 IDisposable 인터페이스를 통해 Dispose 메서드를 재정의 하여 관련 작업을 수행한다.
public class MyClass : IDisposable
{
public void Dispose
    {
     //정리 로직 구현
    }
}
객체 사용을 마치면, 명시적으로 Dispose 메서드를 호출해야 한다.
Finalize
만일, 실수로 Dispose를 호출하지 않았을 경우를 대비하여 정리하는 방안도 마련할 수 있다.
객체가 가비지 컬렉션 될때 호출되는 Finalize를 재정의를 통해 수행하게 된다.
public class MyClass : IDisposable
{
public void Dispose {...}
    
    ~MyClass()
    {
     //정리 로직 구현
    }
}
다만 가비지 컬렉션 도중 특정 객체의 다른 작업이 수반되는 것이므로 성능 이슈가 발생한다.
이 방식은 되도록 사용하지 않는 것이 좋다.


1. 메모리 구조(C)

스택영역
우리는 이제껏 스택영역에 메모리를 할당해 왔습니다. 컴파일 시점에 결정되는 영역입니다.

힙 영역
이 영역의 메모리는 실행시점(Run Time)에 결정됩니다. 프로그래머에 의해서요. 이 영역을 힙영역이라고 합니다.

데이터 영역
이 영역의 메모리는 정적변수, 전역변수, 구조체 등 함수 외부에서 선언되는 변수들이 이 메모리에 할당됩니다.

코드 영역
코드영역에는 프로그램의 실행 명령어들이 존재합니다.

우리가 이번에 주목해야할 영역은 힙영역입니다. 위의 코드를 정상적이게 동작시키기 위해서는요.
그 목적을 달성하기 위해서 나온 함수가 바로 malloc함수입니다. malloc함수는 stdlib헤더에 선언되어 있으며 malloc함수를 사용하기 위해서는 stdlib.h를 include해야합니다.

void *malloc(size_t size)

이 함수는 size만큼의 메모리를 힙영역에 할당합니다. 어떤 자료형일지 모르니 반환형 데이터는 void포인터입니다. 
하지만 그냥 메모리만 할당하고 해제하지 않으면 메모리가 누출됩니다. 우리는 메모리를 이제 쓰지 않을 경우(거의 함수 반환 직전)에 free함수를 써서 메모리를 해제해야합니다.

void free(void *ptr)

1. 프로세스 리스트 확인 : tasklist
1) 설명 : 프로세스 리스트를 보여준다
2) 입력 구조 : TASKLIST [/S 시스템 [/U 사용자 이름 [/P [암호]]]] [/M [모듈] | /SVC | /V] [/FI 필터] [/FO 형식] [/NH]
3) 기본 구성 : 프로세스 명, pid, 세션명 등을 보여준다

2. 프로세스 kill : taskkill
설명 : 개발을 진행하거나 하다보면 여기저기 튀어나오는 좀비들때문에 여간 귀찮은것이 아니다.
          그럴때 프로세스를 죽일수 있는 명령어가 taskkill 이다
2) 기본 구성 : TASKKILL[/S시스템[/U사용자이름[/P[암호]]]] { [/FI 필터] [/PID 프로세스 id | /IM 이미지 이름] } [/T] [/F]
3) 주요 옵션
a. /PID 프로세스 ID : 특정 프로세스ID의 프로세스 종료하기
    예시 : taskkill /PID 21500 -> 21500 PID를 가지는 프로세스 종료해라
b. /IM 프로세스명 : 특정 이름을 가지는 프로세스 종료(와일드카드(*) 사용가능)
    예시 : taskkill /IM java* -> java로 시작하는 이름을 가진 프로세스 종료해라
c. /T : 지정된 프로세스와 그 자식 프로세스 까지 종료
예시 : taskkill /T /PID 21303 -> PID가 21303인 프로세스와 그 자식 프로세스 까지 종료

3. WMIC 명령어를 통한 부모 프로세스 찾기

wmic를 통해 보고싶은것만 찾아보자
   -> wmic process where 항목="항목값" get 파라미터1, 파라미터2, 파라미터3
   -> 프로세스 항목의 값이 "항목값인" 프로세스의 파라미터1, 파라미터2, 파라미터3 정보를 표시해준다.
예시) wmic process where name="chrome.exe" get processid, parentprocessid, commandline
       -> 프로세스명이 chrome.exe인 프로세스의 pid, ppid, commandline을 볼수 있다.

 


C:\Users>tasklist

이미지 이름                    PID 세션 이름              세션#  메모리 사용
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0          8 K
System                           4 Services                   0      1,164 K
Secure System                   56 Services                   0     22,768 K
Registry                       112 Services                   0     23,268 K
smss.exe                       396 Services                   0        956 K
csrss.exe                      568 Services                   0      3,892 K
wininit.exe                    668 Services                   0      4,140 K
services.exe                   892 Services                   0      7,948 K
LsaIso.exe                     900 Services                   0      3,484 K
lsass.exe                      920 Services                   0     12,788 K
svchost.exe                    356 Services                   0     18,748 K
fontdrvhost.exe                520 Services                   0      2,028 K
svchost.exe                    980 Services                   0     12,752 K
svchost.exe                   1068 Services                   0      6,900 K
svchost.exe                   1228 Services                   0      7,408 K
svchost.exe                   1240 Services                   0      6,648 K
svchost.exe                   1288 Services                   0      3,824 K
svchost.exe                   1404 Services                   0      5,512 K
svchost.exe                   1412 Services                   0      6,232 K
svchost.exe                   1476 Services                   0     14,064 K
svchost.exe                   1508 Services                   0     10,360 K
svchost.exe                   1568 Services                   0      4,260 K
svchost.exe                   1596 Services                   0      6,448 K
svchost.exe                   1604 Services                   0      5,120 K
svchost.exe                   1652 Services                   0      5,432 K
svchost.exe                   1704 Services                   0      4,872 K
svchost.exe                   1736 Services                   0      6,824 K
svchost.exe                   1916 Services                   0      7,768 K
WUDFHost.exe                  1940 Services                   0      4,496 K
svchost.exe                   2000 Services                   0      6,024 K
svchost.exe                   2008 Services                   0      4,196 K
svchost.exe                   2016 Services                   0      6,968 K
svchost.exe                   2112 Services                   0      7,512 K
svchost.exe                   2140 Services                   0      4,760 K
Memory Compression            2148 Services                   0    209,304 K
igfxCUIService.exe            2188 Services                   0      4,996 K
svchost.exe                   2196 Services                   0      4,376 K
svchost.exe                   2256 Services                   0      4,352 K
svchost.exe                   2272 Services                   0      4,140 K
svchost.exe                   2344 Services                   0      4,816 K
svchost.exe                   2464 Services                   0      4,568 K
svchost.exe                   2536 Services                   0      5,204 K
svchost.exe                   2564 Services                   0      5,280 K
svchost.exe                   2576 Services                   0      5,456 K
svchost.exe                   2708 Services                   0      6,068 K
svchost.exe                   2780 Services                   0      4,116 K
svchost.exe                   2864 Services                   0     11,904 K
svchost.exe                   2912 Services                   0      5,008 K
svchost.exe                   3016 Services                   0      4,668 K
svchost.exe                   3024 Services                   0      5,256 K
svchost.exe                   2948 Services                   0      4,376 K
svchost.exe                   3176 Services                   0      4,328 K
svchost.exe                   3212 Services                   0      8,216 K
svchost.exe                   3252 Services                   0      6,152 K
spoolsv.exe                   3340 Services                   0      5,708 K
svchost.exe                   3380 Services                   0      3,972 K
svchost.exe                   3476 Services                   0     14,992 K
svchost.exe                   3484 Services                   0      5,884 K
svchost.exe                   3492 Services                   0     20,832 K
eausvc.exe                    3500 Services                   0      1,720 K
ObCrossEXService.exe          3508 Services                   0      2,380 K
AnySign4PCLauncher.exe        3520 Services                   0      9,612 K
IniClientSvc_x64.exe          3532 Services                   0      5,548 K
kpmsvc.exe                    3544 Services                   0      1,736 K
macourtsafersvc.exe           3576 Services                   0      2,468 K
svchost.exe                   3600 Services                   0     23,728 K
svchost.exe                   3676 Services                   0      6,176 K
nossvc.exe                    3684 Services                   0      1,384 K
runSW.exe                     3704 Services                   0      2,860 K
ASDSvc.exe                    3720 Services                   0     11,492 K
svchost.exe                   3728 Services                   0      4,060 K
svchost.exe                   3740 Services                   0      4,516 K
TENXW_SVR.exe                 3804 Services                   0      4,160 K
MsMpEng.exe                   3868 Services                   0    218,900 K
svchost.exe                   3892 Services                   0      3,912 K
svchost.exe                   3916 Services                   0      8,240 K
wpmsvc.exe                    3936 Services                   0      6,412 K
svchost.exe                   3996 Services                   0      5,548 K
svchost.exe                   4104 Services                   0      3,916 K
svchost.exe                   4352 Services                   0      4,048 K
svchost.exe                   4480 Services                   0      6,004 K
wlanext.exe                   4612 Services                   0      4,608 K
conhost.exe                   4632 Services                   0      3,328 K
NisSrv.exe                    5512 Services                   0      6,948 K
svchost.exe                   5876 Services                   0     13,572 K
PresentationFontCache.exe     6736 Services                   0      4,220 K
svchost.exe                   6852 Services                   0     12,852 K
svchost.exe                   7044 Services                   0      4,600 K
svchost.exe                   7088 Services                   0      6,744 K
svchost.exe                   7428 Services                   0      4,784 K
svchost.exe                   7632 Services                   0      8,096 K
svchost.exe                   7960 Services                   0      5,472 K
svchost.exe                   9388 Services                   0     10,012 K
svchost.exe                   9544 Services                   0     28,188 K
SearchIndexer.exe             9860 Services                   0     20,920 K
svchost.exe                   1332 Services                   0      8,232 K
svchost.exe                   3412 Services                   0      8,052 K
GoogleCrashHandler.exe       11268 Services                   0        752 K
GoogleCrashHandler64.exe     11276 Services                   0        632 K
svchost.exe                  12040 Services                   0      8,956 K
svchost.exe                  12212 Services                   0      6,048 K
SecurityHealthService.exe    12096 Services                   0     12,520 K
svchost.exe                   9812 Services                   0      5,148 K
SgrmBroker.exe                8676 Services                   0      7,504 K
svchost.exe                  11304 Services                   0      8,516 K
svchost.exe                   7844 Services                   0      4,596 K
csrss.exe                     3140 Console                    2      4,260 K
winlogon.exe                 14184 Console                    2      5,940 K
fontdrvhost.exe              12684 Console                    2      4,444 K
dwm.exe                      13324 Console                    2     42,940 K
MoUsoCoreWorker.exe           3908 Services                   0     18,648 K
TEWebP.exe                    9676 Console                    2      4,740 K
TEWebP64.exe                  9712 Console                    2      6,660 K
svchost.exe                   9120 Services                   0      7,272 K
svchost.exe                   4620 Services                   0      4,216 K
SwUSB.exe                    12296 Console                    2      5,272 K
AnySign4PC.exe               12552 Console                    2      8,784 K
kpmcnt.exe                    8272 Console                    2      2,756 K
sihost.exe                    6000 Console                    2     18,520 K
svchost.exe                   4492 Console                    2     16,296 K
svchost.exe                   9336 Console                    2     17,144 K
taskhostw.exe                13520 Console                    2      9,328 K
igfxEM.exe                    4316 Console                    2      8,168 K
igfxHK.exe                    7564 Console                    2      6,936 K
igfxTray.exe                  2632 Console                    2      7,988 K
INISAFEAdminUtil.exe         10336 Console                    2      2,488 K
ctfmon.exe                   10724 Console                    2      9,280 K
explorer.exe                 10788 Console                    2     70,700 K
nosstarter.npe                6708 Console                    2     11,500 K
svchost.exe                   8216 Console                    2      8,980 K
macourtsafer.exe             12112 Console                    2      2,540 K
CrossEXService.exe           10852 Console                    2      2,708 K
msedge.exe                    5048 Console                    2     99,368 K
msedge.exe                   13576 Console                    2      5,352 K
TEWeb.exe                    13432 Console                    2      3,868 K
msedge.exe                   10044 Console                    2    118,148 K
msedge.exe                   13420 Console                    2     25,536 K
msedge.exe                   11516 Console                    2      6,620 K
TEWeb64.exe                  11128 Console                    2      6,820 K
delfino.exe                  11952 Console                    2      6,644 K
INISAFECrossWebEXSvc.exe     10216 Console                    2      7,412 K
veraport-x64.exe             13136 Console                    2      8,596 K
StartMenuExperienceHost.e    12808 Console                    2     25,048 K
StSess.exe                   13888 Console                    2      7,072 K
RuntimeBroker.exe            10136 Console                    2      9,900 K
SearchApp.exe                 6424 Console                    2    118,648 K
RuntimeBroker.exe            11444 Console                    2      9,624 K
SkypeBackgroundHost.exe      14464 Console                    2      5,184 K
SkypeApp.exe                 14496 Console                    2     95,716 K
LockApp.exe                  14644 Console                    2      7,148 K
RuntimeBroker.exe            14808 Console                    2      9,008 K
StSess32.exe                 15156 Console                    2      2,788 K
RuntimeBroker.exe            11080 Console                    2      7,264 K
RuntimeBroker.exe            15432 Console                    2      8,796 K
SecurityHealthSystray.exe    15560 Console                    2      6,976 K
OneDrive.exe                 16048 Console                    2     21,184 K
ShellExperienceHost.exe      16260 Console                    2     23,260 K
jusched.exe                  16348 Console                    2      3,396 K
RuntimeBroker.exe            16288 Console                    2      9,236 K
SkypeBridge.exe              16672 Console                    2     22,336 K
TextInputHost.exe            17316 Console                    2     12,560 K
dllhost.exe                   8900 Console                    2      6,124 K
KakaoTalk.exe                16528 Console                    2    116,472 K
msedge.exe                   16804 Console                    2    180,808 K
dllhost.exe                  17128 Console                    2      5,492 K
svchost.exe                   9400 Console                    2      6,012 K
svchost.exe                  11156 Services                   0      6,232 K
ApplicationFrameHost.exe      3572 Console                    2      8,028 K
jucheck.exe                  14308 Console                    2      4,544 K
UserOOBEBroker.exe           12860 Console                    2      7,132 K
msedge.exe                   15580 Console                    2    154,940 K
msedge.exe                   16304 Console                    2     61,860 K
msedge.exe                    9504 Console                    2     11,652 K
chrome.exe                   15596 Console                    2     86,588 K
chrome.exe                    9084 Console                    2      5,744 K
chrome.exe                    9296 Console                    2     67,316 K
chrome.exe                    1744 Console                    2     17,320 K
chrome.exe                    9220 Console                    2      7,936 K
chrome.exe                   10392 Console                    2     48,676 K
chrome.exe                   12024 Console                    2     12,752 K
cmd.exe                       9592 Console                    2      3,928 K
conhost.exe                  15308 Console                    2     19,360 K
svchost.exe                  12504 Services                   0     10,836 K
svchost.exe                  16032 Services                   0      7,472 K
Microsoft.Photos.exe         15568 Console                    2     15,896 K
svchost.exe                  17512 Services                   0      8,492 K
svchost.exe                  18828 Services                   0      6,504 K
RuntimeBroker.exe            18480 Console                    2     14,728 K
VSSVC.exe                     9000 Services                   0      9,968 K
svchost.exe                  17696 Services                   0      9,140 K
WmiPrvSE.exe                 18916 Services                   0      9,452 K
svchost.exe                   6240 Services                   0     12,596 K
backgroundTaskHost.exe       17640 Console                    2     27,112 K
RuntimeBroker.exe            18476 Console                    2     21,824 K
TrustedInstaller.exe         11364 Services                   0      7,856 K
svchost.exe                  10780 Services                   0      7,772 K
svchost.exe                  18036 Services                   0      8,288 K
smartscreen.exe               7556 Console                    2      9,196 K
svchost.exe                   8056 Services                   0      8,248 K
tasklist.exe                  2824 Console                    2      9,528 K
WmiPrvSE.exe                  6368 Services                   0      9,972 K

C:\Users>
C:\Users>wmic process where name="svchost.exe" get processid, parentprocessid, commandline
CommandLine                                                            ParentProcessId  ProcessId
                                                                       892              356
                                                                       892              980
                                                                       892              1068
                                                                       892              1228
                                                                       892              1240
                                                                       892              1288
                                                                       892              1404
                                                                       892              1412
                                                                       892              1476
                                                                       892              1508
                                                                       892              1568
                                                                       892              1596
                                                                       892              1604
                                                                       892              1652
                                                                       892              1704
                                                                       892              1736
                                                                       892              1916
                                                                       892              2000
                                                                       892              2008
                                                                       892              2016
                                                                       892              2112
                                                                       892              2140
                                                                       892              2196
                                                                       892              2256
                                                                       892              2272
                                                                       892              2344
                                                                       892              2464
                                                                       892              2536
                                                                       892              2564
                                                                       892              2576
                                                                       892              2708
                                                                       892              2780
                                                                       892              2864
                                                                       892              2912
                                                                       892              3016
                                                                       892              3024
                                                                       892              2948
                                                                       892              3176
                                                                       892              3212
                                                                       892              3252
                                                                       892              3380
                                                                       892              3476
                                                                       892              3484
                                                                       892              3492
                                                                       892              3600
                                                                       892              3676
                                                                       892              3728
                                                                       892              3740
                                                                       892              3892
                                                                       892              3916
                                                                       892              3996
                                                                       892              4104
                                                                       892              4352
                                                                       892              4480
                                                                       892              5876
                                                                       892              6852
                                                                       892              7044
                                                                       892              7088
                                                                       892              7428
                                                                       892              7632
                                                                       892              7960
                                                                       892              9388
                                                                       892              9544
                                                                       892              1332
                                                                       892              3412
                                                                       892              12040
                                                                       892              12212
                                                                       892              9812
                                                                       892              11304
                                                                       892              7844
                                                                       892              9120
                                                                       892              4620
C:\Windows\system32\svchost.exe -k UnistackSvcGroup -s CDPUserSvc      892              4492
C:\Windows\system32\svchost.exe -k UnistackSvcGroup -s WpnUserService  892              9336
C:\Windows\system32\svchost.exe -k ClipboardSvcGroup -p -s cbdhsvc     892              8216
C:\Windows\system32\svchost.exe -k UnistackSvcGroup                    892              9400
                                                                       892              11156
                                                                       892              12504
                                                                       892              16032
                                                                       892              17512
                                                                       892              18828
                                                                       892              17696
                                                                       892              6240
                                                                       892              10780
                                                                       892              18036


C:\Users>
C:\Users>tasklist

이미지 이름                    PID 세션 이름              세션#  메모리 사용
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0          8 K
services.exe                   892 Services                   0      7,948 K
wininit.exe                    668 Services                   0      4,140 K


wmic process where name="services.exe" get processid, parentprocessid, commandline
C:\Users>wmic process where name="services.exe" get processid, parentprocessid, commandline
CommandLine  ParentProcessId  ProcessId
             668              892

wmic process where name="wininit.exe" get processid, parentprocessid, commandline
C:\Users>wmic process where name="wininit.exe" get processid, parentprocessid, commandline
CommandLine  ParentProcessId  ProcessId
             552              668

C:\Users>

C:\Users>wmic process where name="System Idle Process" get processid, parentprocessid, commandline
CommandLine  ParentProcessId  ProcessId
             0                0


C:\Users>



taskkill /T /PID 21303 -> PID가 21303인 프로세스와 그 자식 프로세스 까지 종료

taskkill /T /PID 0
C:\Windows\system32>taskkill /T /PID 0
오류: PID 56인 프로세스(PID 4인 자식 프로세스)를 종료할 수 없습니다.
원인: 액세스가 거부되었습니다.
오류: PID 112인 프로세스(PID 4인 자식 프로세스)를 종료할 수 없습니다.
원인: 액세스가 거부되었습니다.
오류: PID 396인 프로세스(PID 4인 자식 프로세스)를 종료할 수 없습니다.
원인: 이 프로세스는 중대한 시스템 프로세스입니다. Taskkill에서 이 프로세스를 종료할 수 없습니다.
오류: PID 2148인 프로세스(PID 4인 자식 프로세스)를 종료할 수 없습니다.
원인: 액세스가 거부되었습니다.
오류: PID 4인 프로세스(PID 0인 자식 프로세스)를 종료할 수 없습니다.
원인: 이 프로세스의 자식 프로세스가 하나 이상 실행되고 있습니다.
오류: PID 0인 프로세스(PID 0인 자식 프로세스)를 종료할 수 없습니다.
원인: 이 프로세스의 자식 프로세스가 하나 이상 실행되고 있습니다.

C:\Windows\system32>


# SetWindowLong 함수란 무엇인가,mmmm
# SetWindowLong 함수란 무엇인가,mmmm

 


SetWindowLong 
LONG WINAPI SetWindowLong(
_In_HWND hWnd,
_In_int nIndex,
_In_LONG dwNewLong
);

지정된 윈도우의 속성을 변경합니다. 이 함수로 지정된 기능을 32bit 값으로 메모리에 추가합니다.
이 함수는 SetWindowLongPtr 함수로 대체 되었습니다.32bit, 64bit와 호환됩니다. 사용법은 같습니다.
이 함수는 SetWindowPos함수를 호출할때까지 적용되지 않습니다.

hWnd
변경을 원하는 윈도우의 핸들

nIndex
어느 설정을 변경 할 것인지 정해진 상수로 넣어줍니다.
GWL_STYLE - 새로운 윈도우 스타일을 설정합니다.
GWL_EXSTYLE - 새로운 확장 윈도우 스타일을 설정합니다.
GWL_HINSTANCE - 새 응용 프로그램 인스턴스 핸들을 설정합니다.
GWL_ID - 하위 윈도우의 새 식별자를 설정합니다. 창은 최상위 창이 될수없습니다.
GWL_USERDATA - 창과 관련된 사용자 데이터를 설정합니다. 이 값은 창을 만든 응용프로그램에서 사용하기 위한 값입니다. 초기 값은 0입니다.
GWL_WNDPROC - 윈도우 프로시저의 새주소를 설정합니다. 창이 호출한 스레도와 동일한 프로세스에 속하지 않으면 이 값은 변경 할수 없습니다.


Ex)
public static extern Int32 GetWindowLong(IntPtr hWnd, Int32 Offset);
[DllImport("user32.dll")]
public static extern Int32 SetWindowLong(IntPtr hWnd, Int32 Offset, Int32 newLong);
[DllImport("user32.dll")]

WindowStyle myStyle = (WindowStyle)style;
myStyle = myStyle & ~WindowStyle.WS_SYSMENU;
style = SetWindowLong(childForm.Handle, GWL_STYLE, (int)myStyle);

#함수를 하나만 사용해서, 두개의 함수를 구현하는 방법(오버라이딩의 진화,ㅡ,ㅡㅡ)
#함수를 하나만 사용해서, 두개의 함수를 구현하는 방법(오버라이딩의 진화,ㅡ,ㅡㅡ)
#함수를 하나만 사용해서, 두개의 함수를 구현하는 방법(오버라이딩의 진화,ㅡ,ㅡㅡ)


using System;

class Program
{
    public static void Main(string[] args)
    {
        checkparameters nm = new checkparameters();
nm.run();

checkparametersdown nmm = new checkparametersdown();
nmm.run();
    }
}

//함수를 하나만 사용해서, 두개의 함수를 구현하는 방법
//함수를 하나만 사용해서, 두개의 함수를 구현하는 방법
class checkparameters
{
    void basefrm(string portno, string apmLiteRedismanager, string apmLiteRedismanagers = null )
    {
        Console.WriteLine(portno + "/" + apmLiteRedismanager + "/" + apmLiteRedismanagers);
    }
    public void run()
    {
        basefrm("1010", "1010");
basefrm("1010", "1010", "1010");
    }
}
class checkparametersdown
{
    void basefrm(string portno, string apmLiteRedismanager, string apmLiteRedismanagers)
    {
        Console.WriteLine(portno + "/" + apmLiteRedismanager + "/" + apmLiteRedismanagers);
    }
    void basefrm(string portno, string apmLiteRedismanager)
    {
        Console.WriteLine(portno + "/" + apmLiteRedismanager);
    }
    public void run()
    {
        basefrm("1010", "1010");
basefrm("1010", "1010", "1010");
    }
}

+ Recent posts