스레드란 무엇입니까? 경량 프로세스라고도 하며 프로그램 실행 흐름의 가장 작은 단위입니다.
표준 스레드는 스레드 ID, 현재 명령 포인터(PC), 레지스터 세트 및 스택으로 구성됩니다.
프로세스는 하나 이상의 스레드로 구성됩니다. 각 스레드는 프로그램의 메모리 공간(코드 세그먼트, 데이터 세그먼트 힙 등 포함)과 일부 프로세스 수준 리소스(예: 파일 열기 및 Signal)를 공유합니다. )
여러 스레드가 서로 간섭하지 않고 동시에 실행될 수 있으며 프로세스의 전역 변수와 힙 데이터를 공유할 수 있습니다.
#🎜 🎜# Thread의 접근 권한
Thread의 접근 권한은 매우 자유롭고 프로세스 메모리의 모든 데이터에 접근할 수 있습니다. #스레드 예약 및 우선순위
단일 프로세서는 여러 스레드에 해당합니다. 운영 체제에서는 이러한 여러 스레드가 차례로 실행되도록 허용하고 한 번에 하나만 실행합니다. a time 각 스레드가 동시에 실행되는 것처럼 "보이게" 하는 짧은 시간(보통 수십 초). 이러한 프로세서에서 스레드를 지속적으로 전환하는 작업을 "스레드 스케줄링"이라고 합니다.# 🎜🎜#스레드 일정의 세 가지 상태:
(
1#🎜 🎜#) : Running, 현재 스레드가 실행 중입니다.
(2): 준비됨 , 스레드는 즉시 실행될 수 있지만
은 이미 사용 중입니다.): 현재 스레드는 대기 중입니다. 프로그램이 실행 상태를 벗어날 때마다 스케줄링 시스템은 대기 상태의 스레드를 실행하기 위해 선택됩니다. 이벤트가 발생한 후 준비 상태로 들어갑니다.
#우선순위 예약의 경우 일반적으로 스레드 우선순위를 변경하는 세 가지 방법이 있습니다. # 🎜🎜#사용자 지정 우선순위 대기 상태로 들어가는 빈도에 따라 우선순위를 높이거나 낮춥니다. 오랜 시간 동안 실행할 수 없습니다. 우선순위 높이기;
Linux 멀티스레딩Linux에서는 다음 세 가지 방법을 사용하여 새 작업을 만들 수 있습니다.
(1 ) 포크 : 현재 프로세스 복사
(2) exec: 현재 실행 가능 이미지를 새로운 실행 가능 이미지로 덮어쓰기(3) clone: 자식 프로세스를 생성하고 지정 위치에서 실행 시작
pid_t pid;if(pid==fork()){… }# 🎜🎜#포크 호출 후 새 작업이 시작되고 이 작업과 함께 포크 함수에서 반환되지만 차이점은 이 작업의 포크는 새 작업의 pid를 반환하고 새 작업의 포크는 작업은 0을 반환합니다.
Fork는 원래 작업의 메모리 공간을 복사하지 않지만
기록 중 복사#를 공유하기 때문에 새 작업을 매우 빠르게 생성합니다. 🎜🎜# 원래 작업이 있는 메모리 공간
소위
기록 중 복사
#🎜🎜 #: 두 작업이 동시에 메모리를 자유롭게 읽을 수 있지만 어떤 작업이 메모리 수정을 시도할 경우 메모리 복사본이 수정 당사자에게 별도로 제공되어 메모리에 영향을 주지 않는다는 의미입니다. 다른 작업 사용 # 🎜🎜#fork는 이 작업의 이미지만 생성할 수 있으므로 반드시 다른 새 작업을 시작하려면 exec를 사용하세요. exec는 현재 실행 가능한 이미지를 새 실행 가능한 이미지로 바꿀 수 있으므로, 포크가 새 작업을 생성한 후 새 작업에서 exec를 호출하여 새 실행 파일을 실행할 수 있습니다. 헤더 파일은 모두 pthread.h
Creation A 스레드에 정의되어 있습니다. #include
int pthread_create (pthread_t *thread,const pthread_attr_t* attr,void *(*start_routine)(void*),void*arg)# 🎜🎜#thread 매개변수는 새 스레드의 식별자이며 후속 pthread_* 함수는 이를 사용하여 새 스레드를 참조합니다.
attr 매개변수는 새 스레드의 속성을 설정하는 데 사용됩니다. NULL을 전달하면
Start_routine 및 arg 매개변수는 각각 새 스레드가 실행할 함수와 매개변수를 지정합니다.
pthread_create는 0을 반환합니다. 성공하면 오류가 발생하고 실패하면 오류가 발생합니다.
스레드 종료: void pthread_exit(void *retval)
이 함수는 retval 매개변수를 통해 스레드의 재활용자에게 종료 정보를 전달합니다.
멀티 스레드 프로그램은 변화하는 환경에 있으며 액세스 가능한 전역 변수 및 힙 데이터는 언제든지 다른 스레드에 의해 변경될 수 있습니다.의미: 동기화 및 잠금
원자:
단일 명령 작업을 원자라고 합니다. 이 경우 단일 명령어의 실행은 중단되지 않습니다. 여러 스레드가 동시에 데이터를 읽고 쓰는 것으로 인해 발생하는 예측할 수 없는 결과를 방지하려면 동일한 데이터에 대한 각 스레드의 액세스를 동기화해야 합니다. 동기화는 한 스레드가 데이터가 끝나기 전에 데이터에 액세스하는 것을 의미합니다. 따라서 다른 스레드는 동일한 데이터에 액세스할 수 없습니다. 따라서 데이터에 대한 액세스는 원자적입니다.일반적인 동기화 방법: (세마포어, 뮤텍스, 임계 섹션, 읽기) -쓰기 잠금, 조건 변수)
잠금: 각 스레드는 데이터 또는 리소스에 액세스할 때 먼저 잠금을 획득하려고 시도하고 액세스가 완료된 후 잠금을 해제합니다.세마포: 스레드가 리소스에 액세스할 때 먼저 잠금을 획득합니다.
작업은 다음과 같습니다. (1)은 세마포 값을 1만큼 감소시킵니다. (2) 세마포 값이 0보다 작으면 대기 상태로 들어가고, 그렇지 않으면 실행을 계속합니다. ; 리소스에 액세스한 후 스레드는 세마포어를 해제합니다. (3) 세마포어 변경 값에 1을 추가합니다. (4) 세마포어의 값이 1보다 작으면 대기 중인 스레드를 깨웁니다.mutex
&&
세마포어동일함: 리소스는 동시에 하나의 스레드만 액세스하도록 허용합니다. 차이점: 세마포어는 전체 시스템의 모든 스레드에서 획득하고 해제할 수 있습니다. 예를 들어, 시스템의 한 스레드에서 동일한 세마포어를 획득한 다음 다른 스레드에서 해제할 수 있습니다.
그리고 뮤텍스에서는 스레드가 뮤텍스를 획득할 때 잠금 해제를 담당하는 스레드가 유효하지 않게 됩니다.Critical 섹션:
는 뮤텍스보다 더 엄격한 동기화 방법입니다. Critical 섹션 잠금 획득을 임계 섹션 진입이라고 하며 잠금 해제는 다음과 같습니다. 임계 구역을 떠나라고 했습니다.차이(세마포어 및 뮤텍스 포함)
뮤텍스 및 세마포어는 시스템의 모든 프로세스에서 볼 수 있습니다. 즉, 한 프로세스는 뮤텍스 또는 세마포어를 생성하고 다른 프로세스는 뮤텍스 또는 세마포어를 생성합니다. 프로세스가 잠금을 획득하려고 시도하는 경우 중요 섹션의 범위는 이 프로세스로 제한되며 다른 프로세스는 잠금을 획득할 수 없습니다.읽기-쓰기 잠금:
두 가지 방법: 공유 독점잠금이 해제된 상태일 때 어떤 방법으로든 잠금을 획득하려고 하면 성공하고 해당 상태로 잠금이 설정됩니다(위 그림 참조).
조건 변수:동기화 수단
조건 변수의 경우 스레드에는 두 가지 작업이 있습니다. (1) 먼저 스레드는 조건 변수를 기다릴 수 있고 조건 변수는 여러 스레드에서 기다릴 수 있습니다. ) 스레드는 조건 변수를 깨울 수 있습니다. 이때 이 조건 변수를 기다리고 있는 하나 또는 모든 스레드가 깨어나 지원을 계속합니다(즉, 조건 변수를 사용하면 많은 기존 스레드가 조건 변수를 기다릴 수 있습니다. 이벤트가 발생하면 모든 스레드 실행이 함께 재개될 수 있습니다.
관련 기사:프로세스란 무엇인가요?
자바 학습에서의 멀티스레딩 구현 방식을 바탕으로
위 내용은 Java 학습: 스레드란 무엇입니까? 가장 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!