전체 글

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Signals

Signal Signal 이란 시스템에서 어떤 프로세스에 이벤트가 발생했다고 알려주는 메시지이다. Exception과 interrupt와 유사하다. 커널이 프로세스한테 보내준다. Signal type은 1~30으로 구분할 수 있다. Signal에 signal의 id와 도착했다는 것을 알려주는 정보들이 있다. Signal Concepts : 커널은 대상 프로세스의 컨텍스트에서 일부 상태를 업데이트하여 대상 프로세스에 신호를 전달한다. 신호는 두 가지 이유 중 하나로 전달된다. Sending a Signal 커널이 0으로 나누는 오류 또는 하위 프로세스의 종료와 같은 시스템 이벤트를 감지했을 때 프로세스가 kill 함수를 호출하여 커널이 대상 프로세스에 signal을 보내도록 명시적으로 요구했을 때 Rece..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Shells

Using fork and execve to Run Programs Unix 쉘, 웹 서버 같은 프로그램은 fork와 execve 함수를 많이 사용한다. 쉘은 사용자를 대신하여 다른 프로그램을 실행하는 대화형 응용 프로그램이다. 원래 쉘은 sh 프로그램이었다. 그 뒤에 csh, tcsh, ksh, bash 등의 다양한 프로그램이 생겼다. 쉘은 일련의 read/evaluate 과정을 수행한 뒤 종료된다. read 과정에서 사용자로부터 명령어를 읽어 들인다. eavluate 과정에서 명령어를 해석하고 사용자를 대신하여 프로그램을 실행한다. #include "csapp.h" #define MAXARGS 128 /* Function prototypes */ void eval(char *cmdline); int ..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Process Control

Unix는 C 프로그램에서 프로세스를 제어하기 위한 많은 System Call을 제공한다. Obtaining Process IDs 각 프로세스는 고유한 양의 정수인 Process ID(PID)를 가지고 있다. pid_t getpid(void) 현재 프로세스의 PID를 반환한다. pid_t getppid(void) 부모의 PID를 반환한다. #include #include pid_t getpid(void); pid_t getppid(void); getpid와 getppid는 type pid_t의 정수를 반환한다. Linux 시스템에서 pid_t는 type.h에 int로 정의되어 있다. Process Status 프로그래머의 관점에서 프로세스는 세 가지 상태 중 하나라고 생각할 수 있다. Running 프로..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] System Call Error Handling

System Call Error Handling UNIX 시스템 레벨의 함수에 에러가 발생하면, 보통 -1을 반환하여 무엇이 잘못되었는지를 알 수 있도록 전역 변수 errno를 설정한다. 프로그래머는 항상 에러를 체크해야 하지만 건너뛰는 경우가 많다. 왜냐하면 에러 체크를 하면 코드가 흐트러지고 읽기 어려워지기 때문이다. 예를 들어 Linux fork 함수를 호출할 때 에러를 확인하는 방법은 다음과 같다. if ((pid = fork()) < 0) { fprintf(stderr, "fork error: %s\n", strerror(errno)); exit(0); } fork() 함수의 반환 값이 -1이면 오류가 발생한 것으로 위와 같이 처리한다. strerror 함수는 errono의 특정 값과 관련된 에..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Process

프로세스의 정의 A process is an instance of a running program 프로세스는 실행 중인 프로그램의 인스턴스이다. 프로그램을 컴파일(compile)하면 Object Code가 생성되고 기계어 집합이 된다. 프로세스는 코드가 메모리에 적재된 이후에 CPU를 사용할 수 있는 상태를 말한다. compile이란, 인간이 이해할 수 있는 언어로 작성된 소스 코드(고수준 언어 : C, C++, Java 등)를 CPU가 이해할 수 있는 언어(저수준 언어 : 기계어)로 번역(변환)하는 작업을 말한다. 컴파일된 기계어 집합이 메모리의 Code, Stack, Heap, Data 영역에 할당된다. 프로세스는 각 프로그램에게 두가지 중요한 추상화를 제공한다. Logical control flow..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Exceptions

Exceptions Exception은 프로세서(CPU)의 상태가 변경되는 이벤트에 대한 응답으로 OS 커널로 제어를 넘기는 것이다. Examples of Events Divde by 0 arithmetic overflow page fault I/O request completes typing Ctrl-C 이벤트는 현재 명령어를 실행하는 것과 직접적인 관계가 있을 수 있다. 그 예로 page fault, arthmetic overflow, divde by zero가 있다. 반면에, 이벤트가 발생한 것이 현재 명령어의 실행과 관련 없는 것이 있을 수 있다. 그 예로 timer interrupt, I/O request가 있다. CPU가 이벤트를 감지하면, 특정 이벤트를 처리하기 위해 만들어진 OS의 서브루틴..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Exceptional Control Flow

Control Flow CPU에 전원이 공급된 시점부터 차단될 때까지 CPU는 sequence of instrcutons(machine code)을 한 번에 하나씩 읽고 실행한다. 명령어를 읽고 실행하는 연속된 흐름을 CPU의 Contrl Flow라고 한다. CPU관점에서 프로그램 또는 프로세스는 여러 개의 명령어가 모여있는 집합이다. 메모리에 명령어 집합이 올라가고 어드레스 버스에 신호를 주게 되면 어떤 어드레스를 접근할 것인지 CPU안에 있는 PC/IP 레지스터 값을 보고 해당 주소에 접근하여 명령어를 가져온다. 명령어의 주소는 데이터 버스를 통해서 CPU안에 있는 Instruction Register(IR)로 저장된다. 그다음 디코딩하여 op코드가 무엇인지 보고 실행한다. PC(program cou..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-4. 부호 있는 수와 부호 없는 수

컴퓨터 내에서는 일련의 높고 낮은 전기 신호의 형태로 숫자를 저장하므로 결국 기수 2인 수로 볼 수 있다. 모든 정보는 이진 자릿수(binary digit), 즉 비트(bit)로 구성되므로 비트가 계산의 기본 단위가 된다. 이 기본 단위는 높음/낮음, 온/오프, 참/거짓, 1/0 등 두 값 중 한 값을 갖게 된다. 부호 없는 수 unsigned Numbers 워드 내의 각 비트에 오른쪽에서 왼쪽으로 0, 1, 2, 3, ...과 같이 번호를 붙인다. 아래 그림은 MIPS 워드 내의 비트에 번호를 붙이는 방식과 숫자 1011(2)의 표현을 보여주고 있다. 워드는 수평으로뿐만 아니라 수직으로도 그릴 수 있기 때문에, 가장 오른쪽 혹은 가장 왼쪽 비트라고 말하면 애매할 수가 있다. 대신 LSB(least si..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-3. 피연산자

상위 수준 언어 프로그램과는 달리 산술 명령어의 피연산자에는 제약이 있다. 레지스터(register)라고 하는 하드웨어로 직접 구현된 특수 위치 몇 곳에 있는 것만을 사용할 수 있다. MIPS 구조에서 레지스터의 크기는 32비트이다. MIPS에서는 32비트가 한 덩어리로 처리되는 일이 매우 빈번하므로 이것을 워드(word)라고 부른다. 변수와 하드웨어 레지스터의 큰 차이점 하나는 레지스터는 개수가 한정되어 있다는 점이다. 기호 형태로 표현된 MIPS 언어를 단계적으로 구체화할 때 산술 명령어의 각 피연산자는 32개의 32비트 레지스터 중 하나여야 하는 제약이 있다. 레지스터 개수를 32개로 제한하는 이유는 하드웨어 기술의 바탕이 되는 세 가지 설계 원칙 중 두 번째 원칙에서 찾을 수 있다. 설계 원칙 2..

Computer Science/컴퓨터 구조

[컴퓨터 구조] 2-2. 하드웨어 연산

컴퓨터 언어에서 단어를 명령어(instruction)라고 하고 그 어휘를 명령어 집합(instrcution set)이라고 한다. 기본적으로 모든 컴퓨터는 산술 연산을 할 수 있어야 한다. 다음 MIPS 어셈블리 언어는 두 변수 b와 c를 더해서 그 합을 a에 넣으라고 컴퓨터에 지시하는 것이다. add a, b, c MIPS 산술 명령어는 한 종류의 연산만 지시하며 항상 변수 3개를 갖는 형식을 엄격히 지킨다. 다음은 네 변수의 합을 구하는 명령어들이다. adda, b, c# The sum of b and c is placed in a adda, a, d# The sum of b, c and d is now in a adda, a, e# The sum of b, c, d and e is now in a​ ..

Books/Java의 정석

[Java] 컬렉션 프레임워크(Collections Framework)

JDK1.2부터 컬렉션 프레임워크가 등장하면서 다양한 종류의 컬렉션 클래스가 추가되고 모든 컬렉션 클래스를 표준화된 방식으로 다룰 수 있도록 체계화되었다. 컬렉션 프레임워크(Collections Framework)는 컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공하기 때문에 프로그래머의 짐을 상당히 덜어 주고 있으며, 또한 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있기 때문에 사용법을 익히기에도 편리하고 재사용성이 높은 코드를 작성할 수 있다는 장점이 있다. 컬렉션 프레임워크의 핵심 인터페이스 컬렉션 프레임워크에서는 컬렉션 데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 그 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스를 정의하였다. 인터페이..

Books/Java의 정석

[Java] java.lang패키지

Object클래스 equals(Object obj) public boolean equals(Object obj) { return (this==obj); } Object클래스에 정의되어 있는 equals메서드의 실제 내용이다. 위의 코드에서 알 수 있듯이 두 객체의 같고 다름을 참조 변수의 값으로 판단한다. public class Test { public static void main(String[] args) { Value v1 = new Value(10); Value v2 = new Value(10); if (v1.equals(v2)) System.out.println("v1 == v2"); else System.out.println("v1 != v2"); v2 = v1; if(v1.equals(v2)..

또 고민 중
고민 중