대부분의 컴퓨터는 8비트 바이트로 문자를 표현하며, 거의 모든 컴퓨터가 ASCII를 사용한다. 명령어 몇 개를 사용하면 워드 내의 특정 바이트를 추출할 수 있다. 그러므로 lw와 sw은 워드뿐 아니라 바이트 전송에도 충분히 사용할 수 있다. 하지만 텍스트 데이터를 다루는 프로그램이 많기 때문에 효율성을 위해서 MIPS에는 바이트 전송 명령어가 따로 있다. lb(load byte) 메모리에서 한 바이트를 읽어서 레지스터의 오른쪽 8비트에 채우는 명령 sb(sotre byte) 레지스터의 오른쪽 8비트를 메모리로 보내는 명령 lb rt, offset(rs) lh rt, offset(rs) Sign extend to 32 bits in rt lbu rt, offset(rs) lhu rt, offset(rs) ..
Supproting Procedures in Computer Hardware 프로시저(Procedure)나 함수는 이해하기 쉽고 재사용이 가능하도록 프로그램을 구조화하는 방법 중의 하나이다. 프로시저는 프로그래머가 한 번에 한 부분씩 집중해서 처리할 수 있게 해 준다. 인수(Parameter)는 프로시저에 값을 보내고 결과를 받아 오는 일을 하므로, 프로그램의 다른 부분 및 데이터와 프로시저 사이의 인터페이스 역할을 한다. 프로시저는 소프트웨어에서 추상화를 구현하는 방법 중의 하나이다. Procedure Calling 프로그램이 프로시저를 실행할 때 다음과 같은 여섯 단계를 거친다. 프로시저가 접근할 수 있는 곳에 인수를 넣는다. 프로시저로 제어를 넘긴다. 프로시저가 필요로 하는 메모리 자원을 획득한다...
Conditional Operations 프로그래밍 언어에서는 보통 if문장으로 판단 기능을 표현한다. beq reg1, reg2, L1 reg1과 reg2의 값이 같으면 L1에 해당하는 statement로 가라는 뜻이다. beq는 branch if equal을 의미한다. bne reg1, reg2, L1 reg1과 reg2의 값이 같지 않으면 L1으로 가라는 뜻이다. bne는 branch if not equal을 의미한다. beq와 bne 두 명령어를 조건부 분기(conditional branch)라 부른다. Compiling if Statements 다음 코드에서 f, g, h, i, j는 변수이고, 각각은 레지스터 $s0부터 $s4까지에 해당한다. if (i==j) f = g+h; else f = ..
비트들을 워드로 묶는(packing) 작업과 워드를 비트 단위로 나누는 (unpacking) 작업을 간단하게 하는 명령어들이 프로그래밍 언어와 명령어 집합에 추가되었다. 이러한 명령어들을 논리 연산 명령어라 부른다. Shift Operation Shift 연산 워드 내의 모든 비트를 왼쪽 또는 오른쪽으로 이동시키고, 이동 후 빈자리는 0으로 채운다. sll (shift left logical) 비트들을 왼쪽으로 이동시키고 원래 있던 자리는 0으로 채운다. 2를 곱한 것과 같은 결과다. srl (shift right logical) 비트들을 오른쪽으로 이동시키고 원래 있던 자리는 0으로 채운다. 2를 나눈 것과 같은 결과다. AND Operation AND 연산은 bit : bit 연산자로서 두 비트 값이..
거의 모든 명령어가 레지스터를 사용하기 때문에 레지스터 이름을 숫자로 매핑하는 규칙이 있어야 하는데 MIPS에서는 레지스터 $s0에서 $s7까지는 레지스터 번호 16~23번, $t0에서 $t7까지는 8~15번으로 매핑한다. 예제: MIPS 어셈블리 언어를 기계어로 변환 다음 어셈블리 명령어의 실제 MIPS 언어 버전을 십진수와 이진수 형태로 표현하라. add $t0, $s1, $s2 십진수 표현은 다음과 같다. 명령어의 각 부분을 필드(field)라 부른다. 처음과 마지막 필드(0과 32)가 컴퓨터에게 덧셈을 하라고 지시하는 부분이다. 두 번째 필드는 덧셈에 사용할 첫 번째 피연산자 레지스터의 번호(17 = $s1), 세 번째 필드는 두 번째 피연산자 레지스터 번호(18 = $s2), 네 번째 필드는 계..
Networks 클라이언트와 서버는 종종 별도의 호스트에서 돌아가며, 컴퓨터 네트워크의 하드웨어 및 소프트웨어 리소스를 사용해서 통신한다. 호스트에게 네트워크는 단지 또 다른 I/O 디바이스이며, 데이터를 위한 소스와 싱크로 서비스한다. I/O 버스의 확장 슬롯에 꽂혀 있는 adapter는 네트워크의 물리적인 인터페이스를 제공한다. 네트워크에서 수신한 데이터는 I/O와 메모리 버스를 거쳐서 adapter에서 메모리로, 보통 DMA 전송으로 복사된다. 데이터 또한 메모리에서 네트워크로 복사될 수 있다. 물리적으로 네트워크는 기하학적 위치로 구성된 계층(hierarchical) 구조 시스템이다. 하위 수준은 LAN(Local Area Network)으로 빌딩이나 캠퍼스에 설치된다. 가장 대중적인 LAN 기술..
네트워크 응용은 주변에서 흔히 찾아볼 수 있다. 웹을 검색하고, 이메일을 보내고, 온라인 게임을 하는 등이 네트워크 응용을 사용하고 있는 것이다. 흥미로운 것은 모든 네트워크 응용들은 동일한 기본적인 프로그래밍 모델에 기초하고 있으며, 비슷한 논리 구조를 가지며, 동일한 프로그래밍 인터페이스를 사용한다는 점이다. The Client-Server Programming Model 모든 네트워크 응용 프로그램은 Client-Server 모델에 기초하고 있다. 이 모델을 사용해서 응용 프로그램은 한 개의 서버 프로세스와 한 개 이상의 클라이언트 프로세스로 구성된다. 서버는 일부 리소스를 관리하고, 이 리소스를 조작해서 클라이언트를 위한 서비스를 제공한다. 예를 들어 웹 서버는 디스크 파일들을 관리하고, 클라이언..
Standard I/O 라이브러리는 열린 파일을 starem으로 모델링한다. 프로그래머에게 stream은 FILE 유형의 구조에 대한 포인터이다. 모든 ANSI C프로그램은 stdin, stdout, stderr의 3가지 오픈 stream으로 시작한다. #include extern FILE *stdin; /* standard input (descriptor 0) */ extern FILE *stdout; /* standard output (descriptor 1) */ extern FILE *stderr; /* standard error (descriptor 2) */ int main() { fprintf(stdout, "Hello, world\n"); } Buffred I/O : Motivation g..
How the Unix Kernel Represents Open Files 리눅스 파일은 여러 가지 방법으로 공유할 수 있다. 커널이 열린 파일을 어떻게 나타내는지 명확하게 파악하지 못하면 파일 공유에 개념이 혼란스러울 수 있다. 커널은 세 가지 관련 데이터 구조를 사용하여 열린 파일을 나타낸다. Decriptor table 각 프로세스에는 프로세스의 열린 file discriptor에 의해 인덱싱되는 항목이 있는 고유한 decriptor table이 있다. 열려 있는 각 dicriptor entry는 file table의 entry를 가리킨다. File table 열려 있는 file set은 모든 프로세스에서 공유되는 file table로 나타난다. 각 file table 항목은 현재 파일 위치, 현재..
Reading File Metadata 프로그램은 stat와 fstat 함수를 호출하여 파일에 대한 정보(metadata)를 검색할 수 있다. #include #include int stat(const char *filename, struct stat *buf); int fstat(int fd, struct stat *buf); Returns: 0 if OK, −1 on error stat 함수는 파일 이름을 입력하면 stat 구조체의 멤버 변수를 설정한다. fstat 함수는 파일 이름 대신 file discriptor를 사용한다. struct stat { dev_t st_dev; /* Device */ ino_t st_ino; /* inode */ mode_t st_mode; /* Protection ..
Robust Reading and Writing with the RIO Package RIO (Robust I/O) 패키지는 short count를 자동적으로 처리한다. Rio 패키지는 네트워크 프로그램과 같은 short count 대상이 되는 프로그램에서 편리하고 견고하며 효율적인 I/O를 제공한다. Rio는 두 가지 다른 기능을 제공한다. Unbuffered input and ouput finctions. 이러한 함수는 응용 프로그램 수준의 버퍼링 없이 메모리와 파일 간에 데이터를 직접 전송할 수 있다. 네트워크로부터 binary 데이터를 읽고 쓰는 데에 특히 유용하다. rio_readn rio_writen Buffered input functions. 이러한 함수를 사용하면 printf와 같은 표준..
Input/Ouput (I/O)는 메인 메모리와 디스크 드라이버, 터미널, 네트워크 같은 외부 장치 간에 데이터를 복사하는 프로세스이다. Input은 I/O 디바이스에서 메인 메모리에 데이터를 복사하고 Ouput은 메모리에서 디바이스로 데이터를 복사한다. 모든 language run-time system은 I/O를 수행하기 위해 higher-level의 기능을 제공한다. 예를 들어, ANSI C는 buffer 된 I/O를 실행하는 printf와 scanf 등의 기능을 갖춘 stdin(Standard I/O) 라이브러리를 제공한다. Linux 시스템에서는 커널에서 제공하는 시스템 수준의 Unix I/O 함수를 사용하여 이러한 상위 수준의 I/O 기능이 구현된다. 대부분의 경우 high level의 I/O ..