운영체제(이론) - 핀토스-2(Mode, 레지스터 vs Memory, System Call)

연도·2024년 5월 31일
0
post-thumbnail

User Mode

응용 프로그램이 실행되는 모드

  • 제한된 권한 : 하드웨어나 시스템 리소스에 직접 접근x
  • 시스템 호출 : 커널 모드로 전환하기 위해 시스템 호출을 사용
  • 보호 : 오류나 악의적인 행동이 시스템 전체에 영향을 방지

Kernel Mode

운영체제 커널이 실행되는 모드

  • 높은 권한 : 모든 시스템 리소스와 하드웨어에 직접 접근o
  • 제어 : 메모리 관리, 프로세스 스케줄링, 파일 시스템, 네트워킹 등 주요 시스템 기능 제어
  • 시스템 보호 : 커널 코드의 오류는 시스템 전체에 영향을 미칠 수 있으므로 매우 신중하게 사용

  1. 유저 모드 실행
  • 유저모드에서 애플리케이션이 실행. 예: 웹 브라우저, 텍스트 편집기
  • 이 모드에서는 애플리케이션이 제한된 권환을 가지고 실행되며, 하드웨어나 중요한 시스템 리소스에 직접 접근x
  • 유저모드의 프로그램은 필요한 자원에 접근하기 위해 커널에 요청을 보낼 수 있다.
  1. 시스템 호출
  • 애플리케이션이 시스템 자원에 접근해야할 때, 시스템 호출 인터페이스를 통해 요청을 보낸다.
  • 시스템 호출은 유저모드에서 커널모드로 전환하기 위한 인터페이스 역할을 한다.
  • 예를 들어, 파일을 열거나, 메모리를 할당하거나, 네트워크 통신을 수행할 때 시스템 호출이 사용
  1. 커널모드 전환
  • 시스템 호출이 발생하면 CPU는 커널모드로 전환
  • 커널이 요청된 작업 ex) 파일 읽기, 네트워크 패킷 전송)을 수행한다.
  • 커널모드에서는 운영체제가 높은 권한을 가지고 하드웨어와 시스템 리소스에 직접 접근o
  • 커널은 시스템 호출에 따라 요청된 작업을 수행. ex) 파일시스템에서 파일을 읽거나 쓰는 작업을 수행하거나, 네트워크 인터페이스를 통해 데이터를 전송한다.
  1. 유저모드 복귀
  • 커널이 시스템 호출에 대한 작업을 완료하면, CPU는 다시 유저모드로 전환됩니다.
  • 유저모드로 돌아온 후, 커널은 애플리케이션에 제어를 반환합니다.
  • 애플리케이션은 커널이 수행한 작업의 결과를 받아 계속 실행됩니다

레지스터

CPU 내부에 있는 매우 빠른 소형 메모리 장치로, 현재 실행 중인 프로그램의 데이터를 저장 and 처리하는데 사용.

레지스터는 CPU의 작업을 효율적으로 처리하기 위해 필수적인 역할

특징

속도

CPU 클럭 속도와 동일하게 동작하여 매우 빠름

  • 레지스터는 CPU 내부에 위치하며, CPU 클럭 사이클과 동일한 속도로 동작. 이는 레지스터가 명령어 실행 과정에서 데이터를 신속하게 읽고 쓸 수 있도록 하기 위함.
  • CPU 명령어를 실행할 때, 대부분의 연산은 레지스터에 저장된 데이터를 사용. ex) 두 숫자의 덧셈 연산은 이 숫자들이 레지스터에 있을때 가장 빠르게 수행
  • 메모리 계층 구조에서 레지스터는 가장 상위에 위치하며, 접근 시간이 나노초(ns) 단위로 매우 짧다. 이는 캐시 메모리나 주 메모리에 비해 현저히 빠르다.

크기

💡 일반적으로 32비트, 64비트 등 **소규모** 데이터 저장.
  • 레지스터는 소규모 데이터(일반적으로 32비트 or 64비트)를 저장할 수 있는 용량을 가진다. 이는 현대 CPU 아키텍쳐에서 흔히 사용되는 데이터 크기.
  • 레지스터의 개수는 cpu 아키텍처에 따라 다르며, 보통 10여 개에서 수십개 까지 존재. 예를 들어 x86 아키텍쳐에는 8개의 일반 목적 레지스터가 있으며, x86-64 아키텍처에서는 이 수가 16개로 증가.

용도

데이터 임시 저장

  • 연산 중간값이나 임시데이터를 저장. ex) 두 숫자를 더할 때, 결과를 메모리에 쓰기 전에 레지스터를 임시 저장.
  • CPU 명령어는 주로 레지스터를 대상으로 작동하므로, 연산의 중간 결과를 레지스터에 보관함으로써 빠른 접근o

연산 결과 저장

  • 산술 연산(사칙연산)이나 논리 연산의 결과를 저장.
  • ex) ‘ADD’ 명령어는 두 레지스터의 값을 더한 결과를 다른 레지스터에 저장.

주소 계산

  • 메모리 주소를 계산하여, 특정 메모리 위치에 접근할 때 사용. 예를 들어, 배열의 특정 요소에 접근하기 위해 기초 주소와 오프셋을 합산하여 주소 계산
  • 주소 계산을 위해 베이스 레지스터와 인덱스 레지스터 사용

프로그램 카운터

  • 현재 실행 중인 명령어의 주소 저장. 명령어가 실행될 때마다 프로그램 카운터는 다음 명령어의 주소로 갱신
  • CPU는 프로그램 카운터를 참조하여 다음에 실행할 명령어를 가져옴.

스택 포인터

  • 스택의 최상위 주소 저장. 함수 호출시 매개변수, 반환주소, 로컬 변수를 저장하는데 사용.
  • 스택 연산을 수행할 때 스택 포인터 갱신

종류

일반 목적 레지스터

  • 데이터를 임시 저장 : 계산 중간값, 임시 데이터 등을 저장.
  • ex) x86 아키텍처의 EAX. ‘EBX’, ‘ECX’, ‘EDX’

특수 목적 레지스터

  • 특정한 기능을 수행하도록 설계
  • 프로그램 카운터 : 다음 실행할 명령어의 주소 저장.
  • 스택 포인터 : 현재 스택의 최상위 주소 저장.
  • 플래그 레지스터 : 연산의 상태 or 조건 저장
  • ex) ‘ESP’(스택 포인터), ‘EIP’(명령어 포인터), ‘EFLAGS’(플래그 레지스터)

메모리

컴퓨터 시스템에서 데이터를 저장하고 접근하는 장치.

메모리 계층 구조

  1. 레지스터
  • CPU 내부, 가장 빠름, 매우 소규모
  1. 캐시 메모리
  • CPU and 주 메모리 사이에 위치, 속도와 크기 사이의 균형
  • L1, L2, L3 캐시로 구분
  1. 주 메모리
  • CPU가 직접 접근 가능한 메모리
  • 휘발성 메모리, 전원이 꺼지면 데이터 소멸
  • 프로그램 실행 시 데이터와 명령어를 저장.
  • ex) DDR4, DDR5, RAM
  1. 보조 기억 장치
  • 비휘발성, 대용량, 상대적으로 느림
  • 데이터를 영구적으로 저장.
  • ex) HDD, SSD, USB플래시 드라이브

특징

  • 휘발성 vs 비휘발성

휘발성 : 전원이 꺼지면 데이터가 사라짐(RAM)

비휘발성 : 전원이 꺼져도 데이터 유지(HDD, SSD)

  • 접근 속도:

레지스터 > 캐시 메모리 > 주 메모리 > 보조 기억장치

  • 용도 :

주 메모리 : 프로그램 실행 시 필요한 데이터를 저장.

보조 기억장치 : 프로그램, 파일, 데이터의 영구 저장.

최종 정리

레지스터 : CPU 내부의 소형, 고속 메모리. 임시 데이터 저장. 연산 결과 저장.

메모리 : 컴퓨터 시스템의 데이터 저장소. 계층 구조에 따라 속도와 용량이 다르다.

System Call

응용 프로그램이 운영체제의 커널 기능을 요청하는 인터페이스

  • 자원 관리, 보안, 추상화를 통해 응용 프로그램이 안전우
  • 파일 시스템, 프로세스 관리, 메모리 관리 등의 다양한 작업을 수행할 수 있다.
  • 파일 시스템, 프로세스 관리, 메모리 관리 등의 다양한 작업을 수행할 수 있다.
  • 시스템 콜은 인터럽트를 발생시켜 커널 모드에서 처리된 후 결과를 응용프로그램에 반환.

들어가기전에(운영체제 + 커널)

운영체제

컴퓨터 하드웨어와 소프트웨어 리소스를 관리하고, 컴퓨터 프로그램이 실행되는 동안 기본적인 서비스를 제공하는 시스템 소프트웨어. 운영체제는 사용자 and 컴퓨터 간의 인터페이스 역할을 하며, 효율적이고 공정한 자원 배분을 통해 시스템의 안정성성능을 보장.

구조

커널

HW, SW, 간의 중개자 역할을 한다. 커널은 시스템의 모든 주요 기능을 제어. 프로세스, 메모리, 파일 시스템, 입출력 관리.

컴퓨터의 전원이 켜지면 운영체제는 메모리에 적재된다.. 그러나 운영체제 전체가 메모리에 상주하면 메모리 낭비가 심함.

따라서, 운영체제 중 항상 필요한 핵심 부분만 메모리에 상주시키고, 나머지 부분은 필요할 때 메모리에 올린다. 메모리에 항상 상주하는 이 핵심 부분을 커널이라고 합니다.

구성

프로세스 관리

  • 프로세스에 CPU를 분배하고 작업에 필요한 제반 환경 제공

메모리 관리

  • 프로세스 작업 공간을 배치하고 실제 메모리보다 큰 가상공간 제공

파일 시스템 관리

  • 데이터 저장하고 접근할 수 있는 인터페이스 제공

입출력 관리

  • 필요한 입출력 서비스 제공

프로세스 간 통신 관리

  • 공동 작업을 위한 각 프로세스 간 통신 환경 제공

계층형 구조 커널

오류 발생 시 해당 계층만 고치면 되기 때문에 디버깅 수월

인터페이스

커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할.

운영체제는 두 부분으로 나뉩니다:

  1. 커널: 운영체제의 핵심 기능을 수행하며, 항상 메모리에 상주합니다.
  2. 인터페이스: 사용자의 명령을 커널에 전달하고, 실행 결과를 사용자와 응용프로그램에 돌려줍니다.

운영체제는 커널과 인터페이스를 분리하여, 같은 커널을 사용해도 다른 인터페이스를 통해 사용자에게 다른 운영체제로 보일 수 있습니다.

시스템 콜 종류

1. 프로세스 제어

fork() - 현재 프로세스를 복제하여 새로운 자식 프로세스를 생성

pid_t pid = fork();
if (pid == 0) {
    // 자식 프로세스 실행 코드
} else if (pid > 0) {
    // 부모 프로세스 실행 코드
}

exec() - 현재 프로세스를 지정된 프로그램으로 대체

execl("/bin/ls", "ls", "-l", (char *)NULL);
perror("execl");

exit() - 프로세스를 종료하고 종료 상태를 커널에 반환

exit(0);

wait() - 자식 프로세스의 종료를 대기하고, 종료 상태를 반환.

int status;
pid_t childPid = wait(&status);

2. 파일 관리

open() - 파일을 열고 파일 디스크립터를 반환

int fd = open("example.txt", O_RDONLY);

read() - 파일 디스크립터에서 데이터를 읽어 버퍼에 저장.

ssize_t bytesRead = read(fd, buffer, sizeof(buffer));

write() - 버퍼의 데이터를 파일 디스크립터에 기록

ssize_t bytesWritten = write(fd, buffer, strlen(buffer));

3. 장치 관리(Device Management)

ioctl() - 장치에 대한 입출력 제어 작업 수행

ioctl(fd, SOME_IOCTL_COMMAND, &arg);

read() - 장치로부터 데이터를 읽어들인다.

read(fd, buffer, sizeof(buffer));

write() - 장치에 데이터를 쓴다(파일과 유사하게 사용).

write(fd, buffer, strlen(buffer));

4. 정보 유지

getpid() - 현재 프로세스의 프로세스 ID 반환

pid_t pid = getpid();

alarm() - 지정된 시간이 경과한 후에 시그널을 발생시킨다.

alarm(5);  // 5초 후에 SIGALRM 시그널 발생

sleep() - 지정된 시간 동안 프로세스를 일시 중단

sleep(2);  // 2초 동안 프로세스 중단

5. 통신

pipe() - 프로세스 간의 통신을 위한 파이프 생산

int pipefd[2];
pipe(pipefd);

shmget() - 공유 메모리 세그먼트를 할당하거나 접근

int shmid = shmget(key, size, IPC_CREAT | 0666);

mmap() - 파일이나 장치의 내용을 메모리에 매핑

void *addr = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0);

0개의 댓글