线程
是通过进程代码执行的流程,具有自己的程序计数器,用于跟踪下一个要执行的指令,保存当前工作变量的系统寄存器以及包含执行历史的堆栈 .
每个线程只属于一个进程,进程外不能存在线程
多线程
是指在软件或硬件上实现多个线程并发执行的技术.
按对等性分类:
1.可结合线程:是可以被其他线程收回资源和杀死的。在被回收之前,他的存储器资源(栈等)是不释放的。
2.可分离线程:其资源不能被别的线程收回和杀死,只有等到线程结束才能由系统自动释放
线程类型:
1. 用户级线程:用户管理的线程
2. 内核级线程:操作系统管理的线程
用户级 : 内核级//1:1,N:1,1:N,N:M
用户级线程
在这种情况下,线程管理内核不知道线程的存在。线程库包含创建和销毁线程,在线程之间传递消息和数据,调度线程执行以及保存和恢复线程上下文的代码。应用程序以单个线程开始。
优点:
1. 线程切换不需要内核模式特权
2. 用户级线程可以在任何操作系统上运行。
3. 调度可以是用户级别线程中特定于应用程序的。
4. 用户级线程可以快速创建和管理。
缺点:
1. 在典型的操作系统中,大多数系统调用都是阻塞的
2. 多线程应用程序无法利用多处理
内核级线程
在这种情况下,线程管理由Kernel完成。应用程序区域中没有线程管理代码。内核线程直接由操作系统支持。任何应用程序都可以编程为多线程。应用程序中的所有线程都在单个进程中受支持。
内核维护整个流程和流程中的个人线程的上下文信息。内核调度是基于线程完成的。内核在内核空间中执行线程创建,调度和管理。内核线程创建和管理通常比用户线程要慢。
优点
1.内核可以同时在多个进程上安排来自同一进程的多个线程。
2.如果进程中的一个线程被阻塞,则内核可以调度同一进程的另一个线程。
3.内核例程本身可以是多线程的。
缺点
1.内核线程创建和管理通常比用户线程要慢。
2.在同一进程内将控制从一个线程转移到另一个线程需要模式切换到内核。
多线程模型
某些操作系统提供组合的用户级线程和内核级线程设施。Solaris是这种组合方法的一个很好的例子。在组合系统中,同一应用程序中的多个线程可以在多个处理器上并行运行,并且阻塞系统调用不需要阻止整个进程。多线程模型有三种类型
1. 多对多的关系。
2. 多对一的关系。
3. 一对一的关系。
用户级和内核级线程之间的区别
NO | 用户级线程 | 内核级线程 |
---|---|---|
1 | 用户级线程创建和管理速度更快。 | 内核级线程创建和管理速度较慢。 |
2 | 实现是由用户级别的线程库实现的。 | 操作系统支持创建内核线程。 |
3 | 用户级线程是通用的,可以在任何操作系统上运行。 | 内核级线程特定于操作系统。 |
4 | 多线程应用程序无法利用多处理。 | 内核例程本身可以是多线程的。 |
线程 与 进程区别
NO | 进程 | 线程 |
---|---|---|
1 | 过程是重量或资源密集型的 | 线程重量轻,占用资源少于进程。 |
2 | 流程切换需要与操作系统进行交互 | 线程切换不需要与操作系统交互。 |
3 | 在多个处理环境中,每个进程执行相同的代码,但拥有自己的内存和文件资源。 | 所有线程都可以共享相同的一组打开文件,子进程。 |
4 | 如果一个进程被阻塞,那么在第一个进程解除阻塞之前,不能执行其他进程。 | 当一个线程被阻塞并等待时,同一个任务中的第二个线程可以运行。 |
5 | 不使用线程的多进程使用更多的资源 | 多线程进程使用更少的资源。 |
6 | 在多个流程中,每个流程独立于其他流程运行 | 一个线程可以读取,写入或更改另一个线程的数据。 |
7 | 父子关系 | 对等关系 |
进程与线程:
1:1,1:N,N:1
线程安全
概念:
多线程操作总能得到相同的结果
线程不安全条件:
全局变量 有写操作
保证线程安全充分条件:
1.原子性
2.单行性
实现的方式:
锁
线程安全的情况:
没有写操作
可重入函数:
可以重复进入。这个函数不仅可以被中断,而且除了使用自己栈上的变量以外不依赖于任何环境(包括static)。
可以允许有多个函数的副本在运行,由于他们使用的是分离的栈,因此不会互相干扰。
线程同步:协调 , 一致
同步,又称直接制约关系,是指多个线程(或进程)为了合作完成任务,必须严格按照规定的 某种先后次序来运行
互斥,又称间接制约关系,是指系统中的某些共享资源,一次只允许一个线程访问。当一个线程正在访问该临界资源时,其它线程必须等待。