-
프로그램에 대해 설명해주세요.
실행 파일 형태로 디스크에 저장되어 있는 기계어의 집합
- 프로그램이 실행되면 physical memory에 올라가서 프로세스가 된다.
- 프로세스는 자신만의 독자적인 메모리 공간을 가지게되고, 해당 프로세스가 CPU 제어권을 잡게 되면 자신에게 할당된 메모리 공간을 사용하여 연산을 수행한다.
- 코드 영역에 있는 기계어를 수행
- 데이터 영역에 있는 전역변수를 참조
- 스택 영역에 있는 함수 호출 관련 정보를 참조
-
프로세스에 대해 설명해주세요.
프로그램을 실행시켜 메모리에 올라간 상태
- 각 프로세스는 자신만의 독자적인 가상 메모리 공간을 할당받는다.
- 만약 메모리에 올라간 프로세스가 너무 많아서 경합이 심해질 경우, 현재 기계어를 실행하는데 필수적인 부분을 제외하고 Disk의 스왑 영역으로 내려가게 된다.
- 이 때 프로세스는 physical memory에 올라가 있는 부분과 Disk의 swap 영역으로 내려온 부분을 구분할 수 없으며, 이를 포괄하는 개념인 가상 메모리 공간 자체를 자신의 메모리 공간이라고 인식하게 된다.
- virtual memory와 physical memory는 주소 체계가 다르기 때문에, 주소 변환 작업이 필요하다.
-
프로세스의 메모리 공간에 대해 설명해주세요.
일반 사용자 프로세스의 메모리 공간은 크게 세 파트로 분류된다.
- 코드 영역 : 프로그램 실행을 위한 기계어가 존재한다.
- 데이터 영역 : 전역변수 등의 정보가 존재한다.
- 스택 영역 : 호출된 함수와 리턴 정보 등이 존재한다.
커널도 사용자 프로세스와 동일한 구조의 메모리 공간을 가진다.
- 코드 영역 : 커널의 함수 실행을 위한 기계어 (시스템 콜, 인터럽트 처리를 위한 코드..)
- 데이터 영역 : 모든 하드웨어 및 프로세스 관리를 위한 데이터들
- 스택 영역 : 실행 중인 프로세스들의 함수 호출 관련 정보
-
쓰레드에 대해 설명해주세요.
CPU 실행의 기본 단위
- 전통적인 프로세스 방식인 heavyweight process는 하나의 프로세스가 하나의 스레드를 이루는 구조
- 이와 대비되는 lightweight process는 하나의 프로세스가 여러 개의 스레드를 이루는 구조를 가진다.
- 이 때 CPU 수행 관련 정보인 PC, register set 및 stack 영역은 스레드별로 별도로 가진다.
- 나머지 code, data 영역과 OS resource는 동료 스레드들과 공유한다.
-
프로세스와 쓰레드가 어떤 차이가 있는지 예시를 들어 설명해주세요.
프로세스는 프로그램을 실행하여 메모리에 올려 놓은 것, 쓰레드는 해당 프로세스를 실행하는 단위
- 프로세스가 단일 스레드로 구성된 heavyweight process와 프로세스가 다중 스레드로 구성된 lightweight 구조의 차이를 비교해보겠다.
- 예시 : 웹브라우저에서 특정 사이트를 접근하는 경우
- 사이트 URL을 넣으면 네트워크를 통해 웹서버에 해당 웹 페이지 내용을 요청한다.
- 이 때 페이지에 text말고도 image가 존재한다면 image는 url을 통해 다시 웹서버에 요청하는 과정을 거쳐야 함.
- 단일 스레드 환경이라면 네트워크로 웹 페이지의 내용을 요청하는 작업을 수행하는 동안 사용자는 아무 것도 볼 수가 없어 매우 답답할 것
- 다중 스레드 환경이라면 스레드1이 네트워크로 image 등의 부가적인 요청을 할 동안 나머지 스레드가 현재 사용자에게 당장 보여줄 수 있는 text 등을 표시할 수 있다. → 사용자 입장에선 응답성 빠르다고 느낄 수 있다.
-
쓰레드의 메모리 공간(스택, 데이터, 코드)에대해 설명해주세요.
- 코드 영역 : 프로그램의 실행에 필요한 기계어가 존재
- 데이터 영역 : 전역변수 등의 데이터가 존재
- 스택 영역 : 함수 호출 관련 정보가 존재
- 각 스레드는 기계어의 다른 부분을 작업하므로 스레드별로 별도의 공간을 가짐
-
프로세스 제어블록(PCB)에 대해 설명해주세요.
- PCB에는 어떤 정보가 담겨있을까요?
운영체제가 프로세스를 관리하기 위해 가지고 있는 정보
- OS가 관리상 필요한 정보
- CPU 수행 관련 하드웨어 값
- Program counter : 해당 프로세스가 어느 위치까지 코드 실행했는지에 대한 메모리 주소값
- Register set : 해당 프로세스가 기계어 실행하면서 사용한 레지스터 값들
- 메모리 관련
- 파일 관련
*멀티 스레드 환경에서는 pc, register set을 스레드 별로 가지게 된다.
-
쓰레드 제어블록(TCB)에 대해 설명해주세요.
출처 : https://teraphonia.tistory.com/802
운영체제가 프로세스 내의 스레드를 관리하기 위해 가지고 있는 정보
- CPU 수행관련 하드웨어 값
- PCB를 가리키는 포인터
-
멀티 프로세스에 대해서 설명해주세요.
하나의 프로그램에서 여러 개의 프로세스를 실행하는 것
- 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성하므로서 다중 프로세스를 구성하는 구조
- fork(), exec() 등의 시스템 콜을 통해 자신을 복제한 프로세스를 생성하고, 다른 프로그램을 씌워 동작시킨다.
- 장점으로는
- (안정성 확보) 각 프로세스가 독립적인 메모리 공간을 가지기 때문에 한 프로세스가 비정상 종료되어도 영향을 받지 않아 안정성을 확보할 수 있다는 점이 있다.
- 단점으로는
- (컨텍스트 스위칭 오버헤드)
- (메모리 사용량 증가) 똑같은 기계어 코드의 여러 카피가 메모리에 올라가므로 사용량이 증가
-
멀티 쓰레딩에 대해서 설명해주세요.
하나의 프로세스 안에 여러 개의 스레드가 존재하는 것
- 각 스레드별로 CPU 수행 관련 공간은 별도로 가진다. (메모리 공간의 stack, PCB의 pc, registers)
- 프로세스 내의 나머지 정보는 동료 스레드들과 공유한다. (메모리 공간의 코드 및 데이터, OS resources)
- 장점으로는
- 동일한 실행파일을 여러 개 띄우는 멀티 프로세스 방식보다 훨씬 효율적
- 컨텍스트 스위칭으로 인한 오버헤드가 없다
- 단점으로는
- (안정성 문제) 하나의 스레드에서 문제가 발생하면 해당 프로세스 내에 있는 다른 스레드들에도 문제가 전파될 수 있다.
-
프로세스 수행 상태 변화 과정에 대해 설명해주세요.
기본적으로 3가지 상태를 가진다.
- 프로세스가 생성된 후 CPU 사용할 준비를 마치고 Ready Queue에서 대기하는 상태 → ready
- CPU 제어권을 잡고 기계어를 실행 중인 상태 → running
- 키보드 입력 및 IO 요청을 대기하느라 CPU를 사용할 수 없는 상태 → blocked
위의 상태는 CPU를 사용하든 사용하고 있지 않든 뭔가를 수행하고 있는 상태이기 때문에 active 상태라고 간주.
이 외에 중단 상태로 여겨지는 suspended 상태가 있다.
- 메모리에 경합이 심해 swapper에 의해 메모리를 통째로 빼앗겨 메모리에 올라가 있지 않은 상태의 프로세스들이 이에 해당한다.
- 이들은 외부에서 다시 메모리를 부여해 줘야 active 영역으로 돌아갈 수 있다.
-
문맥교환(context switch)에 대해 설명해주세요.
- 문맥교환은 언제 발생하나요?
- 문맥 교환 발생 과정에 대해서 조금 더 상세히 설명해주세요.
문맥교환이란, 운영체제가 CPU 제어권을 다른 프로세스로 넘겨주기 위해서 CPU 내의 pc(program counter)와 register 집합 값을 교환하는 과정을 말한다.
- 운영체제가 프로세스 a에서 프로세스 b로 CPU를 넘기는 상황을 예로 들어보면
- 프로세스 a로부터 제어권을 뺏기 전 프로세스 a의 문맥 (pc과 연산에 필요한 register 들)을 커널 메모리에 존재하는 프로세스 a의 PCB(Process Control Block)에 저장한다.
- 그리고 프로세스 b의 문맥을 커널 메모리의 프로세스 b PCB로부터 CPU로 로드한다.
- 각 프로세스가 CPU 제어권을 얻었다 뺏겼다 하는데, 매번 CPU를 빼앗길 때 각 프로세스가 어디까지 수행되었는지에 대한 문맥을 저장해 놔야 다음번에 CPU을 얻었을 때 다음 지점부터 실행할 수 있기 때문에 이러한 작업을 거친다.
-
fork() 명령어에 대해 설명해주세요.
자식 프로세스를 생성하는 시스템 콜 명령어
- 새로운 프로세스의 메모리 주소공간에 부모 프로세스의 컨텍스트가 정확히 카피되어 들어간다. (메모리 및 PCB)
- 자식 프로세스는 보통 exec()를 통해 새로운 프로그램으로 덮어씌우는 방식으로 다른 작업을 수행한다.
-
프로세스끼리 협력하는 방법에 대해서 설명해주세요.
원칙적으로 프로세스들은 자신의 메모리 공간을 타 프로세스와 공유하지 않고, 자신 혼자 운영체제 및 컴퓨터 자원을 사용한다는 전제하에 동작하기 때문에 협력이 불가능하다.
따라서 협력이 필요한 상황에서는 프로세스 협력 매커니즘을 통해 협력을 한다.
- 방법 2가지
- message passing : 커널을 통해 메세지를 전달하는 방식
- shared memory : 메모리를 서로 공유하는 방식