Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

yongsa0221의 고물상

프로세스 본문

CS/운영체제

프로세스

yongsa0221 2024. 8. 10. 19:26

프로세스란?

 프로세스(Process)는 실행 중인 프로그램을 나타내는 개념이다. 프로그램(Program)은 디스크에 저장된 정적인 코드와 데이터의 집합이며, 프로세스는 이 프로그램이 실행되어 메모리에 로드되고, CPU에서 실행되는 상태를 말한다.

프로세스는 프로세스의 상태, 프로세스 주소공간에 있는 메모리 변수 값들, 레지스트 값( 스택 포인터, PC), 입출력 관련 정보(사용중인 파일들) 로 표현된다.

프로세스의 상태

프로세스의 상태를 단순화 한다면 다음 세 상태 중 하나를 가질 수 있다.

 

실행(Running)

 프로그램이 실행되기 위한 명령어가 프로세서에서 실행 되고 있을 때 프로세스는 실행(Running) 상태이다. 즉 프로세스는 명령어를 실행하고 있다.

 

준비(Ready)

 프로세서가 하나 비어 있다면 그 프로세서에 의해 즉시 실행될 수 있는 상태이다. 프로세스는 스케줄러에 의해 선택되기를 기다리고 있으며 실행할 준비가 되어있지만 운영체제가 다른 프로세스를 실행 하고 있는 등의 이유로 대기 중이다.

 

대기(Blocked) 

 프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시킨다. 스케줄러에 의해 선택되지 않으며 외부 이벤트를 기다리는 동안 프로세스는 대기한다. (I/O 등)

 

위의 표는 일반적으로 프로세스가 메인 메모리에 올라 온 후의 상태를 표현한다. 프로세스 상태에 관한 명명은 운영체제마다 다를 수 있으며 더 세분화 될 수 있다.

 

3가지 상태에 따른 간단한 프로세스 상태 추이

 

  P0가 입출력을 하는 순간 blocked되며 P1이 스케줄러에 의해 선택되어 CPU를 할당 받아 running 상태가 된다. 이후 P0가 입출력을 마치면 ready 상태가 되어 스케줄러에 의해 선택되기를 기다리고, P1이 종료된 이후 스케줄링 되어 실행된다.

 어떤 프로세스를 어떤 방식으로 CPU를 할당하게 할 것인가는 스케줄러 정책에 의해 결정된다. 운영체제의 스케줄러는 차후에 다루도록 한다.

프로세스를 위한 자료구조

 운영체제는 프로세스들에 관한 정보를 자료구조를 통해 관리한다. 이를 프로세스 리스트 혹은 테스크 리스트라고 한다. 이를 통해 시스템에서 실행 중인 프로그램을 관리하며 이 리스트의 각 노드는 PCB(Processing Cotrol Block), 프로세스 제어 블럭이라는 자료 구조이다.

PCB란 운영체제에서 각 프로세스를 관리하고 추적하기 위해 사용되는 자료 구조이다. PCB는 프로세스의 상태, 자원 사용, 우선순위 등을 포함한 다양한 정보를 저장하며, 이는 운영체제가 여러 프로세스를 효율적으로 관리하고 스케줄링 하는 데에 있어 필수적이다.

단순한 운영체제인 xv6에서의 프로세스를 위한 자료구조는 다음과 같다.

//프로세스간 전환 context switch 을 위한 레지스터 관련 구조체
struct context {
	int eip;
	iht esp;
	int ebx;
	int ecx;
	int edx;
	int esi;
	int edi;
	int ebp;
};

//가능한 프로세스 상태
enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE};

// pcb에 해당한다
struct proc {
	char *mem;                      // 프로세스 메모리 시작 주소
	uint sz;                        // 프로세스 메모리 크기
	char *kstack;                   // 커널 stack bottom 주소
	enum proc_state state;          // 프로세스 상태
	int pid;                        // pid
	struct proc *parent;            // 부모 프로세스
	void *chan;                     // 0이 아니면, chan에서 수면
	int killed;                     // 0이 아니면 종료됨
	struct file *ofile[NOFILE];     // 열린 파일
	struct inode *cwd;              // 현재 디렉토리
	struct context context;         // 프로세스를 실행시키려면 여기로 교환
	struct trapframe *tf;           // 현재 인터럽트에 해당하는 트랩 프레임
}		

 

 

linux 에서는 task_struct 라는 구조체를 사용하여 프로세스를 관리한다.

struct task_struct {
    pid_t pid;                        // 프로세스 ID
    long state;                       // 프로세스 상태
    unsigned int flags;               // 프로세스 플래그
    struct task_struct *parent;       // 부모 프로세스에 대한 포인터
    struct list_head children;        // 자식 프로세스 목록
    struct files_struct *files;       // 열린 파일에 대한 정보
    struct mm_struct *mm;             // 메모리 관리 정보
    struct signal_struct *signal;     // 신호 처리 정보
    int prio, static_prio;            // 프로세스 우선순위
    unsigned long nvcsw, nivcsw;      // 컨텍스트 스위치 카운터
    struct list_head tasks;           // 태스크 리스트
    struct thread_struct thread;      // 하드웨어 관련 컨텍스트
    // 기타 많은 필드
};

 

'CS > 운영체제' 카테고리의 다른 글

프로세스 API  (0) 2024.08.10