goorm 10일차

박경현·2022년 8월 12일
0

오늘은 프로세스의 개념과 관련된 명령어들에 대해 학습했다.
아는 내용도 30프로정도 있어서 이해는 괜찮았지만 명령어가 익숙치 않아 많이 써봐야겠다

프로그램 - 보조기억장치에 저장된 실행가능한 파일(바이너리 파일)
프로세스 - 메모리 상에서 동작중인 프로그램

프로세스 수업 하기전 간단하게 Buffer, 캐쉬 정리

한번 명령어를 실행하고 난 뒤에는 버퍼에 남겨둠

-> 확률적으로 또 사용할 수 있으니까 캐쉬나 버퍼에 남겨 놓으면 메모리에서 안가져와도 되서
훨씬 실행 속도가 빠름!

버퍼와 캐쉬 에 있는 내용은 유효시간이 있는건 아니다 -> 공간으로 판단 이게 중요!

cpu가 메모리로 매번 읽어오지않고 한번 읽은걸 캐쉬에 담았다 -> 캐쉬에 저장된 내용을 사용하는게
히트라고 불린다 -> cpu는 캐쉬를 먼저 검사
-> 캐쉬에 없으면 그때 캐쉬를 비우고 메모리에서 읽고 그 내용을 캐쉬에 넣는다

리눅스 쉘에서 명령은 결국 프로그램 실행과 같다!!

리눅스는 멀티 프로세싱을 지원! -> 여러 프로그램을 관리하는 방법이 필요!
-> 커널안에는 이런 여러 프로그램이 동작하는 걸 관리 할수있다
-> 커널안에 작업관리자가 실행중인 프로그램을 관리함

ls를 치는 순간 프로세스가 만들어짐 -> 그래서 커널에 들어갔다가 동작함 -> 그리고 사라짐!

스레드 (이거 진짜 중요!)

  • process 내에서 동작하는 실행 흐름, 프로세스가 할당받은 4기가안에서 메모리를 사용!

    스레드는 프로세스에 비해 자원 소모량이 적다

    스레드는 프로세스에 비해 데이터 공유가 쉽다

    프로세스간에 데이터 공유를 위해서는 별도의 외부 도구를 지원해야한다

    멀티 프로세스보다 멀티 스레드가 적은 리소스를 이용하여 동시 처리가 가능한 장점

    멀티 스레드 단점은 프로그래밍이 어렵다

프로세스

process를 간단히 정의한다면 실행중인 프로그램이라 할 수 있다

PID(process ID)

리눅스에서 모든 프로세스에는 프로세스 식별 번호(PID -> process ID)를 통해 관리

커널의 작업 관리자가 PID를 이용하여 프로세스 관리

-> PID 꽉 차면 이미 들어왔다가 끝난 애들꺼 번호를 줌 -> 부팅을 하게 되면 1번 부터 다시 시작

PID는 양의 정수로 부여하고 1번 부터 차례대로 부여

PID 관리는 커널의 작업 관리자가 관리하므로 사용자가 임의로 부여할 수 없다!

각 프로세스 마다 기본적인 메모리 할당 - 가상 메모리로 할당, 32bit CPU기준으로 4GB할당 -> 결과를 내기위한 동작을 위해 메모리를 씀
-> 메모리 필요시 쓰라고 준거

리눅스에서 프로세스 관리 (커널, 부모프로세스, 자식 프로세스)

리눅스 메모리 운영이라고 하면 기본적으로 가상 메모리를 운영하는 것을 의미한다!

리눅스에서 프로세스 관리는 계층적으로 관리

리눅스에서 프로세스가 생성된다는 의미는 부모 프로세스가 자식 프로세스 생성을 의미

ex) 쉘에서 ls명령을 입력한다는 것은 쉘 프로세스가 ls 프로세스를 생성해서 실행한다는 의미

쉘 프로세스가 부모 프로세스 -> ls 프로세스가 자식 프로세스

커널은 프로세스 관리를 하지만 생성은 안한다 -> 부모 프로세스가 생성해줌!! 

	부모 프로세스를 식별하는 번호가 필요 -> PPID(parent PID)는 모두 가지고 있다!! -> PPID 나의 부모 프로세스 ID

Linux 프로세스 중 가장 상위 프로세스 ID는 1번 프로세스 - 부팅시에 생성!

Linux shell을 운영할 때 shell 프로세스가 부모 프로세스가 되고 입력하는 명령에 의해 생성된 프로세스는 자식 프로세스다

부모 프로세스 역할
	자식 프로세스 생성
	자식 프로세스 동작 상태 확인
	자식 프로세스 종료에 따른 처리 - kernel에 종료 알림

자식 프로세스 역할
	프로세스 동작 - 자신의 기능 수행
	프로세스 종료 시 종료 상태를 부모 프로세스에 전달
	

프로세스 종류

정상 프로세스
		일반 프로세스	

고아 프로세스
		부모 프로세스가 먼저 종료된 상태의 프로세스
		언젠가는 좀비 프로세스가 될 수 있다
		따라서 통산 1번 프로세스가 부모 프로세스로 설정된다. -> 좀비 프로세스 되는거 막을 수 있다!

좀비 프로세스
		자식프로세스가 종료 되어있으나 부모 프로세스에 의해서 kernel에 보고 되지 않아
		현재 동작 중인 프로세스로 인식
		프로세스는 종료 되었으나 kernel의 프로세스 관리 목록에는 존재하는 프로세스
		좀비 프로세스 많아지면 kernel의 프로세스 운영 비효율이 커진다!
		프로세스 관리 시점에 상태 값으로 확인 가능
		

프로세스 실행 형태에 따른 종류

foreground 프로세스
		사용자와 상호 작용이 가능한 프로세스
		하나의 프로세스만 foreground 프로세스가 된다
        
		-> gedit(메모장)과 터미널 켰을때 여기서 하나만 작성 할 수 있는거!
		-> 터미널에서 xeyes를 실행하고 터미널을 다시 들어가면 터미널이 
        		foreground고 쉘은 입력이 안되니까 foregroud가 아니다

background 프로세스
		사용자와 상호작용을 수행하지 않는 프로세스
		background 프로세스는 프로세스가 생성되었지만 현재 직접적인 사용자와 상호작용 안한다		
		->  gedit(메모장)과 터미널 켰을때 여기서 작성 안하고 있는 애!
		-> 백그라운드 프로세스라고 꼭 멈춰있는건 아니다!
		-> 언제든지 foreground가 될 수 있다!

daemon 프로세스
		항상 background로 프로세스 생성
		사용자와 상호 작용을 절대!!!! 하지 않는다
		다른 프로세스 요청에 대한 응답을 목적으로 하는 프로세스
		-> 서버를 구성하기 위해 작동하는 프로세스
        
        -> DB서버를 구성한다 -> DB 데몬 프로세스가 실행되어야 한다
		-> Linux에서 daemon 프로세스는 프로세스 이름이 d로 끝난다!

프로세스 관리 명령

ps - 현재 동작 중인 프로세스 확인 명령

  • ps [옵션]
    유닉스 유형 - 여러옵션을 묶어서 사용가능, -(하이픈)을 붙여서 사용
    BSD유형 - 여러 옵션을 묶어서 사용 -(하이픈)사용 안해도 됨
    GNU 옵션 - —(하아픈 두개)사용하고 옵션명은 full name을 사용, 한개의 옵션만!
ps -> 현재 shell 상에서 실행되고 있는 프로세스 목록 출력 
		-> 새 터미널 해버리면 이건 다른 shell이다!!!!!
		
		PID - 프로세스 ID
		TTY - 터미널 번호 - 요즘은 의미없음 
		TIME - 실행시간
		CMD - 명령어\

ps -f - 현재 shell상에서 실행되고 있는 프로세스 목록 상세히 출력

		UID - 프로세스를 실행한 사용자 ID
		PPID - 부모 프로세스 ID
		C : CPU 사용량(%)
		STIME:  프로세스 시작 날짜 및 시간 -> 터미널 껐다 키면 bash 시간 달라짐
		
ps a : 현재 shell에서 실행시킨 프로세스 정보 출력(BSD 유형 옵션)

	STAT - 프로새스 상테
            
		R - 실행 중
		S - 인터럽트(interrupt 프로세에 이상하게 신호 들어온거)가 가능한 대기(sleep)					-> 인터럽트를 받을 수가 있다! 
		T - 작업 제어에 의해 정지된 상태
		Z - 좀비 프로세스
		STIME - 프로세스 시작 날짜 시간
		s - 세션 리더 프로세스 (세션은 하나의 작업 공간)
		+ - foreground 프로세스 그룹
		l - 멀티 스레드
        COMMAND 는 CMD랑 같은거
					


ps au - 현재 쉘에서 실행시킨 프로세스 상세 정보 출력
		USER - 사용자 ID
		%CPU - cpu사용량
		%MEM - 물리 메모리 사용랴아!
		VSZ - 사용중인 가상 메모리 크기(kb)
		RSS - 사용중인 물리 메모리크기(kb)
		START - 프로세수 시작 시간

grep 명령어는 자주 쓰인다!

grep명령 - 파일 내용 또는 결과 내용에 대한 검색

grep [옵션] <검색 패턴><파일>
		<검색 패턴> - 검색어나 정규표현식 사용 가능
			-n 옵션 - 행번호 표시
			-I(아이) 옵션 - 대소문자 구별없이 모두 검색
			-l(L임) 옵션 - 검색 패턴이 포함된 모든 파일명 출력
            
파이프 기능과 연계해서 많이 사용!
	ex) cat /ect/services | grep -ni HTTP

전체 프로세스 정보 확인

ps -e -전체 프로세스 목록 출력(유닉스 유형) 
ps -ef -전체 프로세스 상세 목록 출력(유닉스 유형)
			
ps ax - 전체 프로세스 목록 출력(BSD유형)
ps aux - 전체 프로세스 상세 목록 출력(BSD유형)
	
ps 명령 기타 옵션
	ps -u<사용자 이름> - 특정 사용자에 대한 프로세스 정보 출력(유닉스 유형)
	ps -fu<사용자 이름> - 특정 사용자에 대한 프로세스 상세 정보 출력(유닉스 유형)

	ps -p<processID> - 특정 프로세스 상세 정보 출력
	

프로세스 계층 형식으로 출력 - pstree [옵션]

시그널

인터럽트
불가항력 상황에서 발생하는 일, 특수 상황에 발생하는 일

하드웨어 인터럽트

하드웨어 인터럽트 - 하드웨어 이상에 의해 더 이상 컴퓨터 시스템 운영 어려울때
				RAM이나 CPU I/O Device에 이상이 생길때 
				컴퓨터 망가졌다고 생각하면 편함

소프트웨어 인터럽트 - 소프트웨어 적으로 발생하는 인터럽트

시그널
	Linux kernel에서 의해서 프로세스에게 전달되는 소프트웨어 인터럽트
	시그널에 따라 해당 프로세스 동작에 영향을 미친다
	시그널 발생시 처리 유형
			
    	미리 정해진 시그널 동작을 무조건 수행
				ctrl + c키 입력시 동작이 미리 정의된 시그널(강제 종료)에 대한 처리

		무시 - 해당 프로세스에서 설정 가능					
				
		사용자 프로세스에서 시그널 처리에 대하여 별도 정의 해서 처리
		

Kill 명령 - 시그널 발생 명령

kill [옵션 시그널 번호] <프로세스ID> 
	-l 옵션 -현재 사용 가능한 전체 시그널 목록
				
	출력 
		2번 SIGINT - ctrl + c 키 입력시 발생하는 시그널, 기본동작은 프로세스 강제 종료
			프로세스에서 무시하거나 다른처리 하게 할 수 있다

		9번 SIGKILL - 무조건 프로세스 종료, 프로세스에서 설정 못함

		kill -9 <프로세스 ID> - 프로세스ID에 해당하는 프로세스 종료
			kill -9 2364( 현재 터미널에서 xeyes의 프로세스ID)
			killed라고 뜸!

			

top 명령 - 전체 프로세스 실시간 실행 상태 모니터링

윈도우의 작업관리자와 동일! 
	PID 
	USER
	PR - 우선순위
	NI - Nice 값
	VIRT - 프로세스 사용 가상 메모리 크기
	RES - 프로세스 사용 물리 메모리 크기
	SHR - 프로세스 사용 공유 메모리 크기
	%CPU - CPU사용량
	%MEM - apahfl tkdydfid
	TIME+ - CPU누적이용시간
	COMMAND - 명령
	
top 내부 명령
	space bar - 내용 갱신
	k <PID>: 프로세스 종료
	n: 출력 프로세스 개수 변경
	u: 사용자에 대한 정렬
	M: 사용 메모리 크기에 따라 정렬
	q - top종료

foreground/background 프로세스 관리

foreground생성
	shell 에서 명령 실행
	ps a를했을때 STAT에 +(필수!),s,S, l 중에 몇개 가 있어야함!
		
backgournd생성
	shell 에서 명령 실행시 명령 마지막에 & 추가
    
	bg 명령을 이용한 background 프로세스로 전환
    
	foreground 돌고 있어도  ctrl + z 키 입력하면 background로 바꿈! -> 정지 상태로 바꿈


jobs 명령 - 현재 shell에서 background 작업 목록 출력
	jobs -> 작업 번호 - 작업 순서
		+ : 최근 작업
		- : 최근 작업 바로 전
	상태
		Running - 현재 실행중
		Stopping 작업 중지
		Done 작업 정상 종료
		Terminated  작업 비정상 종료
	
foreground / background 전환
	fg <%작업번호>
		background 작업을 foreground로 전환
	bg <%작업번호>
		foreground 작업을 background로 전환

알아두면 좋은 내용들

터미널을 여러개 키면 ps-f 하면 bash 자체는 다 다르지만 터미널 이라는 것은 같으니까 PPID는 같다

메모리 스왑은 동작중인 프로세스가 물리적인 메모리를 다 사용했을경우
다른 프로세스들 중 지금 멈춰있는 프로세스의 물리적인 메모리를 사용하는거 !
-> 보조 기억장치로 옮겨서 쓰는거

PPID 0번은 커널 안에 작업관리자 안에 스케줄러를 뜻한다!! -> 커널에 있어서 프로세스는 아님!

file /usrl/bin/ls 했을때 ELF가 적혀있으면 실행가능한 파일이라는 뜻!!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글