응용 프로그램이 실행되는 모드
제한된
권한 : 하드웨어나 시스템 리소스에 직접 접근x운영체제 커널이 실행되는 모드
높은
권한 : 모든 시스템 리소스와 하드웨어에 직접 접근oCPU 내부에 있는 매우 빠른 소형 메모리 장치로, 현재 실행 중인 프로그램의 데이터를 저장 and 처리하는데 사용.
레지스터는 CPU의 작업을 효율적으로 처리하기 위해 필수적인 역할
CPU 클럭 속도와 동일하게 동작하여 매우 빠름
10여 개
에서 수십개 까지 존재. 예를 들어 x86 아키텍쳐에는 8개의 일반 목적
레지스터가 있으며, x86-64 아키텍처에서는 이 수가 16개로 증가.데이터 임시 저장
저장
. ex) 두 숫자를 더할 때, 결과를 메모리에 쓰기 전에 레지스터를 임시 저장.연산 결과 저장
연산
(사칙연산)이나 논리 연산의 결과를 저장.주소 계산
오프셋
을 합산하여 주소 계산프로그램 카운터
다음
에 실행할 명령어를 가져옴.스택 포인터
최상위
주소 저장. 함수 호출시 매개변수, 반환주소, 로컬 변수를 저장하는데 사용.일반 목적 레지스터
EAX
. ‘EBX’, ‘ECX’, ‘EDX’특수 목적 레지스터
특정한 기능
을 수행하도록 설계컴퓨터 시스템에서 데이터를 저장하고 접근하는 장치.
휘발성 : 전원이 꺼지면 데이터가 사라짐(RAM)
비휘발성 : 전원이 꺼져도 데이터 유지(HDD, SSD)
레지스터 > 캐시 메모리 > 주 메모리 > 보조 기억장치
주 메모리 : 프로그램 실행 시 필요한 데이터를 저장.
보조 기억장치 : 프로그램, 파일, 데이터의 영구 저장.
레지스터 : CPU 내부
의 소형, 고속 메모리. 임시 데이터 저장. 연산 결과 저장.
메모리 : 컴퓨터 시스템의 데이터 저장소
. 계층 구조에 따라 속도와 용량이 다르다.
응용 프로그램이 운영체제의 커널 기능을 요청하는 인터페이스
컴퓨터 하드웨어와 소프트웨어 리소스를 관리하고, 컴퓨터 프로그램이 실행되는 동안 기본적인 서비스를 제공하는 시스템 소프트웨어. 운영체제는 사용자 and 컴퓨터 간의 인터페이스 역할을 하며, 효율적이고 공정한 자원 배분을 통해 시스템의 안정성과 성능을 보장.
구조
HW, SW, 간의 중개자 역할을 한다. 커널은 시스템의 모든 주요 기능을 제어. 프로세스, 메모리, 파일 시스템, 입출력 관리.
컴퓨터의 전원이 켜지면 운영체제는 메모리에 적재된다.. 그러나 운영체제 전체가 메모리에 상주하면 메모리 낭비가 심함.
따라서, 운영체제 중 항상 필요한 핵심 부분만 메모리에 상주시키고, 나머지 부분은 필요할 때 메모리에 올린다. 메모리에 항상 상주하는 이 핵심 부분을 커널이라고 합니다.
구성
프로세스 관리
메모리 관리
파일 시스템 관리
입출력 관리
프로세스 간 통신 관리
계층형 구조 커널
오류 발생 시 해당 계층만 고치면 되기 때문에 디버깅 수월
인터페이스
커널에 사용자의 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할.
운영체제는 두 부분으로 나뉩니다:
운영체제는 커널과 인터페이스를 분리하여, 같은 커널을 사용해도 다른 인터페이스를 통해 사용자에게 다른 운영체제로 보일 수 있습니다.
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);
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));
ioctl() - 장치에 대한 입출력 제어 작업 수행
ioctl(fd, SOME_IOCTL_COMMAND, &arg);
read() - 장치로부터 데이터를 읽어들인다.
read(fd, buffer, sizeof(buffer));
write() - 장치에 데이터를 쓴다(파일과 유사하게 사용).
write(fd, buffer, strlen(buffer));
getpid() - 현재 프로세스의 프로세스 ID 반환
pid_t pid = getpid();
alarm() - 지정된 시간이 경과한 후에 시그널을 발생시킨다.
alarm(5); // 5초 후에 SIGALRM 시그널 발생
sleep() - 지정된 시간 동안 프로세스를 일시 중단
sleep(2); // 2초 동안 프로세스 중단
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);