Note: 이 글은 내가 면접 요약정리를 한것이기 때문에, 설명이 부실한 부분도 있고 나만 알아볼수 있는 부분이 있음. 따라서 차근차근 설명을 덧붙이거나 누구나 알아볼수 있도록 수정할 예정.
2021/12/13 - 오늘은 새벽이고 내일 출근해야하니 복붙하고, 몇몇개 수정.
2021/12/15 - 30번까지 정리 완료. 혹시 추가설명 필요하다고 생각되시면 댓글문의!
OS
1. 프로세스와 스레드의 차이
컴퓨터에서 실행되기위해 디스크 프로그램이 메모리에 올라와 있는 상태를 프로세스.
-> 실행중이 아니라도 프로세스라 할수 있음을 주의. (CPU할당을 기다리는 대기 프로세스들)
쓰레드는 프로세스내 실행흐름의 단위. stack영역을 제외한 데이터를 공유함. [각 영역이 어떤 역할인지 알아두는것 필수]
2. 멀티 프로세스 대신 멀티 쓰레드를 사용하는 이유
프로세스를 이용하여 동시에 처리하던 일을 쓰레드로 구현할 경우 메모리 공간과 시스템 자원 소모가 줄어들게 됨.
쓰레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap(힙) 영역을 이용하여 데이터를 주고받을 수 있음.
심지어 쓰레드의 context switch(문맥교환)는 프로세스 context switch 와는 달리 캐시 메모리를 비울 필요가 없기 때문에 빠른편.
(이는 language레벨 쓰레드를 얘기함)
3. Thread-safe란?
멀티 쓰레딩으로 프로그래밍하면 공유되는 자원이 있기에 동시에 write할수 없도록 막아주는 기법.
참고 - Critical Section이란 공유자원에 접근하는 프로그램 코드 부분을 의미함.
4. 동기화 객체의 종류
동기화 객체는 커널에서 제공하는 객체로, 자원 공유시 충돌에 대한 해법을 제시.
뮤텍스, 세마포어.
5.뮤텍스와 세마포어, 모니터 차이점은? (공통점은 모두 운영체제의 동기화 기법)
뮤텍스는 락방식으로 동작하고(Locking개념) 세마포어는 카운팅이 방식으로 동작함. (Signaling개념)
뮤텍스는 쓰레드 동기화로, 락을 가진 쓰레드만 락을 해제할 수 있음.
(뮤텍스는 하나의 여러프로세스간 동기화가능, 모니터는 한 프로세스내 쓰레드를 동기화.)
(뮤텍스는 운영체제 커널, 라이브러리에서 제공, 모니터는 라이브러리에서 제공)
세마포어는 동시에 쓰레드의 접근을 허용할 수 있고, 락을 가진 스레드 외에 다른 락을 가졌던 쓰레드가 해제할 수 있음.
wait함수가 세마포어 카운트 1을 줄이고, 세마포어의 카운트가 0인경우 락이 실행됨. 이처럼 세마포어는 공유되면 안되는 자원이라서 atomic operation 함수로 구성됨.
세마포어는 객체개념으로 이해하면 편함.
예)
회사에 프린트 5개가 있음(세마포어) 이걸 사용하는중이면 세마포어 하나씩 줄어듬. 누군가 사용끝내면 하나 늘어남.
문제점: P수행 후 V수행하지 않으면 데드락. 함수 V 수행 후 2개 이상의 프로세스가 동시에 들어갈 수 있어서 보장이 안됨. 그래서 atomic하게 수행될 수 있도록 하드웨어단에서 지원함.
반면 모니터는 캡슐화되어있어서 사용이 편함.
6. 스케줄러란?
CPU 코어 하나는 동시에 여러 프로세스 처리 불가능. 어떤 프로세스가 CPU를 사용할수 있게 하는지 정책.
비선점
- FCFS: 도착 순서에 따라. (비선점이라 작업이 긴 프로세스의 경우 오래 CPU를 사용하므로 공평하지 못함)
- SJF(Shortest Job First): 일이 가장 짧게 끝나는 것 부터. (짧게 끝나는것 계산이 어려운 단점)
- HRN(Highest Response ratio): 우선순위 기법으로 스케줄링 (우선순위 계산 자체가 비용이 드는일 + starvation현상)
선점
- RR: 순차적으로 돌아가면서 (주기를 짧게하면 context switching 빈번, 길게하면 FCFS와 유사 -> 적당한 값 정하려면 실험해봐야함)
- MLQ: 여러 큐를 통해 우선순위에 따라 넣어줌. 상위레벨 큐가 비어있으면 하위레벨 할당해줌. (큐간 이동이 불가능한 수준이라 유동성이 부족함)
- MLFQ: 피드백이 존재해서 우선순위를 바꾸기때문에 대기큐의 위치를 바꿔가며 스케줄링. (I/O Bound 작업은 우선순위 높게하고 aging기법으로 starvation방지하지만, 우선순위 계산에 비용이 들어감)
7. 동기 비동기란?
동기와 비동기의 차이는 메소드를 실행시킴과 동시에 반환 값이 기대되는 경우를 동기, 아니면 비동기 라고 표현함. 동기라는 말은 실행되었을 때 값이 반환되기 전까지는 blocking되어 있다는 것을 의미함. 비동기의 경우, blocking되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task 를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않음.
8. 프로세스 동기화란?
현대 컴퓨터는 프로세스간 협력하는 Cooperating process가 많음. 이들은 서로 영향을 미치기 때문에 동기화가중요. 고로 공유자료의 일관성을 유지하는 일을 함. (쓰레드 동기화와 비슷한 부분)
9. 메모리 관리 전략 아는대로
"MMU를 활용한 가상메모리"
페이징처럼 일정 크기로 나누는 방법
세그먼트처럼 로직단위로 크기를 나누는 방법
장단점 공부 필수.
요약하자면 페이징은 external fragment없지만 기능단위로 나뉜게 아니라 보안, 쉐어같은 권한주기 어려움.
세그먼트는 권한쪽은 간단하지만 external fragment가 치명적.
둘다 사용하는방법 -> 메모리접근 3번해야 실 메모리주소 찾을 수 있는 단점. TLB같은거 활용하면 빨라지지만 비용문제...
10. 가상 메모리란?
스왑디바이스를 메모리처럼 활용하는 방법.
11. 캐시의 지역성
cache hit ratio 늘리기 위한 방법론.
공간적 지역성 (Spatial Locality) - 참조 주소와 인접한 주소를 참조하는 특성. (프로그램 코드 다음줄로 갈 확률 높음)
시간적 지역성 (Temporal Locality) - 한번 참조한 주소를 곧 다시 참조하는 특성. (For문 순환할때)
12. 교착상태의 개념과 조건은?
절대 얻을수 없는 자원을 기다리고 있는 상태를 교착상태.
조건은 hold-and-wait / circular wait 한 방식으로 자원선점하고 기다리는걸 사이클릭하게 발생하는 경우.
데이터가 동시접근에서 사용하면 안되고, 비선점이여야 함. 총 4개의 조건으로, 하나의 조건만 버려도 데드락 발생하지 않음.
데드락은 중요하니 꼭 4가지 조건이 어떤건지 설명할 줄 알아야함.
- hold and wait 제거: 프로세스가 필요로하는 모든자원을 lock건 상태로 프로세스 수행. 자원 효율이 굉~~장히 나빠짐.
- circular wait 제거: 자원을 얻으려면 순차적으로 얻어야함. A -> B -> C -> D 가 있을때 D를 얻기위해 A, B, C를 순차적으로 얻은 다음에야 사용이 가능함. 하지만 B를 누가 쓰고있다면 D를 사용가능하더라도 기다려야함. 자원효율 굉~~장히 나빠짐.
- 동시접근 가능하게: 이러면 애초에 동기화하는 의미가 없어짐...
- 비선점 제거(선점으로): 자원 사용하고 있는데 다른 프로세스가 자원을 뺏을 수 있다면 동기화하는 의미가 없어짐.
위의 네가지는 필수로 이해해야함. 이 모든 것은 교착상태 예방(Prevent). 데드락 Avoid, Detect 두가지도 꼭 알아두길 바람.
13. 사용자 수준 스레드와 커널 수준 스레드란?
참조: https://www.crocus.co.kr/1404
사용자수준: 사용자 스레드 하나라도 I/O발생하면 커널스레드가 하나인 경우 프로세스 전체가 block됨.
커널수준: 병렬성은 굉장히 좋으나 커널모드 실행해야 하는 부분에서는 효율성이 떨어짐.
참고: 사용자가 구현한 프로그램은 기본적으로 유저모드에서 동작하다가 커널이 실행되어야 하는 경우 커널모드로 전환이 일어나고 일을 마치면 다시 유저모드롤 전환된다
자세한 장단점은 위의 사이트에서 확인!
14. 외부 단편화와 내부 단편화란?
내부단편화: 분할된 영역이 할당된 영역보다 커서 남는공간. (페이징에서 발생)
외부단편화: 프로세스 사이의 빈공간으로 남아있는데 이를 모두 외부 단편화 (세그먼테이션에서 발생)
외부단편화 해결법: 메모리 압축(모든 프로세스 일시정지해놓고 자리옮기기), 메모리 통합(단편화끼리 붙어있으면 합쳐주기)
15. Context Switching 이란?
프로세스를 변경할때 CPU내부 레지스터 정보와같이 필수정보를 담고 새로운 프로세스의 정보를 로딩하는 과정.
레지스터 정보들(context)은 PCB로부터 가져오거나 저장함.
16. Swapping이란?
필요한 영역을 스왑디바이스에서 메모리로 올리는 작업. 혹은 그 반대.
17. Page fault란?
프로세스 수행에 필요한 페이지가 스왑디바이스에 있는 경우임. 메모리로 올려야하기 때문에 컨텍스트스위칭 발생하는데, MMU가 CPU에게 exception signal을 보내게 되고, exception handler를 수행해야 함. 여기서 스와핑이 발생하고 필요한 데이터가 메모리로 올라옴. 끝나면 다시 컨텍스트스위칭을 통해 이전의 일을 진행함.
18. Starvation이란?
우선순위가 낮아서 자원할당을 계속 할당받지 못하는 상태.
19. Aging이란?
스타베이션 방지하기 위해 나온 방법으로 기다린 시간에 비례해 우선순위를 높이는 기법.
20. 페이징이란?
메모리를 고정된 크기로 나누어 메모리를 관리하는 기법. 그 단위를 보통 frame단위라고 함.
21. 모드 스위치와 프로세스 스위치
모드 스위치: 사용자 모드에서 커널모드로 변경될때 사용. 완전 문맥 전환이 필요하지 않고 시스템스택을 씀.
프로세스 스위치: 컨텍스트스위칭.
22. 소스코드부터 프로세스까지의 과정
run time binding MMU필수로 쓰임.
23. Thrashing 현상
너무많은 멀티 프로그래밍 상황에서 메모리의 한계가 오면 무한 page fault 발생하면서 thrashing 현상이 나타남.
24. Replacement Strategies
굉장히 다양함
LRU FIFO Clock알고리즘 등등등... (LRU가 가장 중요)
Page Size는 어느정도가 좋을까?
사이즈 큰경우: small page table (low overhead) / 내부 단편화 증가 / I/O감소 / Locality 저하 / page fault 감소
작은경우는 반대임.
큰경우 로컬리티 저하한 이유는 한곳에 너무많이 들어있어서 안쓰는것도 다담아두니까 상대적으로 저하되는 것임.
실제 HW 메모리 사이즈에 따라 페이지 사이즈는 점차 커지는게 좋음.
결론: CPU 성능과 메모리양이 늘어남에 따라 I/O를 줄이는 방법인 페이지 사이즈를 키우는게 더 좋은 방법.
25.캐싱 vs 스풀링
-caching
캐싱으로 I/O를 생략 가능. (하드웨어뿐 아니라 소프트웨어적으로 캐싱이 가능하다는거 기억)
-Spooling
한 I/O장치에 여러 Program이 요청 보낼때. 출력이 섞이지 않도록 해줌. 보통 디스크에 기록해둠.
26. 멀티프로그래밍
멀티프로그래밍에 최적인 상황: I/O작업이 많고 context-switching처리를 빠르게할만큼 성능이 좋고, 여러프로그램 올릴 메모리가 커야함.
27. 데드락
프로세스가 발생 가능성이 없는 이벤트를 기다리는 것을 데드락 상태라고 함. 두개 이상의 프로세스가 각각 자원을 홀딩한채로 각 프로세스의 자원을 서로 요청하는 경우.
28. PMT 안에 bit vectors(reference bit, update bit) 이 프레임마다 담겨있음. (페이지 프레임)
메모리 page replacement전략을 위해 존재하는 bit vector들임.
reference bit: 최근에 참조가 되었으면 1 아니면 0. 고로 0번인 애를 빼겠지? (참고로 OS가 주기적으로 0으로 바꿔줌)
update bit: 적재된 후 프로세스에 의해 수정되었으면 1 아니면 0. (메모리 -> 디스크에 써줘야하기에…)
주기적 초기화x. 메모리 나올때만 초기화함. 이때 디스크에 써주고!!
29. 인터럽트
인터럽트 발생하면 컨텍스트 스위칭. ISR(Interrupt Service Routine)의 주소를 불러와 거기에 적힌 명령어들을 수행하는 방식.
30. PCB(Process Control Block)안에 있는 정보는?
Context area, PID, 계정정보, 메모리영역, 프로세스 상태, 스케쥴링 정보
31. Hardware interrupt vs Software interrupt
앞에꺼는 장치에서 작업 끝날때 알려주는 역할 / 뒤에껀 프로그램 스스로 거는 것. (예외처리, 시스템 콜)
32. 인터럽트 왜씀?
CPU와 I/O작업분할 가능. 커널모드 가서 작업해야 할때 필수.
33. 런타임 바인딩에 필요한것은?
MMU(현대컴터는 계속 메모리 위치 바뀌니 로드타임, 컴파일타임 바인딩 불가) 라는 CPU안에 존재하는 레지스터가 필수.
continuous면 간단한데 non이면 계산이 조금 복잡해짐.
34. Memory Allocation
Continuos: 구현이 간단, 메모리 사용효율이 떨어짐, 논리적 주소사용.
Non-Continuous: 가상주소사용, Block Mapping을 통해 떨어져있는것을 논리적으로 연속처럼 만들어줌. Block Map Table이 필요해서 주소찾을라면 메모리 두번 방문. (Dynamic Loading기술로, 호출전까지 루틴들이 디스크에서 대기하게끔)
35. external fragment 완화
공간통합(주변 빈 fragment들 합치기) // 압축(빈공간들 한쪽으로 몰아넣기)
36. 메모리 관리 왜 배움?
코딩때 new malloc 같은거 오래걸림. 그래서 memory pool 할당받고 여기서 내가 직접 관리하면 빠름.(운영체제 간섭없이 가능)
37. Direct Mapping vs Associated Mapping
뒤에께 TLB사용으로 가격은 비싸지만 속도 오짐. 메모리 한번만 들려도 가상주소 찾아냄. 하이브리드는 TLB를 캐시테이블처럼.
Translation Lookaside Buffer
38. Page fault 줄이기 위한 노력
하드웨어: bit vectors활용(reference bit, update bit)
Replacement 전략: 지역성 적용. LRU(Least Recently Used) 오래 사용안한거 뺌.
LFU(Least Frequently Used) 가장 적게 사용한거 뺌.(문제는 최근에 올라온걸 뺌)
Clock: reference bit확인해서 뺌. update bit도 확인하는 알고리즘 있음.
39. Filesystem implement 고려사항
-Allocation Method(파일저장을 위한 디스크 할당법): Continuous, Linked-list, Index(유닉스에서 inode)
-Free Space Management(빈공간 관리): bit vector, Linked-list, Grouping(링크드리스트보다 링크 적어짐)
40. DMA(Direct Memory Access)
I/O 장치와 메모리 사이 데이터 전송을 CPU없이 하게끔.
41. 디스크 스케쥴링 유명한거?
Look스케쥴링 (엘레베이터 알고리즘): 쭉 가다가 앞으로갈 방향에 읽을데이터 없으면 다시 처음으로 돌아옴.
42. RAID1, RAID5
1은 데이터 두군데 저장으로 안정성. 5는 패리티비트를 나눠서저장해서 병목현상 줄임.
42. 스케쥴링에서 우선순위의 약점은?
낮은애가 자원Holding한 상태에서 높은애가 이걸 쓰려면 Priority가 의미없는 꼴…
43. Multiple-Processor Scheduling
프로세서(코어)가 여러개 일때 스케쥴링. Asymmetric Multiprocessing(오직 하나만)
Sysmmetric mulitiprocessing(SMP): 각각의 프로세서가 동일하게 데이터를 엑세스할 권한이 있음
-Processor affinity(프로세서 친화성): 어떤 프로그램은 어떤 프로세서에서 친화성이 있다!
-soft affinity: OS가 동일 프로세서에 프로세스를 실행시키게끔 하지만 보장되진 않음.
-hard affinity: 시스템 호출 단계에서 이미 프로세스는 어디로 처리를 할지 명시됨.
44. 멀티프로세서 스케쥴링을 하는 이유는?
부하균등(Load Balancing)
-Push migration: 태스크가 주기적으로 각 프로세서를 체크하는데, 과부하 있으면 널널한 프로세서에 분할해줌.
-Pull migration: 널널한 프로세서가 바쁜 프로세서의 대기중인 태스크 끌고옴.
45. 멀티코어와 멀티프로세서 차이는?
멀티코어는 하나의 프로세서 안에 여러 코어가 들어있는 개념. 멀티 프로세서는 말 그대로 CPU가 여러개.
46. 그럼 Multicore Processors는?
빠르고 저전력. 캐시 미스날때 memory stall현상 발생(메모리에서 Bus를 통해 CPU로 오기까지의 대기시간)
스레드에 대한 스케쥴링을 할때 이런 Memory stall현상을 적극 이용해 전체적인 스케쥴링 가능.
코어에 여러 스레드 할당.
각각 다른 스레드가 Memory stall에 실행됨.이러면 단일코어의 효율이 높아짐.
47. 컴퓨터 구조관련. 키보드 입력시 모니터까지 어떻게 이루어지는가?
뭔가를 입력하게되면 CPU에게 인터럽트가 가게 된다.
보면 메모리 맵핑된 메모리 주소로 I/O 관련 레지스터를 위해 자리를 할당해줌.
키보드로부터 입력받으면 ready bit가 올라가고, 어떤 데이터가 왔는지 저장한다. interrupt방식이기 때문에 CPU에게 신호를 보냄.
다음으로 CPU가 모니터쪽에 ready bit가 1이면 전달하고, 모니터는 그 작업을 처리할때까지 0으로 만들어놓음. 출력을 완료하면 다시 ready bit가 올라가서 대기함. 근데 CPU랑 I/O사이에 엄청난 속도차이가 존재하는데, 동기화를 위해서 어떤 장치가 필요함.
48. IPC
PIPE: FIFO구조로 단방향 통신(단점). (보통 부모, 자식 프로세스간 통신할 때 사용)
쌍방향일때는 PIPE가 하나더 생성됨. -> 낭비가 심함.
Message Queue: 메모리를 통한, 구조체기반의 통신. msg type에 따라 다른 구조체를 가져올수있음.
Shared Memory: 커널에서 관리하는 공유 메모리. 프로세스간 read write 둘다 필요할때.
메모리 직접 접근을 막음. 프로세스가 공유해도 다른 프로세스가 알 방법이 없어서 별도의 동기화기술 필요.
Message Passing: 메시지를 커널이 직접 전달해줌. -> PIPE개념과 같음.
Memory Map: Shared Memory와 같으나, 열린파일을 메모리에 매핑시켜서 공유함.
여기서 세마포어는 데이터를 동기화하고 보호하는데 목적으로 씀.
댓글