목록CS 개념 학습 정리 (13)
♠Developer blog♠
스레드의 정의 운영체제는 코드와 데이터를 메모리에 가져오고, 프로세스 제어 블록을 생성하고, 작업에 필요한 메모리 영역을 확보한 후, 준비된 프로세스를 준비 큐에 삽입한다. 프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야 할 일을 CPU에 전달하고 실제 작업은 CPU가 수행한다. 이 때 CPU 스케줄러가 CPU에 전달하는 일 하나가 스레드이다. 그러므로 CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드이다. 운영체제 입장에서의 작업 단위는 프로세스이고 CPU 입장에서의 작업 단위는 스레드인 것이다. 프로세스와 스레드의 차이 프로세스끼리는 약하게 연결되어 있는 반면 스레드끼리는 강하게 연결되어 있다. 프로세스는 하나의 작업이고 스레드는 작업을 처리하기 위한 작업 안의 과정 하나 하나이다...
1. 프로세스의 구조 코드 영역 프로그래머가 작성한 프로그램은 코드 영역에 탑재되며 탑재된 코드는 읽기 전용으로 처리된다. 자기 자신을 수정하는 프로그램은 존재하지 않기 때문이다.데이터 영역 변수나 파일 등의 각종 데이터를 모아놓은 곳이다. 본문에 사용되는 데이터가 저장되어 있다. 상수로 선언된 변수는 읽기 전용이지만, 대부분의 변수는 읽기와 쓰기가 가능하다.스택 영역 운영체제가 프로그램을 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳이다. 프로세스 내에서 함수를 호추랗면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 이영역에 저장한다. 스택 영역은 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게 보이지 않는다. 2. 프로세스의 생성과 복사 fork() fork()를..
포인터 프로세스 상태 프로세스 구분자 프로그램 카운터 프로세스 우선순위 각종 레지스터 정보 메모리 관리 정보 할당된 자원 정보 계정 정보 PPID와 CPID 포인터 : 준비 상태나 대기 상태는 큐로 운영되는데, 프로세스 제어 블록을 연결하여 준비 상태나 대기 상태의 큐를 구현할 때 포인터를 사용한다. 프로세스 상태 : 생성, 준비, 실행, 대기, 보류 준비, 보류 대기가 있다. 프로세스 구분자 : 프로세를 구별하는 역할은 한다. 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값을 저장한다. 프로세스 우선순위 : 다양한 우선순위의 프로세스가 대기 상태로 들어오기 때문에 대기 상태의 큐도 우선순위별로 따로 운영된다. 각종 레지스터 정보 : 누산기, 색인 레지스터, 스택 포인터와..
생성 상태 : 프로세스가 메모리에 올라와 실행 준비를 완료한 상태이다. 프로세스를 관리하는 데 필요한 제어 블록이 생성된다. 준비 상태 : 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태이다. 실행 상태 : 실행 상태에 들어간 프로세스는 일정 시간 동안 CPU를 사용할 권리를 갖는다. 만약 일정 시간동안 작업이 끝나지 않았다면, 프로세스는 준비 상태로 돌아와 다음 차례를 기다린다. 완료 상태 : 프로세스 제어 블록이 사라진 상태를 의미한다. 준비 상태에 있는 여러 프로세스 중 다음에 실행할 프로세스를 선정하는 일은 CPU 스케줄러가 담당한다. CPU 스케줄러는 준비 상태의 맨 앞에서 기다리고 있는 프로세스 제어블록을 CPU에 전달하여 작업이 이루어지게 한다. 준비 상태의 프로세스 중 하나를 골라 실..
어떤 모듈이 싱글톤이라면, 클래스가 여러번 인스턴스화 되면 첫번째 인스턴스화만 적용되고 이후 인스턴스화는 무시한다.(싱글톤 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다) 싱글톤을 사용하는 이유는? 고정된 메모리 주소, 이미 생성된 인스턴스를 활용하기 때문에 속도 향상에 이점이 있다. 가장 큰 장점은 데이터 공유가 쉽다. 반면, 단점은? 1. 싱글톤 패턴을 구현하는 코드 자체가 많이 필요하다. 정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우에 멀티스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야 한다. 2. 테스트 하기 어렵다. 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스..
좋은 코드란 무엇인가 읽기 쉬운 코드 주석은 기본적으로 메타데이터이기 때문에 주석의 내용과 함수의 실제 동작이 일치한다고 보장할 수 없다. 수시로 변하는 요구사항을 반영하느라 함수가 수정될 때 주석이 함께 수정되지 않을 수도 있다. 오히려 한두 가지의 잘못된 주석으로 코드를 이해하는데 혼란을 야기할 수 있다. 중복이 없는 코드 테스트가 용이한 코드 테스트가 용이하면 물론 좋다. 테스트 코드를 작성해두면 심리적 안정감도 생기고 리팩토링에 자신감도 생긴다. 그러나 왜 읽기 쉬운가?에 대한 의문처럼 왜 테스트 코드를 작성하기 용이해야 하는가?이다. 그리고 어떻게 하면 테스트가 용이한 코드를 작성할 수 있을까?에 대한 고민이 추가로 필요하다. 좀 더 근본적인 정의를 찾아 좀 더 깊게 들어가볼 수 있을 것 같다...