文章目录
真言:读时共享,写时复制,见机行execve
函数 | 描述 |
---|---|
fork | fork创造的子进程是父进程的完整副本,复制了父亲进程的资源,包括内存的内容task_struct内容 |
vfork | vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运行 |
pthread_create | pthread_create通常只是创建一个用户线程,对核心是不可见的,由线程库调度。内部调用clone() |
clone | Linux上创建线程一般使用的是pthread库 实际上linux也给我们提供了创建线程的系统调用,就是clone colne创建的是核心线程 |
线程分类
你真不会以为线程只有轻量级进程了吧?
优秀博客 :线程分类https://blog.csdn.net/gatieme/article/details/51481863
内核线程:始终运行在内核态
内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。
内核线程只运行在内核态,不受用户态上下文的拖累。
轻量级进程:
轻量级进程(LWP)是建立在内核之上并由内核支持的用户线程,它是内核线程的高度抽象,每一个轻量级进程都与一个特定的内核线程关联。内核线程只能由内核管理并像普通进程一样被调度。
用户线程:
用户线程是完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全又库函数在用户空间完成,不需要内核的帮助。因此这种线程是极其低消耗和高效的。
★★do_fork:读时共享★★
do_fork函数 负责处理**cone() fork() vfork()**系统调用
do_fork和辅助函数 copy_process()来创建进程描述符以及子进程执行所需要的的所有内核数据结构
clone():
该函数负责建立新的轻量级进程的堆栈,并且调用对编程者吟唱的 clone系统调用
clone可以让你有选择性的继承父进程的资源
这里的继承 是指新的PCB内部资源 引用旧的PCB内部的资源
clone()通过参数来实现各种资源的指定复制
因为clone 继承了指定pcb的各种资源 所以在读取task_struct的时候 会读取到相同的资源
fork(): 读时共享,写时复制,自主execve
include <unistd.h>
pid_t fork(void)