线程

内核态线程

  1. new_process = clone(CLONE_VM | /*共享内存 */
  2. CLONE_FS | /*共享文件系统信息 */
  3. CLONE_FILES | /*共享打开的文件 */
  4. CLONE_SIGHAND, /*共享信号处理 */
  5. 0);

线程共享了代码段、数据段、打开的文件,但是没一个线程还存在一些独自己的资源,例如栈、寄存器。这样的线程我们称之为 「内核线程」。

优点 当存在多个处理机是,一个进程的多个线程可以同时执行内核,可以看到更多的系统信息,提高系统的原型效率
缺点 内核线程在用户态执行,而它的调度和管理在内核实现,内核线程的切换速度慢,数据占用空间

用户态线程(协程)

把本来属于内核的资源,在用户态空间实现,并且调度也在用户空间来执行,这样的线程就是用户态线程。

优点 用户态线程不需要内核直接参与,控制简单,更加轻量、创建开销小
缺点 一个用户态的线程阻塞将会引起整个进程的阻塞,用户态线程不能利用系统的多核处理

内核态线程、用户态线程区别

内核态线程 N 个线程 内核会创建 N 个 task_struct(任务结构)
用户态线程 N 个线程 内核只会有 1 个 task_struct(任务结构)

两类协程

stackfull co-routine 协程之间的切换使用栈来保存信息,速度慢、实现简单
stackless co-routine 协程的切换不需要栈来保存信息,速度快、实现负责