C언어와 System

msung99·2022년 9월 18일
0
post-thumbnail


왜 c언어로 시프를 배우는가?

  • 커널 : 운영채제 안에서 완전 핵심역할 수행(메모리 관리, cpu 관리 등)
    • 전문가가 아니면 건들면 안된다.
  • system calls : 커널에 비해 접근 난이도가 보다 낮아서 유저들이 건들 수 있는것
  • linbrary routines : ex. system library 등이 해당
  • applications

=> 안으로 들어갈수록 오래된 언어(로우래벨언어. c언어)로 개발된 경향이 있다.

cf) 1970년대에 유닉스를 개발한 사람이 우연히 c언어라는것을 보고 조합 및 함꼐 발전을 시킴 => 운영채제 커널은 c언어로 구현

  • 그 이후로 나온 많은 운영채제들은 c 와 c++ 로 구현된 시스템 API call 을 제공함

malloc()

  • Glibc 라는 라이브러리 안에 들어있음
    • Glibc : 굉장히 기초적인 컴퓨터 기능을 구현해놓은 GNU 라이브러리

bit, bytes

  • 1byte = 8bit

  • 많은 컴퓨터 시스템은 bit로 표현된 다양한 데이터 타입을 지원한다.

    • 32 bit processors : 정수가 4바이트 데이터 숫자로 표현됨
    • 64 bit processors : 정수가 8바이트 데이터 숫자로 표현됨

=> 컴퓨터는 계산을 할때 한 bit 씩 끊어서 차례때로 계산하는 것이 아니라, 벡터(vector) 단위로 계산한다. 벡터에다 계산을 할때 32비트를 동시에 처리할 수 있는 시스템 보다, 64비트를 동시에 처리 할 수 있는 시스템이 더 빠를 것이다.
( 그래서 64비트 시스템이 더 빠르다! )


c언어 데이터 타입

  • float : 소수점 12자리 이하면 정확한 값 제공x(오차가 발생)

=> 소수점 데이터 타입인 float은 정확한 값이 아니라 근삿값을 저장한다.

  • 포인터(pointe) : 32bit 시스템에서는 4바이트, 64bit 시스템 및 x86-64 시스템에서는 8바이트의 공간을 사용

Boolean Algebra

  • Boolean 형 타입이 0 또는 1인 시스템
  • 기초적인 연산: AND, OR, NOT, XOR
    (cf. XOR 연산 => 같으면 0, 다르면 1을 리턴)
  • c언어에는 이미 구현되어 있음(&, |, ~, ^)

logical operation (논리 연산)

  • 주의) Boolean Algebra 와 다르다!!!!!!!
  • 조건문안에서 해당 변수에 대한 논리연산을 진행시 &,| 등이 아니라 논리 연산자인 &&, || 를 사용한다!
  • 논리 연산자 종류 : &&, ||, ! 등등

cf) early termination (연산의 조기종료)

피연산자 2개가 있고 그 사이에 논리 연산자가 있을때,
앞에 있는 피연산산자와 논리 연산자만 보고 결과값을 미리 도출해내는 방식. 즉, 뒤에 있는 피연산자는 뭐인지 신경도 안쓰고 결과값이 도출되며 연산이 빨리 종료되는 것을 early termination 이라고 한다.

=> ex. !0x23 && 0x1 : 두번째 피연산자 0x1 가 true 이든 false 이든지 상관없이 !Ox23 와 && 를 보면, 결과값은 무조건 false 가 나오므로 연산이 조기 종료된다.


Shift operation (쉬프트 연산)

  • 각 비트의 숫자를 왼쪽 또는 오른쪽으로 밀어버리는 연산

  • left/right shift operation

  • left shift operation

    • x << n : x 에다 2^n 을 곱한것과 동일
  • right shift operation

    • x >> n : x 에다 2^n 으로 나눈것과 동일

logical / artihmetic shift

  • 왼쪽, 오른쪽 쉬프트 연산은 logcial / arithmetic shift 연산을 적용시킬 수도 있다.

    1) logcial shift : 왼쪽(또는 오른쪽) 으로 땡기고 새롭게 생긴 빈공간 bit 들에는(최하위 비트 n개는) 0으로 채우는 연산

    2) arithmetic shift : 최상위 비트(MSB)가 1이면 1로, 0이면 0으로 빈공간을 채우는 연산


각 데이터타입의 표현범위

int 형의 경우 4바이트의 크기를 표현가능


2의보수 (two's complement)

  • 음수를 표현하기 위한 인코딩(encoding) 방법

음수를 표현하는 방법

1) 해당 값을 절댓값(양수) 로 표현한다
2) 모든 bit 를 뒤집는다 (0->1로, 1->0 으로)
3) 1을 더한다


2의보수의 덧셈과 뺄샘연산

  • 연산 결과로 나오는 결과값이 표현범위를 벗어나면, 즉 오버플로우가 벗어난 bit 는 무시한다 (버린다)

( 자세한 내용은 논회 수업떄 내용으로 공부하자! 뭔 개소리인지 모르겠다 )


c언어에서의 메모리 관리

  • 프로그램을 하나 실행시키면, 각 프로그램은 stack(스택), heap(힙), static 을 관리하게 된다.

  • 그 안에 내가 프로세스를 여러개 만들었다면 각 프로세스는 자신이 속해있는 스택이 존재하게 된다.

  • static 은 프로세스에 종속해있지 않다. static 한 프로그램에 하나만 존재한다.

  • malloc() 하면 힙에서 데이터를 가져오는 것이다.
    (원래는 stack 에서 데이터를 가져옴)
    => 스택의 각 프로세스들은 운영채제가 자동적으로 할당한 heap 에 있는 공간을 포인터로 가리킨다 (즉, 각 프로세스들이 힙에 있는 각 공간들의 시작주소를 저장)


static

  • 어떤 프로세스인지 상관없이 모든 프로세스에서 동일하게 동작 (값을 계속 그대로 유지)
  • global 변수(전역변수) 는 static 에 정의된다


stack

  • 각 프로세스에게 할당되는 일시적으로 생성되었다 없어지는 메모리
  • 해당 함수가 선언되고 종료되기 전까지만 유효하다 (메모리가 살아있다)
  • 지역변수는 스택안에 정의된다


heap

  • malloc() 으로 받아올 수 있는 메모리 공간들이 위치한 넓은 공간
  • 포인터를 가지고 힙에 있는 메모리 공간의 시작주소를 저장


malloc(), free()

  • GNU 라이브러리에 속하는 API

  • malloc() : 힙에 있는 메모리공간의 주소를 리턴

free VS malloc

  • malloc 의 경우, 위 그림에서의 화살표가 살아있을때 동안에는 해당 프로세스가 사용을 하고있다. 화살표가 죽고 다시 해당 힙에 있는 메모리공간에 대해서 같은 프로세스 또는 다른 프로세스가 다시 malloc 을 불러서 요청했을 때 이 주소가 할당되지 않는다(이미 힙의 해당 메모리를 사용하고 있다고 말하기 때문에)

  • free 를 하면 데이터를 삭제하지않고 화살표만 지운다.
    ( => free 를 하면 데이터가 바로 사라지지 않음 )


profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글