티스토리 뷰

공부

[OS] Process & Thread

승가비 2018. 8. 20. 23:19
728x90

[OS] Process & Thread



[Program]

하드디스크에 저장되어 있는 실행코드



[Process]

프로그램을 실행해서 메모리상에 올린 것

프로세스는 OS(자원관리자)로 부터 자원을 할당 받는 단위

메모리를 할당 받는다.(Code, Data, Heap, Stack)

- Code: 실행코드

- Data: 전역변수, Static 변수

- Heap: 동적할당 메모리

- Stack: 함수콜, 지역변수, 복귀주소

기본적으로 1개의 Thread를 가지고 있다.


멀티프로세스를 사용하게 되면, 실행중인 Process 변경 작업인 Context Switching에 비용이 많이 발생한다.

이때 캐시메모리도 초기화해줘야 한다.(프로세스끼리 공유하는 자원이 하나도 없기 때문에)





[Thread]

스레드는 프로세스가 할당 받은 자원을 사용하는 단위

멀티스레드(여러 스레드가 독립적으로 작업을 병렬로 처리)는 프로세스 내에 

Stack을 제외한 나머지 Code, Data, Heap을 공유한다.


Stack을 제외한 자원을 공유하므로, Context Switching 비용 또한 줄어든다.

그래서 시스템의 Throughput이 향상된다.

Stack은 현재 어떤 부분이 실행되고 있는지 알 수 있는 정보가 저장되어 있는 값이므로

독립적으로 병렬처리하려면 서로 공유할 수 없다.


pc: ProgramCounter: 다음에 실행될 코드 주소

sp: StackPointer: 함수가 호출되고 현재 가리키고 있는 스택 메모리 주소

fp: FramePointer: 함수가 호출되기 전에 스택메모리 주소

레지스터도 공유하지 않는다.


스레드 간의 통신이 필요한 경우 전역변수를 사용하면 된다. 

따로 자원을 할당하지 않아서(IPC: Inter Process Communication) 자원도 적게 든다.


또한 하나의 프로세스가 여러 개의 작업을 한꺼번에 진행시킬 수 있으므로,

시스템 응답시간이 단축된다.(사용자 응답 스레드, 데이터 처리 스레드)


스레드는 메모리를 공유하므로, 충돌할 가능성이 크다.

쉽게 버그가 발생하고 개발시 디버깅이 어렵다.

스레드간 동기화의 문제가 있다.

다른 프로세스의 스레드를 제어할 수 없다.

하나의 스레드가 다른 스레드에 영향을 미친다.



(내용추가 할것; 스레드 동기화 관련, 충돌관련 해결책)




[출처]

https://brunch.co.kr/@kd4/3

http://ralf79.tistory.com/34

https://magi82.github.io/process-thread/

http://includestdio.tistory.com/6

http://ykcb.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%93%B0%EB%A0%88%EB%93%9C

https://m.blog.naver.com/PostView.nhn?blogId=jaejun0201&logNo=50149617518&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

http://brownbears.tistory.com/39


728x90

'공부' 카테고리의 다른 글

[Recursive] isTwoPower?  (0) 2018.09.06
[DB] 트랜잭션(작성중)  (0) 2018.08.27
[DB] 정규화  (0) 2018.08.16
[Server] Redis?  (0) 2018.08.12
[JS] MobX?  (0) 2018.08.12
댓글