일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 정적링크
- 재배치
- 동적링크
- 행렬
- 벡터
- 다익스트라
- 코드포스
- rust 스터디
- 대상파일
- 컴파일러
- 다이나믹 프로그래밍
- Rust
- c++
- 선형대수학
- 알고리즘
- eigenvalue
- unity
- column space
- CS정리
- 백준
- linear algebra
- 스레드전용저장소
- matrix
- 스레드전용리소스
- 링커
- 컴퓨터밑바닥의비밀
- 심벌 해석
- 적재도구loader
- vector
- 구문트리
- Today
- Total
개발_기록용
[컴퓨터 밑바닥의 비밀 내용정리] 2.2 스레드와 프로세스 리소스 본문
0. 들어가며
- 굉장히 감명깊게 읽었던 [컴퓨터 밑바닥의 비밀] 책의 내용을 돌아보기 위해 정리글을 작성한다.
- 전공자로 어느정도 안다고 생각한 내용들에서도 부족한 부분이 보여 책을 다시 읽어보며 정리하고자 한다.
https://link.coupang.com/a/cdaqFv
컴퓨터 밑바닥의 비밀:컴퓨터 시스템의 본질을 알면 코드의 실마리가 보인다 - 보안과 해킹 | 쿠
쿠팡에서 컴퓨터 밑바닥의 비밀:컴퓨터 시스템의 본질을 알면 코드의 실마리가 보인다 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 보안과 해킹 제품도 바로 쿠팡에서 확인할 수 있
www.coupang.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
(본문 소개 링크로 도서 구입 시 일정액의 수수료를 제공받습니다.)
1. 들어가며
우선 함수가 실행될 때 필요한 정보는 다음과 같다.
- 함수의 매개변수
- 지역변수
- 반환주소
→ 이런 정보는 각 함수에 대응하는 스택 프레임에 저장되며,
모든 함수는 실행 시 자신만의 런타임 스택 프레임을 갖는다.
함수가 호출되고, 반환될 때마다 스택프레임은 LIFO 순으로 증가하거나 감소하며,
이런 스택프레임의 증감이 프로세스 주소 공간에서 스택 영역을 생성한다.
*스레드라는 개념이 있기 전에는
프로세스 내의 실행흐름이 하나라 스택 영역도 하나만 있었다.
그러나, 스레드가 등장하며 프로세스 하나에서 여러개의 실행 진입점이 존재할 수 있게 되었고각 흐름이 실행될 때 정보를 저장하기 위해 프로세스 주소 공간 속
스택 영역도 각 스레드를 위한 별도의 여러개의 영역으로 존재하게 되었다.
여기서 각 스레드를 위한 영역은, 해당 스레드가 실행중인 함수의
실행시간 상태 정보를 저장하며 스택 프레임이라고 한다.
*각 스레드는 자신만이 쓸 수 있는 스택 영역을 가지므로
스레드 여러개가 있으면, 프로세스 주소 공간에 여러 스택 영역이 존재한다.
즉, 각 스레드는 실행중인 함수 정보를 갖는 스택 프레임을 갖고 (독점적인 스택영역)
순차적으로 다음에 실행할 명령어 주소를 저장해놓아야 하므로,
프로그램 카운터를 각 스레드마다 독점적으로 갖는다.
(결국 스레드 전용 리소스는 다른 스레드에서 접근 불가한 "스레드 상황 정보")
→ 따라서, 스레드는 프로세스 주소 공간에서 스택 영역을 제외하고 나머지를 공유하게 된다.
2. 나머지 영역에 대한 설명
자 그러면 스택 영역이 각 스레드마다 실행하는 함수 정보, PC 레지스터 값을 갖는
스레드 별 독자적인 스택 프레임으로 이루어져 있다는 것을 알게 되었으니
나머지 영역에 대해 스레드 간 공유 영역인지 살펴보자.
(모든 스레드가 접근 가능한지를 기준으로 보면 된다)
코드 영역 (read-only 영역)
: CPU는 모든 함수에 스레드를 배치해 실행할 수 있다.
→ 특정 함수를 특정 스레드에서만 실행되도록 하는건 불가능.
→ 공유 영역!
데이터 영역 (전역 변수 저장)
: 모든 스레드가 데이터 영역의 변수에 접근할 수 있다.
→ 프로그램이 실행되는 동안 전역변수 인스턴스는 하나만 있어 모든 스레드가 접근 가능하다.
→ 공유 영역!
힙 영역 (포인터가 핵심이다)
: C, C++에서 malloc 함수와 new 예약어로 요청하는 메모리 영역.
예를 들어, new 키워드로 s라는 string을 만들어 "abc"라는 문자열을 저장한다고 하자.
→ 모든 스레드는 해당 변수 주소만 알고 있다면,
다시 말해 포인터를 얻을 수 있다면 포인터가 가리키는 데이터에 접근할 수 있다.
→ 공유 영역!
이처럼, 코드 영역 - 데이터 영역 - 힙 영역은 모두
각각의 스레드에서 접근 가능하므로 공유 영역이다.
*그럼 추가로 스택 영역도 살펴보자.
스택 영역
: 우리가 앞에서 스레드 간 별도 스택 프레임이 있고, 이것이 스택 영역을 이루므로
스택 영역은 공유 영역이 아니라고 했지만, 실제 구현 측면에서 엄밀하게 격리된 스레드 전용 공간은 아니다.
우선 프로세스와 비교하면 구현 측면에서 다음과 같은 차이가 있다.
서로 다른 프로세스 : 서로 다른 주소 공간을 가짐 → 다른 프로세스의 주소 공간에 접근 금지를 보장
서로 다른 스레드 : 다른 스레드의 스택 프레임에서 포인터를 가져올 수 있다면, 이 스레드는 다른 스레드의 스택 영역을 직접 읽고 쓰며 다른 스레드의 스택 영역에 속한 변수를 임의로 수정할 수 있다.
즉, 먼저 생성된 스레드 내부에서 사용하던 변수가 있고,
새로 생성된 스레드가 이 변수에 대한 포인터를 가져올 수 있다면 그 변수의 값을 변경할 수 있게 된다.
따라서, 이런 논리라면 스택 영역도 스레드 전용 영역은 아니다 라고 설명할 수 있다.
(물론 read-only만 한다면, "스레드 안전" 하므로, 스택 영역을 스레드 전용 영역이라 하는데에 문제가 없을 것이다.)
(함수의 로컬변수만 사용하는 경우에도 "스레드 안전"하니, 함수의 로컬변수는 당연히 스레드 전용 영역에 해당한다)
→ 이 부분은 따로 "스레드 안전"을 구분하는 포스팅을 따로 작성할 예정
그러면 정말 "스레드 전용 영역"이라는건 없는 것일까?
답은 "존재한다."이다. [스레드 전용 저장소] 라는 것을 만들 수 있다.
스레드 전용 저장소
: 아래의 코드 예시에서, 전역 변수 앞에 특정 수식어를 붙이면
각 스레드의 [스레드 전용 저장소]에 전역변수의 복사본이 저장된다.
→ 이 스레드 전용 저장소의 변수들은 해당 스레드에서 독점적으로 사용함이 보장되며,
복사본이므로, 하나의 스레드에서 값을 변경해도 다른 스레드에는 반영되지 않는다.
'Computer Science' 카테고리의 다른 글
[컴퓨터 밑바닥의 비밀 내용정리] 2.1 운영체제, 프로세스, 스레드의 근본 (0) | 2025.02.22 |
---|---|
[컴퓨터 밑바닥의 비밀 내용 정리] 1.7 링커의 재배치와 가상메모리 (0) | 2025.02.16 |
[컴퓨터 밑바닥의 비밀 내용 정리] 1.6 동적 라이브러리와 동적 링크 (0) | 2025.02.07 |
[컴퓨터 밑바닥의 비밀 내용정리] 1.5 정적 라이브러리와 정적 링크 (1) | 2025.02.07 |
[컴퓨터 밑바닥의 비밀 내용정리] 1.4 링커의 일하는 방식 (0) | 2025.02.07 |