线程
大多编程语言都支持线程机制,该机制允许在同一进程的共享内存地址空间运行一组特殊的进程,即线程。
这些线程共享:同一段地址空间,可执行指令,静态数据,进程打开的文件描述符、信号的处理器、当前工作目录和进程用户ID与进程组ID等。
线程私有:线程ID,PC9程序计数器)和相关寄存器,堆栈,错误号,优先级,执行状态和属性
线程并不是越多越好,当线程数多于系统核数。系统要实现多线程需要在线程之间来回切换(上下文切换),在切换时操作系统要保存切换时各种状态,需要消耗一定的资源;并且每个线程都要自己独立的堆栈空间。
进程与线程的区别
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;(通俗的理解进程就是每个开启的可执行程序)
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
- 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信
号等),某进程内的线程在其他进程不可见; - 调度和切换:线程上下文切换比进程上下文切换要快得多
- 地址空间:进程有自己独立的地址空间,线程共享进程的地址空间
进程之间通信(同一个电脑上:管道,文件,消息队列,共享内存),(不同电脑:socket通信技术)。
线程在linux和window中区别
1.linux
linux内核没有专门创建线程的机制,其实linux中没有线程的概念,它把线程当作进程的一个子集来管理。linux没有为线程提供额外的调度算法、描述和存储线程的数据结构。用task_struct结构体记录和描述线程与进程。因此线程就是一个能和其他进程共享资源的进程。linux进程本身就是轻量级的。
从C语言代码层次来看,linux系统为n个线程创建4个task_struct结构体,然后在里面定义共享资源。
通过调用内核中fork()函数和exec()函数来创建线程并且调用clone()函数传递一个参数用于描述共享资源。
2.window
window系统提供了专门用于创建线程的机制,线程被称为“轻量级进程”,因为线程耗费的资源少,能够较快的创建和运行。
从C语言代码层次来看,window操作系统会有一个进程描述符其包含指向n个不同线程的指针,负责描述地址空间,打开文件等共享资源,而线程本身再去描述自己独占的资源