오늘부터는 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(프로세스 제어 블록)
프로세스 생성
기존 프로세스에서 fork() 함수를 호출해서 생성
부모는 자식 프로세스의 PID를 반환
자식은 0을 반환
- fork()
- 자식 프로세스 생성: 쓰기 시 복사
메모리 이미지 복사(코드, 데이터, 힙, 스택)
- PID 할당
- fork() 반환: 부모와 자식이 다른 값 반환
- 독립 실행
- 종료(wait())
wait()
자식이 종료될 때까지 부모는 block
프로세스 생명주기
실행 -> 준비로 바뀌는 이유는 프로세스가 실행 가능한 상태임에도 불구하고, 시분할 스케줄링에 따라 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