1. 시스템 콜이 무엇인지 설명해 주세요
운영체제는 컴퓨터 자원들을 효율적으로 관리하며 사용자가 컴퓨터를 편리하고 효율적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램들의 모임입니다.여기서 커널이란 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고, 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다. 이때 메모리에 상주하는 운영체제의 부분을 kernel(커널)이라고 한다
서로 다른 시스템 콜을 어떻게 구분할 수 있을까요?
각 시스템 콜에는 번호가 할당 되고시스템 콜 인터페이스는 시스템 콜 번호와 시스템 콜핸들러 함수 주소로 구성되는 시스템 콜 테이블을 유지한다.
운영체제는 자신의 커널 영역에서 해당 인덱스가 가리키는 주소에 저장되어 있는 루틴을 수행한다.
작업이 완료되면 cpu에게 인터럽트 발생 시켜 수행이 완료 되었음을 알린다.
시스템 콜 테이블은 일반적으로 배열 형태로 관리(map이 아니었다.) - 시스템 콜 번호를 인덱스로 하여 직접접으로 해당 시스템 콜을 찾아 실행
- map으로 할수는 있지만 느리고 복잡하다.
왜 유저모드와 커널모드를 구분해야 하나요?
os는 크게 두가지 모드로 운영 되는데 유저모드와 커널 모드이다. 두가지 모드를 번갈아가면서 실행한다.
유저 모드는 사용자 프로그램이 실행되는 공간 : 우리가 사용하는 프로그램
하지만 유저 모드에서는 시스템의 모든 자원에 직접 접근 할 수 없어, 커널에게 시스템 콜을 통해 서비스를 요청해야 한다.
사용자 프로그램이 시스템 전체에 영향을 미치는 행위를 제한
커널 모드는 시스템의 하드웨어를 직접 제어하고 시스템 자원을 관리하는 등 시스템 전체를 운영하는 역할
시스템 모든 자원에 대한 무제한 적인 접근 권한을 가지고 있다. 반대로 잘못된 커널 코드는 시스템 전체에 치명적인 오류를 발생 시킬 수 있다.
여러 사용자가 시스템을 동시에 사용하더라도 서로간의 간섭을 최소화 해야하기 때문
하드웨어에 대한 직접적 접근을 커널 모드에서만 허용하여 하드웨어 오류 발생시 시스템 전체가 마비 되는것을 방지
운영체제의 Dual Mode 에 대해 설명해 주세요.
다중 프로그래밍 환경에서 운영체제를 보호하는 보안 기법이다.
응용 프로그램이 운영체제의 자원(메모리, cpu, 하드)에 직접 접근하는 것을 방지하기 위해 유저 모드와 커널 모드 두가지 모드로 분리하는 것
유저모드와 커널 모드로 나우어 모듈화 함으로 써 시스템 개발하고 관리하기 쉽도록
우리가 사용하는 시스템 콜의 예시를 들어주세요.
파일 시스템 관련
- open: 파일을 열 때 사용됩니다. 예를 들어, 텍스트 편집기에서 파일을 열 때 내부적으로 open 시스템 콜이 호출됩니다.
- read: 파일에서 데이터를 읽어올 때 사용됩니다. 웹 브라우저에서 웹 페이지를 불러올 때 HTML 파일을 읽기 위해 read 시스템 콜이 사용됩니다.
- write: 파일에 데이터를 쓸 때 사용됩니다. 문서를 저장할 때 내용을 파일에 쓰기 위해 write 시스템 콜이 사용됩니다.
- close: 열린 파일을 닫을 때 사용됩니다. 프로그램 종료 시 열려 있는 파일을 모두 닫기 위해 close 시스템 콜이 호출됩니다.
프로세스 관리
- fork: 새로운 프로세스를 생성할 때 사용됩니다. 멀티태스킹 환경에서 여러 프로그램을 동시에 실행하기 위해 fork 시스템 콜이 사용됩니다.
- exec: 실행 중인 프로세스를 다른 프로그램으로 교체할 때 사용됩니다. 터미널에서 명령을 실행할 때 exec 시스템 콜이 사용됩니다.
- exit: 현재 프로세스를 종료할 때 사용됩니다. 프로그램이 정상적으로 종료될 때 exit 시스템 콜이 호출됩니다.
메모리 관리
- malloc : 동적 메모리 할당
- free : 동적 메모리 할당 해제
네트워크:
- socket: 소켓을 생성하여 네트워크 통신을 시작할 때 사용됩니다. 웹 브라우저에서 웹 서버와 통신하기 위해 소켓을 생성합니다.
- connect: 서버에 연결할 때 사용됩니다. 클라이언트 프로그램이 서버에 연결을 요청할 때 connect 시스템 콜이 사용됩니다.
- send: 데이터를 네트워크 상으로 전송할 때 사용됩니다. 웹 브라우저에서 서버로 요청을 보낼 때 send 시스템 콜이 사용됩니다.
- recv: 네트워크 상에서 데이터를 수신할 때 사용됩니다. 웹 브라우저에서 서버로부터 응답을 받을 때 recv 시스템 콜이 사용됩니다.
시스템 콜의 유형에 대해 설명해 주세요.
프로세스 제어, 파일 조작, 장치 관리, 정보 유지, 통신, 보호 등 6가지로 분류
시스템 콜이, 운영체제에서 어떤 과정으로 실행되는지 설명해 주세요.
사용자 프로그램에서 시스템 콜 호출, OPEN이라는 시스템 콜 호출하면
커널 모드로 모드 전환
커널 모드로 전화하면서 특정 인터럽트 발생 - 운영체제에게 시스템 콜이 발생했다고 알림
운영체제의 인터럽트 처리 루틴 실행 - 시스템 콜 번호 확인 후 시스템 콜 처리 함 수 찾음
시스템 콜 테이블 참조해서 함수 주소를 찾아서 시스템 콜 함수를 수행
시스템 콜 함수 작업 완료하면 결과 값을 사용자 프로그램으로 반환
다시 모드를 cpu는 유저 모드로 전환
사용자 프로 그램에서 결과 처리
추가 질문
- 핸들러랑 번호로 관리를 누가 관리를 하나요?
- 커널이 관리
- 시스템 콜 자원소모가 큰편인가?
- 커널 스택 유저 스택
- 그리고 시스템 콜은 운영체제의 커널이 제공하는 서비스에 대해 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스입니다.
2. 인터럽트가 무엇인지 설명해 주세요.
프로그램 실행 도중 예기치 못한 상황이 발생했을때 발생한 상황을 처리한 후인터럽트는 하드웨어 이벤트, 시스템 이벤트 또는 외부의 비동기 신호와 같이 즉각적인 주의가 필요한 이벤트를 처리하는 데 필수적입니다.인터럽트 벡터 : 인터럽트 벡터는 인터럽트가 발생했을 때, 그 인터럽트를 처리할 수 있는 서비스 루틴들의 주소를 가지고 있는 공간이다
Polling 방식에 대해 설명해 주세요.
cpu가 작업을 진행하다가 입출력 명령을 만나면 입출력 장치에서 데이터를 가져오는 방식
cpu가 직접 일을 하기 때문에 입출력을 하는 동안 다른 일을 못한다. 입출력이 처리 되는 동안 기다려야한다.
특정 이벤트나 상태 변화를 확인하기 위해 주기적, 정해진 시간 간격으로 시스템 상태를 검사, 우체통에 편지가 왔나 확인하듯이
구현이 간단하고 짧은 주기로 polling해서 실시간성을 확보 할 수 있지만 cpu자원 낭비가된다.
인터럽트는 어떻게 처리하나요?
- 인터럽트 발생
하드웨어 인터럽트: I/O 장치, 타이머 등 외부 장치에서 신호가 발생합니다.
소프트웨어 인터럽트: 시스템 콜, 프로세스의 잘못된 명령어 - 현재 상태 저장
CPU는 현재 실행 중이던 프로그램의 상태를 저장합니다. 여기에는 프로그램 카운터(PC), 레지스터 값, 스택 포인터 등이 포함됩니다. 이 정보는 인터럽트 처리가 끝난 후 다시 복원되어 프로그램이 이전 상태로 돌아갈 수 있도록 합니다. - 인터럽트 벡터 테이블 참조
CPU는 발생한 인터럽트의 종류를 확인하고, 인터럽트 벡터 테이블에서 해당 인터럽트에 대한 ISR(interrupt service routine)의 주소를 찾습니다. 인터럽트 벡터 테이블은 인터럽트 번호와 ISR 주소를 짝지어 놓은 테이블입니다. - ISR 실행
CPU는 찾은 ISR의 주소로 점프하여 ISR을 실행합니다. ISR은 인터럽트의 원인을 파악하고 필요한 처리를 수행합니다. 예를 들어, 키보드 인터럽트가 발생하면 키보드 버퍼에서 입력된 문자를 읽어와 처리합니다. - 상태 복원 및 프로그램 복귀
ISR이 모든 작업을 완료하면, 이전에 저장했던 프로그램의 상태를 복원합니다. 즉, PC, 레지스터 값, 스택 포인터 등을 원래 값으로 되돌립니다. - CPU는 저장된 PC 값으로 점프하여 중단되었던 프로그램의 실행을 재개합니다.
인터럽트 처리 과정 요약
- 인터럽트 발생 → 2. 현재 상태 저장 → 3. 인터럽트 벡터 테이블 참조 → 4. ISR 실행 → 5. 상태 복원 및 프로그램 복귀
HW / SW 인터럽트에 대해 설명해 주세요.
외부 인터럽트가 흔하다 - 입출력 장치의 sigal, data가 발생할때까지 원래 작업 수행하다가 해당 기능 수행
외부 인터럽트 : cpu 외부에서 발생하는 신호에 의해 발생하는 인터럽트, 하드웨어 장치에서 발생하며, cpu에게 특정한 작업을 요청하거나 오류 발생을 알리는 역할
내부 인터럽트 : cpu 내부에서 발생하는 예외적인 상황에 의해 발생하는 인터럽트 - 예외 혹은 trap이라고 부름 (0으로 나누기 오류 , 메모리 접근 오류 등)
소프트웨어 인터럽트 : 의도적으로 발생하는 인터럽트 - 시스템 콜이라고 불림
동시에 두 개 이상의 인터럽트가 발생하면, 어떻게 처리해야 하나요?
- 우선 순위 부여 : 각 인터럽트에 우선 순위를 부여하여 더 높은 우선 순위를 가진 인터럽트를 먼저 처리 - 안정성, 우선순위를 어떻게 하느냐에 따라 성능 우선 순위는
- 인터럽트 중첩 처리 : 현재 처리중인 인터럽트가 발생하면 현재 상태를 저장하고 새로운 인터럽트를 처리한후 다시 이전 상태로 복귀하는 방식 - 여러개의 인터럽트를 순차적으로 처리가능, 인터럽트 처리 과정에서 오버 헤드 발생 할 수도
- 인터럽트 마스킹 : 특정 인터럽트를 무시 - 불필요 인터럽트 무시해 성능 향상, 중요한 인터럽트 놓칠 위험
- 다중 프로세서 시스템 활용 : 여러개의 cpu를 사용해서 각각 다른 인터럽트를 처리 - 병렬처리로 성능 크게 향상, 시스템 구성 복잡, 소프트웨어 개발이 어려워진다.
전원 이상(Power fail) > 기계 착오(Machine Check) > 외부 신호(External) > 입출력(I/O) > 명령어 잘못 > 프로그램 검사(Program Check) > SVC(SuperVisor Call)
인터럽트는 보통 인터럽트 벡터를 통해서 발생 여부를 체크한다.
실행중인 작업으로복귀 하는 것
3. 프로세스가 무엇인가요?
프로세스는 실행 중인 프로그램으로 운영체제에 의해 관리 되며 자원을 할당 받아 실행하는 작업 단위
프로그램과 프로세스, 스레드의 차이에 대해 설명해 주세요.
프로그램은 보조 기억 장치에 저장되어 있는 명령어의 집합
프로세스는 메모리에 올라와 실제로 실행되고 있는 상태
스레드는 프로세스 내부의 실행단위 하나의 프로세스 내에 여러개의 작업을 동시에 수행 할 수 있도록 하는 작은 실행단위
프로세스에 비해 생성 및 관리 오버헤드가 적다.
PCB가 무엇인가요?
Process Control Bolck
운영체제에서 프로세스에 대한 모든 정보를 담고 있는 자료구조
운영체제가 프로세스를 관리하고 제어하는데 필수적인 정보를 제공
뭐가들어있는지
운영체제의 스케줄러에 의해 문맥 교환되는 프로세스 정보의 단위
운영체제가 동시에 여러개의 프로세스를 관리해야하는데 PCB가 다수의 프로세스에 대한 정보를 효율적으로 관리,프로세스 간의 컨텍스트 스위칭을 원할하게
문맥교환 : 프로세스가 cpu를 잃고 다른 프로세스에게 cpu를 넘겨줄때 PCB에 저장된 정보를 이용하여 프로세스의 상태를 저장하고 복원
프로세스에 필요한 자원 (cpu, 메모리, IO장치 ) 을 할당하고 관리
그렇다면, 스레드는 PCB를 갖고 있을까요?
스레드는 일반적으로 PCB내부에 포함된 TCB(스레드 제어 블럭)을 통해 관리,
별도의 PCB를 갖지 않는다.
일부 운영체제에서 커널 스레드에게 별도의 PCB를 할당하여 관리하기도 한다.
같은 프로세스 내에서 많은 자원을 공유하기 때문에 가상 메모리 공간을 바꿀 필요없고 캐시에 두 스레드가 공유하는 data가 올라가 있다.
캐시에서 데이터 가져올때 필요한것만 가져오는것이 아니라 주변에 있는 데이터도 가져오는 locality 특성 으로 새로 실행되는 스레드에서 필요한 data도 올라가 있을 수 잇다.
따라서 TCB가 오버헤드가 적다.
리눅스에서, 프로세스와 스레드는 각각 어떻게 생성될까요?
프로세스 생성 : fork()를 통해서 생성할 수 있다. 리눅스는 실행시 init이라는 첫번째 프로세스를 가지고 있다.
Init은 리눅스 커널 부팅이 완료된 뒤 실행되는 첫 번째 프로세스다. 또한 동시에 Init은 커널이 직접 실행하는 유일한 프로세스다.
스레드 : pthread_create()라는 함수로 생성 할 수 있다.
첫번째 인자로 생성할 스레드의 id가 저장될 주소 , 두번째 인자로 특성
꼬리질문
- fork와 exec의 차이
자식 프로세스가 상태를 알리지 않고 죽거나, 부모 프로세스가 먼저 죽게 되면 어떻게 처리하나요?
이를 좀비 프로세스와 고아 프로세스 라고 하는데
좀비 프로세스 : 자식 프로세스가 종료되었지만 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않아 프로세스 테이블에 남아 있는 경우
부모 프로세스가 wait() 또는 waitpid() 시스템 호출을 통해 자식 프로세스의 종료 상태를 확인하지 않거나, 자식 프로세스가 비정상적으로 종료되어 부모 프로세스가 종료 상태를 회수하지 못하는 경우 발생합니다.
부모 프로세스에서 wait() 또는 waitpid() 호출 하거나 SIGCHLD 시그널을 처리하여 프로세스의 종료를 감지하고 wait()또는 waitpid()를 호출 하여 좀비 프로세스를 처리
고아 프로세스 : 부모 프로세스가 먼저 종료 되어 자식 프로세스가 부모 없이 남게 된 상태
부모 프로세스가 비정상적 종료 되거나 자식 프로세스가 오래 실행되면 발생
init프로세스가 고아 프로세스의 새로운 부모 프로세스가 되어 관리
어떻게 init프로세스가 고아 프로세스를 데려가는가?
- 운영 체제가 고아 프로세스를 감지하고 처리하는 원리
- 운영 체제는 모든 프로세스의 정보를 프로세스 테이블에 저장합니다.
- 여기에는 pid (프로세스 ID)와 ppid (부모 프로세스 ID)가 포함됩니다.
- 부모 프로세스가 종료되면 자식 프로세스의 ppid를 업데이트하여 **init 프로세스의 PID(1)**로 설정합니다.
- 운영 체제는 모든 프로세스의 정보를 프로세스 테이블에 저장합니다.
리눅스에서, 데몬프로세스에 대해 설명해 주세요.
사용자가 직접적으로 제어하지 않고 백그라운드에서 끊임없이 실행되면서 다양한 작업 수행하는 프로그램
사용자 인터페이스 없이 백그라운드에서 실행
시스템이 종료될때까지 계속 실행 혹은 특정 조건에 의해 종료 되어 장기적으로 실행된다.
일반적으로 사용자의 명령을 기다리지 않고 스스로 작업 수행
네트워크나 파일 관리 등 다양한 시스템 제공한다.
예시 - 웹서버 (Apache, Nginx), 데이터 베이스 서버, ssh서버 등
init프로세스도 데몬
원래 프로그램이 종료 되어도 어떻게 계속 실행되는가? - init프로세스의 자식 프로세스가 되어서 계속 실행된다.
데몬 프로세스 생성 과정
- 데몬 프로세스의 동작 과정
- 부모 프로세스에서 자식 프로세스 생성
- fork()를 호출해 자식 프로세스를 생성합니다.
- 부모는 자식 프로세스를 독립시키고 종료됩니다.
- 세션 리더로 변경
- 자식 프로세스는 setsid()를 호출해 새로운 세션을 생성하고 터미널과 분리됩니다.
- 작업 디렉터리 변경
- 현재 디렉터리를 /로 변경해 파일 시스템 의존성을 최소화합니다.
- 파일 디스크립터 닫기
- 표준 입력/출력/에러 스트림을 닫거나 /dev/null로 재지정합니다.
- 특정 작업 수행
- 데몬 프로세스는 무한 루프나 특정 이벤트가 발생할 때까지 기다리는 구조로 설계됩니다.
- 부모 프로세스에서 자식 프로세스 생성
리눅스는 프로세스가 일종의 트리를 형성하고 있습니다. 이 트리의 루트 노드에 위치하는 프로세스에 대해 설명해 주세요.
Init프로세스 : 시스템 부팅시 가장 먼저 생성되는 프로세스
시스템 서비스를 시작하고 관리하는 역할
시스템 종료시 모든 프로세스 정리하고 안정적으로 종료
고아 프로세스를 입양하여 관리
init 프로세스의 관리는 시스템 안정성에 직접적인 영향을 미친다.
4. 프로세스 주소공간에 대해 설명해 주세요.
힙 영역 : 런타임에 크기가 결정되는 영역 사용자에 의해 공간이 동적으로 할당 및 해제, 참조형 데이터 등의 데이터가 할당
코드 영역: 프로그램이 실행 될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장 되어 있는 공간(ReadOnly)
데이터 영역 : 전역 변수나 static 변수등 프로그램이 사용할 수 있는 데이터를 저장하는 영역 프로그램 시작과 함께 할당, 프로그램 종료되면 소멸
스택 영역: 함수의 호출과 관계되는 지역변수와 매개변수가 저장되는 영역 스택영역의 값은 함수 호출과 함께 할당, 함수 호출 완료시 소멸
프로세스가 메모리를 할당 받으면 메모리를 관리하기 위해 만든 구조
초기화 하지 않은 변수들은 어디에 저장될까요?
BSS영역에 할당 된다. Block Started by Symbol
데이터 영역 안에 있는 영역, 초기화 된 데이터는 초기값을 저장해야하므로 rom에 저장 rom에 저장후 ram에 값을 복사한다. 하지만 초기화 되지 않은 데이터 까지 rom에 저장되면 큰size의 rom이 필요하므로 구분
프로그램 실행시에 0으로 초기화 되는 메모리 영역
프로그램 실행전에는 실제로 메모리 차지 하지 않고 실힝시에 플요한 공간만 할당
일반적인 주소공간 그림처럼, Stack과 Heap의 크기는 매우 크다고 할 수 있을까요? 그렇지 않다면, 그 크기는 언제 결정될까요?
크다고 할 수 없다. 주어진 적은 크기만 사용가능하지만 두영역사이의 빈공간에 동적으로 메모리를 할당 가능하다.
스택 과 힙의크기를 작게 하고 가는데 왜냐하면 커널, 기타 시스템 프로세스 등 다양한 구성요소 가 있어 스택과 힙에는 제한적인 메모리양
스택이나 힙을 크게하면 너무 크게 할당하면 스택 오버 플로우나 힙 부족 문제발생할 수 잇따.
프로그램 특성에따라 스택과 힙의 크기를 달리한다.
스택은 컴파일시, 힙은 런타임시
Stack과 Heap 공간에 대해, 접근 속도가 더 빠른 공간은 어디일까요?
스택에서 할당의 의미는 이미 생성되어 있는 스택에 대해 포인터의 위치만 바꿔주는 단순한 CPU instruction이지만, 힙에서의 할당은 요청된 크기, 현재 메모리 상황 등 다양한 요소들을 고려하기 때문에 더 많은 CPU Instruction
다음과 같이 공간을 분할하는 이유가 있을까요?
데이터를 공유하여 메모리 사용량 줄인다. 스택과 데이터를 나누는 이유는 스택의 특성과 전역 변수의 활용성을 위해
스레드의 주소공간은 어떻게 구성되어 있을까요?
공유되는 영역
- 코드 영역: 모든 스레드는 동일한 코드를 실행하므로 코드 영역을 공유합니다.
- 데이터 영역: 전역 변수, 정적 변수 등이 저장되는 영역으로, 모든 스레드가 공유합니다.
- 힙 영역: 동적으로 할당된 메모리 영역으로, 모든 스레드가 공유합니다.
비공유되는 영역
- 스택 영역: 각 스레드는 자신만의 스택 영역을 가지고 있습니다. 함수 호출 시 지역 변수, 매개변수 등이 저장되는 영역으로, 스레드마다 독립적인 실행 환경을 제공합니다.
"스택"영역과 "힙"영역은 정말 자료구조의 스택/힙과 연관이 있는 걸까요? 만약 그렇다면, 각 주소공간의 동작과정과 연계해서 설명해 주세요.
완전히 동일하지는 않다.
스택: 후입 선출, 함수 호출시 스택 포인터가 고주소에서 저주소로 감소하면서 새로운 스택 프레임 생성 함수 호출 시 스택 포인터가 감소하고 새로운 스택 프레임이 생성됩니다. 함수 내에서 지역 변수와 매개변수가 스택에 할당됩니다. 함수가 종료될 때 스택 포인터가 증가하고 스택 프레임이 해제됩니다.
힙: 힙 자료구조와 같이 메모리 블록을 자유롭게 할당하고 해제 할 수 있다. 자료구조 힙은 최대힙 최소 힙을 하지만 주소공간의 힙은 아무 연관없다.
IPC의 Shared Memory 기법은 프로세스 주소공간의 어디에 들어가나요? 그런 이유가 있을까요?
일반적으로 data영역과 heap영역
data영역 : 프로그램 시작시 부터 사용 - 프로그램 시작시부터 공유 메모리 필요한 경우 미리 할당하여 사용 할 수 잇따.
힙 영역: 프로그램 실행중에 필요에 따라 공유 메모리 크기 조절
공유 메모리 할당 - 프로세스 간 데이터 전달 속도 빠르고 간편
단점 : 동기화 문제 , 메모리 문제 (공유 메모리 해제 잘못하면 메모리 누수)
스택과 힙영역의 크기는 언제 결정되나요? 프로그램 개발자가 아닌, 사용자가 이 공간의 크기를 수정할 수 있나요?
메모리 관리는 운영체제읭 영역이라 사용자가 관리 할 수 없다.
'Java' 카테고리의 다른 글
Java 면접(인터뷰) 스터디 회고 3 (0) | 2024.11.21 |
---|---|
CS 스터디 회고 - java 2 (0) | 2024.11.15 |
[CS 스터디 회고] JAVA 면접 질문 대비 (1) | 2024.11.08 |
JAVA JVM Memory 정리 (1) | 2024.07.08 |
Java priority queue (0) | 2023.09.30 |