프로세스와 스레드의 차이
-
프로세스와 스레드 모두 실행의 독립적인 시퀀스
-
차이점 : 같은 프로세스 안의 스레드들은 shared memory space 안에서 동작
-
반대로 프로세스는 Separate memory memory space 안에서 동작
Process
- 실행중인 프로그램
- Disk → 메모리 적재
- OS로부터 address space, file, memory 등을 할당받음.
- 프로세스 스택 : 함수의 매개변수, 복귀 주소, 로컬 변수 등의 임시자료
- 데이터 섹션 : 데이터 섹션
- 힙 : 프로세스 실행 중에 동적으로 할당
- PCB : 프로세스에 대한 중요한 정보를 저장
-
프로세스의 생성과 동시에 고유한 PCB가 생성됨
-
프로세스 전환 이 발생하면 진행하던 작업을 PCB에 저장후 CPU 반환 → 다시 CPU 할당받으면 PCB에 저장된 내용을 불러와 다시 작업 수행
PCB 저장 정보 → PintOS에서는 Struct thread
자체가 PCB
→ tid, status, 이름, priority, wakeup틱, elem, 기다리는 lock에 대한 포인터, donation정보, parent_if, child_list(왜필요하더라?), child_elem, file descriptor table, Supplemental page table, stack bottom, rsp_stack , 스위칭을 위한 intr_frame 등을 요소로 가짐
- PCB는 연결리스트로 관리되며, 커널 힙에 존재한다 = ready_list, sleep_list에 element로써 쓰레드 구조체를 넣음
- 프로세스가 시스템콜을 하면, 유저 프로세스가 유저 영역에 있다가 커널 영역에서 수행된다 = 유저 쓰레드는 각자의 Virtual Adress로써 커널영역, 유저영역을 가지고 있고, syscall이 호출되면 해당 쓰레드의 PC값이 커널 영역으로 JUMP하는 것일 뿐, 쓰레드가 바뀌는 것이 아니다.
PCB
운영체제가 프로세스를 관리하기 위해 프로세스당 유지하는 정보
- OS가 관리상 사용하는 정보
- process 상태, PID, 우선순위
- CPU 수행 관련 하드웨어 값
- PC, registers
- 메모리 관련
- code, data, stack의 위치 정보
- 파일 관련
- Open file Descriptors
⇒ 운영체제 커널의 주소 공간에서 PCB를 프로세스마다 가지고 있다
Threads
- 프로세스의 실행 단위
- 프로세스 내부의 주소공간이나 자원을 공유
- 같은 프로세스의 다른 쓰레드와 code, data, open file 등의 자원을 공유
- 스택을 쓰레드마다 독립적으로 할당
- 스택에 함수 호출시의 인자, 되돌아 가는 주소값, 함수 내 선언된 변수 등을 저장함
- 이러한 스택 공간이 독립적이기 때문에 독립적인 함수 호출이 가능함 ⇒ 독립적인 실행 흐름이 추가되는 것
- 마찬가지로, PC Register를 스레드마다 독립적으로 할당해서
- 스레드의 명령어가 어느부분까지 수행했는지를 기록
Simultaenous VS Concurrent
- Simultaneous는 실제로 여러일이 동시에 벌어지는거고
- Concurrent는 동시에 벌어지는 듯 보이지만, 실제로는 엄청 빠르게 switching 중인거임
그래서, single core만 있으면 concurrent execution만이 가능하다.
그런데 multiple core가 있다면 쓰레드들을 각각 코어에 올려서 simultaneous 한 실행이 가능하다.
이들을 Schedule 하는것은 OS의 일이다.