티스토리 뷰
Done
- 자바의 정석컬렉션 프레임웍 일부 수강 https://bong-f.tistory.com/115
Learned
참고
- 이화여자대학교 반효경 교수님 OS 3강
프로세스란?
- 실행되고 있는 프로그램
프로세스의 문맥이란?
- 프로세스가 cpu를 잡았다가 다른 프로세스가 cpu를 잡고 다시 원래 프로세스가 cpu를 잡는다 (여러 프로그램이 동시에 실행되는 듯한 착각을 일으킬 정도로 빨리 실행되는 cpu)
- cpu를 다시 잡았을 때 이전에 어디까지 코드를 실행했고 레지스터에 어떤 값이 있었고를 알아야 그것에 이어서 프로세스를 실행할 수 있다. 이렇게 현재 프로세스의 상태를 나타네는데 필요한 모든 요소를 프로세스의 문맥이라고 한다.
- 프로세스 문맥은 크게 3가지로 나눌 수 있다.
- CPU 수행상태를 나타내는 하드웨어 문제
: 프로그램 카운터가 어디를 가리키고 있었나
: 레지스터에 어떤 값을 넣고 있었나 - 메모리와 관련된 프로세스 주소공간
: code, data, stack (이 프로세스 주소공간)에 어떤 내용을 담고 있는가 - PCB와 커널스택
: 프로세스가 하나 실행될 때마다 운영체제는 그를 관리하기 위해 자신의 데이터 영역에 자료구조를 만든다. = PCB
: Process Control Block _ (1) process state / process id 등 (2) program counter가 어디 코드 가리키고 있었는지, register에 어떤 값들이 저장되고 있었는지 백업 데이타 (3) code, data, stack의 위치정보, 리소스들 의 내용을 포함한다.
: 커널스택 : 프로세스가 OS의 도움이 필요해서 Systemcall을 했을 때 pc가 커널 주소공간의 코드를 실행을 한다. 커널도 함수로 이루어져 있기 때문에 함수호출이 일어나면 커널 주소공간의의 stack에 관련된 정보를 저장한다. 커널은 각 프로세스 별로 독립적인 스택을 구성한다. 따라서 프로세스 문맥을 알려면 커널 스택을 알아야 한다.
- CPU 수행상태를 나타내는 하드웨어 문제
문맥교환이란 ? context switch
- cpu를 한 프로세스에서 다른 프로세스로 넘겨주는 과정이다.
: cpu를 잡고 있던 프로세스의 정보를 pcb로 넘기고, 새로 cpu를 잡는 프로세서의 pcb를 가져온다
:
프로세스의 상태 3가지 + terminated (new는 제외했다) + suspended
- 프로세스의 상태에 따라 cpu를 잡을 수도 있고 못잡을 수도 있다.
- Running : cpu를 잡고 있을 때
- Ready: cpu만 안잡았을 뿐이지 그 외 조건은 running과 똑같다. 필요한 데이타도 다 메모리에 올라와 있어야 한다
: running 이다가 timer에 할당된 시간 완료가 되면 ready가 된다. - Blocked(wait, sleep) : I/O같이 입력을 오래 기다리는 상황 (자신이 요청한 event가 아직 완료되지 않은 상태)등으로 현재 CPU를 잡는다 하더라도 instrucation을 수행할 수 없는 상태다.
- terminated : insturction이 다 수행되고 수행이 끝난 상태. 정리하는 작업이 남아 있다.
- susended : 중기스케줄러가 메모리 관리를 위해 프로세서에게 메모리를 뺐는 등의 외부적인 이유로 프로세스 수행이 정지된 상태다. 프로세스 통째로 디스크에 swap out된다. 외부에서 다시 active해주지 않는 이상 ready가 될 수 없어 blocked와는 다르다. / suspended도 blocked상태에서 out되었다가 입출력이 완료되면 suspend ready(=ready에서 suspended out 된 상태)가 될 수 있다. 그러나 다시 swap in 되려면 어찌되었든 외부의 힘이 필요하다
프로세스의 상태 + queue
- 프로세스를 스케줄링하기 위해 큐가 있다.
- 이 큐들은 각 디바이스에 붙어 있거나 한 것이 아니고 커널이 본인의 데이터 영역에 자료구조로 만들어 놓고 프로세스의 상태를 바꿔가면서 cpu에게 ready 큐에 있는 애들한테 cpu를 준다
: 그래서 I/O가 끝나서 device interrupt가 발생하면 CPU 제어권이 OS에게 넘어가잖아. 그 때 OS는 일단 데이터를 넘겨주고 해당 프로세스의 상태를 blocked에서 readay로 바꾼다. - job 큐 : 현재 시스템 내에 있는 모든 프로세스의 집합으로 ready 큐와 device 큐를 포함한다
- device큐는 I/O 디바이스의 처리를 기다리는 프로세스의 집합으로 blocked 상태인 것으로 이해했다. '
프로세서의 생성과 죽음
- 부모프로세스가 자신을 fork()해서 자신과 똑같은 걸 하나 만들고 exec() 내용을 덮어 씌운다.
: fork를 하면 어쨌든 fork할 때 program counter가 가리키던 부분이 있을 텐데 그 내용도 다 복사되어 자식 프로세스에서도 pc가 가리킨 코드 다음 부터 실행된다. - 자식 프로세스와 부모 프로세스를 구분해주기 위해 fork뒤에 if문으로 pid 값을 확인한다. 자식 프로세스의 pid값이 0이다. - 기본적으로 프로세스는 부모와 자식이라 해도 cpu를 잡기 위해 경쟁해야 하는 관계이지만 여러 이유로 부모 프로세스가 자식 프로세스의 업무가 끝날 때까지 기다리기도 한다. 그 때 쓰는 것이 wait 시스템 콜이다.
: cmd 창에서 입력을 받는 부분도 하나의 프로그램인데 우리가 프로그램 명령어를 실행하는 동안은 입력 커서가 없다. 그것은 부모 프로세스인 입력 커서 프로그램이 자식 프로세스인 우리가 입력한 프로그램이 실행될 때까지 기다리는 것이다. - 마지막 코드까지 수행되고 exit() 시스템 콜로 자발적으로 죽는다. 컴파일러가 알아서 넣어준다.
- 강제로 죽는 경우가 있는데 그 중 한가지가 자식이 부모보다 먼저 죽는 것이 원칙이다. 부모는 자신이 죽을 때 자신의 자손의 자손의 자손을 먼 쪽 부터 순서대로 죽인다.
Thread란?
- cpu 수행의 basic 단위다.
- cpu 안에서 여러 쓰레드로 나뉘어 수행 단위가 여러개 있는 것이다 (cpu 수행 단위기 때문에 thread를 많이 가질 수록 빨라진다 > 일정 수를 넘어가면 빨라지지 못함)
- 한 프로세스 내 여러 쓰레드
: 함께 공유하는 부분 / 별도로 둔 부분 : 각 프로세의 주소공간에서는 data 부분과 code부분을 공유한다. stack부분은 쓰레드 마다 별도로 있다. : pcb에서 program counter가 어디 있는지 register에 뭘 백업해 놓았는지는 쓰레드 마다 다르다 / process id를 나타내주는 부분이라든가 프로세스 상태를 나타내는 부분, 리소스 부분은 공유한다. - 왜 필요하지?
: 프로세스를 여러 개 만드는 것보다 쓰레드를 여러 개 만드는 것이 경제적이다.
: 협력이 쉽다. 프로세스는 원칙적으로 독립적이고 cpu를 두고 경쟁하는 관계다. 협력이 쉽지 않다. 커널을 통해서 메시지 패싱을 하거나 / 커널에게 말해서 (처음에만 말하면 된다) memory를 share해야 한다.
: cpu가 여러 개 달린 컴퓨터에서는 서로다른 cpu에서 실행이 가능하다.
: 응답성이 올라간다. 사용자 입장에서는 쓰레드가 여러개면 한 쓰레드가 IO를 기다린다거나 하면 다른 쓰레드나 사용자에게 다른 데이터를 보여주면 되니 사용자 입장에서는 응답이 빨리 된다고 생각한다. - 그럼 다들 쓰레드 여러개 만들면 좋은 거 아닌가?
: 노우.. 공유하는 부분이 많아 에러가 날 확률이 높다.
다른 좋았던 자료
https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://www.tutorialspoint.com/operating_system/os_process_scheduling.htm
Bad
Good
TODO
'기타 > TIL' 카테고리의 다른 글
210126 화 TIL (0) | 2021.01.26 |
---|---|
210124-25 토일 TIL (0) | 2021.01.25 |
210121 목 TIL (0) | 2021.01.21 |
210120 수 TIL (0) | 2021.01.20 |
210119 화 TIL (0) | 2021.01.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 최단경로
- 백준
- 순열조합
- Gitignore
- Queue
- spring-boot-qna
- 프로그래멋lev2
- array
- JdbcTemplate
- 우선순위큐
- 프로그래머스lev3
- Stack
- 예외
- 동빈북
- SQL코딩테스트
- 프로그래머스lev1
- 힙
- 프로그래머스lev2
- Sort
- 그래프이론
- arraylist
- thread
- Stream
- FLASK
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함