线程在linux中的实现

线程在linux中的实现

  • 线程机制提供了在同一程序内共享内存地址空间运行的一组线程,这些线程还可以共享打开的文件和其他资源。
  • 从linux内核的角度来说,并没有线程这个概念,linux把所有的线程都当做进程来实现,内核并没有准备特别的调度算法或是定义特别的数据结构来表示线程,而是将线程仅仅视为一个与其他进程共享某些资源的进程,每个线程都拥有唯一隶属于自己的task_struct,所以在内核中,线程看起来更像是一个普通的进程。
创建线程
  • 线程的创建和普通进程的创建类似,只不过在调用clone的时候需要传递的参数不一样,这些参数标明哪些资源要共享。如下是创建fork,vfork,创建线程调用clone的差别:
//fork
clone(SIGCHLD, 0);

//vfork
clone(CLONE_CFORK | CLONE_VM | SIGCHLD);

//创建线程
clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLINE_SIGHAND, 0);
  • 下面是clone的参数及含义
标志 含义
CLONE_FILES 父子进程共享打开的文件
CLONE_FS 父子进程共享文件系统信息
CLONE_IDLETASK 将PID设置为0(只供idle进程使用)
CLONE_NEWNS 为子进程创建新的命名空间
CLONE_PARENT 指定子进程与父进程拥有同一个父进程
CLONE_PTRACE 继续调试子进程
CLONE_SETTID 将TID回写至用户空间
CLONE_SETTLS 为子进程创建新的TLS
CLONE_SIGHAND 父子进程共享信号处理函数及被阻断的信号
CLONE_THREAD 父子进程放入相同的线程组
CLONE_VFORK 调用vfork,所以父进程准备睡眠等待子进程将其唤醒
CLONE_UNTRACED 防止跟踪进程在子进程上强制执行CLONE_PTRACE
CLONE_STOP 以TASK_STOPPED状态开始进程
CLONE_SETTLS 为子进程创建新的TLS(thread-local storage)
CLONE_CHILD_CLEARTID 清除子进程的TID
CLONE_CHILD_SETTID 设置子进程的TID
CLONE_PARENT_SETTID 设置父进程的TID
CLONE_VM 父子进程共享地址空间
内核线程
  • 内核经常需要在后台执行一些操作,这些任务可以通过内核线程来完成
  • 内核线程就是独立运行于内核空间的标准进程,与普通进程的区别在于内核线程没有独立的地址空间(实际上指向地址空间的mm指针被设置为NULL)
  • 内核线程从来不会切换到用户空间,内核线程可以被调度,可以被抢占。
  • 比如flush和ksofirqd就是内核线程来做的

你可能感兴趣的:(Linux,内核)