🎊 线程的概念以及为什么要引入线程

线程的概念以及为什么要引入线程

线程的概念以及为什么要引入线程

文章目录

线程的概念以及为什么要引入线程1.线程2.为什么要引入线程3.线程的状态4.线程的堆栈5.线程的创建6.线程的退出7.等待线程的退出8.线程放弃CPU的使用9.用户级线程和内核级线程

1.线程

线程是轻量级的进程,在一个进程内部可以存在一个或多个线程,进程与进程之间是不能共享内存的,进程之间的消息通信不方便,但是一个进程内部的线程之间是共享这个进程的内存空间的,线程之间通信很方便。

2.为什么要引入线程

如以上讲的,线程之间共享内存。比如,一个文字输入软件,其内部可以有三个线程,一个用来响应鼠标、键盘的交互线程,一个用来运算,另一个用来备份。因为进程之间不共享内存,所以不能用多个进程来实现这时就用多线程可以解决。线程之间共享内存,所以从一个线程切换到另一个线程不需要陷入内核,也不需要切换上下文,线程之间的切换比进程切换快捷。

3.线程的状态

线程和传统的进程一样,存在就绪、运行、阻塞、终止状态。

4.线程的堆栈

线程共用进程的内存空间,但是拥有自己的堆栈,在线程堆栈中有一帧,这个栈帧用来存储局部变量和返回地址,用来供线程之间的相互调用时使用。

5.线程的创建

线程可以调用库函数thread_create来创建一个新的线程,新线程和该线程共享内存空间,有自己独立的堆栈,线程之间不存在层次关系(父子关系),所有线程都是平等的,新线程会返回给调用的线程一个线程ID。

6.线程的退出

调用系统函数thread_exit使线程退出,调用之后线程消失,无法再调度。

7.等待线程的退出

可以调用系统函数thread_join函数等待指定线程退出之后,再运行。

8.线程放弃CPU的使用

线程和进程不一样,线程没有时间片的强制机制使一个线程放弃CPU的使用,让给另一个线程,要灵活使用系统函数thread_yield来使线程放弃对CPU的使用,从而让给另外的线程。

9.用户级线程和内核级线程

与进程相似,线程也有管理线程的线程表,线程分为用户线程和内核线程,用户线程的线程表保存在进程的存储空间里,内核线程的线程表保存在内核中。对于用户级线程来说,实现线程之间的切换不需要陷入内核,可以直接切换,但是用户级线程存在一些问题,比如只有当前运行的线程主动放弃CPU才能切换到另一个线程,没有时间片等强制措施,而内核线程的线程表存储在内核中,线程切换需要内核来管理,所以可以强制切换。另外内核线程的有一个问题,对于线程的创建和销毁,如果每次创建都要在内核中创建线程表,销毁时重置内存表,这样的代价太大。主要的做法就是,当某个线程销毁时将其标志为不可运行,但是,内核数据结构没有改变,需要创建新线程时直接重启某个旧的线程,这样的方法称为线程回收。用户级线程也可以使用线程回收,但是没有必要,因为其线程的创建和销毁不涉及内核。

🎁 相关推荐

下载地址
🎯 best365体育邮箱地址

下载地址

📅 06-29 👀 6344
Extreme pulling(“极限拉扯”)#搞笑视频 #内容过于真实 #万万没想到 #名场面 #
DMA,DMA是什么,DMA设备,什么是DMA,DMA问题
🎯 365bet体育在线导航

DMA,DMA是什么,DMA设备,什么是DMA,DMA问题

📅 06-30 👀 1094