线程
内核态线程
new_process = clone(CLONE_VM | /*共享内存 */
CLONE_FS | /*共享文件系统信息 */
CLONE_FILES | /*共享打开的文件 */
CLONE_SIGHAND, /*共享信号处理 */
0);
线程共享了代码段、数据段、打开的文件,但是没一个线程还存在一些独自己的资源,例如栈、寄存器。这样的线程我们称之为 「内核线程」。
优点 |
当存在多个处理机是,一个进程的多个线程可以同时执行内核,可以看到更多的系统信息,提高系统的原型效率 |
缺点 |
内核线程在用户态执行,而它的调度和管理在内核实现,内核线程的切换速度慢,数据占用空间 |
用户态线程(协程)
把本来属于内核的资源,在用户态空间实现,并且调度也在用户空间来执行,这样的线程就是用户态线程。
优点 |
用户态线程不需要内核直接参与,控制简单,更加轻量、创建开销小 |
缺点 |
一个用户态的线程阻塞将会引起整个进程的阻塞,用户态线程不能利用系统的多核处理 |
内核态线程、用户态线程区别
内核态线程 |
N 个线程 |
内核会创建 N 个 task_struct(任务结构) |
用户态线程 |
N 个线程 |
内核只会有 1 个 task_struct(任务结构) |
两类协程
stackfull co-routine |
协程之间的切换使用栈来保存信息,速度慢、实现简单 |
stackless co-routine |
协程的切换不需要栈来保存信息,速度快、实现负责 |