Developer Log
  • Wiki
  • Books
    • 리눅스 시스템 프로그래밍
      • 핵심 개념 소개
        • 시스템 프로그래밍
        • API와 ABI
        • 리눅스 프로그래밍의 개념
          • 파일과 파일시스템
          • 프로세스
          • 사용자와 그룹
          • 권한
          • 시그널
          • 프로세스간 통신
          • 에러 처리
    • 데이터 베이스 첫걸음
      • 데이터베이스란
        • 데이터베이스의 역할을 생각해 보자
          • 우리와 데이터베이스의 관계
          • 데이터베이스의 기본 기능
          • 데이터베이스 종류
      • 관계형 데이터베이스란
        • 대표적인 DBMS를 알아보자
          • 관계형 데이터베이스란
          • SQL 기초 지식
          • 관계형 데이터베이스를 다루기 위한 사전 지식
      • 데이터베이스에 얽힌 돈 이야기
        • 초기비용과 운영비용을 생각하자
      • 데이터베이스와 아키텍처 구성
        • 다중화에 대해 생각해보자
          • 아키텍처란
          • 데이터베이스의 아키텍처
            • 역사와 개요
              • Stand-alone
              • 클라이언트/서버
              • Web 3계층
            • 가용성과 확장성의 확보
          • DB 서버의 다중화
            • 클러스터링
            • 리플리케이션
          • 성능을 추구하기 위한 다중화 - Shared Nothing
          • 적합한 아키텍처를 설계하기 위해
      • DBMS를 조작할 때 필요한 기본 지식
        • MySQL 설치해보자
        • MySQL과 커넥션 만들기, 데이터베이스에 전화걸기
        • SQL과 관리 명령의 차이
        • 관계형 데이터베이스의 계층
      • SQL 문의 기본
        • SELECT 문으로 테이블 내용을 살펴보자
        • SELECT 문을 응용해보자
        • 데이터를 갱신, 삽입, 제거해보자
        • 뷰를 작성하고 복수 테이블에서 선택해보자
      • 트랜잭션과 동시성 제어
      • 테이블 설계의 기초
      • 백업과 복구
      • 성능을 생각하자
    • 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴
      • 객체 지향
        • 들어가기
        • 객체 지향
        • 다형성과 추상 타입
        • 재사용: 상속보단 조립
      • 설계 원칙 / DI와 서비스 로케이터
        • 설계 원칙: SOLID
          • 단일 책임 원칙(Single Responsibility Principle)
          • 개방 폐쇄 원칙(Open - Closed Principle)
          • 리스코프 치환 원칙(Liskov Substitution Principle)
          • 인터페이스 분리 원칙(Interface Segregation Principle)
          • 의존 역전 원칙(Dependency Inversion Principle)
          • SOLID 정리
        • DI(Dependency Injection)와 서비스 로케이터
      • 주요 디자인 패턴
        • 디지인 패턴이란?
        • 전략(Strategy) 패턴
        • 템플릿 메서드(Template Method) 패턴
        • 상태(State) 패턴
        • 데코레이터(Decorator) 패턴
        • 프록시(Proxy) 패턴
        • 어댑터(Adapter) 패턴
        • 옵저버(Observer) 패턴
        • 미디에이터(Mediator) 패턴
        • 파사드(Facade) 패턴
        • 컴포지트(Composite) 패턴
        • 널(Null) 객체 패턴
        • 팩토리 메서드 패턴
        • 커맨드 패턴
        • 추상 팩토리 패턴
    • 테스트 주도 개발
      • 1부
        • 다중 통화를 지원하는 Money 객체
        • 타락한 객체
        • 모두를 위한 평등
        • 프라이버시
        • 솔직히 말하자면
        • 돌아온 '모두를 위한 평등'
        • 사과와 오렌지
Powered by GitBook
On this page
  • 스레드
  • 프로세스의 계층 구조

Was this helpful?

  1. Books
  2. 리눅스 시스템 프로그래밍
  3. 핵심 개념 소개
  4. 리눅스 프로그래밍의 개념

프로세스

프로세스는 실행 중인 오브젝트 코드를 말하는데 언제나 활성화 상태로 실행 중인 프로그램이다. 정확히는 오브젝트 코드를 넘어 데이터, 리소스, 상태, 가상화된 컴퓨터를 포함한다.

프로세스는 커널이 이해하는 실행 파일 포맷으로 만들어져 실행 가능한 오브젝트 코드로 부터 시작된다. 리눅스에서 가장 일반적인 실행 파일 포맷은 ELF(Executable and Linkable Format) 이다. 실행 파일은 여러 섹션으로 구성되는데, 섹션에는 메타데이터, 코드, 데이터 등이 들어 있다. 이 섹션은 오브젝트 코드가 담긴 바이트 배열이며 선형 메모리 공간에 적재된다.

가장 중요한 공통 섹션은 텍스트 섹션, 데이터 섹션, bss 섹션이다.

텍스트 섹션

텍스트 섹션에는 실행 가능한 코드나 상수, 변수와 같은 읽기 전용 데이터가 있으며, 읽기 전용과 실행 가능으로 표시된다.

데이터 섹션

데이터 섹션에는 정의된 값을 할당한 C 변수와 같은 초기화된 자료가 있으며, 일반적으로 읽고 쓰기가 가능하도록 표시된다.

bss 섹션

bss 섹션은 초기화되지 않은 전역 데이터를 포함한다. C 표준에 따르면 C 변수의 기본값은 보통 0이므로 디스크에 저장된 오브젝트 코드에 0을 저장할 필요가 없다. 그 대신 오브젝트 코드는 단순히 bss 섹션에 초기화되지 않은 변수 목록을 유지하며 커널은 메모리에 올라오는 시점에서 모든 값이 0인 페이지를 bss 섹션에 매핑할 수 있다. bss 섹션은 오로지 이 목적을 위해 최적화되어 있다.

커널은 동작 중인 모든 프로세스가 시스템 프로세서를 공유하도록 빈틈없고 투명하게 프로세스를 선점하고 스케줄링한다. 커널은 가상 메모리와 페이징 기법을 사용해서 프로세스(단일 선형 주소 공간을 가짐)마다 다른 주소 공간에서 동작하도록 만들기 때문에 여러 프로세스가 시스템 상에 공존할 수 있는 것이다.

스레드

각 프로세스는 실행 스레드를 하나 이상 포함한다. 스레드는 프로세스 내부에서 실행하는 활동 단위이며, 코드를 실행하고 프로세스 동작 상태를 유지하는 추상 개념이다.

스레드는 스택, 프로세서 상태, 오브젝트 코드의 현재 위치를 포함한다. 이외의 대부분의 리소스는 모든 스레드가 공유한다. 이러한 방식으로 스레드는 가상 메모리를 공유하고 가상 프로세서를 관리한다.

프로세스의 계층 구조

각각의 프로세스는 pid(프로세스 ID) 라고 하는 고유한 양수 값으로 구분된다. 첫 번째 프로세스의 pid는 1 이다.

리눅스에서 프로세스는 프로세스 트리라는 엄격한 계층 구조를 형성한다. 일반적으로 프로세스 트리는 init 프로그램으로 알려진 첫 번째 프로세스가 루트가 된다. 새로운 프로세스는 fork() 시스템 콜로 만들어 지며, 호출하는 프로세스를 복사해서 다른 프로세스를 새로 만든다. 부모 프로세스가 자식 프로세스보다 먼저 종료되면 커널은 고아가 된 자식 프로세스를 init 프로세스에 입양시킨다.

프로세스가 종료되면 시스템에서 바로 제거되지 않고 프로세스 일부를 메모리에 계속 유지해서 자식 프로세스가 종료될 때 부모 프로세스가 상태를 검사할 수 있도록 한다.

  • 부모 프로세스가 종료된 자식 프로세스를 기다렸다면 자식 프로세스는 완전히 종료된다.

  • 부모 프로세스가 종료된 자식 프로세스를 기다리지 않았다면, 좀비 프로세스가 된다.

init 프로세스는 자기에게 딸린 자식 모두를 기다려서 새로 입양된 프로세스가 영원히 좀비로 남지 않도록 한다.

Previous파일과 파일시스템Next사용자와 그룹

Last updated 6 years ago

Was this helpful?