POSIX Thread Anatomy
āļ āļēāļĒāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļąāđāļāļāļ°āļĢāļāļāļĢāļąāļāļāļēāļĢāļāļģāļāļēāļāđāļāļāļŦāļĨāļēāļĒāļāļēāļāļāļĢāđāļāļĄāļāļąāļ (multitasking support) āđāļāļĒāļāļąāļ§āđāļāļĢ-āđāļāļŠāđāļāļāļāļ°āļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāļāļēāļāļĒāđāļāļĒāđāđāļāđāđāļĢāļĩāļĒāļāļŠāđāļ§āļāļāļĩāđāļ§āđāļē āđāļāļĢāļ (thread) āļŦāļĢāļ·āļāļāļĩāļāļāļ·āđāļāļŦāļāļķāđāļāļ§āđāļē âlightweight processesâ āļāđāļāļāļĩāļāļāļāļāļēāļĢāđāļāđ thread āļāļ·āļāļāļ°āļŠāļēāļĄāļēāļĢāļāļāļģāđāļŦāđāļāļąāļāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļāļģāļāļēāļĢāļāļąāļāļāļēāļĢāļāļąāļāđāļŦāļāļļāļāļēāļĢāļāđāļāļĩāđāđāļāļīāļāļāļķāđāļāđāļāđāļ§āļĨāļēāļāļĩāđāđāļĄāđāđāļāđāļāļāļ (asynchronous events) āđāļāđāļāļĒāđāļēāļāļāļąāļāļāļĩāđāļĨāļ°āļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ āļāļāļāļāļēāļāļāļąāđāļāļŠāļēāļĄāļēāļĢāļāđāļāđāđāļāļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāđāļāļĨāļąāļāļĐāļāļ°āļāļāļēāļ (parallel computing) āļāļāđāļāļĢāļ·āđāļāļāļāļĩāđāļĄāļĩāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāđāļāļāļŦāļĨāļēāļĒāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨ (multi-core CPU) āļāļĩāđāđāļāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļĢāđāļ§āļĄāļāļąāļāđāļāđāļāļĩ (shared-memory multiprocessor)
āđāļāļĒāļāļąāđāļ§āđāļāđāļĨāđāļ§āđāļāļĢāđāļāļŠāļ āļēāļĒāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļ°āļāļĢāļ°āļāļāļāļāđāļ§āļĒāļŠāļāļēāļāļ°āļāļāļāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨ (āđāļāđāļāļāđāļēāļ āļēāļĒāđāļāļāļąāļ§āļĢāļĩāļāļīāļŠāđāļāļāļĢāđ AX,BX,DX
) āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāļāļēāļĢāļāļāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ (āļŠāļģāļŦāļĢāļąāļāđāļāđāļ code, globals, heap āđāļĨāļ° stack) āđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļāļāļąāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ (āđāļāđāļ āļāļēāļĢāđāļāļīāļāđāļāļĨāđ, āļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāđāļāļŠ) āļāļķāđāļāđāļāļĢāļāļāđāļāļ°āļāļĨāđāļēāļĒāļāļąāļ āđāļāđāļāļ°āļāđāļēāļāļāļąāļāļāļĢāļāļāļĩāđāđāļāļĢāđāļāļŠāđāļāđāļĨāļ°āļāļąāļ§āļāļ°āđāļĒāļāļāļēāļĢāđāļāđāļāļŠāļāļēāļāļ°āļāļąāļāļāļĒāđāļēāļāļāļąāļāđāļāļ āđāļāļāļāļ°āļāļĩāđāđāļāđāļĨāļ°āđāļāļĢāļāļāļ°āļĄāļĩāļāļēāļĢāđāļāđ code, globals āđāļĨāļ° heap āļĢāđāļ§āļĄāļāļąāļ
āļāļķāđāļāđāļāļĢāļāļāļ°āļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļāđāļāđāļāļĩāđāļāļāļĢāļāļĩāļāļĩāđāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāļąāđāļāļĄāļĩāļĄāļēāļāļāļ§āđāļēāļŦāļāļķāđāļāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨ āđāļāļĒāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļāđāļŠāļāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļĢāļāđāļāđāļĨāļ°āļāļąāļ§ (āđāļāđāđāļāđ main(), function1()
āđāļĨāļ° function2()
) āļāļķāđāļāļāđāļēāđāļāļĢāļ·āđāļāļāļĄāļĩāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāđāļāļĩāļĒāļāļāļąāļ§āđāļāļĩāļĒāļ§āļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļāđāļāļ°āļāļģāļāļēāļĄāļĨāļģāļāļąāļāļāļāļāļāļģāļŠāļąāđāļāđāļāđāļĨāļ°āļāļĢāļĢāļāļąāļ (program counter) āļāļķāđāļāļāļēāļāļāļ°āđāļāđāđāļ§āļĨāļēāļāļąāđāļāļŠāļīāđāļ 2 āļāļēāļāļĩ āđāļāđāļāđāļēāđāļāļĢāļ·āđāļāļāļĄāļĩāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļģāļāļ§āļ 3 āļāļąāļ§āļāļąāđāļāļŠāļēāļĄāļŠāđāļ§āļāļāđāļāļ°āđāļĒāļāļāļąāļāļāļģāļāļēāļāđāļāđāļāđāļĨāļ°āļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļķāđāļāļāļēāļāļāļ°āđāļāđāđāļ§āļĨāļēāļāļąāđāļāļŠāļīāđāļāđāļāļĩāļĒāļ 50 āļ§āļīāļāļēāļāļĩāđāļāđāļēāļāļąāđāļ


āļāļąāļ§āđāļāļĢāļāđāļāđāļĨāļ°āļāļąāļ§āļ āļēāļĒāđāļāđāļāļĢāđāļāļŠāļāļ°āđāļāđāļāļĢāļąāļāļĒāļēāļāļēāļĢāđāļāļĩāļĒāļ§āļāļąāļāđāļāļĢāđāļāļŠ āđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāđāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāļĢāļēāļāđāļŦāđāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāđ thread āđāļāđāļāļĒāđāļēāļāļāļīāļŠāļĢāļ° āđāļāļ·āđāļāļāļāļēāļāļāļ§āļāļĄāļąāļāđāļāļĩāļĒāļāđāļāđāļāļąāļāļĨāļāļāđāļāļēāļāļĢāļąāļāļĒāļēāļāļĢāđāļāđāļāļĩāļĒāļāđāļĨāđāļāļāđāļāļĒāđāļāđāļēāļāļąāđāļāđāļāļ·āđāļāđāļĒāļāđāļāđāļāđāļāđāļāļĢāđāļāļĢāļĄāđāļĨāđāļāļāļĩāļāļāļąāļ§āļāļąāļāđāļŠāļāļāđāļāļĢāļđāļāļāđāļēāļāļāļ
POSIX threads
āđāļĨāļāļĢāļēāļĢāļĩ POSIX thread āļāļ·āļāļ§āđāļēāđāļāđāļāļāļąāļ§āļĄāļēāļāļĢāļēāļāļēāļāļŦāļĨāļąāļāđāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāļāļŠāļģāļŦāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāļ āļēāļĐāļē C/C++ āļāļķāđāļāđāļāđāļāđāļĨāļāļĢāļēāļĢāļĩāļāļĩāđāļāļąāļāđāļāļĢāļĩāļĒāļĄāļāļąāļāļāđāļāļąāļāļāđāļēāļāđāđāļāļĩāđāļĒāļ§āļāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļĢāļāđāļĨāļ°āļāļ°āļāļģāļāļēāļāđāļāđāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļĄāļēāļāļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāļĩāđāļĄāļĩāļŦāļĨāļēāļĒāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļĨāļēāļ (multi-processor āļŦāļĢāļ·āļ multi-core systems) āđāļāļ·āđāļāļāļāļēāļāļĄāļĩāļāļąāļāļāđāļāļąāļāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāļēāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļĢāđāļāļŠāļāļāđāļāđāļĨāļ°āļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļĨāļēāļāļāļĩāđāļāļĒāļđāđāļ āļēāļĒāđāļāļĢāļ°āļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāļąāļ§āđāļāļĩāļĒāļ§āļāļąāļāđāļĨāļ°āđāļāļĢāļāļāļļāļāļāļąāļ§āļāļĩāđāļāļĒāļđāđāļ āļēāļĒāđāļāđāļāļĢāđāļāļŠāđāļāļĩāļĒāļ§āļāļąāļāļāļąāđāļāļāđāļāļ°āđāļāđāļāļ·āđāļāļāļĩāđāđāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļĩāļĒāļ§āļāļąāļ (address space) āļāļķāđāļāđāļāļāļāđāļēāļāļāļēāļāđāļāļāđāļāđāļĨāļĒāļĩāđāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļāļāļāļēāļ (Parallel programming) āđāļāđāļ MPI āđāļĨāļ° PVM āļāļĩāđāļāļđāļāđāļāđāđāļāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄāļāļēāļĢāļāļģāļāļ§āļāđāļāļāļāļĢāļ°āļāļēāļĒ (distributed computing) āđāļāļĒāļąāļāļĢāļ°āļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāļĢāļ·āđāļāļāļāļ·āđāļāđ āļāļĩāđāļāļĒāļđāđāđāļāļĨāļāļāļāđāļāļŦāļĢāļ·āļāļāđāļēāļāļŠāļāļēāļāļāļĩāđāļāļąāļ
āļāļāļ§āļāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļĢāļāļāļąāđāļāļāļ°āļāļĢāļ°āļāļāļāđāļāļāđāļ§āļĒ āļŠāļĢāđāļēāļāđāļāļĢāļ (thread creation), āļŠāļīāđāļāļŠāļļāļāļāļēāļĢāļāļģāļāļēāļ (termination), āļāļģāļāļēāļāļāļēāļĄāļāļąāļāļŦāļ§āļ° (thread synchronization āļāđāļ§āļĒāļ§āļīāļāļĩāļāļēāļĢāđāļāļ joins, blocking āđāļāđāļāļāđāļ), āļāļēāļĢāļāļąāļāļĨāļģāļāļąāļāļāļēāļĢāļāļģāļāļēāļ (scheduling), āļāļēāļĢāļāļąāļāļāļēāļĢāļāđāļāļĄāļđāļĨ (data management) āđāļĨāļ° āļāļēāļĢāļāļīāļāļāđāļāļāļąāļāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļ (process interaction)

āļāļ·āđāļāļāļĩāđāļāļĩāđāđāļāđāļāļēāļāļĢāđāļ§āļĄāļāļąāļāļāļāļāđāļāļĢāļāļāļąāđāļāļŦāļĄāļāļ āļēāļĒāđāļāđāļāļĢāđāļāļŠāļāļĢāļ°āļāļāļāđāļāļāđāļ§āļĒ
āļāļļāļāļāļģāļŠāļąāđāļāđāļāļĢāđāļāļŠ (Process instructions)
āļāđāļē files descriptors āļāļĩāđāļĄāļĩāļāļēāļĢāđāļāļīāļāđāļ§āđ
āļŠāļąāļāļāļēāļ (signals) āđāļĨāļ°āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ (signal handlers)
āđāļāđāļĢāļāļāļāļĢāļĩāđāļāļąāļāļāļļāļāļąāļ (current working directory)
āļŦāļĄāļēāļĒāđāļĨāļ User āđāļĨāļ° Group

āđāļāļĒāđāļāđāļĨāļ°āđāļāļĢāļāļāļ°āļĄāļĩ:
āļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāļ (Thread ID)
āļāļĨāļļāđāļĄāļāļąāļ§āđāļāļĢāļĢāļĩāļāļīāļŠāđāļāļāļĢāđ (set of registers) āđāļĨāļ° stack pointer
āļŠāđāļāđāļāļŠāļģāļŦāļĢāļąāļāđāļāđāļāļāđāļēāļāļąāļ§āđāļāļĢ (local variables)
signal mask
āļāđāļē priority
āļāđāļēāļŠāļāļēāļāļ°āļāļĩāđāļŠāđāļāļāļĨāļąāļ: errno
āđāļĨāļ°āđāļĄāļ·āđāļāļāđāļāļāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļāļĢāđāļāļĢāļĄāļāļ°āļāđāļāļāļĄāļĩāļāļēāļĢāļāđāļēāļāļāļīāļāđāļĨāļāļĢāļēāļĢāļĩ Posix threads āļāđāļ§āļĒ -lpthread
āļāļąāļāļāļąāļ§āļāļĒāđāļēāļ
$ gcc -o main main.c âlpthread
āđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļĢāļ°āļŦāļ§āđāļēāļ fork() āđāļĨāļ° pthread_create()
āđāļĄāļ·āđāļāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļĨāļ°āļāļąāļāļāļēāļĢāđāļāļĢāđāļāļŠāđāļĨāđāļ§ āļāļēāļĢāđāļāđ thread āļāļ°āļĄāļĩāļāļēāļĢāđāļāđāļāļĢāļąāļāļĒāļēāļāļĢāļāļāļāļĢāļ°āļāļāļāđāļāļĒāļāļ§āđāļēāļĄāļēāļ āđāļĨāļ°āđāļāļīāļ overhead āļāļąāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāļĩāđāļāđāļāļĒāļāļ§āđāļēāļāļĒāđāļēāļāđāļŦāđāļāđāļāđāļāļąāļ āļāļēāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļĨāđāļēāļāļāļ°āđāļŠāļāļāļĢāļ°āļĒāļ°āđāļ§āļĨāļēāļāļāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāđāļĨāļ° thread āļāđāļ§āļĒāļāļģāļāļ§āļ 50,000 āļāļąāļ§ āļ āļēāļĒāđāļāđāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄāđāļāļĩāļĒāļ§āļāļąāļ āđāļāļĒāļāļ°āļĄāļĩāļāļēāļĢāļāļąāļāļŦāļāđāļ§āļĒāđāļ§āļĨāļēāļāļąāđāļāļŠāļēāļĄāđāļāļāļāļ·āļ real time, user time āđāļĨāļ° system time
/*
* =========================================================================
* C Code for fork() creation test
* =========================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#define NFORKS 50000
void do_nothing() {
int i;
i = 0;
}
int main(int argc, char *argv[]) {
int pid, j, status;
for (j = 0; j < NFORKS; j++) {
/*** error handling ***/
if ((pid = fork()) < 0) {
printf("fork failed with error code= %d\n", pid);
exit(0);
}
/*** this is the child of the fork ***/
else if (pid == 0) {
do_nothing();
exit(0);
}
/*** this is the parent of the fork ***/
else {
waitpid(pid, status, 0);
}
}
}
/*
* =========================================================================
* C Code for pthread_create() test
* =========================================================================
*/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NTHREADS 50000
void* do_nothing(void *null) {
int i;
i = 0;
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
int rc, i, j, detachstate;
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for (j = 0; j < NTHREADS; j++) {
rc = pthread_create(&tid, &attr, do_nothing, NULL);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
/* Wait for the thread */
rc = pthread_join(tid, NULL);
if (rc) {
printf("ERROR; return code from pthread_join() is %d\n", rc);
exit(-1);
}
}
pthread_attr_destroy(&attr);
pthread_exit(NULL);
}

āļāļēāļĢāļēāļ 5-3 āđāļŠāļāļāļāļĨāļāļēāļĢāļāļāļŠāļāļāļāļāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļĢāļļāđāļāļāđāļēāļāđ
Ref: https://computing.llnl.gov/tutorials/pthreads/
Last updated
Was this helpful?