스레드는 컴퓨터의 동작 수준에서 이해된다

4888 단어 Thread
다중 스레드 디자인 모델 만들기 및 학습의 글.

실행 프로그램이란?


사고 라인이 자연스럽다는 것을 이해하기 위해서는 먼저 실행 절차를 이해해야 한다.
여기서 익숙한 다음 절차를 생각해 내야 한다.

#include <stdio.h>

int sum(int x,int y){
    return x+y;
}

int main(){
    int x = sum(5,6);
    printf("Hello Single Thread World");
}
여기에 C#가 C를 가져온 것이 아니라 C# 실행 프로그램의 부분이 추상화되어 처리 시스템에 의존하지 않는 형태로 변했기 때문에 이번 내용을 이해하는 것이 좀 부적절하다고 생각합니다. 양해해 주십시오.c#도 최종적으로 어셈블리 언어와 동등한 이진법으로 실행되기 때문에 문제없다.
자세히 알고 싶은 사람은 "c# IL"또는 "c# 중간 언어"같은 검색어를 사용할 수 있습니다.(c#과 Visual Basic이 도서관을 공유할 수 있는 것은 이것 덕분이에요. 아주 편리하군요.
다시 분리해서 이 C의 코드를 구성 요소로 컴파일해 보십시오.총체적으로 gcc를 사용하면 나올 수 있다.
어셈블리란 처리 시스템이 전자 회로 수준에서만 처리하는 명령에 의해 만들어진 프로그래밍 언어(하지만 처리는 의존), x86-64로 검색하면 이것저것 나온다.(이번에 우리가 고려한 것은 intel 기법에 기재된 조립 부품이다. 조립 부품의 본질은 기계 지령과 일대일로 대응하는 것이기 때문에 각양각색의 기법이 있다!)
저것
쿵!

sum:
  push rbp
  mov rbp, rsp
  mov DWORD PTR [rbp-4], edi
  mov DWORD PTR [rbp-8], esi
  mov edx, DWORD PTR [rbp-4]
  mov eax, DWORD PTR [rbp-8]
  add eax, edx
  pop rbp
  ret
.LC0:
  .string "Hello Single Thread World"
main:
  push rbp
  mov rbp, rsp
  sub rsp, 16
  mov esi, 6
  mov edi, 5
  call sum
  mov DWORD PTR [rbp-4], eax
  mov edi, OFFSET FLAT:.LC0
  mov eax, 0
  call printf
  mov eax, 0
  leave
  ret
이것은 읽을 수 없습니다.익숙하지 않으면.
하지만 괜찮아요. 이번 보도의 목적은 이걸 이해할 필요가 전혀 없어요.
중요한 것은 call, jmp 등 gooto 명령과 tag에 프로그램의 동작을 기술한 것이다.
처리 시스템은main 탭의 시작부터 실행되며, 상기 점프 명령을 통해 다른 탭 (메모리 번호에 대응하는) 으로 이동하여 실행됩니다.
즉, 처리 시스템의 실행 경로는 라벨에서 라벨을 연결하는 정방향 곡선으로 나타난다!
그래서 이런 것을 단식홍(선, 선의 영역)이라고 부른다.

오랫동안 기대했던 다중 라인에 대해서.


여기서부터 다선정으로 들어간다.
단식홍의 상황을 알게 된 사람은 다선정의 모습을 다소 상상할 수 있을 것이다.
여기서 구체적인 소스 코드를 보여드리면 컴파일링이 복잡해지기 때문에 개념적으로 설명해 드릴게요.
이미지는 이거예요.

이것은 다중 루틴입니다. 어떤 실행 경로에서 clone or fork 를 진행하면 알 수 있습니다.
그럼 clonefork가 무엇인지에 대한 이야기는 os의 API입니다!
즉, 낮은 수준에서 프로그램의 실행 순서를 보면 (더 자세히 보면 욕이 너무 작아질 수 있다.)
1. 프로그램은 처리 시스템의 구조에 의존하는 2진법으로 전환된다.(컴파일, 링크)
2. os에서 분배된 메모리 공간에 2진법을 불러옵니다.(로더)
3.main 함수(또는 다른 입구 함수)의 시작 메모리 번호를push에서os로 분배된 메모리 공간의 창고에 저장합니다.
4.os에서 분배된 CPU 스레드(이것은 물리 회로의 기능 단위를 의미한다. 당신은 3핵 4스레드라고 들어본 적이 있습니까?)메모리 공간의 창고 팝에서 온 메모리 레이아웃부터 실행합니다.
이런 행동
fork 명령과 clone 명령(os 의존이기 때문에 이름이 다를 수 있음)은 거칠게 말하면 명령은 이 실행 단계의 3번부터 매개 변수로 지정한 함수의 순서에 대한 명령1이다.자세한 내용은 "시스템 호출을 통한 직접 Linux 스레드"을 참조하십시오.
즉, 라인은 처리 시스템의 동작 등급에서 나온 개념으로 집행하는 단위이다!
인상을 잡고 엄밀한 정의를 내릴 수 있다면 (일반인이 받아들이는 것은 아니지만)

이른바 단서


입구점과 메모리에 자신의 전용 창고 구역이 있다.
그 입구점부터 실행하는 집행 단위를 제공한다.

주 루틴(주 프로세스)은


os가 설정한 실행 입구점에서 시작하는 라인입니다.
메모리 공간은 os에서 분배되어 실행됩니다.

서브스레드


주 라인에서 어떤 함수로 생성된 라인을 지정합니다.
주 스레드와 메모리 공간을 공유하여 실행합니다.

하위 프로세스란


주 라인에서 어떤 함수로 생성된 라인을 지정합니다.
os에서 주 라인과 공통된 부분이 없는 메모리 공간을 제공하여 실행합니다.
공유된 메모리 영역을 통해 다른 루트나 프로세스와 교환합니다.

이상!


다음 글


무엇이 단서 안전입니까
대체적으로 이렇다. 그러나 실제적으로 파라미터가 더 많고 많은 일을 할 수 있다. 위의 절차는 고기능의os가 존재하는 상황에서 라인이다. 더욱 빈약한 환경에서wait를 사용하여 라인을 전환하면서 실행하는 다중 라인의 실현 방법도 있다.

좋은 웹페이지 즐겨찾기