이직을 하고 적응하면서 공부를 좀 못했던것 같다. 이직이 끝날때까지 기술을 어떻게 쓰는지 기술위주로 공부했다면 이번에는 좀더 core 쪽을 공부해 보고 싶었다. 뭐 예를들어 비전공자인 나에게는 컴퓨터라는 물체에 대한 공부, 혹은 네트워크..
그래서 이번기회에 깊게는 아니지만 그래도 대화는 가능할정도로 컴퓨터에 대한 공부를 좀 해봤다.
이런식으로 하나의 bit(1 or 0 ) 이 4개모여 4비트를 완성한다.(2진수)
4비트는 2의 4승이므로 총 16가지의 경우의 수가 나온다. (2의3승/2의2승/2의1승/2의0승 을 다 더함)
하지만 더 간편하게 표현하기 위해 보통은 16진수를 사용한다.
2진수에서 16진수로 전환하는 법은 간단하다. 해당 스위치가 켜져있는(0이아닌 1) 자리의 경우의 수를 모두 더해주면 됀다. 예를들어 0011 인경우 2의1승+2의0승이니 3이 나온다.
16진수가 9를 넘어 10이 되는 순간, 표기법은 A~F로 바뀌게 됀다. 예를들어 1010 같은경우 2의 3승 +2의 1승 즉 8+2 이므로 A가 나온다.
0x4F4 같은 경우는 F(16진수) = 4bit, 4(16진수) = 4bit 이므로 총 8비트라고 볼수있다.
8개비트 즉 8bit = 1바이트
1바이트는 영문자 한글자가 저장될 수 있는 메모리 크기이며 관리의 최소단위 이다.(한글은 2바이트)
자주 쓰이는것은 외워두자
4비트 =16가지
8비트는 = 256가지
16비트는 65,536가지 (64KB)
색상을 표현할때도 16진수를 활용한다. 그 외에 하드웨어 주소표현, 메모리값 표현을 할때도 사용한다.
색상을 표현할때는 주로 RGB로 표현을 한다.한컬러당 255가지의 경우의 수 즉 8비트로 표현됀다.
모니터 화면상 점 하나를 화소 (픽셀) 이라고 한다. 픽셀을 표현할때 8,16,24,32비트로 표현할 수 있다. 보통 픽셀은 24비트이며 투명도까지 하면 32비트 즉 4바이트다.
RGB는 24비트 + Alpha Channel(투명도 8비트) 까지해서 32비트가 됀다. 이것은 RGBA 라고 부른다.
각각의 화소들의 RGB값들을 모아서 만든것을 bitmap이라고 한다. 하지만 이것은 용량이 너무커서 보통은 압축해서 사용함
개발자 도구를 켜서 CSS를보면 #B7 1C 1C 이런식으로 구성 되있다.(16진수) 이 예시는 8 8 8 비트이므로 총 3바이트다.
CPU가 연산하는 방법은 간단하다. cpu는 여러개의 게이트로 구성 되있다. 그래서 산술 연산이 가능한것!
A,B로 input이 들어가며 해당조건에 맞게 결과값이 나온다.
이런걸 반가산기 라고 부른다.
2진수 1+1 = 10(2진수) 이다.
A가 1,B가 1이면 XOR 연산자 결과는 S이다
동시에 A가 1, B가 1이면 AND 연산결과 C는 1이다.이 1은 자리올림(carry)이다.
-> 2진수는 숫자가 올라가면 자리올림이 발생한다. 뭔가 더하면 a+b만 하는게 아닌 자리올림까지 더해야 하므로 3개를 더해야 한다. 즉 3개의 bit를 합산할수 있는 로직이 필요함
-> 그래서 나온게 전가산기, 전가산기들이 모여 더하기를 할수 있다.
컴퓨터의 뺄셈을 이해할때는 보수 라는 개념을 이해하면 쉽다.
6에 4를 더하면 10이다. 즉 4는 6에대한 10의 보수이다.
13에 6에 대한 10의 보수 4를 더하고 10자리에서 1을 빼도 역시 7이다.
--> 보수를 구해서 더하면 빼기가 된다. 즉 덧셈을 계산할수 있는 전가사닉로 뺄셈도 계산 가능함!
2진수에서 0은 1로, 1은 0으로 뒤집으면 1의 보수가 된다.
1의 보수 + 1 = 2의 보수
어떤 숫자에 2의 보수를 더하면 자동으로 2진수 뺄셈이 된다. (자리올림은 버린다)
- 예를들어 13-6같은 경우에는 13에 2의 보수를 더하면 된다. 즉 13+1의 보수 + 1
- 6 = 0110 -> not연산자로 뒤집으면 1001
1001+1 = 1010- 1101+1010 = 10111 인데 첫째자리는 4비트를 넘어감으로 무시한다. 즉 최종적으로 0111이 나옴!
곱셉은 shit라고 표현한다. 한칸씩 왼쪽으로 밀어낸다고 생각하면 됀다.(Ex: 10 ->100)
자리올림은 버린다.
- 0101(5) -> 1010 이 됀다. 이때 채워지는 것을 padding이라고 한다. 왼쪽으로 한칸 밀면 곱하기 2의 효과
- 1010 = 8421 이다 . 즉 8+2 = 10이 나옴
- 곱하기 3은 0101(5) 1010(10) 을 더하면 되니까 1111이 나옴, 1111 = 8421, 8421 다 더하면 15가 나옴!
곱하기와 반대로 나눈기는 오른쪽으로 shift 한다. 당연히 패딩도 왼쪽에서 발생!
곱하기도 알고보면 덧셈의 연속, 나눗셈도 알고보면 밸셈의 연속이다.
- 0110(6) 을 오른쪽으로 한칸씩 밀면(=2로나누면) 00110 나옴, 오른쪽 자리올림은 버린다
- 0011 -> 2+1 = 3이나옴
- 0으로 무한으로 나누게 되면 cpu에 부담이 갈수있으니 조심하자! 하지만 우리가 사용하는 요즘 범용 pc는 알아서 os에서 처리를 해준다!
Ram이라는 구조를 살펴보면 엑셀과 매우 흡사함, 즉 데이터에 대한 일련번호들이 있다.
해당 데이터를 Ram에서 가져와 CPU Register라는 임시공간에 담아둔다. 그리고 난뒤 ALU라는곳에 보내 연산을 해서 값을 도출함
cpu에서 계산을 끝낸뒤에 다시 Ram에 저장함
==> 만약 cpu가 64비트이고 윈도우를 32비트를 깔아버리면 ram을 16GB를 사용해도 4GB(32비트)밖에 인식 못함
일반적으로 램은 1차메모리, ssd나 hdd는 2차메모리라고 한다.
cpu에 비해 ram 은 상당히 느리다.
cpu와 ram 은 휘발성 메모리다. 전원을 on/off 할경우 저장되있던 데이터들이 다 날아간다. 하지만 요즘은 중간중간에 백업 알아서 잘한다.
위로 갈수록 빠르고 고가이다. 이것을 서포팅 하기위해 캐쉬메모리가 존재함. ram에서 cpu로 데이터를 가져갈때 캐쉬메모리를 거쳐 가게됀다.
캐쉬메모리는 램에서 데이터를 가져와 cpu에서 연산할때 예측되는(필요로하는 데이터) 들을 ram에서 미리 가져온다. 왜냐하면 cpu계산 속도에 비해 ram은 너무 느리기때문 = 속도차이 극복!!!!
우리가 보통 2차 메모리공간에 프로그램을 설치하고 ‘실행’ 하면 ram 메모리에 카피되서 올라옴. 그래서 cpu에서는 프로그램에대한 연산! 그게 ‘실행’ 임
Cpu - register는 이름으로 관리를하며 주기억장치 공간은 고유이름으로 관리를 한다
반면 hdd같은 2차 메모리는 '트랙'과 '섹터'로 데이터 위치를 파악한다. 데이터를 넣고 읽는 기능 을 수행한다 RW
같은 위치에 데이터를 덮어씌우면(R) = overwrite 이기능이 계속되면 (10만번 정도하면)하드디스크가 망가져서 못쓰게 됌 - > 이렇게 해서 죽은 공간을 badSector이라 부른다
파일을 저장할때 파일시스템. (윈도우는 NTFS) 를 사용한다
파일 정보를 관리하는 테이블이 따로 존재한다 . Filer allocation table = FAT라고 부름
만약에 파일을 삭제하면 FAT에서 완전 지우는는게 아니라 마킹만 따로한다( 삭제 여부 컬럼 체크표시)
하드디스크 복원 이라는 개념 = 따로 마킹한 파일들을 따로 복사하는 작업
0번트랙 0번섹터는 특별한공간임 MasterBootRecord = MBR ==> 운영체제의 부트 코드가 들어감!! 컴퓨터 껏다키면 0번트랙 0번섹터에가서 운영체제 부트코드를 가져와 메모리에 적재해서 실행함 이게바로 '컴퓨터 부팅' 이라는 개념
FAT를 날려버리는게 '포맷' 이라는개념 , 빠른포맷은 FAT만 날리는것 , 느린포맷은 전체 섹터와 트랙을 찾아 0 으로 만들어 주는 것이 느린포맷
병렬은 같은일을 여러명이 하는것 / 동시성은 말그대로 여러가지 일이 동시에 일어나는것
원자성은 동시에 어떤일이 나더라도 하나의 주체가 안전하게 자기일을 할수 있는것 = 원자성을 보장받는다라고 말할수 있다.
컴퓨터에서 동기화란 즉 교통정리하는것 , 사거리같은경우에서 신호등이 통제를 하듯 동기화를 할때는 잠금장치가 필요함 // 다른의미로도 사용하는데 원본 사본을 똑같이 맞춰줄때도 사용함
교착상태 deadLock 은 서로 요구하는 조건이 곂쳐 이러지도 저러지도 못하는 상태,
프로그램을 깔아 실행을 하게되면 프로세스가 생성된다. 스레드는 프로세스를 돌리는 실행단위이다
실질적으로 CPU를 사용하는 녀석은 스레드이다.
실행단위 즉 스레드는 연산이다. 연산은 메모리를 사용한다. 스레드는 프로세스에서 할당된 메모리를 사용한다.
메모리는 용도에 따라 기억공간을 구분하기 때문에 주거공간과 매우 흡사한 개념을 가지고 있다.
메모리는 크게 stack , heap 영역으로 나뉘어지는데 stack이 스레드가 쓰는 공간, heap이 process 전체가 쓰는공간이라고 보면 됀다.
스레드는 위에서 설명한 동시성 이런것들을 지키기위해 개인공간을 가지는것임!
컴퓨터는 소프트웨어와 하드웨어 로 나뉘어지며 소프트웨어는 다시 Application과 System(Os)로 나뉘어진다.
os 는 크게 UserMode/ KernelMode 가 존재한다. 두 영역은 완전히 다른 영역임
h/w는 물리적 저장장소 즉 physical 이라고하며 소프트웨어는 logical, virtual이라고도 한다.
Os는 h/w에 의존적이며 이 둘사이에는 platform 이라는 말을 많이 사용한다. 즉 둘 사이에 원활한 작동을 위한 인프라를 뜻함.
Ex: 64bit platform 이면 cpu,운영체제 둘다 64bit 라는 말
KernelMode 같은 경우는 보통 입출력 제어,자원관리, 접근통제를 한다.
h/w에 있는 device를 제어하기위한 커널모드에서 작동하는 소프트웨어를 driver이라고 부른다
만약 우리가 helloWorld를 모니터 화면에 출력 한다고 예를 들어보자. userMode에서 KernelMode로 명령을 내리기 위해서는 file형태의 인터페이스를 통해서 메세지를 전달할 수 있다. 이것을 DeviceFile이라고 부른다.
그렇게 해서 전달된 명령을 커널모드-driver-device-모니터 화면순으로 전달 됀다.
중간에 커널모드에 있는 필터가 바이러나 이런걸 감지해 접근 통제를 한다. 커널모드 - 실시간 감시엔진
하드웨어를 소프트웨어화 하는걸 가상화 즉 버츄얼라이제이션이라함
주기억장치 ram에서 가능한것보다 더 많은 프로그램을 돌릴경우 hdd영역의 일부를 끌고와서 ram인것 처럼사용하는것을 가상 메모리라한다
Page라고하는 조각난 단위를 하드디스크와 램사이를 왔다갔다하면서 공간이동을 함. 속도가 무척 느리다
실제로 크롬을 킬때 돌아가는 상황을 보면 os가 ram 몇기가 쓸수있는지를 알려준다. 크롬을 킬때 그에 해당하는 사용공간을 보면 실제로 ram일지 아닐지는 봐야한다(그전까지는 모름)
만약에 ram쪽에 공간이 없다면 운영체제가 주기억장치(ram) 에서 hdd쪽으로 이사를 시켜버린다. 이것을 Page-outd이라고 부른다 그 반대는 Page-In
각각 프로세스는 가상메모리를 가지고 그것을 page단위로 잘랐을때( 실행하는 프로그램) 어떤건 ram 어떤건 hdd에서 실행할 수 있도록 os가 교통정리를 해준다 그래서 프로세스가 더 독립적이다.
가상메모리는 page in / page out 할때 프로그램들을 잠시 멈춤으로 결과적으로 봤을때 가상메모리는 어떻게든 돌아가게 해주는대신에 좀 느리다는 단점이 있다.
각 프로세스를 완벽하게 분리할수 있다. 운영체제 입장에서 관리가 제대로 됀다.
=>그래서 그 cpu를 소프트웨어로 구현시키면 그게 버츄얼 머신 (vm)
그 버츄얼머신을 동작시키는 기계언어는 managed 라고 부른다.cpu나 os에 종속적이지 않는게 특징임. 하나의 소프트웨어에 종속적인 native 언어와 다름
예를들어 자바 같은경우에는 jvm = 자바를 위한 cpu를 소트프웨어화 시킨 것, 그래서 자바의 대표적 특징- > 특정 os에 종속적이지 않다는게 성립됨