전체 글

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Concurrent Programming with Processes

Concurrent Programming with Processes client1에서 connect를 호출하여 connection request를 server에 전송한다. server는 accept한 순간에 바로 return하고 fork를 호출하여 자식 프로세스를 생성한다. fork를 호출하기 전에 client2에서 보낸 connection request가 왔다면 client2를 kernel의 TCP manager에 queue된다. client1의 request로 호출한 fork에서 자식 프로세스(child1)가 connectedfd로 client1과 통신한다. 부모 프로세스는 connection이 있다면 accept하여 fork를 하고 자식 프로세스(child2)에서 client2와 통신한다. Proc..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Concurrent Programming

Concurrent Programming 지금까지, concurreny를 주로 운영 체제 kernel이 여러 응용 프로그램을 실행하기 위해 사용하는 메커니즘을 다뤘다. 그러나, concurreny는 kernel에만 국한되지 않는다. 응용 프로그램에서도 중요한 역할을 할 수 있다. 응용 프로그램 수준의 concurreny는 다음과 같은 방법에서도 유용하다. Accessing slow I/O devices Application이 디스크와 같이 느린 I/O 장치로부터 데이터가 도착하기를 기다릴 때, kernel은 다른 프로세스를 실행함으로써 CPU를 busy 상태로 유지한다. application은 유용한 작업을 I/O 요청과 겹치게 함으로써 유사한 방식으로 concurreny를 이용할 수 있다. Intera..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Socket Interface Functions

server server에서 getaddrinfo 함수를 호출하면 IP 주소와 Port에 대한 정보를 가져와서 socket을 만든다. socket을 만들고 bind를 통해서 만들어진 socket을 가지고 listen을 한다. listen은 server가 client로부터 오는 요청을 받겠다는 상황이다. client가 connection request를 하게 되면 accept 함수를 통해서 connection을 설정한다. accept을 하면 coonection이 설정된다. client와 connection이 만들어져서 메시지를 주고받을 수 있다. client client는 getaddrinfo를 통해서 IP 주소와 Port에 대한 정보로 socket을 만들고, connect 함수를 통해서 만든 socket..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] The Sockets Interface

The Sockets Interface Sockets interface는 Network Application을 build하기 위해 UNIX I/O 함수와 함께 사용되는 함수 집합이다. 윈도우와 매킨토시 시스템뿐 아니라 모든 UNIX계를 포함한 대부분의 시스템에 구현되었다. Socket kernel 관점으로 봤을 때, socket은 client와 server의 통신을 위한 endpoint이다. application 관점으로 봤을 때, socket은 application이 network에서 read/write할 수 있게 하는 file descriptor다. client와 server는 socket descriptor을 read/write 함으로써 통신할 수 있다. Socket Address Structure..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Global IP Internet

Global IP Internet Global IP Internet은 internet중 가장 유명하고 성공적으로 구현된 것이다. 인터넷의 내부 구조가 복잡하고 지속적으로 바뀌고 있지만, Client-Server 구조는 1980년대 초 이후로 매우 안정적으로 남아 있다. 각 인터넷 host는 TCP/IP Protocol Transmission Control Protocol/Internet Protocol을 구현한 소프트웨어를 실행하며, 거의 모든 현대 컴퓨터 시스템에서 지원되고 있다. 인터넷 클라이언트와 서버는 Socket Interface와 Unix I/O 함수들을 혼합해서 통신한다. Socket 함수들은 일반적으로 시스템 콜들로 구현되는데, 이 시스템 콜은 커널에서 Trap을 발생시키며, TCP/IP에..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-21. 오류 와 함정

Fallacy: More powerful instructions mean higher performance. Fewer instructions required But complex instructions are hard to implement May slow down all instructions, including simple ones Compilers are good at making fast code from simple instructions Fallacy: Write in assembly language to obtain the highest performance. But modern compilers are better at dealing with modern processors More li..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-19. x86 명령어

ARM이나 MIPS, RISC-V보다 강력한 연산을 제공하는 Instruction set도 있다. 프로그램이 실행하는 명령어의 개수를 줄이는 것에 목표를 두지만, 간결성을 희생한 대가로 얻어지는 것이다. 명령어의 개수를 줄였지만, 명령어 처리 시간이 길어져서 프로그램 실행에 걸리는 시간은 늘어날 위험이 있다. 이렇게 느려지는 이유는 Clock Cycle Time이 길어지거나 필요한 Clock Cycle Count가 더 많아지기 때문이다. The Intel x86 ISA ARM과 MIPS는 1985년에 작은 연구팀이 만든 것이다. 이 프로세서의 각 부분은 조화를 잘 이루고 있으며 구조도 아주 간결하다. 그러나, x86은 여러 독립적인 그룹이 40년 이상 꾸준히 발전 시킨 것이다. Intel은 마치 짐가방에..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-16. ARMv7(32비트) 명령어

ARM은 임베디드용으로는 가장 인기 있는 Instruction set architecture로 MIPS와 같은 해에 나왔으며 같은 설계 철학을 따르고 있다. 두 프로세서는 아래 표와 같이 매우 유사하다. 가장 큰 차이는 MIPS는 레지스터가 더 많고 ARM은 Addressing mode가 많다는 점이다. Addressing Mode 위 표는 ARM이 지원하는 데이터 Addressing mode를 보여 주고 있다. MIPS와 달리 ARM에는 상수 0을 갖고 있는 레지스터가 있다. MIPS는 3개의 단순한 데이터 addressing mode를 갖고 있는 데 반해 ARM은 9개를 갖고 있다. Compare and Conditional Branch Conditional Branch 여부를 판단하기 위해 MIPS..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-14. 배열과 포인터

Comparison of Array vs. Pointer 배열을 사용하면 새 인덱스 값을 계산해야 하므로 곱셈과 덧셈을 해야 한다. 포인터를 사용하면 p를 직접 증가시킨다. 배열의 마지막 주소 계산을 반복문 바깥으로 빼냄으로써 명령어를 줄였다. 곱셈 대신 자리이동과 배열 주소 계산을 반복문에서 제거함으로써 최적화를 했다. C에서 포인터를 이용하면 배열을 이용하는 것보다 더 효율적이니 포인터를 이용하라고 가르치는 경우가 많다. 그러나 요즘 최적화 컴파일러는 배열을 사용한 코드에 대해서도 똑같이 좋은 코드를 생성할 수 있다.

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-13. C 언어 정렬 프로그램

C swap function void swap(int v[], int k) { int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } v in $a0, k in $a1, temp in $t0 MIPS는 Byte address를 사용하므로 각 워드는 실제로 4바이트씩 떨어져 있다. 그러므로 인덱스 k를 주소에 더하기 전에 4를 곱해야 한다. 순차적인 워드 주소가 1이 아니고 4씩 차이가 나는 것을 반드시 기억해야 한다. 따라서 v[k]의 주소를 구하기 위해서 처음 해야 할 일은 k에 4를 곱하는 것이다. sll$t1, $a1, 2# reg $t1 = k * 4 add$t1, $a0, $t1# reg $t1 = v + k * 4 # reg $t1 has the ad..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-12. 프로그램 번역과 실행

Compiler Compiler 컴파일러는 C 프로그램을 어셈블리 언어 프로그램으로 바꾼다. 어셈블리 언어 프로그램은 컴퓨터가 이해할 수 있는 명령의 기호 형태이다. 상위 수준 언어 프로그램은 어셈블리 언어보다 문장 수가 훨씬 적으므로 프로그래머의 생산성이 높아진다. 1975년 당시에는 메모리가 부족하고 컴파일러가 비효율적이었기 때문에 운영체제와 어셈블러는 어셈블리 언어(assembly language)로 작성하였다. 그러나 오늘날에는 DRAM 칩의 용량이 수백만 배나 커져서 프로그램 크기 문제도 완화되었다. Assembler Assembler Pseudoinstruction Assembly Language 어셈블리 언어는 상위 수준 소프트웨어와의 인터페이스이므로 원래는 없는 명령어를 어셈블러가 독자적으..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-10. 32비트 수치와 주소를 위한 MIPS의 주소 지정 방식

32-Bit Immediate Operands 프로그램에서 사용하는 상수는 대체로 크기가 작다. -> 대부분 16비트 필드면 충분하지만 때에 따라서는 더 큰 상수가 필요한 경우도 있다. MIPS는 레지스터의 상위 16비트에 상수를 넣는 lui(load upper immediate) 명령어를 제공한다. -> Copies 16-bit constant to left 16 bits of rt -> Clears right 16 bits of rt to 0 lui를 이용해서 상위 16비트를 채운다. ori를 이용해서 하위 16비트를 채운다. Addressing in Branches and Jumps Jump Addressing jump 명령어는 가장 간단한 주소 지정 방식 6비트의 op 코드와 26비트의 주소 필드..

또 고민 중
고민 중