1) 개념
운영체제 발달 과정
- 일괄처리 → 시분할 → 다중모드 → 분산처리
- 커널(Kernel): 메모리에 상주하면서 하드웨어 자원 관리, 여러 자원을 배분하고 관리하는 핵심 역할 수행하는 운영체제 모듈
C언어 컴파일 과정
- 전처리기 → 컴파일러 → 어셈블러 → 링커 → 로더
원시 프로그램 → 목적 프로그램 과정
- 원시 프로그램 → 어휘 분석 → 구문 분석 → 의미 분석 → 중간코드 생성 → 코드 최적화 → 목적 코드 생성 → 목적 프로그램
스풀링
- CPU와 입출력 장치의 속도 차이를 줄이기 위해 보조기억장치(HDD, SDD)의 일부를 버퍼처럼 사용한다.
버퍼링
- CPU와 입출력 장치의 속도 차이를 줄이기 위해 주기억장치(DRAM)의 일부를 버퍼처럼 사용한다.
2) 프로세스와 스레드
[ 메모리 ]
- 데이터 영역: 정적 변수, 전역변수
- 스택 영역: 지역변수, 매개변수
- 힙 영역: 동적할당, new 키워드
- 텍스트 영역: 코드 자체를 구성하는 메모리 영역으로 실행(이진) 파일이 저장된 메모리
[ 프로세스 상태 ]
* 스케줄링이 끝나거나, 이벤트나 입출력을 완료하면 준비(ready) 상태로 전이
- 일반적인 우선순위 기반 스케줄링에서 실행(running) 상태 프로세스 시간 할당량이 모두 소진되면 준비(ready) 상태로 전이
- 실행(running) 상태 프로세스가 우선순위 높은 프로세스에 의해 선점되면 준비(ready) 상태로 전이
- 실행(running) 상태 프로세스가 동기식 입출력 요청을 하면, CPU를 반납하고 대기(waiting) 또는 블록된(blocked) 상태로 전이
- 블록된(blocked) 상태에 있는 프로세스가 요청한 입출력 작업이 완료되었을 때 준비(ready) 상태로 전이
- 입출력이 완료되면 준비(ready) 상태로 전이
- 대기(waiting) 상태 프로세스를 제외하고 준비(ready) 상태의 프로세스들을 중심으로 스케줄링 수행
[ PCB (프로세스 제어 블록) ]
프로세스 식별자, 프로세스의 우선순위, 프로세스 상태, CPU레지스터(레지스터 정보), 프로그램 카운터
(이때 인터럽트 정보는 스택에 저장된다.)
운영체제가 프로세스를 생성하는 과정
1) 새로운 프로세스에 프로세스 식별자 할당
2) 프로세스 모든 구성 요소를 포함할 수 있는 주소 공간과 프로세스 제어 블록 공간 할당
3) 프로세스 제어 블록을 초기화
4) 링크 수행
인터럽트의 처리순서
1) 인터럽트 요청 신호 발생
2) 프로그램 실행 중단
3) 현재 프로그램 상태 보존
4) 인터럽트 처리 루틴 실행
5) 인터럽트 서비스 루틴 실행
6) 상태 복구
7) 중단된 프로그램 실행 재개
3) 교착상태(Deadlock)
자세한 포스팅은 주디의 Computer Science/OS [OS] 교착상태 (Deadlock)를 참고하자~
교착상태 발생 필요조건
: 상호배제, 점유와 대기, 비선점, 순환 대기
기아상태
: CPU 버스트가 짧은 프로세스에게 우선순위를 항상 부여한다면, 상대적으로 CPU 버스트가 긴 프로세스가 계속해서 지연되는 것을 의미한다.
✔️ 동기화
자세한 포스팅은 주디의 Computer Science/OS [OS] 동기화(Synchronization) | 스핀락, 뮤텍스, 세마포어를 참고하자~
[ 뮤텍스 ]
- 뮤텍스는 상태가 0, 1이다.
[ 세마포어 ]
- 프로세스 간 상호배제의 원리를 보장하는 데 사용된다.
- 여러 개의 프로세스가 동시에 그 값을 수정하지 못한다.
- 하나 이상의 컴포넌트가 공유자원에 접근할 수 있도록 허용
- 세마포어에 대한 연산은 수행 중에 인터럽트 될 수 없다. (원자성을 가짐)
- 세마포어는 플래그 변수와 그 변수를 검사하거나 증감시키는 연산들로 정의된다.
4) 프로세스 스케줄링
✔️ 스케줄링
- 선점: RR(라운드 로빈), SRT, MLQ, MFQ
- 비선점: FIFO, SJF, HRN
- 기아현상이 발생하는 스케줄링: 우선순위, SJF, SRT
- 기아현상 해결: HRN
✅ 선점 : SMMR
[ SRT(Shortest Remaining Time) 방식 - 선점 ]
- 다른 프로세스가 선점 가능한 것이고
- 기아 현상 발생
💡 도착 시간에 맞춰서 실행하고 다음 프로세스 도착했을 때 존재하는 것 중에 실행 시간이 가장 짧은 거부터 실행함.
[ MLQ 다단계 큐 - 선점 ]
- 입출력 위주의 프로세스와 연산 위주 프로세스의 특성에 따라 CPU 사용 시간을 다르게 부여
- 준비 큐 다수 개 구분, 각 준비 큐는 자신만의 스케줄링 알고리즘 별도로 가짐
[ MLFQ 다단계 피드백 큐 - 선점 ]
- 큐마다 다른 시간 할당량
- MLQ의 단점을 개선하기 위해 작업이 큐 사이 이동 가능하다.
[ RR 라운드 로빈 방식 - 선점 방식 ]
- 어떤 프로세스가 일정 크기의 CPU 시간 할당량을 한 번 받은 후에는 강제로 대기 큐의 다른 프로세스에게 CPU 넘겨주는 방식
- 시분할 시스템(Time Sharing System)을 위해 고안된 방식
- 시간 할당이 작아지면 프로세스-문맥 교환이 자주 일어난다.
- 시간 할당이 커지면 FCFS 스케줄링과 같은 효과를 얻을 수 있다.
✅ 비선점 : 우기 HFS
[ 우선순위(Priority) ]
- 우선순위: 각 프로세스에게 우선순위 부여하여 순위가 높은 순서대로 처리. 선점/비선점 모두 가능
- 기아현상 발생
[ Deadline 기한부 ]
- 기간 내에 완료되도록 계획
[ FCFS(First-Come First-Served) ]
- 도착한 순서대로 처리
[ SJF(Shortest Job First) 방식 - 비선점 ]
- 다른 프로세스가 선점 불가능해서 실행시간이 끝날 때까지 못 바꿈
- 작업들 가운데 가장 짧은 작업을 먼저 처리하는 것으로 평균 반환 시간이 가장 짧다.
- 기아 현상 발생
💡 도착 시간에 맞춰서 실행하고 종료한 다음 존재하는 것 중에 실행 시간이 가장 짧은거 부터 실행함.
[ HRN(Highest Response ratio Next) 방식 - 비선점 ]
- HRN: 비선점, 우선순위에 대기 시간 고려하여 기아 문제 해결
- 우선순위를 계산하여 그 숫자가 가장 높은 것부터 낮은 순으로 우선순위가 부여된다.
💡 우선순위 = (대기시간 + 서비스 시간) / 서비스 시간
5) 기억 장치
[ 메모리 관리 방안 ]
- Buddy 할당 방식: 메모리를 2의 거듭제곱 단위의 크기로 할당하여 외부 단편화 최소화 할 수 있다.
[ 외부 단편화를 해결하기 위한 메모리 관리 방안 ]
- 집약(Compaction): 기억장치의 모든 내용들을 한 군데로 몰고 모든 자유공간들을 다른 한군데로 몰아 큰 블록으로 만드는 기법
- 통합(Coalescing): 이웃되는 가용공간을 하나의 커다란 가용공간으로 만드는 곳
[ 가상 페이지 번호, 페이지 오프셋 ]
- 가상주소 길이 32비트 → 2^32
- 페이지 크기 → 2048비트 → 2^11
💡 계산 방법
가상 페이지 번호: 가상주소 길이 / 페이지 크기
페이지 오프셋: 페이지 크기가 2^k비트이면 k비트!
페이지 번호: 물리주소 / 페이지 크기
페이지 내 오프셋: 물리주소 % 페이지 크기
sol)
페이지 크기가 2^11바이트라서 페이지 오브셋은 11비트
가상 주소 길이가 32비트라서 가상 페이지 번호는 32비트 - 11비트를 뺀 21비트
[ TLB 적중률 계산 ]
- TLB(변환 색인 버퍼): 프로세스 내부에 있는 장치로 가상 메모리 주소를 물리적인 주소로 변환하는 속도를 높이기 위해 사용하는 캐시 일종
💡 계산 방법
유효메모리 접근시간
= (메모리 접근 시간 + TLB 검색 시간) * TLB 적중률 + (2 * 메모리 접근시간 + TLB 검색 시간)(1 - TLB 적중률)
✔️ 페이징(Paging) 기법
가상 메모리
- 역 페이지 테이블: 물리 메모리의 프레임당 단 한 개의 페이지 테이블 항목을 할당함으로써 페이지 테이블이 차지하는 공간을 줄이는 기술
- 페이징 기법은 가상기억장치에 보관되어 있는 프로그램과 주기억장치의 영역을 동일한 크기로 나눈 후 나눠진 프로그램(페이지)을 동일하게 나눠진 주기억장치의 영역(페이지 프레임)에 적재시켜 실행하는 기법이다.
- 프로그램을 일정한 크기로 나눈 단위를 페이지(Page)라고 하고, 페이지 크기로 일정하게 나누어진 주기억장 치의 단위를 페이지 프레임(Page Frame)이라고 한다.
- 외부 단편화는 발생하지 않으나 내부 단편화(공간 남는 거)는 발생할 수 있다.
- (누군가는 계속 주소 변환을 해줘야 해서) 주소 변환을 위해서 페이지의 위치 정보를 가지고 있는 페이지 맵 테이블(Page Map Table)이 필요하다.
- 페이지 크기가 커질수록 외부 단편화 문제가 심각해진다.
여기서 주기억 장치 가득 찼으니 페이지 교체 알고리즘 (FIFO)
[ 페이지번호(논리), 프레임번호(물리) ]
논리 주소와 물리 주소를 페이지 크기로 나누면 각각 페이지 번호와 프레임 번호가 된다.
ex. 페이지 크기가 2000byte에서 논리주소가 2500, 물리주소가 6500이면 페이지 번호는 1, 프레임 번호는 3이다.
✔️ 세그먼테이션 (Segmentation) 기법
가상 메모리
- 세그먼테이션 기법은 가상기억장치에 보관되어 있는 프로그램을 다양한 크기의 논리적인 단위로 나눈 후 주 기억장치에 적재시켜 실행시키는 기법이다.
- 프로그램을 배열이나 함수 등과 같은 논리적인 크기로 나눈 단위를 세그먼트(Segment)라고 하며, 각 세그먼 트는 고유한 이름과 크기를 갖는다.
- 주소 변환을 위해서 세그먼트가 존재하는 위치 정보를 가지고 있는 세그먼트 맵 테이블(Segment Map Table) 이 필요하다.
- 내부 단편화는 발생하지 않으나 외부 단편화는 발생할 수 있다.
주기억 장치에 공간이 남으면 외부 단편화
[ 물리 주소로 변환 ]
- 세그멘트 테이블 논리주소 (2,176)에 대한 물리주소는?
- 세그멘트 번호 2 / 시작 주소 222 / 길이(바이트) 198
- 222 + 176 = 398 (최대가 198임)
✔️ 페이지 교체 알고리즘
페이지 교체 알고리즘은 페이지 부재(Page Fault)가 발생했을 때 가상기억장치의 필요한 페이지를 주기억장치에 적재해야 하는데, 이때 주기억장치의 모든 페이지 프레임 이 사용 중이면 어떤 페이지 프레임을 선택하여 교체할 것인지를 결정하는 기법이다.
* MRU(Most Recently Used): 가장 최근에 사용한 페이지를 교체한다.
Ex1. FIFO 알고리즘
Ex2. LRU 알고리즘
✔️ 캐시
- SRAM(재충전이 필요 없는 메모리, Flip-Flop 조합으로 구성, 고속 캐시 메모리) 사용
- 캐시 일관성을 유지하기 위한 다양한 프로토콜
- 스누핑(snooping) 프로토콜, MESI 프로토콜, 디렉터리 기반 프로토콜
6) 스레싱(Thrashing)
프로세스의 처리 시간보다 페이지 교체에 소요되는 시간이 더 많아지는 현상
- 페이지 프레임이 큼 -> 페이지 부재 빈도에 따라 프레임수 감소 -> 다중 프로그램 정도 감소
[ 스레드 ]
사용자 수준에서 지원되는 스레드 장점
- 커널 모드로의 전환 없이 스레드 교환이 가능하므로 오버헤드가 줄어든다.
커널 수준 스레드의 장점
- 한 프로세스가 운영체제를 호출할 때 전체 프로세스가 대기할 필요가 없으므로 시스템 성능을 높일 수 있다.
- 동시에 여러 스레드가 커널에 접근할 수 있으므로 여러 스레드가 시스템 호출을 동시에 사용할 수 있다.
- 각 스레드를 개별적으로 관리할 수 있으므로 스레드의 독립적인 스케줄링이 가능하다.
[ Working Set(워킹 셋) ]
프로세스가 일정 시간 동안 자주 참조하는 페이지들의 집합
[ Prepaging(프리페이징) ]
사용될 페이지라고 예측되는 페이지를 미리 적재하는 것
7) 디스크 스케줄링
[ 선입 선처리 FCFS (FIFO) ]
- 도착 순서에 따라 실행 순서가 고정된다는 점에서 공평
[ 최소 탐색 시간 우선 SSTF(shortest seek time first) ]
- 현재 헤드 위치에서 탐색 거리가 가장 짧은 요청이 먼저 서비스를 받는 기법
[ N-Step-SCAN ]
- 어떤 방향의 진행이 시작될 때 당시에 대기 중이던 요청에 대해서만 서비스하고 진행 도중 도착한 요청들은 반대 방향 진행 때 서비스하는 기법
[ 스캔 SCAN ]
- 헤드 진행 방향 상의 가장 짧은 거리에 있는 요청을 먼저 서비스하는 기법
- 헤드가 한쪽 끝까지 이동한 다음 진행 방향을 바꾸어 서비스한다.
[ C-SCAN ]
- 마치 처음과 마지막 트랙이 원형으로 연결된 것과 같은 환형 처리와 유사하다.
[ C-LOOK ]
- 보통 헤드는 요청에 따라 각 방향으로 이동하지만, 현재 방향에 더는 요청이 없을 때 다시 처음부터 요청을 처리한다.
8) 운영체제의 실제
✔️ 운영체제 파일시스템
[ FAT(File Allocation Table) 파일 시스템 ]
- 클러스터 단위로 구성하고, 이것을 링크드 리스트의 형태로 보관
- 클러스터는 섹터들의 집합
[ NFS(Network File System) 파일 시스템 ]
- 컴퓨터 사용자가 원격지 컴퓨터에 있는 파일을 마치 자신의 컴퓨터에 있는 것처럼 검색하고, 마음대로 저장하거나 수정하도록 해주는 클라이언트/서버형 응용프로그램
- 컴퓨터 간의 통신 방법 RPC
✔️ 유닉스
[ 파일 접근 권한 ]
- rwx/rwx/rwx (파일 소유자, 프로젝트 그룹, 일반 사용자) 순으로
- 읽고 쓰고 실행 가능하면 7
[ 유닉스 명령어 ]
- grep: 주어진 패턴을 포함하는 파일의 라인을 찾고, 출력
- mount: 기존 파일시스템에 새로운 파일시스템 서브 디렉터리에 연결
- ln: 특정 파일의 링크 파일 만듦
- pwd: 현재 작업 중인 디렉터리 경로
- more: 주어진 파일 내용 한 화면씩 출력
- finger: 사용자 계정정보를 확인
- lp: 특정 파일 및 정보를 프린터로 출력
- utmp: 유닉스의 로그 중 현재 로그인한 사용자의 아이디, 사용자 프로세스, 실행 레벨, 로그인 종류 등을 기록하는 것
- wtmp: 사용자 로그인 및 로그아웃 기록을 저장하는 파일
- sulog: 시스템 관리자가 다른 사용자로 전환할 때의 정보를 기록
- xferlog: ftp 데몬을 통하여 송수신되는 모든 파일에 대한 기록
- syslog: 시스템 이벤트 및 메시지를 기록하는 데 사용되는 표준 로그 시스템
- ABOR: 현재 전송 중인 파일 전송 중단
- CWD: 작업 디렉터리 변경
- MDTM: 파일의 수정 시간 확인
- RETR: 원격지 파일 가져오기
- RMD: 원격지 디렉터리 제거
[ IPC ]
- 시그널(signal): 프로세스나 동일 프로세스 내의 특정 스레드로 전달되는 비동기식 통보이다.
- 파이프(pipe): 파이프에는 일반(익명) 파이프와 지명 파이프가 존재한다.
- 일반(익명) 파이프: 한 방향 통신을 수행하며, 생성자와 소비자 관계를 가진다.
- 지명 파이프(named pipe): 양방향 통신을 수행하며, 어떠한 관계도 가지지 않는다.
[ 리눅스 시스템에서 fork() 호출 ]
fork()는 자식 프로세스를 생성한다.
즉, 부모와 자식 프로세스의 분기가 일어난다.
pid가 0보다 작으면 fork() 실패를 나타내고, 0이면 자식 프로세스이고, 0보다 크면 부모 프로세스다.
부모 프로세스 부분의 wait(NULL)은 자식 프로세스가 끝날 때까지 기다리는 것을 의미한다.
fork() 호출 시 부모와 자식의 메모리의 위치는 다르다.
[ 리눅스 ]
* 파일 권한
- chmod: 파일 권한 변경
- chown: 파일 소유자 변경
- chgrp: 파일 그룹 변경
* 실행 권한 추가하는 방법
chmod +x 파일명
# 특정 사용자에서 실행 권한 부여
chmod u+x 파일명 # 소유자에게 실행 권한 추가
chmod g+x 파일명 # 그룹에게 실행 권한 추가
chmod o+x 파일명 # 기타 사용자에게 실행 권한 추가
chmod a+x 파일명 # 모든 사용자에게 실행 권한 추가
9) 기타
- 폴링 방식: 인터럽트의 요청 신호 플래그를 차례로 검사하여 인터럽트의 원인을 판별하는 방식
'Computer Science > CS' 카테고리의 다른 글
[전산공부] 소프트웨어공학 + 최신기술 (2) | 2024.03.17 |
---|---|
[전산공부] 데이터베이스 (4) | 2024.02.25 |
[전산 공부] 데이터 통신 (0) | 2024.02.02 |
[전산 공부] 자료구조 (0) | 2024.01.27 |
댓글