라벨이 OS인 게시물 표시

CPU 작업과 I/O 작업은 어떻게 병행될 수 있는가 ?

이미지
다음 3개의 요인을 통해 CPU와 I/O 작업이 병행될 수 있음. 1. Interrupt 1.1 Device가 RAM에 요청된 데이터를 Load하는 작업이 끝나면 1.2 CPU에 Load작업이 완료되었다는 I/O Interrupt를 보냄. 1.3 CPU는 다시 RAM에 적재된 데이터를 통해 작업을 마저 수행할 수 있음. 2. DMA Controller DMA를 지원하는 환경이라면 - DMA를 통해 CPU의 도움 없이 직접 RAM에 접근 가능하다. - Device driver와 RAM이 직접 통신한다. 3. Device driver = 장치 드라이버 - OS와 Hardware 사이의 통신을 담당하는 소프트웨어. - Hardware의 ROM에 내장된 Firmware를 구동한다. - 제조사의 마이크로 프로세서에    하드웨어를 제어하는 명령들을 담은 firmware가 탑재되어 나오는데   CPU의 도움 없이 device specific한 작업을 수행할 수 있음. - 대형 운영체제들은 여러 겹의 Layer를 사용하는데   Firmware들에 대응할 수 있게 추상화된 레이어라고 볼 수 있다. 병행 작동 예 Device driver 상위 Layer에는 OS와 Application이 위치한다. OS는 Kernel로서 RAM에 적재되어 돌아가고 Application 데이터도 RAM에 적재되고 RAM에서 해제된다. 애플리케이션 코드가 수행되다가 필요한 데이터가 I/O장치에 있을 때는 API를 통하여 시스템 콜을 통해 OS가 대신 데이터를 애플리케이션에 전달한다. 이해를 돕기 위해 I/O 장치에 P1(프로세스1)을 기입한 것이고 실제 I/O에서 프로세스를 수행하는 것이 아님 ! [그림 참고] CPU가 작업 P1를 수행하다가 I/O 장치의 데이터가 필요해서 인출 작업을 I/O 영역에 맡긴다. CPU는 대기하고 있는 것이 아니라 P2라는 다른 작업을 수행한다. I/O장치는 P1과 관련된 데이터 인출 작업을 수행하고 인출 및 적재가 끝나면 CPU에 ...

IOCP & Overlapped I/O (2) : Blocking 대 Non-blocking, 동기 입출력 대 비동기 입출력 , 비동기 통지

blocking / non-blocking Blocking socket mode 소켓 함수 호출 시, 조건이 만족되지 않으면  함수가 r eturn하지 않고 스레드 실행이 그 위치에서 정지 한다. 조건이 만족될 때, socket 함수가 return하며 정지 상태의 스레드가 깨어난다.(wake-up) 그리고 작업을 재개한다. 조건이 만족되는 시점이 길어지면 교착 상태로 인해 스레드가 오랜 시간 정지할 수 있다. 다른 스레드가 있다면 TerminateThread() 함수를 호출해 강제 종료시키거나 주 스레드가 종료되어 모든 스레드가 종료되기를 바래야한다. Non-blocking socket mode 소켓 함수 호출시, 조건이 만족되지 않아도 일단 함수가 return 한다. (이 때, 조건이 만족되지 않았다는 오류를 리턴한다.) 때문에 중단 없이 다음 코드를 계속 수행한다. 멀티스레드를 사용하지 않고도 싱글스레드로 여러 소켓을 번갈아가며 입출력 처리를 할 수 있으며 중간에 다른 작업을 수행할 수 있다. 그러나 위에서 말한 '조건이 만족되지 않았다는 오류'를 처리해야한다. 클라이언트가 없어도 계속 cpu자원을 소모하여 함수 return 로직을 수행하기 때문에 blocking 소켓보다 CPU 사용률이 높다. 윈도우에서 제공하는 Select 모델을 사용하면 소켓 함수 호출 성공시점을 미리 알 수 있다. 블록킹 소켓의 단점인 교착상태 돌입 위험과 넌블록킹 소켓의 단점인 '조건 불충족 오류' 처리 로직을 해결할 수 있다. 동기 입출력 / 비동기 입출력 동기 입출력 ( synchronous I/O ) 1. 응용 프로그램이 입출력 함수를 호출하고,    입출력 작업이 끝날 때까지 기다린다. 2. OS는 입출력 작업을 커널 모드에서 수행한다. 3. 커널 모드의 입출력 작업이 완료되면 입출력 함수가 리턴한다. 4. 응용 프로그램은 리턴된 값을 처리하거나     다른 작업을 진행한다. 입출력 작업이 완료될 때까지 기다린다. 비동기 입출력 (...

IOCP & Overlapped I/O (1) : 윈도우 소켓 입출력 모델을 사용한다는 것

이런 저런 채용공고를 둘러보다가 이런 개발 세상도 있구나~ 하고 잠깐 조사했다. 윈도우 운영체제에서 제공하는 기술이라 생소한 용어들이 많다. 윈도우의 소켓 입출력 모델을 사용한다는 것은? 윈도우는 다양한 소켓 입출력 모델을 제공한다. - Select, WSAAsyncSelect, WSAEventSelect - Overlapped(1), Overlapped(2) - Completion Port 윈도우에서 제공하는 소켓 입출력 모델을 활용한다는 것은 새로운 전송 프로토콜을 작성하는 것이 아니다. TCP나 UDP와 같은 전송 프로토콜은 유지하되, 종단에서 Socket(구조체/인터페이스)이 어떻게 데이터를 Read/Write 할 지 로직을 작성하는 것이다. 즉, 여기서 데이터를 인출하고, 데이터를 쓸 때의 효율 을 따지는 과정이다. 많은 연결이 서버에서 이뤄지고 연결당 계산이 무거운 경우, User 모드와 Kernel 모드에서 자원 분배가 효율적으로 이뤄진다면 ( CPU/메모리 ) Response time을 줄일 수 있다. Raw Socket과 차이 앞서 설명한 소켓 입출력 모델의 전제는 소켓으로서 TCP 소켓이나 UDP 소켓을 사용한다는 것이다. 데이터를 전송할 때, 네트워크 계층을 내려가며 운영체제가 프로토콜 헤더를 붙여서 패킷을 제작한다. Raw socket을 사용하면 애플리케이션 단에서 직접 프로토콜의 헤더 일부를 생성할 수 있다. 헤더 일부를 직접 생성함으로서 세부적으로 제어할 수 있지만 그만큼 동작이 복잡해진다.

C compiler & Program memory 구조

이미지
    <Main Memory로의 적재> D HDD에 저장된, 프로그래머가 작성한 소스코드가 전용 컴파일러에 의해 기계어 코드로 변환된다. 이 실행파일이 생성이 되고 실행된다면 Process가 생성되고 Process가 가지는 opened_file은 이 실행파일일 것이다. 위 단계부터 Main memory (RAM) 에 여러 정보들이 적재되기 시작한다.  이 적재도 무작정 순차적으로 되는 것이 아니라 위와 같은 메모리 구조를 따라서 적재된다. <Compile time & Run time> 변수 초기 데이터는 프로그래머가 지정한 초기값으로 초기화된 전역 변수로 main()함수가 실행되기 전 compile타임에 변수 초기 데이터가 복사되어 들어간다.  <선언과 할당> 만약 위 code에서 man이 선언된 후 man = {20, 'F', 'gordon'} 의 코드가 실행되면 이는 '선언'이 아니라 '할당'이다. <Const> const로 선언할 경우, 반드시 초기값이 존재해야한다. 선언 이후에 바뀔 수 없는 값이기 때문이다. <정적 변수 할당 시점> 정적 변수는 프로그램이 실행되기 전까지 존재하지 않는다. 프로그램 실행 후  | 정적 변수 할당 | main function으로의 돌입 executable file 자체는 변수가 아니며, 프로그램 실행시 executable code와 함께 Main Memory에 적재되어야 하는 데이터다. <Optimization> 프로그램이 특정 variable를 '절대' 참조하지 않거나, Compiler에서 프로그램이 variable에 의존하지 않는다 판단할 경우 자체적으로 최적화 시킬 수 있다. 이는 compiler의 구현에 따라 다르며 일반적으로는 해당되지 않음. <메인 메모리 구조> 코드 영역에는 일련의 명령어들이 텍스트 형태로 저장되어있다. 프로그램이 시작되고 종료될 때까지 M...

윈도우 Onedrive에서 Onenote 파일이 인식이 안 될 때 해결방법

노트북에서의 Onedrive 동기화는 상당히 자원을 많이 잡아먹는 작업이다. 사실 Onedrive에서 Onenote 전자필기장 파일을 동기화 할 때 전자필기장 파일로서 인식하지 못하는 것은 전혀 문제가 아니다. 당연히 데이터가 동기화된다고 생각했지만  전자필기장 파일이 아닌 인터넷 바로가기 파일로 동기화 되는 것은 다른 동기화되는 파일들과 달리 Onenote 전자필기장은 데이터가 동기화되는 것이 아니라 url주소를 동기화 시키는 것으로 의도 되었기 때문이다. 아래 링크는 동일한 문제에 대한 Microsoft 고객 센터의 답변이다. https://answers.microsoft.com/ko-kr/msoffice/forum/all/%EC%9B%90%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B8%8C/91dd5012-1613-44dc-a1c3-498a42c5a074 " 원노트 전자 필기장의 경우 OneDrive를 통해 Local로 동기화 시 데이터가 sync되는것이 아닌 데이터가 저장된 Cloud의 Url이(바로가기) sync가 되는 특징이 있습니다. 이미 알고 계신바와 같이 원노트 프로그램을 통해 Cloud에 있는 전자필기장을 오픈하는 식으로 사용하는 것이 정상적인 동작입니다. " 따라서 윈도우의 '파일탐색기' 앱에서 Onedrive - Onenote를 사용하기보다 그냥 Onenote 프로그램을 실행시키는 것이 훨씬 빠르다.

Linux & Linux 공부 road map

서버로 많이 쓰이는 운영체제 Unix&Linux 리눅스 다중 사용자, 다중 작업(멀티 태스킹), 다중 스레드 지원 네트워크 운영체제(NOS). 여러 사람이 하나의 리눅스 시스템에 접속, 다수의 프로그램을 동시에 실행할 수 있다. 무료 -> 때문에 서버로 사용하기 딱 알맞다. (다수의 사용자에 대한 접근 통제, 권한 관리 등의 보안수칙도 지켜져야 원활한 서비스가 가능하다.) GNU Copyleft 유닉스 유료 독점적, 폐쇄적 운영으로 인한 안정성 보장 (버그 발생시 벤더에서 해결해주기 전까진 해결하기 어려움) 전체적인 점유율이 떨어짐 But, 금융권&대기업은 유닉스를 많이 사용함. (오래전부터 안정적으로 운영해온 전산망인데 리스크를 떠안고 리눅스 운영체제로 마이그레이션 하기 위험함) 내가 Linux를 공부하기 위해 세운 마일스톤 0. 사용하는 리눅스 OS의 CLI 명령어들을 익히는 것. 리눅스로 프로젝트를 관리하거나 서버로 리눅스를 사용한다면 당장 회사의 프로젝트에서 자주 쓰이는 명령어들을 위주로 익혀놓자. EX) 기본 시스템 명령어 + 패키지의 명령어들로 이미지를 배포, 수정함으로써 CI/CD를 수행한다. IaC가 도입된 프로젝트 및 회사라면 관련 서비스의 IaC 문서 명세를 알아두자. Apache, NginX, DBMS(postgre, mysql 등), JDK를 설치하여 WAR 로 배포 또는 docker 이미지로 배포 APM(Apache-Php-mysql )구축하거나 MERN같은 필요 기술스택에 맞게 똑같이 구성한 뒤 배포해보자. 회사에서 쓰고 있는 프레임웍을 vm에 centOS나 ubuntu 설치하고 똑같이 클론코딩 해보면 좋을듯. EX) 기능 개발을 중심으로 하는 직무의 경우 딱히 생각나는 브랜치 관리 전략이 없을 경우 Git-flow나 Gitlab flow 등의 전략들을 차용한 뒤 수정할 것. Git, 소스트리를 통한 코드 관리 전략 1. 시스템 관리법 1.1 리눅스에 TOMCAT, MYSQL, JDK 등 설치해서 WAR배포할 수 있...

간략한 OS history

이미지
  위키를 읽으면서 간략하게 OS의 역사를 정리해 보았다.  리눅스의 배포판은 언제든 Forking할 수 있어서 매우 많기에 다 알수가없다. 퍼스널 컴퓨터의 OS로 많이 선택하는 제품군에는 Windows, Mac, Linux가 있다. UNIX UNIX 정통의 코드를 가지고 있는 OS는 좌측 하단의 Solaris, IAX, UX정도이다. Mac OS 가상 메모리 개념이 추가되어 BSD프로젝트로 발전된 이후에는 DARPA의 자금 지원에 힘입어 UNIX코드와 내부 커널코드들이 BSD프로젝트용으로 발전했고 인터넷 프로토콜 연구의 환경으로서 BSD 프로젝트가 쓰이기 시작했다. 386/BSD 프로젝트는 여러 프로젝트로 Fork 되기도 했다. 그 중 microkernel 기반의 매킨토시(Mac OS)가 FreeBSD의 툴을 가져다 썼다. 네이티브 API로서 BSD/POSIX를 사용한다. LINUX GNU Project에서 리누스 토르발스가 제작한 '리눅스 커널' 이 패키지로 들어가있는  리눅스 배포판이다. Windows WindowNT를 기준으로 Microsoft에서 개인용 컴퓨터를 대상으로 만들었다. 네이티브 API로서 Win32, NT API를 사용한다. 윈도 2003 R2부터 POSIX 2.0에 준하는 Subsystem for UNIX-based Applications(SUA)를 통해 POSIX를 지원한다. 특정 프로젝트, OS가 리눅스인지 구분하는 것은 쉽지 않다. 구분하는 것 자체에 큰 의미는 없으나 어떤 프로젝트에서 파생되었는지 궁금할때는 다음을 보면 좋을 것 같다. UNIX-LIKE

프로그램과 실행 3: 컴파일러 추가내용

  <컴파일러의 사용 효과> 컴파일러를 사용한 결과로 다음 조건들을 만족해야한다. 1. 변환 과정에서 프로그램의 뜻을 보존 2. 실용적인 면에서, 입력으로 들어온 프로그램을 어떤 면에서든지 개선. (어셈블리어를 기계어로 변환하는 경우 기계어가 해석할 수 있게 된다는 이점) (같은 언어로 옮긴 경우에는 성능이 개선되는 등의 이점이 존재해야함.) 위 두 가지를 만족하지 않는다면 굳이 컴파일러를 쓸 이유가 없다. <컴파일 과정> 컴파일러나 프로그래밍 언어의 특성에 따라 일부 단계는 생략되거나 더 세부적인 단계로 나뉠 수도 있다. 일반적인 과정은 다음과 같다. 구문 분석 소스 코드 파일을 읽어 개별 문법요소(연산자, 괄호, 식별자 등) 단위로 자른후, 이 문법요소들을 해석하여 추상 구문 트리 를 생성한다. 이 과정에서 문법에 맞지 않는 소스 코드는 사용자에게 알려준다. 최적화 추상 구문 트리 를 분석하여 최적화를 수행한다. 도달할 수 없는 코드를 식별하거나, 상수 표현식을 미리 계산해 두거나, 루프 풀기 등의 대부분의 최적화가 이 단계에서 수행된다. 코드 생성 최적화된 구문 트리로부터 목적 코드를 생성한다. 목표 언어가 기계어일 경우, 레지스터 할당 , 연산 순서 바꾸기 등 하드웨어에 맞는 최적화 가 이 단계에서 수행된다. 대부분의 하드웨어 최적화 알고리즘 은 NP 복잡도를 갖지만, 휴리스틱을 통해 많은 최적화가 수행된다. 링킹 목적 코드가 기계어일 경우, 여러 라이브러리 목적 코드를 묶어 하나의 실행 파일을 생성하게 된다. 이 과정은 링커에 의해 수행되며, 어떤 사람들은 링커를 컴파일러의 일부로 간주하지 않기도 한다. <일단 구조와 다단 구조> 일단 구조 원시 코드 -> READ -> 번역 -> 목적 코드 다단 구조 원시 코드 -> READ -> 번역 -> 중간 코드1 -> ... -> 목적 코드 다단 구조에서 중간코드의 효용 1. 다양한 언어 지원   다양한 입력 언어를...

Producer-Consumer

생산자-소비자 패턴은 프로그램 디자인 패턴의 한 종류. 특히 멀티스레드 환경에서 쓰인다.  운영체제에서도 자원 분배 문제를 해결할 때 짚고 넘어가는 주제이다.

Response time, Turn-around time

응답시간 - 응답을 받을 때까지 경과된 시간 - 실행단위에 입력이 주어지고 나서 반응하기까지 걸린 시간 - 응답시간이 짧다 = 반응속도가 빠르다  - [ (DB쿼리 전송) -> 화면출력(쿼리 결과 출력) ] 까지  턴어라운드 시간 - 작업시작~작업종료까지 경가된 시간 - 작업이 제시된 시점~종료까지의 시간 - 작업이 제출되어 결과를 얻을 때까지의 총 소요시간. 반응이라고 해석하는 기준을 다르게 함으로서 응답시간을 줄일 수 있다. -> DB에서, 쿼리 결과 출력시 Bulk로 수신하지 않고 빠르게 여러번 읽기 -> 웹에서 , 전체 컴포넌트를 수신하기 전에, 우선적으로 렌더링 된 객체를 먼저 화면에 표시하기 운영체제에서의 응답시간, Turn around time은 Cpu관점에서 서술된다.

이 블로그의 인기 게시물

실무진 면접 경험으로 정리하는 백엔드 (1) : 에듀 테크 기업 면접

노마드코더 개발자북클럽 Clean code TIL 6 : 6장. 객체와 자료구조

백엔드 개발자가 Djnago fullstack 사이드 프로젝트를하며 ( html, css, vanillaJS 그리고 JS프레임워크 )