앞서, CPU를 virtualize하기 위해서는 OS가 동시에 동작하는 것처럼 보이는 프로그램들에게 물리적인 CPU를 공유해야한다고 설명했다. 기본 아이디어는 한 프로세스를 잠시 실행했다, 다른 프로세스를 실행하고, 또 다른 프로세스를 돌아가며 실행하는 것이다. 이걸 CPU의 time sharing이라고 한다. 하지만 time sharing에는 몇가지 문제들이 있다. 1. Performance 과도한 오버헤드 없이 좋은 성능을 유지하며 time sharing을 할 수 있을 것인가. 2. Control 어떻게 cpu를 컨트롤하며 효율적으로 프로세스들을 실행할 수 있을 것인가. Basic Technique : Limited Direct Execution 프로그램을 빠르게 실행하기 위해서 OS는 limited..
앞서 2번글에서 OS가 프로세스를 위한 인터페이스를 제공한다고 했다. 이번 글에서는 OS가 process API를 어떻게 제공하는지 실제로 코드를 알아보자. 코딩은 UNIX가 제공하는 시스템으로 진행 할 것이다. The fork() System Call fork()는 새로운 process를 생성하는 시스템 콜이다. fork() 시스템 콜을 호출하면 새로운 프로세스를 생성하고, fork()를 호출한 프로세스를 부모 프로세스, 새로 생성된 프로세스를 자식 프로세스라고 한다. 프로세스는 각 프로세스를 식별하기 위해 id를 가지고 있는데, 이를 PID라고 한다. fork()를 통해 프로세스 생성에 성공 했을 때 새로 생성된 자식 프로세스에는 0을 반환하고, 부모 프로세스에는 자식 프로세스의 pid를 반환한다. ..
Process는 무엇일까?프로세스는 OS가 제공하는 추상적인 개념으로, 실행중인 프로그램을 말한다.프로세스와 프로그램을 혼동할 수 있지만 프로그램은 그 자체적으로 생명이 없는 것이다.즉, 디스크에 들어있는 명령어 덩어리에 불과하다. 이를 가져다가 변환하고 실행하는 것은 os가 하는일이다. os가 이런 프로세스를 관리해주기 때문에 우리는 프로그램을 실행할 때 cpu가 사용가능한지 고려하지 않고,그냥 프로그램을 실행할 수 있는것이다. 그렇다면 물리적인 cpu가 몇개 없음에도 불구하고 어떻게 OS는 무한대의 CPU를 가진 것같은 착각을 줄 수 있는것일까? 이는 OS가 CPU를 virtualization, 가상화하기 때문이다.이전 복숭아의 예시와 같이, 한 프로세스를 실행하고 멈추고 다른 프로세스를 실행하면서 ..
운영체제에서 Virtualization, 즉 "가상화"란 무엇일까? 쉽게 예를 들자면, 복숭아 한개를 가지고 있다고 생각해보자. 하지만 복숭아를 먹고 싶어하는 사람은 여러명이고 모두가 만족하기 위해서는 각자 복숭아를 가지고 있어야 한다. 이를 해결하기 위해서 물리적인 복숭아 한개에서 가상의 복숭아 여러개를 만들어 내는 것이다. 이게 어떻게 가능할까? 사람들은 대부분의 시간을 자거나 다른 일을 하며 보낸다. 이 시간동안 복숭아를 뺏어서 필요한 다른 사람에게 넘겨준다면, 가상의 복숭아 여러개가 있는 것 같은 착각을 만들어 낼 수 있다.(실제로 우리가 갖고 있는건 복숭아 한개 뿐이다!) 이 상황을 CPU에 적용해보면, 물리적인 CPU가 한개 있을때 Virtualization을 통해 실행중인 애플리케이션들이 각..
https://pages.cs.wisc.edu/~remzi/OSTEP/ 위 사이트에 공유되어 있는 Operating Systems in Three EasyPieces 책을 통해 운영체제를 공부하고자 함. 또한 원어로 되어있는 책을 통해 학습함으로써 영어에 대한 친근감을 형성할 수 있을 것으로 기대됨. 포스팅은 주로 해당 목차의 요약을 올릴 예정.
Stack이란? Stack은 LIFO(Last-in, First-out) 의 특성을 가지고 있는 자료구조이다. 즉, 나중에 들어온 것이 먼저 나가는, 바닥부터 차곡차곡 쌓고 제일 위를 꺼내는 특성을 가지고 있다! Stack의 시간 복잡도는 다음과 같다. 삽입(push) O(1) 삭제(pop) O(1) 읽기(peek) O(1) 탐색(search) O(n) Java로 코테에서 Stack 활용하기 java에서는 Stack클래스를 제공하고 있다. 하지만 오라클 공식 문서에 따르면 Stack 클래스 보다는 ArrayDeque를 활용하는 것을 추천한다. (https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ArrayDeque.html) Th..
$mysql.server start My SQL을 성공적으로 설치하고 실행하려는데 다음과 같은 오류가 발생했다. mysqld_safe A mysqld process already exists mysql.server stop 그래서 서버를 종료 시켜 주려 하니... ERROR! The server quit without updating PID file 이번엔 이런 오류가 발생했다. 그래서 구글에 해당 오류를 검색해 나오는 대부분의 방법 chmod로 권한도 줘보고 , killall mysql 도 해봤지만 ps aux|grep mysql 을 실행했을때 계속해서 mysql이 실행되고 있는게 잡혔었다. 해결 방법 My SQL 서버를 실행하는데는 2가지 방법이 있다. 1. mysql로 실행하기 $mysql.serv..
My SQL 패스워드를 까먹었다,, 구글에 나온 온갖 방법들 mysql.server start --skip-grant-tables 등등 을 시도해봤지만 권한이 없어서 실패했고, 권한을 주려하니 다시 패스워드가 필요한 무한 반복의 상황을 겪은 후 My SQL을 재설치하기로 했다! 하지만, brew uninstall mysql 후 brew install mysql 로 재설치 했는데도 패스워드가 초기화 되지 않았다. → 캐시에 기존 mysql 과 관련된 파일이 남아있는것을 확인 그래서 제대로 삭제해 보자! 1. brew uninstall mysql $brew list → brew로 깔린 것들 체크 $brew uninstall mysql → mysql과 관련된 것들은 uninstall로 다 제거해준다 2. /u..
Stream이란? 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미한다. 즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미하며, 중간 매개자 역할을 한다! 자바에서는 바이트 기반 스트림과 문자 기반 스트림 두개로 나뉜다. 그리고 바이트 기반 스트림과 문자 기반 스트림은 각각 스트림을 실제로 읽고 쓰는 기반 스트림과 기반스트림이 읽어온 데이터를 처리하는 보조스트림 으로 나뉜다. 보조스트림은 생성자로 기반스트림을 받아서 실제 데이터를 읽어온다. 바이트 기반 스트림 1Byte단위로 입출력을 한다. 입력에서는 InputStream 클래스, 출력에서는 OutputStream이 있다. 모든 바이트 기반 스트림은 InputStream과 OutputStream의 하위 클래스이다. 기반 스트림 ..
https://gogogohigher.tistory.com/7 이 포스트를 먼저 참고하면 좋다. 자바의 입출력은 모두 java.io패키지에서 관리한다. 그 중 바이트의 출력 스트림에 관한 모든 클래스의 부모 클래스는 OutputStream 클래스이다. public abstract class OutputStream extends Object implements Closeable, Flushable 이 외에도 OutputStream을 상속하는 클래스는 무지 많다..! 우리가 자바에서 출력할 때 사용하는 System.out도 OutputStream의 하위 클래스이다. System클래스에 가보면 out이 PrintStream형으로 선언되어 있는 것을 알 수 있다. OutputStream의 Method들 publ..