본문 바로가기

CS

(20)
Pintos Project2: User Programs 아 일단 시간이 너무 없어서 프로젝트가 다 끝난 뒤 정리용으로 써야 될 거 같다. 먼저 저번 프로젝트에서 부팅이 된 후 커널 스레드를 생성시켜 프로세스를 돌게 만들고 우선순위 별로 스케줄링하는 단계까지 구현을 했다. 이번 프로젝트에서는 사용자 명령어를 받아서 시스템 콜들을 실행하는 단계를 구현해야 한다. 그래서 일단은 argument passing을 먼저 처리해야 한다. 우리가 쉘에서 명령어를 입력하면 그 명령어대로 처리할 수 있게 입력된 명령어들을 잘 파싱 하여서 스택에 올리고 실행할 수 있게 넘겨주는 것이다. 이 동작은 밑에 코드를 보면 알 수 있다. 이전 단계에서는 무시되었던 코드다. 우리가 입력한 명령어가 저 task 인자로 들어간다. 이곳으로 들어오면 우리가 입력한 명령어에서 실행해야 될 커맨드..
Virtual Memory 주소 변환의 원리 cpu와 마찬가지로 memory에서도 가상화 비슷한 전략을 추구한다. 제어와 효율성을 추구함. 프로그램을 다른 프로그램으로부터 보호하고 운영체제를 프로그램으로부터 보호하려면 하드웨어 도움이 필요함. 밑의 핵심문제를 보자 여기서 다루는 기법은 하드웨어-기반 주소 변환인데 짧게 주소 변환이라고도 한다. 가상 주소를 물리 주소로 변환하는 것. 주소 변환은 하드웨어가 하지만 하드웨어를 셋업 하기 위해 운영체제가 관여해야 함. 메모리의 빈 공간 사용 공간 등 알고 있어야 함. 먼저 가장 간단한 가정부터 시작함 사용자의 주소 공간이 물리 메모리에 연속적으로 배치되어야 한다고 가정. 또한 주소 공간은 물리 메모리 크기보다 작고, 주소 공간의 크기가 같다고 가정. 예시를 보면 프로그램 관점에서 0부터..
유저 스택과 커널 스택 출처: https://kldp.org/node/73308 커널 스택이 궁금합니다. | KLDP 리눅스 커널 스택에 대해서 궁금합니다. 1.커널 스택은 프로세스마다 하나씩 생성되는 건가요 ? 2.커널 스택에는 어떤 정보가 들어가게 되나요 ? (얼핏 알기로는 해당 프로세스에 인터럽트가 걸 kldp.org 질문 1. 커널 스택은 프로세스마다 하나씩 생성되는가? 2. 커널 스택에는 어떤 정보가 들어가는가 3. 프로세스 하나는 4기가의 가상공간을 사용한다고 들었다. 이 중에서 0~3이 응용프로그램이고 3~4기가는 커널이 사용하는 공간인데 어떤 연관성이 있나?? 답변: 1. 커널 스택은 프로세스마다 하나씩 생성됩니다. 일반적인 프로세스는 User Mode 스택과 Kernel Mode 스택을 각각 하나씩 가지고 있습..
Pintos project 1 Alarm clock, priority scheduling project 1 Threads는 크게 2가지를 개선하는 방식으로 진행되는데 우선 alarm clock을 먼저 이야기하겠다 기존의 Alarm clock(sleep)은 스레드가 일어날 때까지 busy waiting으로 대기하면서 언제 깨울지를 기다린다. 밑의 코드처럼 시간이 될 때까지 계속 깨워서 확인하게 된다. 우리는 이걸 주어진 시간만큼 스레드를 재웠다가 다시 깨울 것이다. 그러기 위해서는 몇 가지 상태에 대해 알아야 되는데 위에서 말한 것처럼 스레드가 돌고 있는 상태를 running, 우리가 스레드를 잠재우면 blocked 된다고 말한다. 이걸 다시 깨워서 ready 큐에 넣는데 이걸 대기 상태라 볼 수 있다. 따라서 우리는 block 시켜서 잠재울 애들을 따로 관리하는 sleep list를 추가해 ..
CPU 가상화 CPU를 가상화한다는 건 쉽게 말해서 여러 작업들이 동시에 실행되는 것처럼 보이도록 cpu 공유하게 함. 기본적인 아이디어는 돌아가면서 CPU 시간 나눠 쓰면 되는 거다. 여기서 2가지 문제가 발생 성능 저하랑 , 제어 문제 제어권을 상실하게 되면 한 프로세스가 영원히 실행권을 가질 수가 있다. 그래서 제한적 직접 실행(LDE) 이라는 기법이 있다. 말 그대로 cpu상에서 그냥 실행하는 거임 근데 여기서 문제 한 프로그램이 운영체제가 원치 않는 일을 하지 않는다는 보장이 있나, 그리고 운영체제가 어떻게 알고 원래 프로그램 중단하고 다른 프로세스로 바뀌는가. 자 그럼 해결해보자 일단 제한된 연산이라는 것은 커널 모드랑 유저 레벨 모드를 두어서 커널 모드에서 특수한 명령어만 실행하게 함. 여기서 시스템 콜들..
커널 레벨 쓰레드와 유저 레벨 쓰레드 먼저 간단하게 스레드의 개념과 커널 레벨 스레드, 유저 레벨 스레드를 살피고 가자 스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다. 사용자 레벨 스레드 (User-Level Thread) 사용자 스레드는 커널 영역의 상위에서 지원되며 일반적으로 사용자 레벨의 라이브러리를 통해 구현되며, 라이브러리는 스레드의 생성 및 스케줄링 등에 관한 관리 기능을 제공한다. 동일한 메모리 영역에서 스레드가 생성 및 관리되므로 속도가 빠른 장점이 있는 반면, 여러 개의 사용자 스레드 중..
프로시저 프로시저 호출은 소프트웨어에서 중요한 추상화이다. 이들은 지정된 인자들과 리턴 값으로 특정 기능을 구현하는 코드를 감싸주는 방법을 제공한다. 프로시저에 대한 기계어수준 지원을 제공할 때 처리되어야 하는 여러 가지 많은 특성들이 존재한다. 프로시저 P가 프로시저 Q를 호출하고, Q가 실행한 후에 다시 P로 리턴한다고 가정하자. 이러한 동작들은 다음과 같은 하나 이상의 메커니즘이 연관된다 제어권 전달: PC(프로그램 카운터) 는 진입 할 때 Q에 대한 코드의 시작주소로 설정되고, 리턴할 때는 P에서 Q를 호출하는 명령어 다음의 명령어로 설정되어야 한다. 데이터 전달: P는 하나 이상의 매개변수를 Q에 제공할 수 있어야 하며, Q는 다시 P로 하나의 값을 리턴할 수 있어야 함. 메모리 할당과 반납: Q는 시작..
전통적 동기화 문제와 데드락 데드락은 동시성 이슈에서 다루는 게 좋을 것 같았지만, 예시와 함께 정리해보려고 한다. Produer-Consumer problem 소비자와 생산자가 유한한 버퍼를 갖는 상황에서 소비자와 생산자가 상호 배타적으로 접근하고, 소비자는 버퍼가 있으면 소비하고 , 생산자는 원소가 없으면 원소를 생성해야 한다. 위의 문제를 해결하려는 조건은 생산자가 우선 실행된 적이 있어야 하고, 생산자의 실행 횟수가 소비자보다 많아야 한다. 이를 해결하기 위해서 3가지 세마포를 사용한다 mutex라는 생산자 소비자 상호 배제를 위한 세마포 slots이라는 비어있는 버퍼의 개수를 나타내는 세마포 items라는 버퍼에 차있는 개수를 나타내는 세마포 여기서 주의할 점은 다음과 같이 코드를 작성해 버리면 데드락에 걸릴 수가 있다. ..