✅ 운영체제 영상 보기
☑️ 운영체제 블로그 보기
✅ 토요일 저녁 : CSAPP 3.7절 발표
☑️ 월요일 점심 먹고 : 동적 프로그래밍 발표
☑️ 화요일 점심 먹고 : Knapsack Problem 발표
https://www.youtube.com/playlist?list=PLBlnK6fEyqRiVhbXDGLXDk_OQAeuVcp2O
운영체제는 소프트웨어와 하드웨어를 잇는다.
입출력 장치에는 각각 컨트롤러들이 붙어 있다.
cpu는 컴퓨터의 뇌다.
무언가가 실행되거나 로드되려면 메인 메모리에 일단 들어가야된다.
모든 입출력 장치나 컨트롤러는 동시에 실행될 수 있음
동시에 문제없이 실행되도록 메모리를 각각 할당해줘야 함
이럴 때 메모리 컨트롤러가 필요함
Bootstrap program : 부팅 프로그램은 ROM(Read Only Memory)에 저장됨. 키면 제일 먼저 실행되는거. 운영체제를 불러온다. OS Kernel이라는 걸 불러와야 함.
Interrupt : 하드웨어가 CPU한테 "하던거 잠깐 멈추고 이거 먼저 해줘" 요청하는거
System Call (Monitor call) : 소프트웨어가 CPU한테 "이거 먼저 해줘" 하는거
Service Routine (I.S.R) : interrupt가 뭘 원하는지 적혀있는거. cpu가 interrupt 당하면 service rouitine에 있는거 읽고 그거 한다. 끝나면 다시 돌아감.
Register > Cache > Main Memory > Electronic Disk > Magnetic Disk > Optical Disk > Magnetic Tapes
(왼쪽에 있을수록 비싸고 빠르지만 작음)
작업하려는 것들은 메인 메모리에 저장되고 나머지는 2차 메모리에 저장됨
Main Memory까지는 volatile(전원 꺼지면 내용 잃는다), 그 이후는 non volatile(꺼져도 내용 유지)
Electronic Disk 중에서도 volatile인 것들 있고
Main Memory 중세어도 non volatile인 것들 있다 (NVRAM)
운영체제의 많은 부분은 입출력 장치를 제어하는데 쓰인다. 애초에 입출력 장치의 종류도 많고 성능에 중요한 부분이기 때문.
장치 컨트롤러는 Local Buffer Storage와 특수 목적 레지스터들을 관리한다.
Local Buffer Storage : 장치에 입출력되는 데이터들을 담아두는 작은 메모리. 모든 장치 데이터들은 로컬 버퍼를 통한다.
장치 드라이버는 장치 컨트롤러와 운영체제가 장치를 이해하고 이용할 수 있도록 하는 인터페이스를 제공한다.
입출력 장치 작업 시작할 때 장치 드라이버가 적합한 레지스터를 장치 컨트롤러를 위해 할당한다.
작업하는 동안 CPU와 장치는 로컬 버퍼를 경유하여 데이터를 주고 받는다.
장치에 데이터 전송이 완료되면 CPU에 Interrupt 한다.
근데 이렇게 입출력 장치 제어하면 데이터 많이 있을 땐 오버헤드가 크게 발생하므로 DMA (Direct Memory Access) 방식이 쓰이기도 한다. 이건 데이터 블럭을 전부 로컬 버퍼에서 메로리로 바로 전달한다.
프로세서 개수에 따른 컴퓨터 시스템 종류
1. Single Processor Systems (CPU 하나)
2. Multiprocessor Systems (CPU 여러개)
3. Clustered Systems (독립된 컴퓨터가 여러개 엮임)
Throughput : 컴퓨팅이나 네트워킹에서 주어진 시간 동안 시스템이 처리할 수 있는 작업의 양
멀티 프로세서 시스템 종류
1. Symmetric Multiprocessing : 다같이 똑같은 작업 처리
2. Asymmetric Multiprocessing : 프로세서 하나는 일 배분만 하고 나머지들은 배분된 작업 처리
Multiprogramming
Time Sharing(Multitasking)
운영체제가 제공하는 서비스
1. User Interface : Command Line Interface (CLI), Graphical User Interface (GUI)
2. 프로그램 실행
3. 입출력 작업
4. 파일 시스템 조작 (파일 삭제, 추가, 권한 변경 등)
5. 프로세스들 간의 정보 교환
6. 에러 탐지
7. 자원 할당 (CPU, 파일, 입출력 장치, 메인 메모리 등)
8. 자원 사용량 측정 (어디에 얼마나 자원이 쓰이고 있는지)
9. Protection and Security : Protection은 시스템 자원들에 대한 접근을 통제하는 것 (ex. 여러 프로세스가 실행될 때 어떤 프로세스는 다른 프로세스에 의해 방해받지 않아야 함) Secutiry는 허가 안 받은 사람이 시스템에 못 들어오도록 하는거
어떤 운영체제는 커널에 command interpreter가 포함되어 있다.
윈도우나 UNIX같은 건 command interpreter를 별도의 프로그램으로 뺀다.
시스템에는 여러 command interpreters가 있다. shells라고 부른다.
유저 모드에서는 메모리같은 시스템 자원에 접근할 수 없음.
커널 모드로 들어가야 운영체제가 관리하는 시스템 자원에 접근할 수 있음.
시스템 콜(System Call) : 운영체제가 제공하는 서비스에 접근하기 위해 응용 프로그램이 호출하는 함수
cp in.txt out.txt
이렇게 간단한 거 (in.txt에 있는 내용을 복사해서 out.txt을 만드는 명령어) 입력해도
이렇게나 많은 시스템 콜들이 호출된다.
시스템 콜은 5가지로 나눌 수 있다.
시스템 콜 목록
프로세스 관리
fork()
: 새로운 프로세스를 생성합니다.exec()
: 현재 프로세스 주소 공간에서 새로운 프로그램을 실행합니다.wait()
: 자식 프로세스가 종료될 때까지 대기합니다.exit()
: 현재 프로세스를 종료합니다.getpid()
: 현재 프로세스의 프로세스 ID(PID)를 반환합니다.getppid()
: 현재 프로세스의 부모 프로세스 ID를 반환합니다.파일 관리
open()
: 파일을 엽니다.close()
: 열린 파일을 닫습니다.read()
: 파일에서 데이터를 읽습니다.write()
: 파일에 데이터를 씁니다.lseek()
: 파일 읽기/쓰기 위치를 이동합니다.unlink()
: 파일을 삭제합니다.stat()
: 파일의 상태 정보를 얻습니다.fstat()
: 파일 디스크립터로 파일의 상태 정보를 얻습니다.lstat()
: 심볼릭 링크의 상태 정보를 얻습니다.디렉토리 관리
mkdir()
: 새로운 디렉토리를 생성합니다.rmdir()
: 빈 디렉토리를 삭제합니다.opendir()
: 디렉토리를 엽니다.readdir()
: 디렉토리에서 다음 항목을 읽습니다.closedir()
: 열린 디렉토리를 닫습니다.메모리 관리
brk()
: 데이터 세그먼트의 크기를 변경합니다.sbrk()
: 데이터 세그먼트의 크기를 변경합니다.mmap()
: 파일이나 디바이스를 메모리에 매핑합니다.munmap()
: 메모리 매핑을 해제합니다.네트워크 관리
socket()
: 소켓을 생성합니다.bind()
: 소켓에 주소를 할당합니다.listen()
: 소켓을 수신 대기 상태로 만듭니다.accept()
: 수신 대기 중인 소켓 연결을 수락합니다.connect()
: 소켓을 통해 서버에 연결합니다.send()
: 소켓을 통해 데이터를 전송합니다.recv()
: 소켓을 통해 데이터를 수신합니다.시간 관리
time()
: 현재 시간을 초 단위로 반환합니다.gettimeofday()
: 현재 시간과 타임존 정보를 얻습니다.nanosleep()
: 지정된 시간 동안 프로세스를 일시 중지합니다.시스템 정보
uname()
: 시스템 정보를 얻습니다.sysinfo()
: 시스템 통계 정보를 얻습니다.커널 모드 진입은 어떻게 하는거임?
시스템 콜 쓰면 그 자체가 커널 모드에 대한 인터페이스임?
네, 정확히 그렇습니다. 시스템 호출(System Call)을 사용하면 응용 프로그램이 커널 모드로 진입하는 인터페이스 역할을 합니다. 시스템 호출은 사용자 모드에서 실행되는 응용 프로그램이 커널 모드에서 제공하는 기능을 사용할 수 있게 해주는 메커니즘입니다. 이를 통해 응용 프로그램은 직접 하드웨어 자원에 접근하지 않고, 안전하게 운영체제의 기능을 이용할 수 있습니다.