티스토리 뷰

용어정리

프로세스

실행중인 프로그램을 의미한다. 메모리에 정보가 올라와 CPU가 실행 가능한 프로그램이 되어 OS가 관리하는 상태이다.

스레드

프로그램의 실행 단위이다. 프로세스에서 실제 작업을 수행하는 단위이다. (기본적으로 프로세스가 있다는 것은 1개 이상의 커널레벨 스레드를 가진다는 것과 동일하다.) 스레드는 같은 프로그램 내의 code, data, heap 영역 등 주소공간의 일부를 공유한다. PC(Program Counter), 레지스터셋, stack 영역을 독자적으로 가진다. 따라서 context switch가 일어날 때, 교체되는 자원이 적다. OS가 존재를 알고 관리하는 커널 레벨 스레드와 OS가 존재를 모르고 프로세스가 자체 관리하는 사용자 레벨 스레드로 나뉜다. 

Task

프로세스를 추상화 한 것으로 작업의 단위이다.

시스템 콜

OS에서 제공해주는 API로 주로 하드웨어 제어 기능이 있다. 인터럽트를 발생시켜, CPU와 소통한다.

메모리 지역성

시간지역성과 공간지역성으로 나눠볼 수 있다.

 

시간지역성은 짧은 시간 내에 다시 접근 가능성이 높은 것을 의미한다. GC가 참조되지 않는 객체는 청소하고, 자주 참조되는 객체는 청소하지 않는 것을 생각해보면 좋다.

공간지역성은 메모리를 읽었을 때, 연관되어 다음 요청이 들어올 수 있는 메모리 정보를 의미한다. 다음 요청으로 들어올 가능성이 높은 데이터는 가까운 위치에 저장하는 것이 좋다. 배열과 같은 자료구조를 생각해 보면 된다. 

cache와 buffer

cache와 buffer의 공통점은 더 빠른 연산 처리를 위해 사용된다는 것이다.

 

cache는 CPU~메인 메모리 사이에 존재한다. cache에 정보가 있다면 hit 되어 메인 메모리에 접근하는 것보다 더 빠른 접근이 가능하다록 한다. cache는 정보를 임시 저장하여 같은 정보가 요청되었을 때, 더 빠르게 접근하도록 한다.

 

buffer는 사용 후에 데이터를 폐기힌다. 데이터 참조가 일어날 때, 요청 정보가 들어올 때마다 요청하는 것이 아니라, 비슷한 정보를 모아서 한 번에 요청하는 역할을 한다.

 

컴퓨터 발전의 역사

Bash system 

입출력은 천공카드로 진행되었고, 응답시간은 하루였다. 프로세스가 존재하지 않았다. 카드가 80 column 이었기 때문에 터미널 해상도랑 연관이 있고, 권장 코딩폭이 되었다.

CTSS(Compatitible Time Sharing System)

멀티 유저 로그인이 가능했고, 응답시간은 200ms정도로 빨라졌다.

Multics

제대로 된 Time Sharing OS의 시작이다. 프로세스의 개념이 들어가기 시작했고, 모니터와 키보드가 달린 컴퓨터의 형태를 가진다. 하지만 너무 앞서나가서 성공하지 못했다.

Unix

 Multics가 성공하지 못하면서 탄생되었다. 입력은 키보드, 출력은 전기 타자기로 되었다. 현재 운영체제로 발전하는 기반이 된다. multi process가 가능해졌다.


DOS

한 번에 한개의 프로세스만 실행가능한 싱글프로세스이다. 하드웨어 protection 기능은 없어서 OS라고 보기에 조금 애매하다고 한다.

OS(운영체제)의 목적

1. 하드웨어를 쉽게 제어할 수 있게 한다.

2. Protection(자원을 보호한다)

Virtual memory 사용의 목적

1. 실제 물리 메모리보다 프로세스들에게 더 많은 메모리를 사용하고 있다고 생각하게 한다. (모든 프로세스가 물리 메모리의 전부를 사용하고 있다고 느낀다)

2. 보안(남의 영역을 침범하지 못하게 한다)

스레드를 사용하면 왜 빠른가?

스레드 별로 시간을 CPU를 나눠쓰게 되어있다. 빨라지려면 OS가 그 존재를 아는 스레드여야 한다. java에서 Thread로 만들어지는 스레드는 커널 레벨 스레드이다. (사용자 레벨 스레드의 증가는 속도가 빨라진다는 것을 보장할 수 없는 듯 하다.) 그렇게 때문에 시간이 오래걸리는 작업이 아니더라도 스레드를 여러개 사용하면 속도가 빨라진다. (빨라지는 한계점이 있기 때문에 무한정으로 빨라지지는 않고, 최대로 생성할 수 있는 프로세스 수와 스레드 수도 한정되어 있다.) JVM에서 스레드를 생성하면 커널 레벨 스레드와 1:1 맵핑이 된다고 한다.

SMT(하이퍼스레딩)

 

단일 코어 시스템에서 CPU는 한 번에 1개의 스레드만 실행가능하다. SMT는 부가적인 하드웨어를 추가해 ALU를 논리적으로 2번 실행하게 만드는 기법이다. CPU가 일하는 단계도 여러 단계가 있는데 이 단계를 쪼개서 pipeline화 한다. 실제로 CPU에서 일하는 단계중 가장 중요한 것은 ALU가 연산하는 내용이다. 단계를 쪼개서 놀리지않고 단계별로 계속 task를 실행하게 하면서 마치 1개의 코어를 2개의 코어 역할을 하는 것처럼 느끼게 해준다. N개의 코어가 있다면 부가적인 하드웨어(register, PC)를 N*2개 추가하여 N개의 하드웨어를 N*2개 처럼 느끼게 해준다. 파이프라인화 한다는 것은 컨베이어 벨트처럼 생각하면 이해하기 쉬울 듯 하다.

프로세스의 생성과정

fork(), exec()의 시스템콜로 생성된다. fork로 복사하여, exec로 원하는 내용으로 덮어쓴다.

 

프로세스의 생성

fork()가 일어나면 부모는 자신과 동일한 자식을 생성한다. 부모는 모통 기다리고, 자식인 경우 exec로 자신이 원하는 프로세스로 만든다. 자식 프로세스가 종료되면 부모가 자원을 처리해준다. 따라서 항상 자식이 부모보다 먼저 죽는다.

 

 

Shell의 동작을 살펴보면, 프롬프트 -> 키보드 입력 -> fork() -> exec() -> 프롬프트 의 순서로 이루어진다. ls 같은 명령어도 하나의 프로세스가 생겨나고 죽는 것과 동일하다. 

스레드의 생성과정

 

스레드의 생성

 

프로세스는 기본적으로 main thread가 1개 존재한다. pthread_create(실행할 함수)로 추가 스레드가 만들어진다. 현재 프로세스에 추가되는 것이며, 모든 스레드의 단위는 함수단위이다. 스레드는 data, heap, code 영역을 프로세스 내에서 공유한다. PC, 레지스터셋을 가지는 것은 문맥교환이 일어날 때 필요하기 때문이다. 커널 레벨 스레드도 문맥교환이 일어나며, 다만 context switch 발생시 교체되는 정보의 양이 프로세스보다 적은 것이기 때문에 경제성있어 가볍다고 하는 것이다.

프로세스와 스레드의 Join()

join() : 부모 프로세스가 자식 프로세스의 리소스를 정리하기 위해 종료까지 기다린다.

pthread_join() : 스레드의 종료까지 기다려준다. 스레드의 실행 결과를 받아 다른일을 처리하는 과정이 필요하기 때문이다.

 

join()을 하지 않으면 대부분의 경우 부모가 먼저 종료된다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함