패스트캠퍼스

[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 42회차 미션

돌맹이시터 2020. 11. 29. 23:27

 

 

환급미션 42일째...

 

 

운영체제 - 프로세스와 스케쥴러의 이해 - 14. 컨텍스트 스위칭 원리

소프트웨어 베이직 - 자료구조와 알고리즘 - 07. 정렬 - 선택 정렬과 삽입 정렬

 

 

 

 

운영체제 - 프로세스와 스케쥴러의 이해 - 14. 컨텍스트 스위칭 원리

 

 

 

- 프로세스, 컨텍스트 스위칭

 

•PC(program counter) + SP(stack pointer)

•Stack, HEAP, DATA(BSS,DATA), TEXT(code)

 

 

우선, 전역변수 global_data1은 초기화되지 않았으므로 BSS에,

global_data2는 초기화되었으므로 DATA 영역에 저장된다.

 

프로그램을 실행하면

stack영역에 return address값이 먼저 반환되고

PC = 0000h (program counter)

SP = F000h (stack pointer)

값이 들어가면서 시작된다.

 

여기까지는 이전 강의 (프로세스 구조)에서 다루었던 내용과 동일한데,

컨텍스트 스위칭에 대해 다룰 것이다.

 

위에 그림에 나와있는 프로세스를 프로세스 A라고 가정하고,

프로세스A가 실행되려면 스케쥴러에 의해 프로세스가 running state로 바뀌면서 cpu에서 실행되게 된다.

실행 도중 어느 순간 스케쥴러에 의해 프로세스 B가 실행되도록 바꾸는데,

이러한 과정을 '컨텍스트 스위칭'이라고 한다.

 

이 때 중요한 것이 바로 PC, SP이다. 

이외에도 여러가지 레지스터가 관여하지만 모두 다루기엔 너무 복잡하기도 하고

관여하는 레지스터 중 가장 중요한 것이 PC, SP이다.

 

 

가령, 위의 프로세스에서

int *data까지 실행이 된 상황에서 다른 프로세스를 실행시키려고 할 때

PC = 0002h

SP = EFFEh

값이 저장되어 있을텐데,

이 값을

PCB (process control block) 라고 하는 별도의 메모리 공간에 저장하게 된다. - 운영체제가 관리

(process context block 이라고 하기도 한다.)

 

 

 

PCB에 값을 각각 저장한 다음

process B가 실행된 상황을 나타낸다.

data = (int*) malloc(sizeof(int));

까지 실행된 상태를 나타낸다.

 

 

 

*data = 1;

까지 실행된 상태를 나타낸다.

 

PC = 0004h로 바뀌게 되고,

 

여기까지 실행된 상태에서 다시 process A를 실행하려 한다.

(process B->ready state / process A->running state)

 

 

1. process B의 현재 PC, SP 값을 PCB에 저장

2. process A의 PCB 확인 (아까 멈추었던 상태의 PC, SP 확인)

3. 레지스터에 해당 PCB에 들어있던 PC, SP값을 넣어준다.

4. 아까 중단된 시점부터 프로그램이 이어서 실행된다.

 

 

 

* PCB (process control block / process context block)

 

•process ID

•register 값 - PC,SP 등

•process state 관리 - scheduling information (process의 현재 상태)

•memory information (메모리 사이즈 limit) - 전체 프로세스의 사이즈가 어떻게 되는지

...

=> PCB : 프로세스의 상태를 캡쳐/구조화해서 저장

 

리눅스에서의 예시

 

 

 

 

 

소프트웨어 베이직 - 자료구조와 알고리즘 - 07. 정렬 - 선택 정렬과 삽입 정렬

 

 

- 선택 정렬

 

가장 작은 것을 선택해서 앞으로 보내는 정렬 기법

가장 작은 것을 선택하는 데에 N번, 앞으로 보내는 데에 N번의 연산으로

0(N^2)의 시간 복잡도를 갖는다.

 

초기값 가정 
정렬의 결과

 

* 배열의 선언

 

------------

#include <stdio.h>

#include <limits.h>

#define SIZE 1000

 

int a[SIZE];

 

void swap(int *a, int*b)

{

    int temp=*a;

    *a=*b;

    *b=temp;

}

------------

강의에서는 swap 자료형을 int형으로 선언했지만

return 문제 때문에 void형을 사용했다.

 

 

* 선택 정렬 수행

 

 

------------

int main(void)

{

    int n, min, index;

    //n : 원소가 몇 개인지 입력받을거임

    //min : 한 번 검색할 때마다 발견되는 가장 작은 값

    printf("원소의 갯수 입력\n");

    scanf("%d", &n);

    

    for (int i=0; i<n; i++)

    {

        printf("원소%d : \n", i+1);

        scanf("%d", &a[i]);

    }

    for (int i=0; i<n; i++)

    {

        min = INT_MAX;

        //가장 작은 값을 입력받기 위해서는 min 변수에 가능한 가장 큰 수를 넣어준다.

        for (int j=i; j<n; j++)

        {

            if (min > a[j])

            {

                min = a[j];

                index = j; //가장 작은 값이 존재하는 위치를 인덱스

            }

        }

        swap(&a[i], &a[index]);

    }

    printf("정렬 결과 : ");

    for (int i=0; i<n; i++)

        printf("%d ", a[i]);

        

    return 0;

}

------------

 

 

출력결과는 아래와 같다.

일부 코드를 수정했으며 

4,2,10,1,7 순으로 입력한 뒤에 정렬시켰을 때의 결과이다.

 

 

 

 

 

 

 

- 삽입 정렬

 

각 숫자를 적절한 위치에 삽입하는 정렬 기법

들어갈 위치를 선택하는 데에 N번, 선택하는 횟수로 N번이므로

0(N^2)의 시간 복잡도를 갖는다.

(선택정렬과 유사하지만 조금 더 빠르게 작동한다.)

 

초기값 가정

정렬이 위와 같은 방식으로 이루어지고..

 

정렬이 끝난 결과

 

 

 

 

* 배열 선언

 

 

-----------------------

#include <stdio.h>

#define SIZE 1000

 

int a[SIZE];

 

void swap(int *a, int *b)

{

    int temp = *a;

    *a = *b;

    *b = temp;

}

-----------------------

 

선택정렬에서와 마찬가지로 배열이 선언되었는데,

강의에선 swap 함수를 int 자료형으로 선언했지만

return 반환 문제로 void를 사용했을 때 실행가능했다.

 

 

 

* 삽입정렬 수행하기

 

----------------------

int main(void)

{

    int n;

    printf("원소의 갯수 입력 : \n");

    scanf("%d", &n);

    

    for (int i=0; i<n; i++)

    {

        printf("%d번째 원소 : ", i);

        scanf("%d", &a[i]);

        printf("\n");

    }

    for (int i=0; i<n-1; i++)

    {

        int j=i;

        while (j>=0 && a[j]>a[j+1])

        {

            swap(&a[j], &a[j+1]);

            j--;

        }

    }

    printf("정렬 결과 : ");

    for (int i=0; i<n; i++)

        printf("%d ", a[i]);

 

    return 0;

}

----------------------

 

 

코드 실행했을 때 조금 더 보기 편하도록 일부 코드를 수정했다.

 

원소는 3,2,7,10,1의 순서로 입력했고

출력 결과는 아래와 같다.

 

 

실수가 있었는데,

원소 값을 입력받는 부분에서 print함수에 i가 아닌 i+1 값을 입력했으면 1,2,3,4,5번째 원소로 출력되었을 것이다.

귀찮으니 수정은 생략

 

 

 

 

올인원 패키지 : 컴퓨터 공학 전공 필수👉https://bit.ly/3i4sCVE