I'm on your side, when times get rough.

2011-02-25

[Win32 / C] CPU Usage Percentage of Process

Filed under: Programming — Peter_KIM @ 02:20

Windows 시스템에서 실행되고 있고, 특정 프로그램의 CPU 사용률을 측정합니다.

일정 시간 간격으로 GetTickCount64, GetProcessTimes 함수를 각각 두 번 실행하여, 획득한 커널 시간, 사용자 시간, Tick Count 값을 이용하여, 아래의 코드와 같은 연산을 수행하면 프로그램이 차지하는 CPU 사용 비율을 구할 수 있습니다.

특히, Multi-Core Processor, Hyper-Threading 기술이 적용된 컴퓨터 환경에서는 논리적인 core 개수를 연산에 적용해야 합니다.

__int32 RetrieveCpuUsage(HANDLE hProcess, INT nProcessorCount)

{

        __int64  nCreationTime = 0;

        __int64  nExitTime = 0;

        __int64  nKernelTimeOld = 0, nKernelTimeNew = 0;

        __int64  nUserTimeOld = 0, nUserTimeNew = 0;

 

        __int64  nTickCountOld = 0, nTickCountNew = 0;

        __int32  nCpuUsagePercent = 0;

 

        nTickCountOld = GetTickCount64();

        if (!GetProcessTimes(hProcess, (LPFILETIME)&nCreationTime, (LPFILETIME)&nExitTime, (LPFILETIME)&nKernelTimeOld, (LPFILETIME)&nUserTimeOld))

               return -1;

 

        Sleep(5000);

 

        nTickCountNew = GetTickCount64();

        if (!GetProcessTimes(hProcess,  (LPFILETIME)&nCreationTime, (LPFILETIME)&nExitTime, (LPFILETIME)&nKernelTimeNew, (LPFILETIME)&nUserTimeNew))

               return -1;

 

        nCpuUsagePercent = (__int32)((nKernelTimeNew – nKernelTimeOld + nUserTimeNew – nUserTimeOld) / (100 * (nProcessorCount * (nTickCountNew – nTickCountOld))));

 

        return nCpuUsagePercent;

}

 

전체 소스코드는 아래의 주소에서 얻을 수 있습니다.

https://skydrive.live.com/embedicon.aspx/.Public/CpuUsage.7z?cid=1bbcdfedee1c617e

2011-02-22

[Virtual PC] UBUNTU 설치

Filed under: Programming — Peter_KIM @ 04:22

Vurtual PC…Windows7 운영체제에서 더욱 사용하기 불편하게 된 듯하다. 예전에 지원하던 기능들도 보안과 같은 여러 가지 이유에서 지원되지 않고, Micrisoft 사에 흡수되면서 불편한 점들이 많아진 것은 사실이다. 역시, WMWARE 제품들이 사용과 기능 면에서 독보적인 듯하다. FreeWare(Open Source) 제품을 사용해야 하는 경우에는 오라클사에서 제공하는 “VirtualBox”를 사용하는 게 나을 듯하다.

“Virtual PC”에 ubuntu 운영 체제를 설치하려면, 아래의 과정이 필요하다.

1 부팅을 시작하면서, ESC 키를 눌러서, 아래의 화면이 나타나게 한다. 사용하려는 언어를 설정한다.

clip_image002.jpg

2. F6 키를 누르면 부트 옵션이 나타난다. 이때 ESC, 오른쪽 화살표 키를 차례로 누르면, 부트 옵션 줄에 커서가 나타난다.

clip_image003.png

3. 부트 옵션의 “quiet splash” 뒤에, “vga=791”을 추가 입력한다. (“quiet splash” 옵션은 제거 할 수도 있다.) 입력이 완료되면 Enter 키를 눌러서 설치하지 않고, 경험하기를 수행한다. (주의: 부트 옵션을 수정하고, 작업을 변경하면, 수정한 옵션이 무시되므로, 부트 옵션을 수정하기 전에, 작업 사항을 먼저 결정해야 한다.)

clip_image005

4. “우분투 설치” 작업을 시도한 경우, 위의 화면과 같이 “ubuntu@ubuntu:~$” 프롬프트를 만나게 된다. 다음 화면이 나타날 때까지, 기다린다. 심심하면, Enter 키를 한번 눌러줘도 좋다.

clip_image007.jpg

5. 언어를 선택하고, “앞으로” 버튼을 눌러서, 설치를 진행한다. 여러 가지 시스템 관련 설정을 처리한다.

clip_image009.jpg

6. 컴퓨터 이름, 사용자 이름, 비밀 번호를 설정하고 “앞으로” 버튼을 눌러서 계속 진행하여, 설치를 완료한다.

2011-02-16

[C#] Win32 BOOL

Filed under: Programming — Peter_KIM @ 02:37

/// <summary>

/// In Win32, The BOOL is a 32-bit signed integer. Represent the BOOL

/// </summary>

public struct BOOL

{

    /// <summary>

    /// The possible BOOL values: FALSE, 0

    /// </summary>

    public static readonly BOOL FALSE = new BOOL(0);

 

    /// <summary>

    /// The possible BOOL values: TRUE, 1

    /// </summary>

    public static readonly BOOL TRUE = new BOOL(1);

 

    /// <summary>

    /// Private field that stores 0x00, 0x01 for FALSE, TRUE:

    /// </summary>

    int value;

 

    /// <summary>

    /// Private constructor. The value parameter must be 0, or 1:

    /// </summary>

    /// <param name="value">The value parameter must be 0, or 1</param>

    private BOOL(int value)

    {

        this.value = value;

    }

 

    /// <summary>

    /// Implicit conversion from bool to BOOL.

    /// Maps true to TRUE and false to FALSE:

    /// </summary>

    /// <param name="x"></param>

    /// <returns></returns>

    public static implicit operator BOOL(bool x)

    {

        return x ? TRUE : FALSE;

    }

 

    /// <summary>

    /// Explicit conversion from BOOL to bool.

    /// Returns TRUE or FALSE:

    /// </summary>

    /// <param name="x"></param>

    /// <returns></returns>

    public static explicit operator bool(BOOL x)

    {

        return x.value > 0;

    }

 

    /// <summary>

    /// Equality operator.

    /// Returns TRUE or FALSE:

    /// </summary>

    /// <param name="x"></param>

    /// <param name="y"></param>

    /// <returns></returns>

    public static BOOL operator ==(BOOL x, BOOL y)

    {

        return x.value == y.value ? TRUE : FALSE;

    }

 

    /// <summary>

    /// Inequality operator.

    /// Returns TRUE or FALSE:

    /// </summary>

    /// <param name="x"></param>

    /// <param name="y"></param>

    /// <returns></returns>

    public static BOOL operator !=(BOOL x, BOOL y)

    {

        return x.value != y.value ? TRUE : FALSE;

    }

 

    /// <summary>

    /// Logical negation operator.

    /// Returns TRUE if the operand is FALSE,

    /// or FALSE if the operand is TRUE:

    /// </summary>

    /// <param name="x"></param>

    /// <returns></returns>

    public static BOOL operator !(BOOL x)

    {

        return new BOOL((x.value + 1) % 2);

    }

 

    /// <summary>

    /// Logical AND operator.

    /// Returns FALSE if either operand is FALSE, otherwise TRUE:

    /// </summary>

    /// <param name="x"></param>

    /// <param name="y"></param>

    /// <returns></returns>

    public static BOOL operator &(BOOL x, BOOL y)

    {

        return new BOOL(x.value < y.value ? x.value : y.value);

    }

 

    /// <summary>

    /// Logical OR operator.

    /// Returns TRUE if either operand is TRUE, otherwise FALSE:

    /// </summary>

    /// <param name="x"></param>

    /// <param name="y"></param>

    /// <returns></returns>

    public static BOOL operator |(BOOL x, BOOL y)

    {

        return new BOOL(x.value > y.value ? x.value : y.value);

    }

 

    /// <summary>

    /// Definitely true operator.

    /// Returns true if the operand is TRUE, false otherwise:

    /// </summary>

    /// <param name="x"></param>

    /// <returns></returns>

    public static bool operator true(BOOL x)

    {

        return x.value > 0;

    }

 

    /// <summary>

    /// Definitely false operator.

    /// Returns true if the operand is FALSE, false otherwise:

    /// </summary>

    /// <param name="x"></param>

    /// <returns></returns>

    public static bool operator false(BOOL x)

    {

        return x.value < 0;

    }

 

    /// <summary>

    /// Overload the conversion from BOOL to string:

    /// </summary>

    /// <param name="x"></param>

    /// <returns></returns>

    public static implicit operator string(BOOL x)

    {

        return x.value > 0 ? "TRUE" : "FALSE";

    }

 

    /// <summary>

    /// Override the Object.Equals(object o) method:

    /// </summary>

    /// <param name="o"></param>

    /// <returns></returns>

    public override bool Equals(object o)

    {

        try

        {

            return (bool)(this == (BOOL)o);

        }

        catch

        {

            return false;

        }

    }

 

    /// <summary>

    /// Override the Object.GetHashCode() method:

    /// </summary>

    /// <returns></returns>

    public override int GetHashCode()

    {

        return value;

    }

 

    /// <summary>

    /// Override the ToString method to convert BOOL to a string:

    /// </summary>

    /// <returns></returns>

    public override string ToString()

    {

        switch (value)

        {

            case 0:

                return "FALSE";

            case 1:

                return "TRUE";

            default:

                throw new InvalidOperationException();

        }

    }

}

2011-02-14

[C#] Multithreaded Singleton Queue

Filed under: Programming — Peter_KIM @ 06:39

using System;

using System.Collections.Concurrent;

using System.Collections.Generic;

using System.Threading;

 

namespace ConsoleApplication1

{

    public class MultiThreadedSingletonConcurrentQueue<T> : ConcurrentQueue<T>

    {

        private static volatile MultiThreadedSingletonConcurrentQueue<T> instance = null;

        private static object oSyncRoot = new Object();

        private MultiThreadedSingletonConcurrentQueue() { }

 

        public static MultiThreadedSingletonConcurrentQueue<T> Instance

        {

            get

            {

                if (instance == null)

                {

                    lock (oSyncRoot)

                    {

                        if (instance == null)

                        {

                            instance = new MultiThreadedSingletonConcurrentQueue<T>();

                        }

                    }

                }

                return instance;

            }

        }

    }

 

    public class MultiThreadedSingletonQueue<T> : Queue<T>

    {

        private static volatile MultiThreadedSingletonQueue<T> instance = null;

        private static object oSyncRoot = new Object();

        private MultiThreadedSingletonQueue() { }

 

        public static MultiThreadedSingletonQueue<T> Instance

        {

            get

            {

                if (instance == null)

                {

                    lock (oSyncRoot)

                    {

                        if (instance == null)

                        {

                            instance = new MultiThreadedSingletonQueue<T>();

                        }

                    }

                }

                return instance;

            }

        }

 

        public Int32 ItemCount

        {

            get

            {

                lock (((System.Collections.ICollection)instance).SyncRoot)

                {

                    return instance.Count;

                }

            }

        }

 

        public void EnqueueItem(T item)

        {

            lock (((System.Collections.ICollection)instance).SyncRoot)

            {

                instance.Enqueue(item);

            }

        }

 

        public T DequeueItem()

        {

            T t = default(T);

 

            lock (((System.Collections.ICollection)this).SyncRoot)

            {

                if (instance.Count > 0)

                    t = instance.Dequeue();

            }

            return t;

        }

    }

 

    // Test code

    class Program

    {

        static void Main(string[] args)

        {

            Thread oThread1 = new Thread(QueueTestProc);

            oThread1.IsBackground = true;

            oThread1.Priority = ThreadPriority.Highest;

            oThread1.SetApartmentState(ApartmentState.STA);

            oThread1.Start();

 

            Thread oThread2 = new Thread(ConcurrentQueueTestProc);

            oThread2.IsBackground = true;

            oThread2.Priority = ThreadPriority.Highest;

            oThread2.SetApartmentState(ApartmentState.STA);

            oThread2.Start();

 

            Console.ReadLine();

        }

 

        static void QueueTestProc()

        {

            // Enqueue

            Thread oThread = new Thread(EnqueueProc1);

            oThread.IsBackground = true;

            oThread.Priority = ThreadPriority.Highest;

            oThread.SetApartmentState(ApartmentState.STA);

            oThread.Start();

 

            // Sleep

            Thread.Sleep(10);

 

            int i = 0;

 

            // Dequeue

            while (MultiThreadedSingletonQueue<Int32>.Instance.ItemCount > 0)

            {

                i = MultiThreadedSingletonQueue<Int32>.Instance.DequeueItem();

            }

            Console.WriteLine("\t\t\tLast Queue Dequeue : {0}", i);

 

            oThread.Join();

        }

 

        static void EnqueueProc1()

        {

            int i = 0;

            for (; i < 10000; ++i)

            {

                MultiThreadedSingletonQueue<Int32>.Instance.EnqueueItem(i);

            }

            Console.WriteLine("Last Queue Enqueue : {0}", i - 1);

        }

 

        static void ConcurrentQueueTestProc()

        {

            // Enqueue

            Thread oThread = new Thread(EnqueueProc2);

            oThread.IsBackground = true;

            oThread.Priority = ThreadPriority.Highest;

            oThread.SetApartmentState(ApartmentState.STA);

            oThread.Start();

 

            // Sleep

            Thread.Sleep(10);

 

            Int32 i = 0;

            // Dequeue

            while (MultiThreadedSingletonConcurrentQueue<Int32>.Instance.Count > 0)

            {

                MultiThreadedSingletonConcurrentQueue<Int32>.Instance.TryDequeue(out i);

            }

            Console.WriteLine("\t\t\tLast ConcurrentQueue Dequeue : {0}", i);

 

            oThread.Join();

        }

 

        static void EnqueueProc2()

        {

            int i = 0;

 

            for (; i < 10000; ++i)

            {

                MultiThreadedSingletonConcurrentQueue<Int32>.Instance.Enqueue(i);

            }

            Console.WriteLine("Last ConcurrentQueue Enqueue : {0}", i - 1);

        }

    }

}

 

Create a free website or blog at WordPress.com.