반응형

리눅스에서 작업을 하다보면  명령어 사용법을 몰라서 당황할 때가 있는데... 이때 사용하면 좋은 명령어가 바로 man 입니다.

 

man은 윈도우에서 보면 help(F1 key)와 같습니다. 모르는 명령어의 다양한 옵션과 사용예제가 나옵니다.

 

그렇지만, man을 보다 잘 사용하면 더 쉽게 많은 일을 할 수 있어서 사용법에 대한 설명을 드리도록 하겠습니다

 

man 명령어에는 Section이라는 개념이 존재합니다.

 

전통적으로 유닉스에서는 총 8권으로 구성되어 있으며  리눅스의 메뉴얼은 9권으로 구성되어 있습니다. 이에 따라 man의 Section으로 구성되었습니다.

 

  섹션번호

 섹션설명

 1

 실행 가능한 프로그램 또는 쉘 명령

 2

 시스템 호출 (System call)

 3

 라이브러리 호출 (프로그램에 포함된 함수들)

 4

 특별한 파일 (주로 /dev에 포함된 디바이스 파일들)

 5

 File Format 및 규칙 (/etc/passwd 같은 파일)

 6

 게임

 7

 기타 (매크로 패키지나 규약 같은 내용)

 8

 시스템 관리자를 위한 명령 (보통은 root 사용자를 위함)

 9

 커널 루틴 (표준 아님)

 

CUI(터미널)환경에서 유닉스 및 리눅스 환경에서 프로그램, 함수, API, 특수 파일 같이 운영체제의 전반적인 내용을 다 담고 있다. 인터넷이 지원되지 않더라도 API 함수의 사용법, 파라메터 같은 세세한 내용이 담겨 있기 때문에 유용하다.

그리고 혹시 버전별로 사용법이 다른 명령어가 있을 경우, 맨 페이지는 현재 시스템에 설치된 바로 그 버전의 문서를 제공하기 때문에 현재 설치된 버전에 맞는 옵션 조합을 찾아내고자 할 때는 맨 페이지가 유용하다.

일단 가장 쉬운 printf 등으로 시작하여, 점점 복잡한 함수들을 찾아 보는 형태로 접근하도록 하자. 당신의 프로그래밍 능력을 확실히 향상시켜 줄 것이다. 아 물론 프로그래밍을 이제 입문하는 사람은 맨 페이지보다는 책이 낫다.


단점


MSDN 생각하고 맨 페이지 열람하다간 멘탈이 나갈 수 있다.

검색이 자유롭지 않다. 또한 모든 게 고정폭 터미널 텍스트로 표기되고 색상도 단색이라 UI가 썩 좋지 않다. 그래서 요즘은 구글 검색으로 사용법을 찾아보는 게 더 편하다. 

그리고 모든 명령어가 맨 페이지를 제공하는 게 아니다. 서드 파티 명령어들은 아예 구글 검색으로만 매뉴얼을 열람할 수 있는 경우가 종종 있다.[4] info 명령이 이 경우에 도움이 될 수는 있지만 구글검색으로 찾아내는 정보에는 예제가 포함된 경우가 많기 때문에 명령어를 처음 사용하는 경우에는 맨 페이지는 썩 좋은 선택은 아니다. 대체적인 사용법은 아는데 몇몇 옵션이 기억나지 않을 때 빠르게 열람하는 용도가 가장 적절하다.

반응형
반응형

vim을 리눅스 환경에서 사용하게 되면 여러모로 불편한 점이 많습니다.

 

처음에는 이런환경에서 어떻게 작업을 해야 되나 막막하기도 한데 설정파일을 사용하면 보다 vim환경을 예쁘고 아름답게 사용할 수 있습니다.

 

실제로 많은 설정이 있고 사용하는 많은 방법이 있지만 저는 제가 주로 사용하는 설정값을 바탕으로 예시를 들었습니다. 설정파일의 위치는 "~/.vimrc" 입니다

 

set shiftwidth=2             ">>나 << 사용시 들여쓰기 간격을 지정합니다.
set visualbell               "사용자실수를 경고할때 비쥬얼 벨을 사용함                 
set nobackup                 "백업 파일을 생성하지 않음
set cindent                  "C스타일의 들여쓰기를
set ruler                    "커서의 위치를 표시함사용함
set autoindent               "자동들여쓰기를 사용
set smartindent              "지능적인 들여쓰기 사용
set incsearch                "키워드를 입력할때 마다 검색하는 점진 검색을 사용
set ruler                    "커서의 위치를 표시함
set showcmd                  "화면마지막 라인에 커맨드 표시
set backspace=2              "삽입모드에서 백스페이스를 계속 허용
set wrapscan                 "찾기에서 파일의 맨끝에 이르면 처음부터 다시 찾음
set title                    "타이틀 바에 현재 편집중인 파일을 표시
set number                   "줄번호표시
set ts=2                     "tab 키를 스패이스바 2개로 구분     
syntax on                    "구문강조기능 사용
filetype on                  "파일종류에 따라 구문을 강조
set background=dark          "배경색을 어두운 색으로
colorscheme evening          "색상테마를 evning으로
set history=1000             "편집기록을 1000개 등록
set hlsearch                 "검색어 기능 강조
set ignorecase               "검색시 대/소문자 구분 없음
set showmatch                "닫는 괄호를 입력할 때
set novisualbell             "화면깜박거리지 않기
set backspace=indent,eol,start  "줄의 끝, 시작, 들여쓰기에서 백스페이스를 사용하면 이전줄과 연결

"################### 단축키 설정 ####################"
"파일 버터간 이동 "
map ,1 :b!1<cr>
map ,2 :b!2<cr>
map ,3 :b!3<cr>
map ,4 :b!4<cr>
map ,5 :b!5<cr>
map ,6 :b!6<cr>
map ,7 :b!7<cr>
map ,8 :b!8<cr>
map ,9 :b!9<cr>
map ,0 :b!0<cr>
map ,w :bw <cr>

"F2 == 폴딩하기  "
map <F2>  z]}zf

"F3 == 저장 "
map <F3> : w! <CR>
map <F3> <ESC> <F3>

"F4 == 탭열기, Ctrl+h,l로 탭이동 "
map <F4> : tabnew<CR>
map <C-h> gT
map <C-l> gt

"F5 == 컴파일 후 결과보기 / 오류난 라인으로 이동
map <F5> : w<cr> :make<cr> :ccl<cr> :cw<cr>

"F6 == Taglist 열기
map <F6> : TlistToggle<CR>

"F7 == 태그리스트 넘어 다니기
map <F7> <c-w> <c-w>

"F8 == 디렉토리 목록 열기
map <F8> : NERDTree<CR>

"F12 == 저장후 종료
map <F12> : wq! <CR>
map <F12> <ESC> <F12>


"=============== ctags 설정 ================"
set tags=./tags,../tags,../../tags,/usr/src/linux/tags
"세부 코드 보여주기 "
if version >= 500
func! Sts()
 let st = expand("<cword>")
 exe "sts ".st
endfunc 
nmap ,st :call Sts() <CR>

func! Tj()
 let st = expand("<cword>")
 exe "tj ".st
nmap ,tj :call Tj() <CR>
endfunc
endif

"=============== cscope 설정 ================"
"set csprg=/usr/bin/cscope
"set csto=0
"set cst
"set nocsverb

if filereadable("./cscope.out")
 cs add cscope.out
else
 cs add /usr/src/linux/cscope.out
endif
set csverb

func! Css()
 let css = expand("<cword>")
 new
 exe "cs find s ".css
 if getline(1) = ""
   exe"q!"
 endif
endfunc
nmap ,css :call Css()<cr>

func! Csc()
 let css = expand("<cword>")
 new
 exe "cs find c ".csc
 if getline(1) = ""
   exe"q!"
 endif
endfunc
nmap ,csc :call Csc()<cr>

func! Csd()
 let csd = expand("<cword>")
 new
 exe "cs find d ".csd
 if getline(1) = ""
   exe"q!"
 endif
endfunc
nmap ,csd :call Csd()<cr>

func! Csg()
 let csg = expand("<cword>")
 new
 exe "cs find g ".csg
 if getline(1) = ""
   exe"q!"
 endif
endfunc
nmap ,csg :call Csg()<cr>

 

"============== Man page 설정 ==============="
func! Man()
 let sm = expand("<cword>")
 exe "!man -S 2:3:4:5:6:7:8:9:tcl:n:l:p:o ".sm
endfunc
nmap ,ma :call Man()<cr><cr>

 

"############### taglist ##########################"
let Tlist_Display_Tag_Scope = 1 "태그 범위를 표시합니다
let Tlist_Display_Prototype = 1 "함수의 원형을 표시합니다
let Tlist_Sort_Type="name"      "태그리스트를 이름 순서로 표시합니다. 

 

 

반응형
반응형

선점과 컨텍스트 전환

 

실행중인 한 작업에서 다른 작업으로 전환하는 것을 뜻하는 컨텍스트 전환 (Context-Switching)은 kernel/sched.c에 정의된 context_switch() 함수를 통해 처리     

 

context_switch() 함수

  1. <asm/mmu_context.h>에 정의된 switch_mm() 함수를 호출해 프로세스의 가상 메모리 매핑(virtual memory mapping)을 새 프로세스의 것으로 바꾼다
  2. <asm/system.h>에 정의된 switch_to() 함수를 호출해 이전 프로세스의 프로세서 상태를 현재 프로세스의 프로세서 상태를 바꾸고 이과정에서 프로세서 단위로 관리가 필요한 스택정보, 프로세서 레지스터 등의 특정 하드웨어 관련 정보를 저장하고 복원하는 일이 포함

※ 커널은 언제 schedule()함수를 호출할 것인가를 알고 있어야 한다.

※ 만일 코드에 명시된 경우에만 schedule()함수를 호출한다면, 사용자 프로그램이 영원히 실행 될 수 도 있다.

 

선점(preemption)

 

유저 선점 : 커널이 사용자 공간으로 돌아가는 순간 need_resched

  플래그가 설정되어 있어 스케줄러가 호출되면 발생한다

  따라서, 커널은 인터럽트 처리를 끝내거나 시스템 호출을 마치고

  사용자 공간으로 돌아갈 때마다 need_resched 값을 확인

 

  < 유저 선점 발생 조건> 

-시스템 호출에서 사용자 공간으로 돌아갈 때
-인터럽트 처리를 끝내고 사용자 공간으로 돌아갈 때

 

커널 선점 : 리눅스 커널은 완벽한 선점형 커널

  실행중인 작업이 잠금을 설정하고 있지 않은 상태라면 커널은 선점

  -> 선점 불가능한 영역을 표시 하는데 잠금을 사용

 

  < 커널 선점 발생 조건>    

-인터럽트 처리를 마치고 커널 공간으로 돌아갈 때
-커널 코드가 다시 선점 가능한 상태가 되었을 때
-커널 내부 작업이 명시적으로 schedule() 함수를 호출
-커널 내부 작업이 중단돼 대기 상태일 때
·schedule() 함수를 호출하게 되는 경우
반응형
반응형

윈도우즈에서 작업한 파일을 리눅스에서 열 경우 라인 끝마다 ^M 문자가 들어간 것을 볼 수 있다.

이유는 리눅스와 윈도우에서 사용하는 개행문자가 다르기 때문에 이런 경우가 종종 발생한다.

 

특히, 쉘스크립트를 실행하게 되면

 

^M : bad interpreter : No such file or directory

메시지만 보이면서 제대로 실행이 되지 않는 경우가 있습니다.

 

이럴 경우에는 ^M 문자만 제거 해주면 간단하게 해결이 됩니다.

 ^M을 없애는 방법은 간단하다.

 

vi 에디터를 열고,


:%s/^M//g

(^M은 단순 텍스트 입력이 아닌 Ctrl + v + m으로 입력하여야 한다.)


이렇게 명령어를 날려주면 된다.



반응형
반응형

휴면 & 깨어남

 

  1. 휴면(Sleep)중이거나 대기(Blocked) 상태인 작업은 실행 불가능한 상태이다.
  2. 어떤 작업이 휴면 상태가 되는데는 여러가지 유이가 있지만 결국 특정 조건이 발생하는 것을 기다리는 상황으로 요약
  3. 이 조건은 일정시간이 지나는 거 일수도 파일 입출력으로 데이터를 읽어 들인 경우나 다른 하드웨어 이벤트가 발생한 경우, 사용중인 커널의 세미포어를 얻으려는 경우에 대기상태가 됨

 

대기열(Wait queues)

  • 특정 조건이 일어나기를 기다리는 단순한 프로세스 목록
  • 커널에서 wake_queue_head_t 형으로 표현
  • DECLARE_WAITQUEUE()를 이용해 정적을 생성하거나 init_waitqueue_head()함수를 이용해 동적으로 생성
  • 대기열과 과련된 조건이 발생하면 해당 대기열에 있는 프로세스를 깨우게 된다.
  • 휴면과 깨우기 작업을 올바로 구현하지 못하면 경쟁 조건 (Race Condition)이 발생한다.

 

휴면 처리작업

  1. DEFINE_WAIT() 매크로를 이용해 대기열에 추가할 항목 선택
  2. add_wait_queue() 함수를 이용해 작업을 대기열에 추가한다. 대기열이 기다리고 있는 조건이 발생하면 대기열에 있는 프로세스를 깨운다. 조건이 발생했을 때 대기열의 wake_up 함수를 호출하는 코드가 있어야 한다.
  3. prepare_to_wait() 함수를 호출해 프로세스 상태를 TASK_(UN)INTERRUPTIBLE 상태로 바꾸고 필요할 경우 작업을 다시 대기열에 넣어 루프의 후속 작업이 진행 될 수 있게 하다.
  4. 작업상태가 TAKS_INTERRUPTIBLE이면  시그널에 의해 프로세스가 깨어날 수 있으며 이럴 경우 의사각성(spurious wake up)이라고 함고 깨어나서 시그널을 확인하고 적.절히 처리한다
  5. 작업이 깨어 나면 조건이 만족되었는지 확인하고 만족됐으면 루프를 벗어나고 그렇지 않다면 schedule()을 호출해 앞의 과정을 반복
  6. 조건이 만족되면 작업 상태를 TASK_RUNNING으로 변경하고 finish_wait()함수를 호출해 대기열에서 작업을 제거

작업이 휴면상태가 되기전에 조건이 발생하면 루프가 종료되므로 작업 휴면상태가 되는 경우는 발생하지 않는다. 루프 안에 여러가지 많은 작업을 처리하는 커널 코드가 있음을 주의 해야 한다.

 

 

깨어남 (wake up)

  • 작업을 깨우는 일은 wake_up() 함수를 통해 처리
  • 주어진 대기열에 있는 모든 작업을 깨움
  • try_to_watke_up() 함수를 호출해 작업상태를 TASK_RUNNING 변경
  • enqueue_task() 함수를 호출해 작업을 다시 레드블랙트리에 추가
  • 깨어난 작업의 우선순위가 지금 실행 중인 작업의 우선순위보다 높으면 need_resched 값을 설정

 

반응형
반응형

지난번에 이어 HBA와 RAID카드를 알아보는 시간을 갖도록 하겠습니다.

처음에 설명 했듯이 HBA와 RAID 카드는 많은 유사점이 있지만 차이점도 존재합니다. 먼저 그전에 HBA와 RAID카드의 시스템적인 구성을 추가로 설명하도록 하겠습니다

 

 

위에 그림에서 보는 것과 같이 RAID와 HBA는 PCI 슬롯에 장착이 되고 내부적으로는 I/O 프로세서와 캐쉬, 컨트롤러를 포함하게 됩니다. 여기서 보이는 바와 같이 HBA의 성능 프로세서와 캐쉬, 컨트롤러로 가격의 차이가 결정나게 됩니다.

 

HBA는 정확하게 말하면 스토리지와 관리하는 카드를 의미하고 그중에서 RAID를 지원해주는 카드를 RAID 카드라고 의미 할 수 있습니다. 통상적으로 HBA > RAID의 의미라고 볼 수 있습니다.

 

추가적으로 JBOD에 대해 알아보겠습니다. JBOD란  RAID용으로 구성되어 있지 않은 컴퓨터 하드디스크를 다소 낮추어 부르는 용어이며, 이를 가리키는 원래의 용어는 "spanning"이다.

 

RAID 시스템은 동일한 데이터를 여러 개의 디스크에 중복 저장하면서도, 운영체계에는 하나의 단일 디스크로 인식시킴으로써, 내고장성의 증가와 데이터 접근 효율성을 높여준다. JBOD도 역시 여러 개의 디스크를 하나의 디스크로 보이게 해 주긴 하지만, 이는 여러 개의 디스크를 논리적인 하나의 커다란 디스크로 결합해주는 것일 뿐, 각각의 디스크를 독립적으로 사용하는 것에 비해 어떠한 장점도 제공하지 않습니다.

 

 

반응형

'인프라 구축 기술' 카테고리의 다른 글

SSD 와 HDD  (0) 2019.09.16
VIP (Virtual IP)란 ??  (0) 2017.12.06
RAID 와 HBA 카드 (1)  (0) 2017.11.07
메모리의 종류 (UDIMM, RDIMM, RLDIMM, NVDIMM)  (0) 2017.10.23
Xeon(제온) CPU는 ??  (0) 2017.10.21

+ Recent posts