동기식, 비동기식 입출력
프로세스가 입출력이 진행되는 동안에 CPU 점유는 중요하지 않음
입출력 명령을 계속 대기하면 동기,
해놓고서 다른 작업을 수행하면 비동기
구현 1
I/O가 끝날때 까지 계속 대기해 CPU를 낭비시킴
매시점 하나의 입출력만 일어남
구현 2
입출력이 완료될 때까지 해당 프로그램에서 CPU를 빼앗음
다른 프로그램에서 CPU를 가지고 연산 수행
입출력 작업이 완료되면 해당 프로세스에 CPU할당
스레드
프로세스 내부의 CPU 수행단위가 여러개 있는것이 스레드
프로세스마다 code, data, stack 이 주어짐
CPU수행과 관련된정보는 스레드가 별도로 가지고있고,
나머지는 공유한다.
스레드의 구성
program counter
register set
stack
스레드의 장점
다중스레드 구성된 작업구조에서는 하나의 스레드가 blocked 상태인 경우에도
동일한 작업 내의 다른 스레드가 실행되어 빠른 처리가 가능하다.
1, 2, 3 을 보여줄때
먼저 완료된거 바로 보여주게 되면 사용자에게 좀더 원활한 서비스를 제공가능자원 공유 - 같은 일을 하는 프로그램을 멀티 프로세스를 구성하기 보다는 cpu 수행단위만 여러개로 주게되면 자원을 효율적으로 사용이 가능하다.
같은 작업을 다중 스레드를 사용하여 동시처리가 좋아지고 성능 최적화를 할 수 있다.
(병렬 처리)여러개의 프로세스에서 각각의 스레드가 서로 다른 CPU에서 병렬적으로 작업 수행이 가능하다.
커널 스레드
커널의 지원을 받는 스레드
운영체제 커널이 여러 스레드로 구성되어 있는것을 알고있음
유저 스레드
라이브러리를 통해 지원, 프로세스안에 여러 스레드가 있다는것을 운영체제는 모름
구현사항에 제약은 있을 수 있음
프로세스
프로세스는 파일 형태로 존재하는(ex - xxx.exe 등) 프로그램이 실행되어 메모리에 올라가 있는 상태를 뜻한다.
잡(Job)이라는 용어와도 혼용해서 부른다.
프로세스를 이해하려면 프로세스 문맥(Context)도 알아야 한다.
프로세스 문맥(Context)
문맥은 해당 프로세스의 주소공간, 레지스터의 값, 시스템 콜 등등을 통해
커널에서 수행한 작업의 상태, 커널이 관리하고 있는 정보들을 담고있다.
프로그램이 프로세스가 되면, 운영체제는 프로세스를 관리하기 위한 자료구조를 유지한다.
이 두개가 바로 PCB, 커널스택이다.
프로세스의 상태에는 실행, 준비, 봉쇄가 있다.
- 실행
- 프로세스가 CPU를 보유, 기계어 명령을 실행하고 있는 상태
- CPU는 하나뿐이므로, 여러 프로세스가 실행된다 하더라도 실행 상태에 있는 프로세스는 매 시점에 하나뿐
- 준비
- CPU를 할당 받지 못한 상태
- 봉쇄
- CPU를 할당받더라도 바로 명령을 실행할 수 없는 프로세스의 상태
- 프로세스가 요청한 입출력 작업이 진행중인 경우 이에 해당함
프로세스의 상태를 구분하는 이유는 컴퓨터의 자원을 효율적으로 관리하기 위함
크게는 3가지이고
시작과 완료 상태가 존재한다.
프로세스가 시작되어 프로세스를 위한 자료구조는 생성됐는데 메모리를 획득하지 못한 경우를 시작상태,
프로세스와 관련된 자료구조를 완전히 정리하지 못한상태가 완료상태이다.
운영체제에게 입출력을 요구하건 다른 작업을 요구하면 모두 큐에 줄을 서게되고,
자기 차례가 되면 그때서야 데이터들을 받게되고, 그 때 인터럽트가 발생해서 입출력 완료 사실을 알림
프로세스 제어 블록 (Process Control Block; PCB)
PCB는 운영체제가 시스템 내의 프로세스들을 관리하기 위하여 프로세스마다 유지하는 정보들을 저장하는
커널 내의 자료구조이다. 구성 요소는 아래와 같다.
- 프로세스의 상태
- 프로그램 카운터 값
- CPU 레지스터 값
- CPU 스케줄링 정보 (메모리 할당을 위해 필요한 정보)
- 메모리 관리 정보 (메모리 할당을 위해 필요한 정보)
- 자원 사용 정보
- 입출력 상태 정보
문맥교환 (Context Switching)
하나의 프로세스로부터 다른 프로세스로 CPU 제어권이 이동하는 것을 컨텍스트 스위칭이라 한다.
교환이 될 때 원래 CPU를 가지고 있던 프로세스는 프로세스의 문맥들을 PCB블록에 저장하고,
제어권을 받은 CPU는 자기 자신의 저장된 문맥을 PCB로부터 읽어온다. (이 과정이 성능을 느리게 할듯?)
인터럽트에서 설명을 정리했을 수 있는데,
프로세스 중간에 입출력을 해야된다거나 등등으로 운영체제를 사용해야 하는 경우에 시스템 콜을 하게 될텐데
이 때의 프로세스는 컨텍스트 스위칭이 아니라 그냥 해당 프로세스가 실행중인 것이다.
그래서 이러한 과정에선 컨텍스트 스위칭이라고 하지 않는다.
CPU를 점유하는 프로세스가 다른 사용자의 프로세스로 변경되어야만이 컨텍스트 스위칭이라 할 수 있다.
CPU 할당 시간을 아주 작게 설정하면 너무 많이 컨텍스트 스위칭이 일어나서 오버헤드가 커지며
성능이 저하될 것이다.
반대로 너무 시간을 길게 잡게되면 시분할 시스템의 의미가 퇴색될 수 있다.