여러 프로세스, 스레드가 동작하다 보면 충돌이 발생할 수밖에 없다. 운영체제에서는 이러한 충돌에 대해서 해결할 수 있는 시스템을 구축해 놓았다. 먼저 동기화를 이해하기 위한 중요한 용어부터 살펴보자. Some Key Terms in Concurrency Race Condition 멀티 프로세스나 스레드가 동시에 같은 공유 자원에 접근하는 상황 Mutual exclusion 하나의 프로세스가 공유자원을 차지하고 있으면 다른 프로세스는 접근할 수 없는 것 Critical section 공유하는 리소스에 접근하는 코드 영역이다. 따라서 다른 프로세스와 충돌이 일어날 수 있다. Critical Section이 상호 배타적(mutually exclusively)이게 실행되지 않는다면, Race Condition이..
프로세스와 스레드 스레드란 일련의 명령의 집합에 의해 실행되는 프로세스에서의 실행 단위이다. 즉, 모든 프로세스는 사실상 스레드 내에서 실행이 된다고 이해할 수 있다. 또한 스레드는 경우에 따라서 여러 개가 동시에 만들어져 있는 모습 또한 가질 수 있다. 이를 멀티 스레드라고 한다. 리눅스 운영체제는 이러한 스레드를 스레드라고 부르지 않고, 경량 프로세스(lightweight process)라고 부르기도 한다. 프로세스와 스레드의 자원 프로세스는 _Code_, _Data_, _Stack_, _Register_ 값들로 이루어져 있으며, 스레드는 _Stack_과 PCB 내의 _Register_값들을 가지고 있다. 이를 Thread Conrol Block이라고 한다. 즉, 각각의 스레드는 별도의 _Stack_..
Process Termination 프로세스가 종료되는 경우는 다음과 같다. 프로세스가 _exit()_ System Call을 불렀을 때이다. 다루지 못하는 시그널을 받았을 경우이다. 회복하지 못하는 CPU 예외가 발생한 경우이다. 부모 프로세스가 자식 프로세스를 _kill_하는 경우이다. exit()을 통해 프로세스를 종료한다면 모든 자원을 회수하지만, PCB는 남겨둔다. 즉, main memory 상에 있는 자원들은 전부 회수하지만, 커널이 있는 메모리 상의 PCB는 그대로 둔다. 그 이유는 PCB 내의 State는 Zombie상태로 유지해야 할 뿐만이 아니라 PCB 내의 Accounting Information을 가져야 하기 때문이다. 만약 부모가 자식 프로세스를 _kill()_하고 싶다면 부모 프..
도메인 제약 조건(Domain Integrity Constraints) 애트리뷰트나 도메인의 값을 제한할 수 있다. 즉, 릴레이션 내의 각 속성의 도메인에 지정된 값만을 가져야 한다는 조건이다. 예를들어, 어떠한 데이터 값이 0보다 커야한다는 제약조건을 추가해줄 수 있다. 그러면 DBMS가 자동으로 이 조건을 검사해주어 개발자가 비교로직을 넣을 필요가 없어진다. CHECK를 통해서 제약 조건을 지정해 줄 수 있다. NULL 제약 조건(NULL Integrity Constraints) NOT NULL 제약 조건은 어떤 애트리뷰트에 널 값을 허용하지 않는 것이다. 이때 NULL이라는 것은 비어있는 필드로 적용이 되지 않았거나 기록되지 않은 것 혹은 알 수 없는 경우 일 때 NULL을 표기하여 넣는다. 그래서..
Protocol Layer 우선 프로토콜이란 송신자와 수신자, 그리고 중간장치들이 효율적으로 의사소통하기 위해 따라야 하는 규칙을 말한다. 통신이 간단하다면 하나의 프로토콜만 있으면 되지만, 통신이 복잡하다면 각 층마다 프로토콜이 필요하다. 이를 프로토콜 계층화(Protocol Layer)라고 한다. 프로토콜 계층화를 사용하면 복잡한 작업을 여러 개의 더 작고 간단한 작업으로 나누는 것이 가능하다. 예를들어, 데이터를 주고 받는데 암호화/복호화 과정이 들어간다고 가정해보자. 만약 계층화를 사용하지 않는다면 암호화/복호화 방식이 맘에 들지 않아 교체해야 하는 경우 전체를 교체해야한다. 하지만 암호화/복호화만을 담당하는 계층을 만들어 해당 역할을 수행하도록 맡긴다면 훨씬 간단해질 것이다. 나머지 계층들은 전..
Redirection Redirection은 stdin/stdout/stderr가 전달되는 목적지를 재정의한다. 이는 표준 입력, 출력, 에러에 대한 메시지를 의미한다. 커맨드에 의한 입력은 표준 입력(stdin 파일)에 작성되고 화면에 출력된다. 그리고 커맨드에 의한 출력은 표준 출력 또는 표준 에러에 작성된다. 이는 둘 다 화면으로 연결되지만 실질적으로 작성되는 파일은 서로 다르다.(stdout/stderr) 기본적으로 디스크에는 저장되지 않는다. 프로세스에서 파일을 참조하기 위한 파일 번호를 file descriptor(fd)라고 부른다. 표준 입력/출력/에러의 fd는 순서대로 0,1,2이다. pts는 같은 터미널에 묶여있다고 생각하면 된다. 표준 출력 리디렉션 화면에 출력될 결과물이 파일에 쓰이도..
Context Switch 이전에 배운 것을 다시 한 번 짚어보자. 커널 모드와 유저 모드를 변경하는 것을 Mode Change라고 하며, 이 Mode Change는 하나의 프로세스안에서 동작한다. 반대로 컨텍스트 체인지는 Mode Change와 달리 프로세스가 바뀌는 것을 말한다. 위 그림을 보면 조금 더 쉽게 이해할 수 있다. 한 프로세스에서 커널로 CPU 할당이 바뀌는 Mode Change와는 달리 Context Switch는 프로세스 그 자체가 바뀜을 알 수 있다. 그렇다면 어떠한 경우에 프로세스를 바꾸는 Context Switch가 일어날까? 다음을 살펴보자. 프로세스의 Termination(Termination of a process) 프로세스의 에러나 예외 혹은 일반적인 종료(terminat..
* 해당 글은 김영한 강사님의 자바 ORM 표준 JPA 프로그래밍 - 기본 편을 보고 간단하게 정리한 글입니다.(자세한 내용은 강의가 최곱니다. 강의 사세요) 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런 회사땜에 매일 바쁜 와중에 학원이라도 다닐까 생각했는데 마침 JPA 강의가 생겨서 꿀 타이밍이네요. 저는 이 전에 JPA 책을 보고 공부 했었는데요 궁금했던 점, 업무에 적용하며 고민하고 해결하 www.inflearn.com 상속 관계 매핑 관계형 데이터베이스에는 객체 지향 언어의 상속이라는 개념이 없다. 대신 슈퍼타입, 서브타입이라는 모델링 기법이 그나마 비슷하여 대신 사용한다. 물론, 이를 실제 물리 모델인 테이블로 구현하기 위해 다음 세 가지 방법을 사용한다. 조인 전략 단일 테이..
Process Control 실행 모드 User Mode 낮은 권한을 가진다. System Mode(=Kernel Mode, supervisor mode) 높은 권한을 가진다. 이전에 Virtual Memory Space에 대해서 배울 때 해당 공간에도 커널이 있었음을 기억해 보자. 여기에 있는 커널은 메인 메모리로부터 복사된 것일까? 그렇지 않다. 실제로는 Main Memory 상의 커널이 매핑되어 그렇게 보이는 것 뿐이다. 프로세스는 user mode와 kernel mode를 번갈아 가면서 Mode change를 진행한다. 즉, CPU가 끊임없이 하나의 프로세스만을 차지하는 것처럼 보이지만 실제로는 그렇지 않다는 것이다. 실제로는 굉장히 빠른 속도로 Mode를 바꾸어간다. 다시 말해 A라는 task가..
Process Context 컨텍스트란 프로그램의 실행 환경을 의미한다. 그리고 Process Context는 컴퓨터가 실행되는 데 필요한 구성 요소들의 집합을 말한다. 컨텍스트에는 두 가지로 나뉘는데 하나는 User Context, 다른 하나는 System Context이다. User Context 코드 : 유저 프로그램 코드 데이터 : 프로세스의 전역 변수 User Stack : LIFO 자료구조 지역 변수, 함수의 파라미터, 리턴 정보 등을 저장하기 위함이다. System Context 운영체제가 만든 것이다. Kernel Stack(System Stack) 커널 코드 내에 있는 함수 호출을 위한 인자, 지역 변수를 저장한다. 커널 영역에 존재 Process Control Block(PCB) 프로세..