출처: https://typemin.tistory.com/7 [TypeLOG:티스토리]

전 페이지에서 다루었듯이 운영체제는 자원을 관리하고 자원을 보호한다. 그리고 사용자가 응용프로그램이 컴퓨터 자원을 쉽게사용 할 수 있는 인터페이스를 제공한다.

또 운영체제의 핵심이라고 말할수 있는 커널이 있다고 하였다.

운영체제 구조

위 그림에서 운영체제는 크게 2가지로 나누어 지는데 인터페이스 커널이다.

인터페이스


커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할

우선 인터페이스란 서로다른 두 시스템을 연결해주는 것을 말한다. 인터페이스의 종류를 보면 여러가지가 있는데

명령 인터프리터

명령 인터프리터를 예를 들자면 window에 터미널 , macOS bash를 들수 있겠다. 예전에 친구들과 게임을 하면서 terminal에 ipconfig를 작성해본 기억이 있을것이다.
또 macOs에서 rm -rf (삭제) 와 같은 명령을 실행해본적도 있을것이다.

그래픽 사용자 인터페이스

작업관리자 등이 있다.

커널


운영체제 구성요소 중 항상 메모리(RAM)에 올라가 있는 운영체제의 핵심 부분으로써 하드웨어와 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할

커널이 하는일


  • 프로세스 관리 : 프로세스에 CPU를 배분하고 작업에 필요한 제반 환경을 제공한다.
  • 메모리 관리 : 프로세스에 작업 공간을 배치하고 실제 메모리보다 큰 가상공간을 제공한다.
  • 파일 시스템 관리 : 데이터를 저장하고 접근할 수 있는 인터페이스를 제공한다.
  • 입출력 관리 : 필요한 입력과 출력 서비스를 제공한다.
  • 프로세스 간 통신 관리 : 공동 작업을 위한 각 프로세스 간 통신 환경을 지원한다.

커널의 구성


단일형 구조 커널

초창기의 운영체제 구조였다. 커널의 핵심 기능을 구현하는 모듈들이 구분없이 하나로 구성되어있는 구조이다.

모듈 간의 통신 비용이 줄어들어 효율적인 운영이 가능하지만 , 모듈이 묶여 있어 아래와 같은 문제점들이 생겼다.

  • 모든 모듈이 하나로 묶여 있기 때문에 버그나 오류를 처리하기가 어려움
  • 운영체제의 여러 기능이 서로 연결되어 있어 상호 의존성이 높기 때문에 기능상의 작은 결함이 시스템 전체로 확산될 수 있음
  • 다양한 환경의 시스템에 적용하기 어려움

마이크로 구조 커널

  • 프로세스 관리, 메모리 관리, 프로세스 간 통신 관리 등 가장 기본적인 기능만 제공
  • 커널의 각 모듈은 세분화되어 존재하고 모듈 간의 정보 교환은 프로세스 간 통신을 이용하여 이루어짐

시스템 호출


커널이 자신을 보호하기 위해 만든 인터페이스다. 커널은 사용자나 응용 프로그램으로 부터 컴퓨터 자원을 보호하기위해 자원에 직접 접근하는 것을 차단한다.

만약 직접 접근 을 하게 된다면 ? 응용 프로그램이 원하는 위치에 데이터 저장(충돌)이 있을것이고, 하나의 응용프로그램이 다른 응용프로그램이 사용중인 데이터를 삭제가 가능할것 이다.

그래서 시스템 호출은 커널이 제공하는 시스템 자원의 사용과 연관된 함수이다. 이러한 인터페이스(규칙)이 있기 때문에 응용프로그램이 하드웨어 자원에 접근하거나 서비스를 이용할때는 시스템 호출을 사용해야된다.

❓ 그러면 커널에 시스템호출을 하지않고 접근해서 자원을 건드릴수있다면 어떻게 될까 ?

이러한 이유때문에 운영체제는 커널이 제공하는 서비스를 시스템 호출로 제한하고 다른 방법으로 커널에 접근하는것을 막음으로써 보호한다.

드라이버


커널과 하드웨어의 인터페이스다.

  • 디바이스 드라이버라고도 불림
    • 마우스, 키보드 드라이버
    • 그래픽 카드 드라이버 등..

 

보안해야될 내용이거나 틀린내용이 있다면 지적해주시면 공부하는데 많은 도움이 될거같습니다. 지적은 항상 감사합니다

 

 

반응형

'Programming > CS' 카테고리의 다른 글

운영체제란 ?  (0) 2023.04.19

우선 개발자스럽게 코딩을 하려면 마우스에 손이 안가야(?) 된다(?)

우선 내가 사용하는 있는 환경은 IDEA(Intellij) 이다. Vim을 사용하면 마우스를 사용하지 않고 코딩을 할수있게 되는데 이에 관련된 설정을 공유하고자 한다.

VIM의 장점을 설명하자면 진짜 익숙해지면 마우스 못쓴다. 온갖 핑계를 대면서 다른환경에서도 VIM을 깔고있는 자신을 보게된다.(이것만으로 장점을 설명해준거 같다.)

설치


우선 IDEA Plugin에 들어가서 VIM을 검색해 IDeaVim을 설치한다.
여기서 필자는 밑에 Extension이라는 것을 추가로 설치하였는데. esc키를 눌렀을때 자동으로 영어로 바꿔준다. (설정이 필요함 아래에서 설명)

노말모드 (움직이는 모드) 영어로만 유지하는 설정

let keep_input_source_in_normal=ABC
set keep-english-in-normal

사용법


우선 VIM에대한 설명은 다른 블로그에서도 많이 찾아볼수 있기 때문에 추가로 설명하지는 않을것이다.

아래는 intellij에서 ideaVim을 사용할때 추가로 설정해줄수 있는 것인데

밑에 V모양을 클릭하여 이동한다.

위에 스크린샷을 따라가면 설정을 할수있다. 

"" Source your .vimrc
"source ~/.vimrc

" english auto change
let keep_input_source_in_normal=ABC
set keep-english-in-normal
" set keep-english-in-normal-and-restore-in-insert

let mapleader=" " "스페이스바로 leader키를 사용할수있게한다.
set ignorecase
set smartcase
set visualbell
set number relativenumber 
" set noerrorbells
set expandtab
set autoindent
set hlsearch
set incsearch
set ideajoin
set mouse=a
set idearefactormode=keep
set mousefocus
set scollfocus
set scrolloff=3
set highlightedyank

" 3 lines above/below cursor when scrolling
set NERDTree
" set surround
set multiple-cursors
" set easymotion 
" set quickscope


" essential
noremap H ^ "이부분은 초보자세팅을하면 삭제해야됩니다.
noremap L $ "이부분은 초보자세팅을 사용하면 삭제해야합니다.
" toggle sidebar
nmap <C-e> :NERDTreeFocus<cr>

" These create newlines like o and O but stay in normal mode

" zen mode
noremap <leader>kz :action ToggleZenMode<CR>

" Quit visual mode
" nnoremap k kzz "커서가 중간에 위치하게한다.
" nnoremap j jzz "위와 동일
nnoremap <leader>y "+y "운영체제에 clipboard에 카피한다.
nnoremap <leader>p "+p "운영체제에 clipboard를 paste한다.
vnoremap <leader>y "+y
nnoremap Y y$
vnoremap v <Esc>
nnoremap <esc> :noh<cr>:w<cr><esc> "esc 키를 누르면 저장과 하이라이트된 단어를 취소시킨다.
inoremap <Esc> <Esc>:w<CR>
" nnoremap jk :noh<cr>:w<cr><esc>
inoremap jk <esc>:w<CR>
inoremap ㅓㅏ <esc>:w<CR>
" nnoremap ㅓㅏ :noh<cr>:w<cr><esc>
" Tab operation
nnoremap <leader>l gt "열려 있는 파일을 이동한다.
nnoremap <leader>h gT "열려 있는 파일을 이동한다.

" mehotd up
nmap [[ <Action>(MethodUp)
nmap ]] <Action>(MethodDown)

" goto Error and Declaration 이것들은 거의 필수와 마찬가지다 정의된 코드로 이동하는 명령어다."
nmap gb <Action>(Back)
nmap gD <Action>(GotoTypeDeclaration)
nmap gf <Action>(Forward)
nmap gl <Action>(QuickJavaDoc)
nmap gL <Action>(QuickImplementations)
nmap gy <Action>(ShowErrorDescription)
nmap gn <Action>(GotoNextError)
nmap gp <Action>(GotoPreviousError)
nmap <TAB> <Action>(GotoNextError)
nmap <S-TAB> <Action>(GotoPreviousError)

"Editor indent" 
nmap > <S-v>:action EditorIndentSelection<cr>
nmap < <S-v>:action EditorUnindentSelection<cr>
vmap > <Action>(EditorIndentSelection)
vmap < <Action>(EditorUnindentSelection)

" moving row"
nnoremap <C-j> :m +1<CR> 
nnoremap <C-k> :m -2<CR>
inoremap <C-j> <Esc>:m +1<CR>gi
inoremap <C-k> <Esc>:m -2<CR>gi
vnoremap <C-j> :action MoveStatementDown<CR>
vnoremap <C-k> :action MoveStatementUp<CR>


" Refactorings
map <leader>t <Action>(Refactorings.QuickListPopupAction)
map Tr <Action>(RenameElement)
" SurroundWith
map Ts <Action>(SurroundWith)
" VSC Popup
nmap Tv <Action>(Vcs.QuickListPopupAction)
" Inspectiom
nmap Ti <Action>(InspectCode)
map Ta <Action>(AnalyzeActionsPopup)
nmap To <Action>(OptimiziImports)

" Closing tabs
nmap <leader>q :action CloseContent<cr>
nmap <leader>Q :action CloseAllEditorsButActive<cr>

" edit ideavim config
nnoremap <leader>vv :e ~/.ideavimrc<CR>
nnoremap <leader>vr :source ~/.ideavimrc<CR>

" code Run & Debug
nmap <leader>r :action Run<cr>
nmap <leader>d :Debug<cr>

" Navigation
nmap <leader>L :action RecentLocations<cr>
" nmap <leader>g :action GotoDeclaration<cr>
nmap <leader>i :action GotoImplementation<cr>
nmap <leader>u :action FindUsages<cr>
nmap <leader>f :action GotoFile<cr>
nmap <leader>c :action GotoClass<cr>
nmap <leader>s :action GotoSymbol<cr>
nmap <leader>; :action FileStructurePopup<cr>
nmap <leader>I :action SelectIn<cr>
nmap <leader>e :action RecentFiles<cr>
nmap <leader>b :action ShowBookmarks<cr>
nmap <C-Enter> :action Generate<cr>
imap <C-Enter> :action Generate<cr>


" multi Cursor
map <C-N>  <A-N>
map <C-P>  <A-P>
map <C-X>  <A-X>

map g<C-N> <Action>(SelectAllOccurrences)

입문자들을 위한 추천세팅

원래 VIM은 hjkl키로 이동을 할수있다. 하지만 익숙치 않으면 이게 더 복잡하고 어렵다. 

이 설정을 하면 이렇게 움직일수 있다 (호호)

이것을 설정으로 보통 키보드의 방향키와 비슷하게 바꿀수있다. 하지만 조금 달라지는부분이 있어 숙지하고 넘어가야 나중에 viw등을 봤을때 헷갈리지 않고 사용할수있다.

"아래의 코드를 에세셜에 넣어주면 ijkl로 매핑을해 사용할수있다.
noremap j h
noremap i k
noremap k j
noremap h i
noremap J ^
noremap L $
noremap H I

" 맨위 이동 맨 아래 이동
nmap I gg
nmap K G 
vmap I gg
vmap K G

중요 !!

원래 VIM에서 Insert모드에 들어가기위해선 i를 사용한다.

우리가한매핑방식은 i키를 움직이는 키로 변경했기 때문에 해당 i를 대체할 키가 필요한데 이 설정파일에서는 i 를 h 로 변경하였다.

그래서 나중에 viw(단어선택) diw(단어삭제) 를 하기위해선 i 가 h 로 바뀐걸 인식하고 vhw, dhw로 사용하여야 한다.

카카오 가고싶다..

반응형

'개발환경' 카테고리의 다른 글

m1 vscode C/Cpp 개발환경 구축(debug 터미널 포함)  (0) 2022.01.21

프론트 컨트롤러 패턴은 중앙 집중형 컨트롤러를 프레젠테이션 계층의 제일 앞에 둬서 서버로 들어오는 모든 요청을먼저 받아서 처리하게 만든다

사실 프론트 컨트롤러가 받기전에 Filter가 먼저 받긴하는거 같다.

예전 방식의 서블릿들은 클라이언트가 요청을 보내면 서블릿컨테이너가 서블릿을 찾아 매핑해줘 결과를 리턴해준다.

하지만 이 방식은 단점이 아래와 같다.

  • 서블릿이 많아지고 web.xml에 작성해야되는 매핑코드가 많아지면서 유지보수가 어려워진다.
  • 서블릿들은 웹 기술의 종속적이게 되면서 안좋아진다.
  • 서블릿들은 각각의 진입점을 갖기때문에 중복되는 코드를 막을수가 없다.

그래서 해당 일들을 해주는 프론트 컨트롤러 패턴을 고안해냈다(선배 개발자들이) 프론트 컨트롤러 패턴을 하면 좋은점은 웹환경에 종속적이지 않고 순수한 JAVA POJO코드로 컨트롤러를 만들수 있다 . (이는 곧 서블릿이 아니여도 된다는 소리와 같다.)

DispatcherServlet


스프링은 프론트 컨트롤러가 있는데 이것은 DispatcherServlet이라고 한다.

해당 프론트 컨트롤러가 하는 일은 아래와 같다.

  1. 요청을 분석한다.
  2. 핸들러 매핑에게 위임하여 요청을 처리할 핸들러를 찾는다.
  3. 해당 핸들러(컨트롤러)를 실행할수 있는 핸들러 어댑터를 찾는다.
  4. 찾아낸 핸들러 어댑터를 사용해서 컨트롤러로 요청과 응답을 처리한다.
  5. DispatcherServlet은 ViewResolver를 통해 View를 생성한다.
  6. DispatcherSerlvet은 View를 통해 요청결과를 생성 및 반환한다. 
  7. 부가적으로 컨트롤러 실행중에 예외가 발생했다면, 예외처리 핸들러에게 요청처리를 위임한다.

핸들러 매핑


핸들러 매핑은 HTTP 요청정보를 이용해서 이를 처리할 핸들러 오브젝트, 즉 컨트롤러를 찾아주는 기능을 가진 DispatcherServlet의 전략이다.

핸들러 매핑은 컨트롤러의 타입과는 상관없다. 하나의 핸들러 매핑 전략이 여러가지 타입의 컨트롤러를 선택할 수 있다는 뜻이다. (이와 관련된 내용은 핸들러 어댑터에서 다루겠다)

핸들러 인터셉터


핸들러 매핑의 역할은 기본적으로 URL과 요청정보로부터 컨트롤러 빈을 찾아주는 것이다. 한 가지 더 중요한 기능중 핸들러 인터셉터는 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터 역할인 인터셉터의 실행 체인을 돌려준다.

핸들러 어댑터


dispatcherServlet이 가지는 무한한 확장성의 비결

핸들러 매핑이 끝났다면 DispatcherServlet이 어떤 컨트롤러의 메소드를 실행할지 알고있어야 한다. 그렇다면 dispatcherServlet은 호출 가능한 컨트롤러는 특정 인터페이스를 구현해야 한다는 식의 규약을 따라서 작성해야 할까?

그건 아니다. 핸들러 어댑터를 이용하면 된다. 전형적인 오브젝트 어댑터 패턴을 사용해서, 특정 컨트롤러를 호출해야 할때는 해당 컨트롤러 타입을 지원하는 어댑터를 중간에 껴서 호출하는것이다. 그러면 항상 일정한 방식으로 컨트롤러를 호출하고 결과를 받을수 있다.

뷰 리졸버


컨트롤러가 어떤 식으로든 다시 DispatcherServlet에 돌려줘야할 두가지 정보가 있는데 그중 하나가 모델이고 하나가 뷰다. 컨트롤러가 직접 뷰 오브젝트를 리턴할수 있지만, 보통은 DispatcherServlet의 전략이 viewResolver를 통해 뷰 오브젝트를 리턴해준다.

이렇게 되면 View는 어떤 모델을 받아서 Table로 보여주든 Excel로 보여주든 html로 보여주든 자기 입맛대로 할수있다.

핸들러 예외 리졸버


컨트롤러의 작업 중에 발생한 예외를 어떻게 처리할지 결정하는 전략이다.

web.xml에 를 지정해서 에러 안내페이지를 보여줄 수도 있다. 그런데 핸들러 예외 리졸버가 등록되어 있다면 DispatcherServlet은 먼저 예외 리졸버에게 해당 예외를 처리 할수 있는지 확인한다. 핸들러 예외 리졸버가 있다면 예외는 DispatcherServlet 밖으로 던지지 않고 해당 핸들러 예외 리졸버가 처리한다.

 

작성하면서 정리를 하는데도 아직도 혼란스럽습니다.. 혹시 지적해줄곳이 있으시면 꼭 댓글로 알려주시면 감사하겠습니다.

반응형

🍀 운영체제와 컴퓨터


운영체제 : 컴퓨터의 구성요소, 자원을 관리 및 운영하는 시스템소프트웨어의 구조 및 기능
쉬운말로 정의하자면 사용자나 응용 프로그램이 컴퓨터 자원을 쉽게 사용할 수 있는 인터페이스를 제공하여 컴퓨터 자원을 보호하고 자원을 사용, 결과를 돌려주는 시스템 소프트웨어이다.

운영체제의 정의


  • 자원 관리
    • 사용자는 자원을 직접 접근 불가능하게 만들어서 자원을 보호한다.
    • 인터페이스 환경 제공
  • 컴퓨터의 성능 향상
    • 보안 업데이트 등
  • 운영체제는 관리자(supervisor)
    • 실행중인 프로그램 관리, 메모리 관리, 파일과 디스크 장치 관리, 입출력 장치 관리, 사용자 계정 등
  • 운영체제는 소프트웨어(software)
    • 커널이라고 불리는 핵심 코드와 UI/도구 프로그램들, 장치를 제어하는 디바이스 드라이버들로 구성한다.

그래서 운영체제는 컴퓨터 하드웨어나 응용소프트웨어 등 자원 관리를 목적으로 사용한다.
프로세스, 메모리, 파일 시스템, 입출력 장치 등 자원 관리와 사용자 관리를한다.

컴퓨터 자원이란


CPU 시간, 메모리 공간, 파일 저장 공간, 입출력장치 등

  • 다시 말하면 컴퓨터 하드웨어
    • 하드웨어 자원 – CPU, 캐시나 메모리, 키보드, 마우스, 디스플레이, 하드 디스크, 프린터 등
    • 소프트웨어 자원 - 응용프로그램
    • 데이터 자원 - 파일, 데이터베이스 등

🍀 운영체제의 역할


위에 정의에서 간단하게 설명했듯 운영체제는 컴퓨터 자원을 관리하고, 또 사용자로부터 컴퓨터 자원을 직접 접근하는것을 보호해준다.

자원관리


  • 응용 프로그램 및 사용자에게 컴퓨터 자원(하드웨
    어)을 할당하여 작업 할 수 있도록 함
  • 자원을 요청한 프로그램이 여러 개라면 적당한 순서로 자원을 배분하고 적절한 시점에 자원을 회수
    하여 다른 응용 프로그램에 할당
  • 운영체제는 자원에 대한 독점(exclusive) 권한 소유
  • 자원에 대한 모든 관리 권한은 운영체제에게 있음
  • 자원 할당, 자원 공유, 자원 액세스, 자원 입출력 등

자원보호


비정상적인 작업으로부터 컴퓨터 자원을 보호한다.

운영체제는 사용자가 실행하는 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. 만약 자원을 운영체제가 보호하지 않는다면 프로그램들이 CPU,메모리,하드 디스크 등 자원에 마음대로 접근하고 조작한다면 자원의 질서가 무질서하게 관리가 될것이고 이는 큰 버그가 될것이다.

그래서 운영체제는 자원에 대한 접근을 오직 자신을 통해서만 접근하도록 자원을 보호한다. 이러한 과정을 운영체제의 핵심인 커널에서 실행하는데 이는 다음 포스트에서 다루겠다.

하드웨어 인터페이스 제공


  • CPU, 메모리, 키보드, 마우스와 같은 하드웨어를
    사용자가 일관된 방법으로 사용할 수 있도록 하드웨어 인터페이스 제공
  • 사용자 인터페이스 제공
    • 사용자가 운영체제를 편리하게 사용하도록 지원
      • EX) 윈도우의 그래픽 사용자 인터페이스(GUI))

🍀 운영체제의 기능


  • CPU/프로세스 관리(process management)
  • 메모리 관리(memory management)
  • 파일 시스템 관리(file system management)
  • 장치 관리(device management)
  • 네트워크 관리
  • 보안 관리
  • 기타 관리
    • 사용자 관리 - 사용자 계정 관리
    • 통계 - CPU, 메모리, 네트워크 사용 시간이나 사용자의 접속 시간 등
    • 오류 발견 및 대응
    • 부팅(booting)
반응형

'Programming > CS' 카테고리의 다른 글

운영 체제의 구성 - 커널  (0) 2023.04.20

+ Recent posts