프로세스 및 스레드 관련 질문
- 프로세스와 스레드의 차이는 무엇인가요?
프로세스는 실행 중인 프로그램으로 작업의 흐름 단위를 말하고,
스레드는 프로세스 내에서 실행되는 흐름 단위를 말한다.
프로세스 내에 작업의 단위를 좀 더 작게 나눈 것이 스레드이다.
각각의 프로세스는 메모리에 올라가 서로 자원과 주소공간을 공유하지 않지만,
스레드는 프로세스 내의 stack을 제외한 메모리 영역을 다른 스레드와 공유한다.
- 스택을 스레드마다 독립적으로 할당하는 이유는 무엇인가요? (= 스레드가 스택만 공유하지 않는 이유는 무엇인가요?)
스택은 함수에 필요한 매개변수, 반환값, 함수 내에 선언되는 변수가 저장되는 공간이다.
즉, 함수와 관련된 메모리 공간이다.
우리가 흔히 함수는 동작을 실행하기 위해 호출하는데,
스택 영역을 공유하지 않음으로써 독립적인 함수 호출이 가능해 독립적인 동작을 할 수 있다는 거다.
이건 스레드가 독립적인 실행 흐름을 가질 수 있다는 뜻이다.
앞서, 스레드는 프로세스 내에서 실행되는 흐름 단위라고 말했는데, 이 정의를 충족시키기 위해서 스택 영역을 공유하지 않는다.
- 멀티 프로세스 대신 멀티 스레드를 사용하는 이유는?
메모리 측면에서 자원을 효율적으로 사용하기 위해서이다.
멀티 프로세스는 메모리 내 자원을 서로 공유하지 않아 시스템 콜을 할 때마다 오버헤드가 크지만,
멀티 스레드는 메모리 영역을 공유하기 때문에 시스템 자원을 효율적으로 쓸 수 있다.
속도 측면에서 문맥 교환의 비용을 줄이고, 응답 속도를 빠르게 하기 위해서다.
메모리 영역을 공유하기 때문에 문맥 교환과 스레드 간의 통신 시 스택 영역만 처리하기에 통신 비용이 적고 응답속도가 빠르다.
- ⛔️ [잘 모르겠음] 사용자 수준의 스레드와 커널 수준의 스레드 차이는?
https://velog.io/@taehee-kim-dev/사용자-수준-스레드-커널-수준-스레드
커널 수준 스레드는 커널 레벨에서 생성되는 스레드라 커널이 직접 관리한다.
사용자 수준의 스레드는 사용자 단에서 생성 및 관리되는 스레드이다.
커널이 따로 관리하지 않고, 커널은 이 스레드에 대해 알지 못한다.
즉, 그 차이는 커널의 통제권 안에 있냐 없냐로 나눠볼 수 있다.
커널에는 사용자 모드와 커널 모드 두 가지가 있는데, 사용자 모드에서 동작하는 스레드가 사용자 수준 스레드이다.
사용자 수준 스레드는 커널의 통제 밖에 있기 때문에 문맥 교환(CPU의 제어권이 다른 프로세스로 넘어가는 것)이 없어, 오버헤드 또한 일어나지 않는다.
...?
- 프로세스 혹은 스레드의 동기화란 무엇인가요?
여러번 말하지만 우리는 프로세스 여러개를 하나의 메모리 공간에 올려두고 돌리는 멀티 프로세스 환경에 살고 있다.
그래서 각 프로세스는 서로 작업을 처리하기 위해서 CPU 너란넘을 갖기 위해 경쟁을 한다.
이렇게 여러 프로세스가 다른 프로세스와 서로 경쟁하며 하나의 데이터를 공유하게 되는 경우가 있는데,
이때 동기화 처리가 필요하다.
데이터를 읽기만 할 경우에는 문제가 없지만, 한 프로세스(A)가 데이터를 조작 시에 프로세스(B)도 같이 조작하게 되면 데이터의 일관성이
깨져 프로세스 간의 동기화가 필요하다.
- 프로세스에 할당되는 메모리의 각 영역에 대해서 설명해주세요.
Stack : 함수를 호출하고 함수의 반환값을 쌓는 영역 / 지역변수, 매개변수, 반환값의 번지 / Last in First Out
Heap : 프로그래머가 동적으로 사용하는 영역
Data : 전역변수, 정적변수(static), 배열, 구조체나 프로그램이 사용하는 자료구조를 저장하는 영역 / 프로세스가 종료될 때까지 유지된다.
Code : CPU에서 실행할 기계어 코드, 작성한 코드가 저장되고 read only 영역이고, 프로세스가 종료될 때까지 유지된다.
프로세스 및 스레드 관련 개념
- 인터럽트
쉽게 말하면 급하게 처리해야 할 작업이 발생할 경우에 인터럽트를 통해서 CPU 제어권을 가져오도록 하기 위해 있는 거다.
인터럽트에 포함되는 작업이 : 하드웨어 입출력 장치 사용, 커널 함수 사용한 시스템 콜 등이 해당된다.
인터럽트는 이런 급한 작업 즉, 우선순위가 높은 작업을 처리하기 위한 용도로 쓰인다.
하드웨어 인터럽트 : 입출력 장치의 작업 처리 / 타이머 인터럽트 / 정전
소프트웨어 인터럽트 : 사용자 프로그램이 사용하기 위해 (trap) - 시스템 콜
- 커널
운영체제의 중추로, 운영체제도 실행되기 위해서는 메모리 영역에 올라가야 하는데
이 커널이 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분이다.
그렇기에 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하고,
메모리나 CPU 등의 하드웨어 같은 컴퓨터 자원을 관리하는 역할을 한다.
인터페이스를 제공한다는 것은
즉, 시스템 콜을 통해 사용자 프로그램들이 컴퓨터 자원을 사용할 수 있게끔 커널은 자원 관리자 같은 역할을 한다.
- 모드비트
현재 CPU의 제어권이 사용자 프로그램(1)에게 있는지, 운영체제(0)에게 있는지 모드비트를 통해 구분할 수 있다.
모드비트가 있는 이유는 예를 들어, 다른 프로그램의 사용자가 내 프로그램을 실행하는 등의 문제를 막는 보안의 이유에서 존재한다.
사용자 프로그램에 있는 경우를 사용자 모드
운영체제에게 있는 경우를 커널 모드라고 하는데
사용자 모드일 경우, 모드비트가 1로 설정되고, 일반 사용자 프로그램이 실행되고 제한적인 명령만 수행할 수 있다.
커널 모드일 경우, 모드비트가 0으로 설정되고, 운영체제 코드를 실행하고 모든 종류의 명령을 수행할 수 있다.
- 문맥교환
CPU 너란 넘을 갖기 위해, 프로세스는 경쟁을 해. 니가 몬데;
유튜브, 카톡, 티스토리 등 여러개의 프로세스를 동시에 처리할 때.. 각각의 프로세스는 CPU가 필요하다.
프로세스는 일을 처리하기 위해서 CPU가 필요하다. CPU를 사용하기 위해 CPU 제어권을 한 프로세스에서 다른 프로세스로 넘겨주는 과정을 말하는 것이다.
넘겨주는 과정에서 운영체제는 프로세스A의 문맥(program counter)을 자신의 PCB에 저장하고 새롭게 CPU 제어권을 갖게 될 프로세스B의 문맥(이전에 저장해둔 PCB로부터)을 복원시켜 중단된 지점부터 다시 실행시킨다.
PCB는 process control block이라고 프로세스의 문맥을 저장하기 위해 운영체제의 커널의영역에 저장해둔 것을 말한다.
여기서 문맥교환이 아닌 것도 기억해야 하는데,CPU의 제어권이 프로세스에서 다른 프로세스로 넘어가는 것이 중요한 포인트다.
만약, 인터럽트나 시스템 콜을 통해 CPU의 제어권이 운영체제에게 넘어가는 경우에는 문맥교환이 아니다.왜냐하면 CPU의 제어권이 다른 프로세스로 넘어간 상황이 아니기 때문이다.
- 메모리
CPU의 작업 공간이다.
프로그램이 실행되기 위해서는 메모리에 올라가야 한다.
기타 질문
- ⛔️ [잘 모르겠음] 시스템 콜(시스템 호출)이란?
커널 영역의 기능을 사용자 모드에서 사용 가능하게, 즉 프로세스가 하드웨어 직접 접근해서 필요한 기능을
사용할 수 있게 해준다.
운영체제의 특정 기능을 쓸 수 있게 하는 인터페이스를 요청하는 함수
시스템 콜의 종류는 프로세스 제어, 파일 조작, 장치 관리, 정보 유지, 통신이 있다.
다른 프로그램 시작 exec()
새 프로세스 생성 fork()
자식 프로세스가 끝날 때까지 대기 wait()
파일 열기 open()
파일 읽기 read()
파일 쓰기 write()
등..
1. 프로세스가 시스템 콜을 호출
2. 트랩이 발생해 커널 모드로 진입
3. 요청받은 시스템 콜 수행
4. 유저 모드로 돌아옴
- PC 레지스터를 스레드마다 독립적으로 할당하는 이유?
PC Register는 Program Counter Register를 말하는데,
CPU에는 수행할 코드 주소를 기억하는 CPU 내부의 데이터 기억장치를 PC Register라고 한다.
그리고 Program Counter는 스레드가 명령어를 어디까지 수행했는지를 나타낸다.
CPU를 할당받았다가 스케줄러에 의해 다시 선점당하기 때문에 명령어가 연속적으로 수행되지 못하고
어느 부분까지 수행했는지 기억할 필요가 있기 때문에 스레드마다 독립적으로 할당한다.
- 문맥 교환의 과정 (컨텍스트 스위칭 과정)
- 가상메모리란?
물리 메모리 크기의 한계를 극복하기 위해 나온 것이다.
물리 메모리보다 큰 프로세스를 수행하기 위해 가상 메모리를 사용한다.
100MB 메모리 크기에서 200MB 크기의 프로세스를 수행하기 위해 사용하는 거라고 봐도 된다.
프로세스는 바로 물리 메모리에 올라가는 게 아니라 각각 독자적으로 가상 메모리라는 가상 주소공간을 가진다.
보통 32비트 기준으로 4GB의 크기를 가지며 각각의 프로세스가 물리 메모리와 상관없이
마치 혼자서 4GB를 모두 사용할 수 있는 것 같은 환상을 가지게 해준다.
가상 메모리는 code, data, heap, stack 영역으로 나뉜다.
가상 주소공간에서 실제로 프로그램을 실행하는 데에 필요한 부분은 block 단위로 물리 메모리에 올라가게 되고,
경우에 따라 물리 메모리의 공간이 부족할 경우에 swap area에 잠시 보관된다.
- DMA란?
Direct Access Memory Controller로, CPU의 인터럽트를 줄여서 CPU 성능을 높이기 위한 것이다.
하는 일은 CPU는 계속 자기일을 하고 있고 중간중간 load buffer에 들어오는 내용은 작업이 끝났으면
DMA가 직접 입출력 장치의 load buffer에 있는 내용을 프로세스로 복사하는 일을 해준다.
그 작업을 다 하고 나서 CPU에게 Interrupt를 한 번만 걸어서 CPU에게 보고한다.
(만약, 입출력 장치에 작업이 들어와서 그때마다 CPU에 인터럽트를 걸고,
입출력 장치에 있는 내용을 복사하는 과정은 CPU의 오버헤드가 크다.)
같은 메모리 영역에 접근할 가능성이 있기 때문에 memory controller가 CPU, DMA 중 누가 먼저 메모리 영역에 접근할 건지 정리한다.
- 메모리 구조와 순서가 어떻게 되는가? CPU에서 가까운 순서로 말해보시오.
레지스터 -> 캐시 -> RAM(주기억장치) -> 보조기억장치
CPU와 가까울 수록 용량이 작고, 속도가 빠르며, 접근빈도가 높다.
보조기억장치는 비휘발성이다.
'⭐️ Computer Science > 운영체제' 카테고리의 다른 글
[운영체제] CPU 스케줄링, 프로세스 상태, CPU 스케줄링 기법 (1) | 2022.09.06 |
---|---|
[운영체제] 운영체제에 들어가기 앞서 (0) | 2022.09.06 |
[운영체제] 3. 프로그램과 프로세스, 스레드, PCB, Context Switching (0) | 2022.08.21 |
[운영체제] 2. 메모리계층, 가상메모리, 스와핑, 페이지폴트, 스레싱 (0) | 2022.08.21 |
[운영체제] 1. 운영체제와 컴퓨터, 인터럽트, 시스템콜과 modebit (0) | 2022.08.21 |