정확한 도서명은 "Head First Design Patterns"
                       스토리가 있는 패턴 학습법
                       한빛미디어, 에릭 프리먼, 엘리자베스 프리먼, 케이시 시에라, 버트 베이츠 저, 서환수 역


사용자 삽입 이미지

Ready , Go!!
학습목표 : TCP & UDP 프로토콜에 대한 이해 필요
               소켓 옵션에 대한 이해 필요
               파일 입출력에 대한 이해 필요
               파일 전송 프로그램 구현

<용어정리>
데이터 : 우리가 실제로 전달하고자 하는 내용
유저 데이터그램 : 데이터가 일정한 단위를 가지는 것을 데이터그램이라 하는데 UDP에서는 특별히 데이터를 유저가 나눴다고 해서 유저 데이터그램이라 한다.
세그먼트 : 데이터들이 조각으로 나눠진 부분들
세그먼트화 : 세그먼트를 만드는 행위, 구획을 나누는 행위
단편 : 원래 완성된 원본 데이터의 일부분
단편화 : 원래 데이터를 재조합하기 위해서 단편화를 한다.
데이터 원형을 보존하는지 안하는지에 따라 차이가 있다.
세그먼트화는 데이터 원래 모양에는 전혀 관심없고 구획만 나누는 것
패킷 : 실제로 네트워크 구간에서 전송되어지는 형태

소켓버퍼
소켓이 생성되면 버퍼가 자동으로 만들어진다. 수신버퍼와 송신버퍼가 생기고 TCP, UDP 모두 가지고 있다.
이 두 소켓의 버퍼의 의미는 약간 다르다. 소켓 버퍼의 크기는 시스템의 안전성과 속도 양측에 모두 영향을 미치게 된다. 버퍼가 큰 것은 시스템 자원의 소비가 크다는 것을 의미하므로 소켓의 효율 저하와 시스템 자원 부족현상을 가져올 수 있으므로 데이터분절 크기와 전송 지연을 고려하여 잘 잡아야 한다 ~

단편화와 재조합
데이터를 통째로 전송하기에는 무리가 있다. 만일 통째로 보내면 파일 손상의 우려가 있기 때문이다. (전송파일의 크기가 클 수록 오류확률이 커진다. 그래서 작은 확률로 여러개를 보내게 되면 오류 난 부분만 새로 보내면 되기 때문에 효율적이다.) 이렇게 데이터를 잘게 쪼개는 과정을 단편화라고 하고 상대편에서 전송되어진 뒤에 다시 조립되는 과정을 재조합이라고 한다. 데이터 크기는 MTU(Maximum Transfer Unit) 크기를 기준으로 쪼개어진다.

TCP는 미리 세그먼트화를 하기 때문에 데이터가 커도 단편화가 일어나지 않고 UDP에서는 단편화가 발생하게 된다.
사용자 삽입 이미지
                                                            Picture] IP Header



사용자 삽입 이미지
                                                           Picture] TCP Header

사용자 삽입 이미지
사용자 삽입 이미지

                                                          Picture] UDP Header



사용자 삽입 이미지

주 부트로더(MBR에 설치됨)로 사용하거나 2차 부트로더(부팅 가능한 파티션에 설치됨)로 사용할 수 있다. 파티션에 위치하게 되면 이를 불러올 무언가가 MBR에 위치해야 한다. Linux, FreeBSD(Berkeley Software Distribution), NetBSD, OpenBSD는 LILO와 GRUB을 모두 지원하며, 설정 파일을 통해서 윈도우 XP에서도 사용할 수 있다. 두 가지 모두 루트 사용자의 싱글유저모드로 부팅하는 기능을 제공한다.

LILO는 특정 파일 시스템에 의지하지 않는다.
플로피 디스크와 하드 디스크에서 가능하다.(OS 시동)
바이오스(BIOS) 드라이버를 통해 하드웨어와 접근 가능하다.
예전의 배포판의 대부분이 LILO를 기본 부트로더로 사용했다.



GRUB의 가장 큰 특징은 파일시스템과 커널 포맷을 이해한다는 점이다.
따라서 디스크상에서 커널의 물리적인 위치를 알 필요 없이 단지 파일명과 커널이 위치하고 있는 파티션만 알고 있으면 커널을 로드할 수 있다. LILO의 경우 부트로더가 커널의 하드디스크상의 물리적인 위치를 알고 있어야 한다. 따라서 커널을 다시 설치할 때마다 ‘lilo’를 실행해 부트로더를 다시 심어 주어야 하지만, GRUB의 경우 파일명만 알면 되기 때문에 파일명이 바뀌지 않는 한 다시 실행해 줄 필요가 없다.

현재 GRUB은 다음과 같은 기능들을 제공한다.

1. a.out 포맷과 ELF 포맷의 커널을 읽어들일 수 있다.
2. Linux, FreeBSD, NetBSD, OpenBSD등 비-멀티부트 커널을 지원한다.
3. 멀티플 모듈을 로드할 수 있다.
4. 텍스트 형식의 설정 파일을 제공한다.
5. 메뉴 인터페이스를 제공한다.
6. 유연한 커맨드라인 인터페이스를 제공한다.
7. BSD FFS, FAT16, FAT32, Minix, ext2 그리고 ReiserFS 파일시스템을 지원한다.
8. gzip으로 압축된 파일을 다룰 수 있다.
9. BIOS에서 인식되는 모든 장치에 엑세스할 수   있다.


GRUB에도 장점만 있는 것은 아니다. 먼저, 윈도우 등 “chainloader”를 사용해야 하는 운영체제가 첫 번째 하드디스크 외의 다른 하드디스크, 예를 들어 “hdb”에 설치되어 있을 경우 GRUB을 사용해서는 이 운영체제로 부팅할 수 없다. 다음으로, 플로피 디스크나 CD-ROM 부팅을 지원하지 않는다. 마지막으로 다른 부트로더에 비해 덩치가 상당히 크다. 특히 GRUB 플로피디스크를 이용하여 부팅할 때에는 stage2가 로드되는 동안 GRUB 자체를 부팅하는 듯한 느낌이 들 정도다. 하지만 요즘 대부분의 배포판에서는 GRUB을 기본 부트로더로 제공하고 있다.

부트로더란 무엇인가?? 왜 사용하는 거지??
: machine이 직접 OS를 로드하면 BIOS는 우선 512 바이트의 부팅 가능한 미디어(master boot record 또는 MBR)를 읽는다. 하나의 MBR에 단 하나의 OS의 부트 레코드를 저장할 수 있기 때문에 여러 OS가 필요할 경우 문제는 자명하다. 따라서 우리에겐 보다 유연한 부트 로더가 필요하다.

마스터 부트 레코드는 부트 로더 프로그램 전체 또는 일부, 그리고 파티션 테이블(나머지 미디어가 파티션으로 나뉘어지는 방법에 대한 정보를 포함하고 있음.)을 가지고 있다. BIOS가 로딩되면 하드 드라이브의 첫 번째 섹터에 있는 데이터를 찾는다. 그것이 MBR이다. MBR에 저장된 데이터를 사용하여 BIOS는 부트 로더를 활성화한다.

BIOS가 액세스 할 수 있는 데이터 양은 매우 적기 때문에, 대부분의 부트 로더는 두 단계로 로딩된다. 첫 번째 단계에서, BIOS는 initial program loader 또는 IPL로 알려진 부트 로더의 일부를 로딩한다. IPL이 파티션 테이블을 검사하고, 다양한 미디어에 존재하는 데이터를 로딩할 수 있다. 이 작동은 두 번째 단계의 부트 로더가 처음에 자리잡기 위해 사용된다. 여기에는 로더의 나머지 부분이 포함된다.

두 번째 단계의 부트 로더는 부트 로더의 핵심이라 할 수 있다. 많은 사람들은 이것을 부트 로더라고 생각한다. 여기에는 사용자 인터페이스와 커널 로더 같은 디스크를 위시한 부분들을 포함하고 있다. 이러한 사용자 인터페이스들은 간단한 명령행부터 GUI 까지 다양하다.

부트 로더는 두 가지 방식(주 부트 로더 또는 제 2의 부트 로더) 중 하나로 설정된다. 주 부트 로더는 부트 로더의 첫 번째 단계가 MBR에 설치되는 장소이다. 제 2의 부트 로더는 부트 로더의 첫 단계가 부팅 가능한 파티션에 설치되는 장소이다. 개별 부트 로더들이 이때 MBR에 설치되고, 컨트롤을 제 2의 부트 로더에 전달하도록 설정된다.

친구가 config.mak 파일이 뭐냐는 질문을 해왔다 ...
난감... 뭐지?;;

검색해본 결과 ,
configure 명령으로 컴파일 옵션을 설정해주었을 때
명령이 성공하면 생성되어지는 파일이라고 한다.

파일을 열어보면 어떤 컴파일러와 툴을 사용하는지에 대한 정보가
기록되어 있다.

이노무 기억력..

분명 예전에 삽질하면서 본 파일같은데

아직 건드려보진 않았지만

작년처럼 모르고 막 수정해버리는 실수따윈 하지 않을거다

올해는 앎의 중요성을 인지해야 한다 ㅎㅎ


뽀나스~

* ar: 정적 라이브러리들을 만든다.
* objdump: 가장 중요한 바이너리 툴; 바이너리 형식 오브젝트
파일의 모든 정보를 보여준다.
* strings: 바이너리 파일의 출력가능한 모든 문자열들을 보여준다.
* nm: 오브젝트 파일의 심볼 테이블에 정의된 심볼들의 리스트를 보여준다.
* ldd: 오브젝트 바이너리 파일이 의존하고 있는 공유 라이브러리들의
목록을 보여준다.
* strip: 심볼 테이블 정보를 지운다.

시그널
동기적 시그널 : 프로세스의 어느 정해진 동작과 관련되어 있어서 그 동작을 하는 동안 전송되게 된다.(단, 프로세스의 시그널이 Mask되지 않을 때) ex) 메모리 확보 예외, 잘못된 명령 실행 등
비동기적 시그널 : 실행되는 프로세스의 제어 밖에 있는 외부 사건에 의해 발생한 시그널
예측할 수 없는 시간에 도착하며 Mask되지 않은 어떤 다른 프로세스에 적용되도록 요청한다.
ex) Ctrl + C, Ctrl + Z, Kill 커맨드에 의한 시그널 전송

시그널 마스크 란?
시그널을 보내면 안되는 경우, 마스크를 하게되면 그 동안에는 시그널이 보류되고, 마스크가 해제되면 전달되게 된다. 중복된 시그널이 도착하면 모두 삭제되고 하나만 남아있게 된다.

시그널 수신 시 동작의 변경이 자유로우나 SIGKILL, SIGSTOP은 예외이다.

시그널 수신 시 5가지 동작
종료 : 프로세스 종료
코어 덤프 : 프로세스의 코어 덤프 파일을 작성하고 종료(코어 덤프 파일은 프로그램 비정상 종료시 메모리 상황을 기록한 파일로 어디서 오류가 났는지 알 수 있음, 디버깅 모드로 컴파일하면 좀 더 자세한 정보가 기록됨, 실행중인 프로세스에 시그널을 날려 강제로 파일을 생성할 수도 있다.)
무시 : 시그널 전송을 비롯하여 아무것도 하지 않음
정지 : 프로세스의 실행 (일시) 정지
계속 : (정지상태의) 프로세스의 실행 재시작


실시간 시그널
POSIX에서 시그널 처리가 가지는 단점을 보완하기 위해 규정한 사양
시그널이 큐에 보관되어 생성된 횟수만큼 전송됨
작은 시그널 번호부터 배송됨
시그널 번호뿐 아니라 시그널 번호, 에러번호, 시그널 코드, 시그널 번호에 해당한 보다 상세한 정보등을 전달해줌

시그널핸들러는 응용프로그램에서 사전에 설정해두어야 하며 시그널이 발생되면
시그널 생성, 마스크 검사, 전송, 복귀처리를 한다.
시그널 핸들러 설정 -> do_sigaction 함수의 sighand 구조체 설정
시그널은 프로세스 혹은 프로세스 그룹에 대해 생성
실시간 시그널이 아니고 동일한 시그널이 생성되어 있을 경우엔 전송하지 않음
실제처리는 send_signal 함수가 수행
실시간 시그널일 경우 sigqueue 구조체를 확보해야 하는데 메모리가 부족하면 시그널이 생성되지 않을 수 있다. 하지만 sigaddset()의 비트 설정으로 끝나기 때문에 시그널은 생성된다.
그래서 SIGKILL이나 SIGSTOP이 송신될 수 있는 것이다.

시그널 마스크는 task_struct에 비트 설정/제거 로 수행
전송될 시그널이 있을 경우 TIF_SIGPENDING 플래그 설정

시그널 핸들러 종료 시 스택 상에 쌓인 주소로 처리 이동

+ Recent posts