오늘부터는 CS 복습하면서 면접 준비
운영체제
운영체제란?
- 컴퓨터 시스템의 자원(CPU, 메모리)을 관리
- 사용자가 컴퓨터를 사용할 수 있는 환경(인터페이스) 제공
CPU
Control Processin Unit: 중앙 처리 장치
프로세서라고도 함.
- ALU(산술 논리 장치)
- (산술연산) 덧셈, 뺄셈
- (논리연산) 배타적 논리합(XOR), 논리곱(AND), 논리합(OR)
- CU(제어 장치): 제어 신호 발생(데이터 입출력)
- Register Set: 임시 저장 공간, 범용/특수
- 프로그램 카운터(PC)
- 스택 포인터(SP)
- 명령어 레지스터(IR)
- 상태 레지스터 등(SR)
커널
OS 핵심 요소
- CPU 스케줄링
- 메모리 관리
- 입출력 관리
- 파일 시스템 관리
시스템 콜
사용자 모드에서 실행된 프로세스가 자원에 접근하려면 시스템 콜을 통해 커널에 요청
(사용자 모드에서는 특권 명령어가 실행될 수 없음. 커널에 특권 명령어를 실행해달라고 커널에 요청하는 것.)
사용자 모드: 모드 비트 0
커널 모드: 모드 비트 1
시스템 콜에서 커널로 매개변수가 전달되는 방법
- 레지스터에 직접 전달(근데 레지스터가 부족할 수도 있음)
- 메모리에 저장 후 메모리 주소 값을 레지스터에 저장
- 프로그램 스택에 push, OS에서 pop
프로세스
- 디스크에 저장된 데이터가 메모리에 로드되어 실행중인 프로그램을 프로세스라고 함.
- 프로세스는 OS로부터 독립된 메모리 영역(코드, 데이터, 스택, 힙)을 할당 받음.
변수
- 지역변수: 함수 내부에서 선언, 함수 내에서만 접근
- 매개변수: 함수 호출될 때 함수에 값을 전달하기 위해 사용
- 전역변수: 프로그램 어느 곳에서나 접근. 함수 외부 선언.
- 정적 변수: 함수 내외부 선언
정적변수
- 함수 내부에서 선언된 경우: 함수 내에서만 접근가능. 단, 함수가 종료된 후에도 값이 유지.(지역변수가 되지만, 수명은 정적)
- 파일 범위에서 선언된 경우: 파일 내에서 접근 가능. 다른 파일에서는 접근 불가.
스택의 변수는 생명주기 단위가 함수.
데이터 변수는 생명주기 단위가 프로그램.
변수는 생명주기(Lifetime)와 가시성(Visibility)으로 구분할 수 있음.
스레드
스레드는 별도의 스택 영역을 할당 받으며, 힙 영역은 다른 스레드와 공유함.
즉, 스레드는 독립된 스택 영역만 할당받는 것.
(코드, 데이터, 힙은 공유)
PCB
Process Control Block(프로세스 제어 블록)
![](https://velog.velcdn.com/images/classbinu/post/db273e10-d7af-405f-91a8-66db8266f53a/image.png)
프로세스 생성
기존 프로세스에서 fork() 함수를 호출해서 생성
부모는 자식 프로세스의 PID를 반환
자식은 0을 반환
- fork()
- 자식 프로세스 생성: 쓰기 시 복사
메모리 이미지 복사(코드, 데이터, 힙, 스택)
- PID 할당
- fork() 반환: 부모와 자식이 다른 값 반환
- 독립 실행
- 종료(wait())
wait()
자식이 종료될 때까지 부모는 block
프로세스 생명주기
![](https://velog.velcdn.com/images/classbinu/post/185008d1-5616-427f-bbac-ead2353c5881/image.png)
실행 -> 준비로 바뀌는 이유는 프로세스가 실행 가능한 상태임에도 불구하고, 시분할 스케줄링에 따라 CPU 독점을 막기 위해서.
실행 -> 대기로 바뀌는 이유는 I/O 등으로 해당 프로세스가 CPU를 점유해도 실행할 수 없는 상태이기 때문임.
실행 -> 준비로 바뀌는 이유는 특정 프로세스의 CPU 독점을 막기 위해서.
스케줄링 알고리즘에 따라 준비 <-> 실행 과정이 반복해서 발생함.
동시성 vs 병렬성
동시성: 싱글코어에서 여러 작업을 번갈아 가면서 처리하는 방식
병렬성: 멀티코어에서 물리적으로 여러 작업이 처리되는 방식
멀티 프로세스
프로세스 간 데이터를 공유하려면 IPC(프로세스 간 통신)를 사용해야 함.
- 파이프: 한 방향 통신. 대표적으로 표준 입출력 리디렉션 할 때 사용
- 소켓: 네트워크 인터페이스
- 공유 메모리: 두 개 이상의 프로세스가 같은 메모리 영역에 접근
- 메시지 큐: 프로세스 간 데이터를 큐에 저장하여 비동기적으로 통신
임계 영역(Critical Section)
공유 자원에 접근할 수 있고, 접근 순서에 따라 결과가 달라지는 코드 영역
- 뮤텍스 락: 락킹 메커니즘
- 세마포어: 시그널링 메커니즘
교착 상태
서로 다른 프로세스가 각각의 자원을 소유한 채, 서로의 자원을 요구하는 상황
좀비 & 고아
- 좀비 프로세스: 실행 완료했지만 부모에 의해 종료 상태가 회수되지 않음. 이 경우 부모 프로세스가 종료되면, init이 자동으로 자원을 회수함.
자식은 종료되면 부모에 SIGCHLD 시그널을 보내고, 부모는 wait()를 호출
- 고아 프로세스: 부모 프로세스가 종료되었지만 자식 프로세스는 실행 중인 상태
이 경우 자동으로 init 프로세스 자식이 됨. 고아는 일반적으로 큰 문제를 일으키지 않음. init이 자동으로 인수하기 때문.(부모 PID가 1로 바뀜.)
원티드 미션 1
경험을 Fact와 Lesson으로 구분, 증거
경험 1
AI 글쓰기 교육 플랫폼 <오늘의 일기> 개발 및 3년째 운영
Fact
- Python을 처음 배워 2개월 만에 서비스 개발
- 회원 수: 7K
- MAU: 3~6K
- 작성 글: 46K
Lesson
- MTV 패턴의 Django는 빠른 개발에 유리하지만, CSR, APP 등으로 확장은 어려움.
- 테스트 코드의 부재로 유지 보수성이 떨어짐.
- View에 너무 많은 로직이 있으면 유지 보수성이 떨어짐. 레이어드 아키텍처, 의존성 주입의 필요성 느낌.
증거
https://todaysdiary.net
경험 2
AI 동화 생성 서비스 <스토리파이> 5인 개발 및 팀장
Fact
- 1주 오픈 기간 동안 사용자 50명 확보
- 4건의 피드백을 받아 기능 개선
- GPT 3.5 모델을 파인튜닝해서 커스텀 모델 생성하여 적용
Lesson
- 사용자 피드백을 문장 그대로 해석하는 게 아니라, 그 안에 숨은 뜻을 찾아야 함.
- UX는 개발자의 관점이 아니라 사용자의 관점에서 생각해 봐야 함.
- 팀 프로젝트에서는 문서만으로 소통하는 게 아니라 수시로 대화를 나눠야 오해가 생기지 않음.
증거
https://storifyai.site