반응형

프로세스 vs 스레드

 

프로세스

 

프로세스는 현재 실행 중인 프로그램을 말한다. 프로그램 그 자체는 프로세스가 아니다.

프로세스는 스택(매개변수, 복귀주소, 로컬변수 등 임시자료 저장), 데이터 공간(전역변수 저장), 텍스트 공간(코드 저장), 힙 공간(동적으로 할당되는 객체, 변수 저장)으로 구성된다.

 

 

 스레드

하나의 스레드는 하나의 실행을 할 수 있다. 즉, CPU가 처리하는 작업의 단위이다.

만약 하나의 프로세스에 하나의 스레드가 있다면, 한번에 한가지 일만 실행할 수 있다. 예를 들면, 동일한 프로세스 내에서 문자를 입력하면서 동시에 철자검사기를 실행할 수 없다.

현대의 운영제체는 프로세스 개념을 확장하여 한 프로세스가 여러 스레드를 가질 수 있도록 하여 한순간에 하나 이상의 일을 실행할 수 있게 한다. (멀티스레드)

 

 


멀티 프로세스 vs 멀티 스레드

 

 

멀티 프로세스

하나의 CPU는 한 순간에 하나의 프로세스를 실행할 수 있다.

따라서 여러 개의 CPU 또는 CPU 내 여러개의 코어가 있다면, 여러 개의 프로세스를 동시에 실행가능해진다. (병령처리)

프로세스는 fork( )를 이용해 복제할 수 있으며 부모 프로세스를 fork하여 자식 프로세스를 생성할 수 있다. 부모로부터 복제된 자식 프로세스라 할지라도 기본적인 메모리(스택, 힙, 텍스트, 데이터 영역)는 할당된다.

 

(단일 CPU 이용해서 짧은 시간을 주기로 번갈아가며 여러 개의 프로세스를 처리하는, 멀티 프로그래밍과는 다른 용어임)

 

 

 

멀티 스레드란,

 

하나의 프로세스 내에는 여러개의 스레드가 존재할 수 있으며, 이 스레드는 운영체제 자원(코드,데이터 등)을 공유한다.

스레드는 CPU 이용의 기본 단위이며, 스레드ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성된다.

 


프로세스의 상태 5가지

 

 

생성 new

프로세스가 생성 중이다. fork()

 

준비 ready

프로세스가 CPU를 할당 받기를 기다리는 중이다.

 

실행 running

명령어들이 실행되고 있는 중이다. exec()

 

대기 waiting

프로세스가 입출력 완료 또는 신호 수신 등 이벤트가 일어나기를 기다리는 중이다. wait

 

종료 terminated 

프로세스 실행이 종료되었다. exit()

 

 

 

 

 

 

 

 

 

 

반응형
반응형

성능향상 기술 1) 버퍼, 스풀, 캐시

 

CPU, 메모리, 입출력장치, 시스템 버스 등 모든 데이터 전송은 동일한 속도로 진행되지 않는다.

이러한 속도차이 때문에 시스템의 성능이 떨어지지 않도록 보완하며 효율성을 높이는 세가지 방법이 있다.

 


1. 버퍼 Buffer 란,

CPU -> RAM 에 접근하는 속도   <<<<<<<<<<  하드디스크에 접근하여 데이터를 READ 하는 속도

 

CPU는 최대한 쉬지않고 일을 하고 싶은데, I/O장치가 하드디스크에 접근하여 데이터를 가져오는 속도가 너무 느려 기다려 줄 수가 없다. 하드디스크에 접근해서 데이터를 가져오는 시간 동안, CPU는 다른 일을 한다면 효율성을 높일 수 있다.

따라서 효율성을 더 높이기 위해, I/O장치가 가져온 데이터들을 RAM 내 Buffer에 저장해놓고 데이터가 어느정도 모였으면 CPU로 보내서 한꺼번에 처리하는 방식이 버퍼링이다.

 

버퍼는 큐, FIFO 알고리즘으로 구현되어 있어,

한쪽에서는 전송속도가 느린 발신자가 데이터를 느리게 저장하고, 다른쪽은 누적 데이터를 수신자가 힌꺼번에 꺼내간다.

 

버퍼의 목적

1. 데이터가 전송되는 두 장치 간의 속도를 일치시키는데 도움이 된다.

2. 데이터 전송 크기가 다른 장치끼리 전송할 때 간극을 줄여주는데 도움이 된다.

3. 디스크의 트래픽 양을 줄여 전체 시스템의 처리량을 높이고 응답시간을 줄여준다.

 

버퍼의 단점

1. 필요한 버퍼 크기를 정확하게 알 수 없으므로 약간 크게 할당해놓는다. 버퍼는 주메모리 내에 있기 때문에 아무리 적은 양이라 할지라도 공간 낭비 문제가 발생한다.

2. 버퍼는 고정크기를 갖는데 그 크기를 넘어선 데이터가 들어오면, 큰 크기의 버퍼로 재할당해야하는 비효율이 발생한다.

 

참고) https://www.javatpoint.com/buffering-in-operating-system

 

Buffering in Operating System - javatpoint

Buffering in Operating System with OS Tutorial, Types of OS, Process Management Introduction, Attributes of a Process, CPU Scheduling, FCFS with overhead, FCFS Scheduling etc.

www.javatpoint.com

 

 


2. 스풀링 Spooling(Simultaneous Peripheral Operation On-Line) 이란,

CPU가 연산하는일과 입출력 장치가 하는 일을 분리함.

 

CPU와 I/O장치를 분리시켜 독립적으로 동작하게 하는 방식으로, 버퍼는 램에 저장됐다면 스풀은 디스크 내에 저장된다.

CPU는 처리해야하는 데이터를 spool 파일에 저장한 뒤 다른 일을 하러 떠나고, I/O 장치는 이 spool 파일에서 데이터를 꺼내와 실행한다.

예를 들면, 인쇄 버튼을 클릭하면 스풀 파일이 생기며(스풀링), 프린터는 이 스풀파일을 이용해 문서를 출력한다. 

그동안 CPU는 I/O장치에 신경쓰지 않고 다른 일을 할 수 있어 효율성 측면에서 좋은 방법이다.

 

 

 

 


3. 캐시 Cache

 

CPU는 데이터 처리에 필요한 명령이 들어오면, 메모리에서 데이터를 찾아야 한다.

이때 주기억장치에 접근하는 시간이 생각보다 길기 때문에, 중간에 캐시라는 고속메모리를 두어 효율성을 높일 수 있다.

(캐시는 CPU 안에 존재, 버퍼는 CPU 밖 RAM에 존재)

 

캐시에는 자주 사용하는 데이터, 최근에 사용한 데이터 등을 저장한다. CPU는 명령을 수행하려고 주기억장치에 접근하기 전에 캐시를 먼저 확인한다.

 

캐시 Hit Ratio가 높을수록 주기억장치에 접근하는 횟수가 줄어들기 때문에 컴퓨터의 처리속도가 높아진다.

* Hit : 필요한 데이터가 캐시에 있는 경우

* Miss : 캐시에 없어서 주기억장치에 접근해야하는 경우

 

 

 


성능향상 기술 2) 폴링과 인터럽트

 

CPU가 이벤트가 발생했는지 알 수 있는 방법은 2가지가 있다.

1. CPU가 장치들을 지속적으로 확인하는 방법. (polling)

2. 이벤트가 발생하면 알람을 울려서 CPU에게 알리는 방법. (interrupt)


폴링

CPU가 장치를 꾸준히 확인하는 프로토콜로, 폴링 프로세스 장치는 I/O 장치에게 CPU처리가 필요한지 계속 묻는다.

즉, CPU는 연결된 모든 장치를 일정주기마다 확인한다.


인터럽트

CPU는 인터럽트 요청을 받으면 현재 하던 프로세스를 모두 중지하고, 장치를 서비스하는 인터럽트 핸들러에제 제어를 전달한다. 인터럽트 관련 프로세스가 끝나면 기존에 하던 프로세스로 돌아와 마서 수행한다.

이러한 인터럽트는 언제든지 발생할 수 있으며 프로토콜이 아닌 하드웨어적으로 동작하는 매커니즘이다.

 

 

반응형
반응형

레지스터란

플립플롭 여러개를 일렬로 배열하고 연결하여 만들어진 레지스터는 여러 비트로 구성된 2진수를 저장하기에 용이하다.

저장된 비트를 좌측, 우측으로 하나씩 이동할 때 사용한다. (shift)

 

레지스터의 용도

- 범용 레지스터: 데이터와 주소 둘다 저장 가능하다.

- 특수 레지스터: 실행중인 프로그램의 상태를 저장한다. 프로그램 카운터, 상태 레지스터 등.

- 데이터 레지스터: 정수값 저장

- 주소 레지스터: 기억장치 주소를 저장하여, 기억장치 액세스에 사용된다.

- 부동소수점 레지스터: 부동소수점 데이터값을 저장하기 위해 사용된다.

- 상수 레지스터: 0이나 1 등 고정된 데이터를 저장한다.

- 명령 레지스터: 현재 실행중인 명령어를 저장한다.

- 색인 레지스터: 실행 중인 피 연산자의 주소를 계산하는 데 사용한다.

 

 

 

프로세서 레지스터 (CPU 레지스터)

CPU 내부에서 데이터를 저장하는 장치를 프로세서 레지스터라고 한다.

레지스터는 기억장치 중에서 속도가 가장 빨라 CPU 에서 고속으로 계산한 값을 저장할 때 쓰인다.

예를 들면, ALU(연산장치)에서 처리된 결과 데이터를 레지스터에서 임시 보관하고, 주기억장치에서 읽어온 명령어와 데이터를 임시보관하기도 한다.

 

 

레지스터의 두 가지 분류

1. 사용자에게 보이는 레지스터

어셈블리 프로그래밍을 하기 위해 명칭과 용도를 알아야 하는 레지스터.

어셈블리 프로그래머는 프로그램에서 사용되는 변수 데이터 등을 저장하기 위해 해당 레지스터를 알고 있어야 한다.

- 범용 레지스터: 연산을 위한 모든 종류의 피연산자(Operand)를 저장할 수 있다.

- 데이터 레지스터: 데이터 저장에만 사용 가능하다. 누산기(Accumulator) 등

- 주소 레지스터: 간접 주소지정방식에서 특정 레지스터는 유효주소를 표시하는데, 이것이 주소 레지스터이다.

- 조건 코드: 사용자에게 보이는 레지스터에 저장된 데이터의 상채를 표시하는 데 사용된다.  (부호비트, 영 비트, 오버플로우 비트 등)

 

2. 제어 및 상태 레지스터

프로그램 실행 과정에서 CPU 내부적으로 사용되는 대표 레지스터이다.

- 프로그램 카운터 (PC): 주기억장치에 저장된 다음에 인출할 명령의 주소를 가지고 있다. 

- 명령어 레지스터 (IR): 가장 최근에 주기억장치인 RAM에서 인출할 명령어의 주소를 가지고 있다.

- 기억장치 주소 레지스터 (MAR): 액세스할 기억장치의 주소가 저장되며 이 레지스터의 출력이 주소버스와 직접 연결

- 기억장치 버퍼 레지스터 (MBR): 기억장치에 쓰일 데이터 혹은 가장 최근에 읽은 데이터가 저장. 데이터 버스와 직접 연결

- 입출력 주소 레지스터 (I/O AR): 입출력 장치의 주소를 저장한다.

- 입출력 버퍼 레지스터 (I/O BR): 입출력 모듈과 CPU 사이에 교환되는 데이터를 일시적으로 저장한다.

- 프로그램 상태 단어: 제어 및 상태 레지스터에서 저장된 데이터의 상태와 조건을 나타내기 위하여 추가된 조건코드 비트.

 

 

 

참고 도서) 컴퓨터 구조와 원리 2.0 

 

 

반응형
반응형

 


폰노이만 구조 

폰노이만은 컴퓨터, 수학, 경제학, 물리학 등 천재 중의 천재.

폰 노이만이 제안한 폰노이만구조란 컴퓨터 구조로, 중앙처리장치(CPU), 메모리, 프로그램 세가지로 구성된다. 

 

폰노이만이 등장하기 전에는 하드웨어 전선을 일일이 뽑았다 꽂아서 작업을 수행했다.

폰노이만 구조가 등장한 이후, 하드웨어는 변경없이 소프트웨어(프로그램)만 교체하면 되기 때문에 편의성 증가함.

 

- 하나의 메모리로 데이터를 저장하고 명령어를 처리한다.

- 하나의 버스로 순차적으로 정보를 처리하기 때문에 병목현상이 존재한다.

 

 

 

하버드 구조

폰노이만구조의 병목현상은 프로그램메모리와 데이터메모리가 물리적 구분없이 하나의 버스를 통해 CPU와 교류하기 때문이다. 즉, CPU는 동시에 명령어와 데이터를 사용할 수 없음.

 

폰노이만의 병목현상을 해결하기 위해 하버드 구조가 고안되었다.

하버드 구조는 명령용 버스와 데이터용 버스를 물리적으로 구분하여, 동시에 명령어와 데이터를 사용할 수 있게 되었다.(속도 향상)

 

- 속도가 빠른 반면, 구성시 비용이 많이 들고 복잡하다.

- 메모리가 물리적으로 분리되어 있다. 프로그램 코드는 명령어 메모리에 저장되고, 데이터는 데이터메모리에 따로 저장됨

 

 

 

 


컴퓨터 구조의 핵심: CPU, Memory, IO, Bus

 

 

 

1. CPU

컴퓨터 시스템을 통제하고 프로그램 연산을 실행/처리한다.

CPU의 성능이 곧 컴퓨터의 성능이다.

- CU (Control Unit): CPU 내 제어장치로, 명령어를 기억장치에서 꺼낸 다음 각 장치에 보내는 역할

- ALU (Arithmetic Logic Unit): CPU 내에서 연산을 담당하는 부분

- 레지스터 (Register): CPU 내에 들어있는 작은 데이터 기억장치

 

 

2. Memory

실행하고자 하는 프로그램은 메모리에 저장되어 있어야, CPU에서 가져다가 명령을 적재할 수 있다.

 

- 주기억장치:

RAM(Random Access Memory)은 속도가 빠르며, 전원이 꺼지면 데이터가 모두 지워진다.

ROM(Read Only Memory)읽기만 가능한 메모리로, 전원이 꺼져도 데이터가 사라지지 않는다.

 

- 보조기억장치:

하드디스크는 매우 느리며, 전원이 꺼지더라도 데이터가 지워지지 않는다. (여기에 부팅 프로그램이 있음)

 

 

3. I/O 장치

- input 장치: 입력 장치로 키보드, 마우스, 마이크, 터치스크린 등이 있다.

- output 장치: 출력 장치로 스피커, 모니터, 프린터, 헤드촌 등이 있다.

- 마이크로프로세서와 입출력장치 사이에서 정보를 전달하는 통로

 

 

 

4. Bus: CPU, Memory, I/O장치를 이어주는 시스템 버스

- 데이터 버스: CPU와 기타 장치 사이에서 데이터를 전달하는 통로(단방향)

- 주소 버스: 기억장치의 주소를 전달하는 통로(단방향)

- 제어 버스: 주소버스와 데이터 버스는 모든 장치에 공유되기 때문에 제어할 수단이 필요하다. (양방향)

반응형
반응형

커널의 핵심 기능

 

커널(운영체제)이  제공하는 기능

 

1. 프로그램 실행(Program Execution):

시스템은 프로그램을 메모리에 적재해 실행한다.

 

2. 입출력 연산(I/O Operation):

실행중인 프로그램은 입출력(CD, 디스플레이, 키보드 등)을 요구할 수 있는데, 이를 커널(운영체제)이 제어한다.

 

3. 파일시스템 조작 (File System):

파일을 생성/삭제/읽고/쓰는 기능 뿐만 아니라, 권한에 따른 허가/거부 역시 커널(운영체제)이 제어한다.

 

4. 통신 (Communication):

한 프로세스가 다른 프로세스에게 메시지를 전달 할 때, 패킷들은 운영체제에 의해 제어된다.

 

5. 자원할당 (Resource Allocation):

다수의 사용자나 다수의 작업들이 동시에 실행될 때, 각각에 자원을 할당해야 한다.

예를 들면, CPU를 최대한 효율적으로 이용하기 위해 커널(운영체제)은 CPU 스케줄링 루틴이 CPU의 속도, 반드시 실행해야 할 작업들, 사용 가능한 레지스터의 수와 다른 요인들을 고려하도록 해야한다. 

 

6. 회계(Accounting):

사용자가 어떤 종류의 컴퓨터 자원을 얼마나 많이 사용하는지 관리하고자 사용통계를 내고, 이를 서비스 개선에 자료로 쓰인다.

 

7. 오류 탐지(Error Detection):

CPU, 메모리 하드웨어 오류 (메모리 오류, 정전 등),

입출력장치 오류 (패리티 오류, 네트워크 접속실패, 프린터 종이부족 등)

사용자 프로그램 오류 (연산의 오버플로우, 불법적인 메모리 위치에의 접근시도 또는 CPU시간의 지나친 사용 등)

각 오류에 대해 올바르고 일관성 있는 조치를 취해야 한다. 

 

8. 보호(Protection)와 보안(Security):

보호는 시스템 자원에 대한 모든 접근이 통제되도록 보장하는 것을 포함한다.

보안은 각 사용자가 자원에 대한 접근을 허가받기 위해 통상 패스워드를 사용해서 시스템에게 자신을 인증하는 것부터 시작한다.

 

 


단일형 구조 커널(Simple Structure )

커널은 시스템호출을 통해 파일 시스템, CPU 스케줄링, 메모리 관리 그리고 다른 운영체제 기능을 제공한다.

이러한 기능들을 하나의 계층으로 결합한 모놀리식 구조로, 구현하기도 어렵고 유지보수 하기도 어렵다.

 

* 모놀리식 구조:

모든 비즈니스 관련 사항을 결합한 대규모 단일 컴퓨팅 네트워크 (반댓말은 MSA:Micro Service Architecture)

 

 


계층형 구조 커널

커널을 여러개의 으로 나누어서, 각 층은 자신의 하위층에 대한 연산만 호출한다.

즉 최상위 층인 N층은 사용자 인터페이스이고, 0층은 하드웨어다.

그 사이에 있는 1층부터 (N-1) 층은 자신의 하위 층들의 기능들만 사용할 수 있다.

 

장점

구현과 디버깅이 간단하다.

 

단점

- 기능들을 어떤 층에 배치할지 적절히 정의하는 것이 어렵다.

- 명확하게 층을 구분하기 어려운 기능들도 있다.

예) 장치 드라이버는 메모리 관리 루틴들 보다 하위에 있어야 함.

 

 


마이크로구조 커널

거대한 커널을 쪼개 모듈화한 구조.

중요하지 않은 기능들은 커널에서 제거하고, 시스템 프로그램이나 사용자 프로그램 수준으로 구현.

 

장점

새로운 서비스는 모듈을 추가하면 되므로 운영체제 확장에 용이하다.

하나의 서비스가 잘못되도 다른 서비스는 아무런 영향을 받지 않아서 높은 보안성과 신뢰성을 제공한다.

 

단점

가중된 시스템 동작 오버헤드 때문에 성능이 감소한다.

 

 

 

 

 

참고) 공룡책 8판

반응형
반응형


운영체제 역할

 

 

컴퓨터 시스템이란

사용자 프로그램을 실행하고, 사용자 문제의 해결을 보다 쉽게 해주기 위해 존재한다.

이러한 목적을 위해 하드웨어가 등장했고, 하드웨어를 제어하는 소프트웨어 및 데이터도 등장했다.

 

운영체제란

다양한 소프트웨어(프로그램)들이 하드웨어(입출력장치)를 이용해 연산을 할 필요가 생겼고, 각 프로그램에게 자원을 할당해주고 반환해가는 소프트웨어가 필요해졌는데 이게 바로 운영체제이다.

운영체제는 컴퓨터 시스템이 동작할 때 이들 자원(CPU시간, 메모리 공간, 파일 저장 공간, 입출력장치 등) 을 적절하게 사용할 수 있는 방법을 제공한다.

 

운영체제의 역할

운영체제는 환경에 따라 다양한 역할을 한다.

1. 대형컴퓨터의 OS: 주로 하드웨어의 이용을 최적화하는 데 주안을 두고 있다.

2. 퍼스널컴퓨터의 OS (ex 윈도우, 리눅스) :복잡한 게임, 비즈니스 응용 등 모든 응용프로그램을 지원한다.

3. 휴대용 컴퓨터 OS (ex apple mac os x ) :사용자가 프로그램을 쉽게 실행하기 위해 컴퓨터와 쉽게 인터페이스 할 수 있는 환경을 제공하기 위해 설계되었다.

4. 임베디드 OS: 가전제품이나 자동차 내의 내장형 컴퓨터는 사용자의 개입없이 작동하도록 설계되었다.

 

하드웨어에 따른 다양한 역할의 OS가 있지만, OS의 공통점은 자원을 할당하고 제어하는 기능을 한다는 것이다.

 

운영체제가 제공하는 서비스

운영체제는 프로그램 실행환경을 제공한다. 

1. 사용자 인터페이스:  GUI(Graphical User Interface) 또는 CLI(CommandLine Interface)의 형태로 제공된다.

2. 프로그램 실행: 시스템은 프로그램을 메모리에 적재해 실행한다.

3. 입출력 연산: 실행중인 프로그램은 입출력(CD, 디스플레이, 키보드 등)을 요구할 수 있는데, 이를 운영체제가 제어한다.

4. 파일시스템 조작: 파일을 생성/삭제/읽고/쓰는 기능 뿐만 아니라, 권한에 따른 허가/거부 역시 운영체제가 제어한다.

5. 통신: 한 프로세스가 다른 프로세스에게 메시지를 전달 할 때, 패킷들은 운영체제에 의해 제어된다.

 

 


운영체제의 구조

 

운영체제 구성

1. 커널: 운영체제의 코어로써, 프로세스나 메모리 관리 등 핵심기능을 수행한다.

- 프로세스 관리

- 메모리 관리

- 파일 시스템 관리

- 입출력 관리

- 프로세스 간 통신관리

 

2. 인터페이스: 사용자의 목적을 수행하기 위해, 명령을 전달하는 역할을 수행한다.

- 명령 해석기 (CI: command-Interpreter): 사용자가 지정한 명령을 가져와서 그것을 실행한다. shell이라고 불린다.

- 그래피컬 사용자 인터페이스 (GUI: Graphical User Interfase): 마우스 포인터를 기반으로 하는 프로그램 호출

 

3. 시스템 호출:

커널이 제공하는 서비스에 대한 인터페이스를 제공한다. 저수준 작업(어셈블리 명령)으로 보통 C, C++ 로 작성된다.

 

 


API와 SDK

 

응용 프로그래밍 인터페이스(API: Application programming Interface)

API의 등장으로 대부분의 사용자(개발자 포함)는 시스템호출에 필요한 저수준의 명령을 알 필요가 없어졌다.

API에는 함수에 전달되어야 하는 매개변수와 반환값 등이 명시되어 있고, API에 따라 프로그래밍을 하면 어느 시스템에서건 컴파일 되고 실행되기 때문에 호환성 측면에서 이점이 있다.

 

소프트웨어 개발자 도구모음(SDK: Software Development Kit)

SDK 에는 프로그래밍을 편리하게 할 수 있도록 API 뿐만 아니라 IDE, 문서, 라이브러리, 코드 샘플 등을 제공한다.

예를 들면, iOS SDK는 iOS어플리케이션을 개발하는 개발자들에게 유용하다. 컴퓨터에서 아이폰을 시뮬레이션 할 수 있도록 시뮬레이터를 제공하기도 한다. 또한 안드로이드 앱을 위한 JDK: Java Development Kit도 있고, GCP(Goole Cloud Platform)을 위한 Cloud SDK 도 있다.  

 

 

 

 

참고1) 공룡책 8판

참고2) https://rapidapi.com/blog/api-vs-sdk/

 

반응형

+ Recent posts