task_struct

2009/06/26 12:21 | Posted by 한량도깡
//====== 스케쥴링에 관한 task_struct 정보 =============//   
#define TASK의 모든 상태 비트 마스크
TASK_RUNNING
TASK_INTERRUPTIBLE
TASK_UNINTERRUPTIBLE
TASK_STOPPED
TASK_TRACED

TASK_EXIT_ZOMBIE
TASK_EXIT_DEAD

TASK_NONINTERACTIVE



    int lock_depth;        /* BKL lock depth */
    /*
     * We keep the big kernel semaphore locked,
     * but we clear  ->lock_depth so that schedule() doesnt
     * auto-release the semaphore:
     * 실행 큐를 보호하기 위한 락은 순서대로 잠금을 해야한다
     */

#if defined(CONFIG_SMP) && defined(__ARCH_WANT_UNLOCKED_CTXSW)
    int oncpu;
#endif
    /*
     * SMP 다중 프로세서 동시성에 대한 안전
     * 다중 프로세서 일때 필요한 옵션
     */

    int prio, static_prio;
    /*
     * nice 우선순위 -20 ~ 19 (default 0)
     * static_prio 정적 우선순위
     * prio 동적우선순위
     * effective_prio(task_t *p) 동적우선순위 계산
     * prio = p->static_prio - bonus;
     */
   

    struct list_head run_list;
    /*
     * list.h => list_head { *pre,*next }
     * 커널이 제공하는 리스트 자료구조 사용하여
     * run_list 를 만듬
     * 실행가능한 task ???
     * 그럼 이게 runqueue ???
     * 이건 task의 list run 이란 의미는 current와 비슷한의미
     * list_entry(ptr,type,member)
     */


    prio_array_t *array;
    /*
     *  struct prio_array {
     *  unsigned int nr_active;
     *      ready_task, wait_task이냐, 우선순위 배열은 2개가 존재한다.   
     *     
     *  unsigned long bitmap[BITMAP_SIZE];
     *      현재실행중인 모든 task의 우선 순위 비트 맵
     *
           *  struct list_head queue[MAX_PRIO]; }
     *      각각의 우선순위들은 하나의 큐를 가지고있다
     *      (해쉬와 같은 포인터 배열을 나타낸다)
     *
     *  list_entry(array->queue[sched_find_bit(array->bitmap)])
     *  를 이용하면 한번에 우선순위가 가장높은 task를 가져올수있다
     *  O(1)
     */

    //===== 런 큐는 우리가 생각하는 하나의 리스트가 아니라
    //실행가능한 task중 우선순위 큐의 제일 앞의 task들을 말한다.
    //struct runqueue *rq; 는 여기서 선택된 task의 포인터
    //이다 : 실행중인 task
    //(cpu를 점유하고 있는 task(current)를 가르킨다.)


    unsigned short ioprio;
    /* 실시간 우선순위를 말하는듯???
     * 0~99 까지 (정적)
     */

    //=== 동적인 우선순위 부여를 위해 time_slice 계산
    unsigned long sleep_avg;
    /*
     * 휴면시간 실행중일때마다 감소
     * 0 ~ MAX_SLEEP_AVG (default 10ms)
     */


    unsigned long long timestamp, last_ran;
    /* cpu tick를 기록(전원이 들어오는순간 계속 증가하는 시간)
     * 스케쥴링 들어올때 cpu tick,timestamp
     * 스케쥴링 나갈때 cpu tick, last_ran
     * task를 스케쥴링 할때 timestamp 와
     * task에 기록되어있는 마지막 스케쥴링되었을때의 last_ran
     * timestamp - last_ran = 실행시간
     */



    unsigned long long sched_time; /* sched_clock time spent running */

    /*
     * 실행시간을 기록한다.
     */

    int activated;
    /*
     * 이 task의 활성/비활성 상태를 나타낸다
     * 활성 상태가되면 실행가능한 대기상태로 간다.
     * 위의 state는 runable,unrunable,zombi를 나타난다
     */


    unsigned long policy;
    /*
     * 우선순위 정책으로
     *
     * SCHED_FIFO(실시간),실시간우선순위
     *     - 단순한 선입출 알고리즘, time_slice사용하지않음
     *         
     * SCHED_RR(실시간,정해진 시간),실시간 우선순위
     *     - FIFO와 같지만 time_slice를 사용
     *
     * SCHED_NORMAL(비 실시간),nice
     *     -
     *
     * SCHED_BATCH(비 실시간),nice
     *     -
     *
     * 나누어지고 실제 코드에서 switch case로 구현
     */


    cpumask_t cpus_allowed;
    /*
     * SMP 다중 cpu에 대한 task의 소속
     * CPU_MASK_NONE 이tkask 는 모든 프로세서에서 실행 가능하다.
     * 변경하여 특정 프로세서그룹에서만 실행할수 있게 할수도있다.
     * task의 상성,
     */


    unsigned int time_slice, first_time_slice;
    /*
     * 동적 time_slice 정적 first_time_slice
     * 우선순위에따른 비례확장한 시간
     * task_timeslice() 함수사용
     */



#ifdef CONFIG_SCHEDSTATS
    struct sched_info sched_info;
#endif

/*
 * schedule()
 * task switch, context switch
 *
 * /

/**
 * list_entry - get the struct for this entry
 * @ptr:    the &struct list_head pointer.
 * @type:    the type of the struct this is embedded in.
 * @member:    the name of the list_struct within the struct.
 */
#define list_entry(ptr, type, member) \
    container_of(ptr, type, member)

  
/*
 *  time_slice 0이되면 활성/비활성 배열에 삽입/삭제
if (!--p->time_slice) {
        dequeue_task(p, rq->active);
        set_tsk_need_resched(p);
        p->prio = effective_prio(p);
        p->time_slice = task_timeslice(p);
        p->first_time_slice = 0;

        if (!rq->expired_timestamp)
            rq->expired_timestamp = jiffies;
        if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) {
            enqueue_task(p, rq->expired);
            if (p->static_prio < rq->best_expired_prio)
                rq->best_expired_prio = p->static_prio;
        } else
            enqueue_task(p, rq->active);
    } else {
        if (TASK_INTERACTIVE(p) && !((task_timeslice(p) -
            p->time_slice) % TIMESLICE_GRANULARITY(p)) &&
            (p->time_slice >= TIMESLICE_GRANULARITY(p)) &&
            (p->array == rq->active)) {

            requeue_task(p, rq->active);
            set_tsk_need_resched(p);
        }
    }

*/

/* wait_queue
 * struct __wait_queue {
 *     unsigned int flags;
 *     void *private;
 *     wait_queue_func_t func;
 *     struct list_head task_list;
 *     }
 */
이올린에 북마크하기(0) 이올린에 추천하기(0)

Makefile 만들어 컴파일해보기

2009/06/25 14:35 | Posted by 한량도깡
리눅스 커널에 대해서 공부하고 있는데, 너무 잠이 온다... 그나마 실습문제를 만나서, 하나씩 풀어보는중
Make유틸을 이용해서 컴파일 해보자.
이미 test.c파일을 하나 만들어 두고 이것을 컴파일 해볼것이다.

[localhost@root#]vim Makefile
//오브젝트 파일 생성
test:test.o
gcc -o test test.o
//오브젝트 파일 컴파일
test.o:test.c
        gcc -c test.c
:wq

요렇게 Makefile을 하나 만들어 준다.

[localhost@root#] make test
정확하게 실행이 된다.

저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)

드디어 방학!

2009/06/21 10:53 | Posted by 한량도깡

기말고사가 끝나고, 이제 방학이네요~ 이제 본격적인 공부를 시작할때!
이올린에 북마크하기(0) 이올린에 추천하기(0)

후킹관련 이야기...

2009/06/06 22:06 | Posted by 한량도깡
후킹을 공부하면,,, 한가지 몰랐던 사실을 한자 쓸려고 한다...
이것은 기본적으로 다 아는 사람들이 있을수도 있으며, 뭐 또한 나만의 실수를 한것일지 모르지만,, 아무튼.. 정리는 해놔야 하니까. ㅎㅎ 오늘 동아리에서 토요일마다, 자신이 공부한것을 발표는 시간을 갖는데, 아직까진 그렇게 정착됐다고는 보기 어렵지만,, 그래도 그냥 시간을 보내는 것 보다는 괜찮은것 같다.. :) 
 
 내가 하고자 하는 이야기는, 
  GetProcAddress()함수를 이용해서 내가 훅할 프로시저의 함수포인터를 얻어와야 하는데, 여기서 첫번째 인자는 인스턴스의 핸들이 들어가게 되고, 두번재 인자에는 프로시저명을 써주면 되는데,,, 여기서 반환되는 주소가 계속 널이 되는것이다. ㅜㅜa 그걸 가지고 거의 몇일동안을 구글링했다는.. ㅜㅜ

그래서 얻어진 답은 네임맹글링의 문제였다..
이게.. API하고 코딩이 되어 있었지만, DLL을 만들때.. CPP로 작성했기 때문에.. 컴파일이 될때 c++컴파일이 되어 버렸기 때문에,, 네임맹글링 때문에 함수명이 바껴버린것이다..
하지만, extern "C' 라고 선언을 했었다면,, 그렇게 문제 되었을까.. 라는 생각을 해봤지만...
아무튼.. 함수명의 변경으로 인해서.. 함수명을 제대로 찾질 못한것이다.. ㅡㅜ

네임맹글링은 c++에서 존재하는것인데.. 이것은 c++에서 함수오버로딩이 가능해졌기 때문에,, 만들어진것이라고 한다.. 이는 동일한 함수명을 여러개만들어서 호출할 수 있기때문에.. 프로그래머는 알고 있지만.. 컴퓨터는 알길이 없기 때문에.. 이러한 문제를 해결하기 위해서.. 만들어진 것이다.

여튼간에.. 이 문제를 해결하고 난다음 포인터가 정확하게 넘어왔다...
이 얼마나 기쁜일인가.. 우훼훼훼훼~

이젠... smtp프로토콜을 이용해서... 메일을 보내는 방법을 찾아야 할 때이다..
이건 어떻게 해야할지... 아휴~~~~~~~a
어디에 자문을 구해야 할지... 시험도 이제 한주밖에 남지 않아서.. 시험공부도 해야되고...
학교 시험은 너무 싫다!
저작자 표시 비영리 동일 조건 변경 허락
이올린에 북마크하기(0) 이올린에 추천하기(0)
TAG API, DLL, 후킹

간단하게 정렬알고리즘 정리

2009/05/25 08:45 | Posted by 한량도깡

정렬알고리즘

 

선택정렬 (버블보다 빠름)

주어진 데이터에서 첫 번째 데이터와 가장 가작장은 데이터를 만나면 값을 교환하는 방식

3

6

8

1

7

 

 

 

 

1

6

8

3

7

 

 

 

 

1

3

8

6

7

 

 

 

 

1

3

6

8

7

 

 

 

 

1

3

6

7

8

1. 첫 번째 데이터와 가장 작은데이터를 만나면 교환

2. 두 번째 데이터와 가장 작은 데이터를 만나면 교환..

3. 반복

 

퀵정렬(가장우수)

기준값(Pivot)을 두고, 맨 왼쪽부터 오른쪽으로 가면서 큰값, 맨오른쪽에서 왼쪽으로 오면서 작은값 교환방식

단, 서로 교차되면, 오른쪽에서 오는 값과 기준값과 교환

26

5

37

1

61

11

59

15

48

19

 

 

 

 

 

 

 

 

 

26

5

19

1

61

11

59

15

48

37

 

 

 

 

 

 

 

 

 

26

5

19

1

15

11

59

61

48

37

 

 

 

 

 

 

 

 

 

11

5

19

1

15

26

59

61

48

37

 

 

 

 

 

 

 

 

 

11

5

1

19

15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

5

11

19

15

 

 

 

 

 

 

 

 

15

19

 

 

 

 

 

1

5

11

15

19

 

59

61

48

37

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

57

37

48

61

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

48

37

57

61

1

5

11

15

19

26

48

37

57

61

  ⑷번이 끝나면, 26을 기준으로 왼쪽에는 기준보다 작은값들, 오른쪽에는 기준보다 큰값들이 정렬되어 있다.

이는 다시한번, 나눠진 양쪽에서 다시한번 정렬을 시켜준다.(왼쪽정렬후, 오른쪽정렬) 정렬순은 처음정렬방식과 동일하다.

 

버블소트(가장 대중적인 방법이다)

첫 번째 값보다 n+1값이 더 작으면 서로 교환, 교환을 했다면, 그 다음 값과 그 다음값의 +1한 값과 또다시 비교를 반복한다.

끝까지 한번 정렬되면 1세트가 끝난 것이다.

4

7

3

1

5

8

2

6

 

 

 

 

 

 

 

 

 

4

3

7

1

5

8

2

6

 

 

 

 

 

 

 

 

 

4

3

1

7

5

8

2

6

 

 

 

 

 

 

 

 

 

4

3

1

5

7

8

2

6

 

 

 

 

 

 

 

 

 

4

3

1

5

7

2

8

6

 

 

 

 

 

 

 

 

 

4

3

1

5

7

2

6

8

 

 

 

 

 

 

 

 

 

3

4

1

5

7

2

6

8

 

 

 

 

 

 

 

 

 

3

1

4

5

7

2

6

8

1세트

 

 

 

 

 

 

 

 

3

1

4

5

2

7

6

8

 

 

 

 

 

 

 

 

 

3

1

4

5

2

6

7

8

2세트

 

 

 

 

 

 

 

 

1

3

4

5

2

6

7

8

 

 

 

 

 

 

 

 

 

1

3

4

2

5

6

7

8

3세트

 

 

 

 

 

 

 

 

1

3

2

4

5

6

7

8

4세트

 

 

 

 

 

 

 

 

1

2

3

4

5

6

7

8

5세트

 힙정렬(이진트리를 이용) - 힙공간에 데이터를, MIN Tree로 만든다음 root만 빼와서 정렬하는 방식

{5, 1, 15, 11, 19}

 그림 생략...

5

19

15

11

11

15

19

15

19

19

⑴ root노드를 삭제하고 자식이 없는 노드중 제일 큰 노드를 하나 root로 올린다.

⑵ 다시 자식 노드들과 비교해서 제일 작은 값과 root과 교환하고 삭제한다.

이로써, 정열이 끝나게 된다.

 

합병정렬 (병합정렬)

병합하고자 하는 정렬된 데이터 두 세트를 가져다가 새로운 배열에 저장하는 방식

 

1

3

4

7

 

 

 

 

 

1,

 

2

5

6

8

 

 

 

 

 

 

 

1

3

4

7

 

 

 

 

 

1,2

 

2

5

6

8

 

 

 

 

 

 

 

1

3

4

7

 

 

 

 

 

1,2,3

 

2

5

6

8

 

 

 

 

 

 

 

1

3

4

7

 

 

 

 

 

1,2,3,4

 

2

5

6

8

 

 

 

 

 

 

 

1

3

4

7

 

 

 

 

 

1,2,3,4,5

 

2

5

6

8

 

 

 

 

 

 

 

1

3

4

7

 

 

 

 

 

1,2,3,4,5,6

 

2

5

6

8

 

 

 

 

 

 

 

1

3

4

7

 

 

 

 

 

1,2,3,4,5,6,7,8

 

2

5

6

8

 

 

 

 

 

 

이것말고도 정렬되지 않은 데이터에 대한 병합정렬 방식도 있다.

⑴ a,b 배열의 첫 인덱스를 가리키고, a,b배열의 값중에 더 빠른 값를 새로운 배열에 먼저 넣는다.

⑵ 한칸 이동후 다시 한칸이동한 값과 이동하지 못한 값을 다시 비교해 낮은 값을 배열에 넣는다.

⑶ 2번 반복

...늦은저녁에 한번 정리
저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)

일반 웹어플리케이션과 Ajax의 기술적 차이

2009/05/20 16:30 | Posted by 한량도깡

  일반 웹어플리케이션이라고 하면, html을 많이 떠올릴 것이다. 하도 인터넷에서 Ajax라고 많이들 떠들고 다니고, 이야기가 나온지도 꽤 되었지만, 전반적인 정리된 내용이 내 머릿속으로 들어오진 않았다.
  Ajax(Asynchronous JavaScript and XML) 대화식 웹 어플리케션을 제작하기 위해 만들어진 웹 개발 기법이다. 
 - HTML, CSS , JASON, DOM...

  이야기 하고자 하는것은 이것이 아니다. 기술적으로 어떤 차이가 있냐는 것이다. 타이틀에 써놓았다 싶이.. 웹어플리케이션은 일반적으로 브라우저에서 폼양식을 작성하고, sumit(제출) 하게 되고, 이 데이터를 받은 서버쪽에서 가공 처리하고 클라이언트에게로 다시 전송해서 화면에 뿌려 주게 된다.
  하지만, 여기서의 문제점은 작성한 양식에 채운 내용들과 다시 전송해서 받는 데이터 가운데 중복되는 데이터가 많이 포함되어 있어, 되돌려받는 양식에 대해 많은 대역폭을 낭비하게 된다. 이는 금전적 손식을 일으킬 수 있고, 상대방과의 대화 서비스를 어렵게 할 수 있는 것이다.
  이제 Ajax의 출현배경은 대충 알 수 있을 것이다. Ajax은 필요한 데이터만 웹서버에 요청해 클라이언트에서 처리할 수 있다. 이에 SOAP, XML기반의 웹 서비스 프로토콜을 사용한다. 웹 서버의 응답을 처리하기 위해서는 자바스크립트를 쓴다. 이렇게 처리함으로써, 기존의 서버에서 처리하던 방식을 클라이언트에서 처리할 수 있다는 점이 대역폭의 낭비를 줄이고, 대화형 서비스에 금전적인 손실을 줄일 수 있다....
하지만, 한가지 생각해 본다면... 보안으로써의 상당한 위험을 가져다 줄 수 있다.
 서버에서 전적으로 처리하던 방식에서 클라이언트에서 처리를 할 수 있기때문에, 사용자의 임의적인 변경으로 인해, 보안상 위험을 초래 할 수 있다.

저작자 표시
이올린에 북마크하기(0) 이올린에 추천하기(0)
TAG Ajax
이전 1 2 3 4 5 ... 18 다음