=> 안으로 들어갈수록 오래된 언어(로우래벨언어. c언어)로 개발된 경향이 있다.
cf) 1970년대에 유닉스를 개발한 사람이 우연히 c언어라는것을 보고 조합 및 함꼐 발전을 시킴 => 운영채제 커널은 c언어로 구현
1byte = 8bit
많은 컴퓨터 시스템은 bit로 표현된 다양한 데이터 타입을 지원한다.
=> 컴퓨터는 계산을 할때 한 bit 씩 끊어서 차례때로 계산하는 것이 아니라, 벡터(vector) 단위로 계산한다. 벡터에다 계산을 할때 32비트를 동시에 처리할 수 있는 시스템 보다, 64비트를 동시에 처리 할 수 있는 시스템이 더 빠를 것이다.
( 그래서 64비트 시스템이 더 빠르다! )
=> 소수점 데이터 타입인 float은 정확한 값이 아니라 근삿값을 저장한다.
피연산자 2개가 있고 그 사이에 논리 연산자가 있을때,
앞에 있는 피연산산자와 논리 연산자만 보고 결과값을 미리 도출해내는 방식. 즉, 뒤에 있는 피연산자는 뭐인지 신경도 안쓰고 결과값이 도출되며 연산이 빨리 종료되는 것을 early termination 이라고 한다.
=> ex. !0x23 && 0x1 : 두번째 피연산자 0x1 가 true 이든 false 이든지 상관없이 !Ox23 와 && 를 보면, 결과값은 무조건 false 가 나오므로 연산이 조기 종료된다.
각 비트의 숫자를 왼쪽 또는 오른쪽으로 밀어버리는 연산
left/right shift operation
left shift operation
right shift operation
왼쪽, 오른쪽 쉬프트 연산은 logcial / arithmetic shift 연산을 적용시킬 수도 있다.
1) logcial shift : 왼쪽(또는 오른쪽) 으로 땡기고 새롭게 생긴 빈공간 bit 들에는(최하위 비트 n개는) 0으로 채우는 연산
2) arithmetic shift : 최상위 비트(MSB)가 1이면 1로, 0이면 0으로 빈공간을 채우는 연산
int 형의 경우 4바이트의 크기를 표현가능
1) 해당 값을 절댓값(양수) 로 표현한다
2) 모든 bit 를 뒤집는다 (0->1로, 1->0 으로)
3) 1을 더한다
( 자세한 내용은 논회 수업떄 내용으로 공부하자! 뭔 개소리인지 모르겠다 )
프로그램을 하나 실행시키면, 각 프로그램은 stack(스택), heap(힙), static 을 관리하게 된다.
그 안에 내가 프로세스를 여러개 만들었다면 각 프로세스는 자신이 속해있는 스택이 존재하게 된다.
static 은 프로세스에 종속해있지 않다. static 한 프로그램에 하나만 존재한다.
malloc() 하면 힙에서 데이터를 가져오는 것이다.
(원래는 stack 에서 데이터를 가져옴)
=> 스택의 각 프로세스들은 운영채제가 자동적으로 할당한 heap 에 있는 공간을 포인터로 가리킨다 (즉, 각 프로세스들이 힙에 있는 각 공간들의 시작주소를 저장)
GNU 라이브러리에 속하는 API
malloc() : 힙에 있는 메모리공간의 주소를 리턴
malloc 의 경우, 위 그림에서의 화살표가 살아있을때 동안에는 해당 프로세스가 사용을 하고있다. 화살표가 죽고 다시 해당 힙에 있는 메모리공간에 대해서 같은 프로세스 또는 다른 프로세스가 다시 malloc 을 불러서 요청했을 때 이 주소가 할당되지 않는다(이미 힙의 해당 메모리를 사용하고 있다고 말하기 때문에)
free 를 하면 데이터를 삭제하지않고 화살표만 지운다.
( => free 를 하면 데이터가 바로 사라지지 않음 )