글

[Bash] 배시 기본 {01}

참고문헌: Learning the bash shell. 캐머런 뉴햄, 빌 로젠블랫 저, 배장렬 역 O'Reilly, 한빛미디어 명령을 입력하면 몇 가지 이벤트 계층(event layer)이 발생하여 명령을 처리하지만 여기서는 최상위 계층인 셸(shell)만을 다룬다.  셸이란 운영체제의 사용자 인터페이스로서 사용자가 입력한 명령(command line)을 운영체제가 이해할 수 있는 명령(instructions)으로 바꾸고 운영체제가 처리한 결과를 사용자에게 돌려주는 일종의 프로그램이다. 셸 자체는 리눅스(유닉스)가 아니라 사용자 인터페이스이다. 유닉스는 사용자 인터페이스와 운영체제가 분리된 최초의 운영체제다. 자신의 셸이 무엇인지 확인하고 싶다면 다음을 입력한다. $ echo $SHELL 배시가 시스템의 어느 디렉토리에 있는지 알고 싶다면 다음을 입력한다. $ whereis bash --- TIP --- $ cd - // 이전 디렉토리로 돌아간다. ----------- ls 명령 duchess 파일이 있을 때 ls duchess를 치면 duchess만 표시된다. -l 옵션을 사용하면 해당 파일의 소유자, 크기, 마지막 수정 날짜와 같은 정보를 출력하고  -a 옵션을 사용하면 숨긴파일을 표시한다. 셸이 제공하는 와일드카드를 이용하면 특정 파일명을 한 번에 지정할 수 있다. ? : 문자 하나 * : 문자 여러 개 [set] : set에 있는 임의 문자 [!set] : set에 없는 임의 문자 set에는 문자 리스트 [abc] or [-_ ] or [!0-9]나 어떤 범위 [a-z]를 말한다. 느낌표 자체를 의미하고 싶으면 역슬래시를 입력한다.(\!) 대소문자를 섞어서 사용하는 것은 아무런 의미도 없다. [a-Z], [A-z]

[Network] Link-layer addressing & address resolution protocol (ARP)

이미지
네트워크를 공부한지 하도 오래되서 link-layer address를 어디에 쓰는건지 잊어버렸다.(link-layer address, link address, physical address, MAC address 다 같은 말이다.) Data communications and networking 5판의 9장을 참고하여 쓴다. 9.2 Link-Layer Addressing Internet 같은 connectionless internetwork의 경우에 datagram(packet)을 IP 주소만을 이용해서 보낼 수는 없다. Connectionless communication  is a data  transmission  method used in  packet switching  networks by which each data unit is individually addressed and routed based on information carried in each unit, rather than in the setup information of a prearranged, fixed data channel as in  connection-oriented communication  (wikipedia, connectionless communication, connectionless internetwork) 각 datagram은 같은 source와 destination으로 이동하더도 다른 path를 가지게 된다. datagram이 network layer에서 data-link layer로 가면 datagram이 frame으로 encapuslate되고 두 개의 data-link address가 frame header에 붙는다. 이 두 주소는 다른 링크로 갈 때 마다 바뀌게 된다. 아래 그림을 참고하자. datagram의 Link-layer 주소가 link1,...

[리눅스 커널] 리눅스 커널의 블록 디바이스 I/O 과정

리눅스 커널의 블록 디바이스 I/O 과정의 기본적인 흐름 사용자 프로세스 -> 표준 C 라이브러리 -> 시스템콜 인터페이스 -> 가상파일시스템 -> ext4 파일시스템 -> 블록 디바이스 드라이버 -> 블록 디바이스(디스크) 블록 디바이스 -> (인터럽트) -> 블록 디바이스 드라이버 -> ext4 파일시스템 -> ... 역순 1. 사용자 프로세스는 실행 도중 파일을 읽기 위해 fread()라는 표준 C 라이브러리 함수를 호출 2. 이 함수는 read() 시스템콜로 구현되어 있으므로 read() 시스템콜을 호출, 커널에 파일 읽기 동작을 요청 3. 소프트웨어 인터럽트(=시스템콜)가 발생해 커널에 진입하면 호출한 시스템콜 번호에 따라 해당 시스템콜 종류를 판별, 현재는 read() 시스템콜이므로 리눅스 커널의 가상 파일 시스템(Virtual File System, VFS)에 파일(디스크) 읽기 요청을 하게 된다. 4. VFS가 ext4 파일시스템에게 읽기 동작을 요청 5. ext4 파일시스템의 read() operation은 파일시스템 관련 처리를 한 뒤 블록 디바이스 드라이버에 읽기 요청 6. 읽기 요청 받은 블록 디바이스 드라이버는 읽을 파일에 해당하는 블록 디바이스의 블록 단위 데이터를 메모리로 읽어오려고 하드웨어를 제어. 따라서 현재 프로세스는 블록 디바이스의 I/O 동작을 완료하기 전까지 sleep하게 됨. 즉 현재 프로세스 상태를 대기 상태(wait state)로 변경하고 스케줄러를 호출해 다른 프로세스를 실행함 7. 하드디스크가 읽기 요청을 받으면 메모리에 있는 리눅스 커널의 캐시 영역에 요청받은 데이터를 전송. 블록 I/O 연산은 대부분 DMA로 이루어짐. 8. 데이터 전송 완료하면 인터럽트 발생시켜 디바이스 드라이버에게 읽기 동작이 끝났음을 알려줌 9. 디바이스 드라이버에 등록된 인터럽트 핸들러 실행 10. 인터럽트 핸들러가 읽기 동작을 완료하면 대기하던 프로세...

Xen overview

Reference: CPU scheduling for virtual desktop infrastructure, Hwanju Kim Task-aware Virtual Machine Scheduling for I/O Performance, Hwanju Kim, VEE'09 Running Xen, Matthews, Prentice hall Xen Overview Xen is an open-source hypervisor based on a paravirtualization technique, which achieves higher performance than full virtualization approaches. (Full virtualizatoin: allows a system to run many instructions directly on the raw ahrdware. It no longer must use software to simulate a different basic architecture.) Xen puts the priviledged VM, called domain0 , in charge of managing other guest VMs, called domainU . Xen also supports full virtualization based on hardware-assisted virtualization(Intel-VT and AMD-V), ensuring that it is possible to run unmodified OSes such as Windows. such a full-virtualized domain is called a hardware virtual machine (HVM) by Xen. The Xen Hypervisor The Xen hypervisor is the heart of Xen. It sits between the guest domains and the physica...

[리눅스 커널] 시스템 콜

이미지
reference : 리눅스 커널 심층 분석, 로버트 러브 지음, 황정동 옮김 시스템 콜 커널과 통신 시스템 콜은 하드웨어와 사용자 공간 프로세스 사이에 있는 계층이다. 이 계층은 다음과 같은 세 가지 역할을 한다. 첫째, 사용자 공간에 하드웨어 인터페이스를 추상화된 형태로 제공(파일 입출력 시 애플리케이션은 디스크나 저장 매체의 형식이나 파일시스템 형식 같은 것을 신경 쓸 필요가 없다. 둘째, 시스템 콜은 시스템 보안 및 안정성을 제공(커널이 시스템 자원과 사용자 공간 사이에서 중재자 역할을 하기 때문에, 커널이 접근권한과 같은 기준을 적용해 통제할 수 있다. 예를 들면, 하드웨어를 잘못 사용하거나 다른 프로세스의 자원을 빼았는 등의 동작을 막을 수 있다. 셋째, 사용자 공간(user-space)과 기타 시스템 사이에 계층을 둠으로써 프로세스별 가상 시스템 환경을 제공할 수 있다. 만약 애플리케이션이 아무런 제약없이 시스템 자원에 접근할 수 있다면 멀티태스킹이나 갓아 메모리를 구현하는 것은 거의 불가능에 가깝다. 리눅스의 시스템 콜은 사용자 공간에서 커널과 상호작용할 수 있는 유일한 수단이다. 트랩(trap)을 제외하면 시스템 콜은 정상적인 방법으로 커널로 진입하는 유일한 수단이다. 장치파일이나 /proc 파일시스템을 이용하는 다른 인터페이스도 결국은 시스템 호출을 통하게 되어 있다. APIs, POSIX, and the C Library 애플리케이션은 일반적으로 시스템 콜을 직접 사용하지 않고, 사용자 공간에 구현된 애플리케이션 프로그래밍 인터페이스(API, Application Programming Interface)를 이용한다. 이 때문에 애플리케이션이 사용하는 인터페이스와 커널이 제공하는 인터페이스 사이에 직접적인 연관이 없다는 점이 아주 중요하다. API는 애플리케이션이 사용하는 프로그래밍 인터페이스다. 이 인터페이스는 하나 또는 그 이상의 시스템 콜을 사용해 구현되며, 경우에 따라 시스템 콜을...

[리눅스 커널] 커널 자료구조

reference : 리눅스 커널 심층 분석, 로버트 러브 지음, 황정동 옮김 6장 커널 자료구조 1. 연결 리스트 연결 리스트는 노드라고 부르는 가변적인 개수의 데이터를 저장하고 관리하는 기능을 제공한다. 정적 배열과 달리 연결 리스트는 동적으로 데이터를 새엇ㅇ해 리스트에 추가할 수 있다. 그러므로 컴파일 시점에 미리 개수를 알 수 없는 데이터를 관리할 수 있다. 데이터가 한꺼번에 동시에 만들어지지 않으므로, 이 데이터는 인접한 메모리 공간에 모여 있지 않을 수 있다.따라서 데이터를 서로 연결시키는 방법이 있어야 하므로 리스트의 각 데이터에는 다음 데이터의 위치를 가리키는 next 포인터가 들어 있다. 리스트에 데이터를 추가하거나 삭제할 때는 다음 노드를 가리키는 포인터를 조정하면 된다. 단일 연결리스트와 이중 연결 리스트 연결 리스트를 나타내는 가장 단순한 자료구조의 형태는 다음과 같다. /* 연결 리스트의 데이터 항목 */ struct list_element {     void *data;                     /* 항목에 담긴 데이터(payload) */     struct list_element *next; /* 다음 항목을 가리키는 포인터 */ }; 이중 연결 리스트를 나타내는 자료구조의 형태는 다음과 같다. /* 연결 리스트의 데이터 항목 */ struct list_element {     void *data;                     /* 항목에 담긴 데이터(payload) */     struct list_element *next; /* 다음 항목을 가리키는 포인터 */     struct list_eleme...

[리눅스 시스템 프로그래밍] 6 세션과 프로세스 그룹

세션 시스템 호출 셸은 로그인 시점에 새로운 세션을 생성한다. 이러한 작업은 새로운 세션을 쉽게 생성하는 특수 시스템 호출을 사용해서 수행한다. #include <unistd.h> pid_t setsid (void); setsid()는 새로운 세션 내부에 새로운 프로세스 그룹을 생성하며, 호출한 프로세스를 세션과 프로세스 그룹 모두의 리더로 만든다.(새로운 세션에서 제어하는 tty가 없는 유일한 구성원이 된다.) 이는 데몬이나 셸에 유용한 특성이다. 데몬은 세션 구성원과 터미널 제어를 원하지 않으며, 셸은 사용자가 로그인할 때마다 새로운 세션 생성을 원하기 때문이다. 여기서 tty는 유닉스 전문 용어로  tty 는 단순히 읽기와 쓰기를 넘어 몇 가지 추가적인 명령어를 지원하는 디바이스 파일을 뜻합니다. 그리고  터미널 은 사실상 이 tty와 동일한 의미로 사용됩니다. 일부 tty는 하드웨어 디바이스를 위해 커널이 제공하며 그 예로 키보드에서 들어오는 입력과 텍스트 모드 화면으로 나가는 출력, 시리얼 라인을 통해 전송되는 입출력이 있습니다. 그 외의 tty는 씬 커널 레이어를 통해 터미널 에뮬레이터라고 불리는 프로그램으로 제공되며 이런 tty를 pseudo-tty 로 부르기도 합니다. 터미널 에뮬레이터로는 Xterm(X 윈도우 시스템), Screen(프로그램과 다른 터미널 사이에 독립적인 계층을 제공), SSH(한 머신에서 프로그램으로 다른 머신의 터미널에 연결), Expect(스크립팅 터미널 인터랙션용) 등이 있습니다. http://www.myservlab.com/144 성공하면 setsid()는 새롭게 생성된 세션의 세션 ID를 반환한다. 실패하면 호출은 -1을 반환하며 유일하게 가능한 errno 코드는 EPERM이다.(프로세스가 현재 프로세스 그룹 리더라는 사실을 알려준다.) 특정 프로세스가 프로세스 그룹 리더가 되지 않도록 만드는 확실한 방법은 fork이며,  부모 프로세스가 종료된 다음에 자식 프로...