线程在linux中的实现 亦凉 2022-05-21 00:21 150阅读 0赞 ### 线程在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的参数及含义 <table> <thead> <tr> <th>标志</th> <th>含义</th> </tr> </thead> <tbody> <tr> <td>CLONE_FILES</td> <td>父子进程共享打开的文件</td> </tr> <tr> <td>CLONE_FS</td> <td>父子进程共享文件系统信息</td> </tr> <tr> <td>CLONE_IDLETASK</td> <td>将PID设置为0(只供idle进程使用)</td> </tr> <tr> <td>CLONE_NEWNS</td> <td>为子进程创建新的命名空间</td> </tr> <tr> <td>CLONE_PARENT</td> <td>指定子进程与父进程拥有同一个父进程</td> </tr> <tr> <td>CLONE_PTRACE</td> <td>继续调试子进程</td> </tr> <tr> <td>CLONE_SETTID</td> <td>将TID回写至用户空间</td> </tr> <tr> <td>CLONE_SETTLS</td> <td>为子进程创建新的TLS</td> </tr> <tr> <td>CLONE_SIGHAND</td> <td>父子进程共享信号处理函数及被阻断的信号</td> </tr> <tr> <td>CLONE_THREAD</td> <td>父子进程放入相同的线程组</td> </tr> <tr> <td>CLONE_VFORK</td> <td>调用vfork,所以父进程准备睡眠等待子进程将其唤醒</td> </tr> <tr> <td>CLONE_UNTRACED</td> <td>防止跟踪进程在子进程上强制执行CLONE_PTRACE</td> </tr> <tr> <td>CLONE_STOP</td> <td>以TASK_STOPPED状态开始进程</td> </tr> <tr> <td>CLONE_SETTLS</td> <td>为子进程创建新的TLS(thread-local storage)</td> </tr> <tr> <td>CLONE_CHILD_CLEARTID</td> <td>清除子进程的TID</td> </tr> <tr> <td>CLONE_CHILD_SETTID</td> <td>设置子进程的TID</td> </tr> <tr> <td>CLONE_PARENT_SETTID</td> <td>设置父进程的TID</td> </tr> <tr> <td>CLONE_VM</td> <td>父子进程共享地址空间</td> </tr> </tbody> </table> ##### 内核线程 ##### * 内核经常需要在后台执行一些操作,这些任务可以通过内核线程来完成 * 内核线程就是独立运行于内核空间的标准进程,与普通进程的区别在于内核线程没有独立的地址空间(实际上指向地址空间的mm指针被设置为NULL) * 内核线程从来不会切换到用户空间,内核线程可以被调度,可以被抢占。 * 比如flush和ksofirqd就是内核线程来做的
相关 如何在Java中实现多线程 在Java中实现多线程主要有两种方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: ```java class MyThread extends 逃离我推掉我的手/ 2024年09月16日 05:27/ 0 赞/ 3 阅读
相关 如何在Java中实现多线程 在Java中,可以通过以下几种方式来实现多线程: 1. 继承Thread类: ```java public class MyThread extends Thread { àì夳堔傛蜴生んèń/ 2024年09月12日 00:15/ 0 赞/ 21 阅读
相关 如何在Java中实现线程同步 在Java中,线程同步主要是通过synchronized关键字、wait/notify机制和并发工具类(如CountDownLatch、Semaphore等)来实现的。 1. ゝ一世哀愁。/ 2024年09月11日 04:33/ 0 赞/ 14 阅读
相关 多线程(7)如何在Java中实现线程 在Java中,实现线程有两种主要方式:继承Thread类或实现Runnable接口。以下是这两种方法的详细说明和比较。 刺骨的言语ヽ痛彻心扉/ 2024年04月24日 23:05/ 0 赞/ 47 阅读
相关 linux线程的实现 首先从OS设计原理上阐明三种线程:内核线程、轻量级进程、用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情。这在处理异步事件如异步IO时特别有用。内核 逃离我推掉我的手/ 2022年08月18日 03:16/ 0 赞/ 34 阅读
相关 在Linux中使用线程 我并不假定你会使用Linux的线程,所以在这里就简单的介绍一下。如果你之前有过多线程方面的编程经验,完全可以忽略本文的内容,因为它非常的初级。 首先说明一下,在Linu 迷南。/ 2022年08月04日 11:59/ 0 赞/ 140 阅读
相关 线程在linux中的实现 线程在linux中的实现 线程机制提供了在同一程序内共享内存地址空间运行的一组线程,这些线程还可以共享打开的文件和其他资源。 从linux内核的角度来说,并没 亦凉/ 2022年05月21日 00:21/ 0 赞/ 151 阅读
相关 Linux上线程的实现 0、Linux线程历史 在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。针对线程的这两大意义,分别开发出了内核级 ゞ 浴缸里的玫瑰/ 2021年09月07日 06:06/ 0 赞/ 225 阅读
还没有评论,来说两句吧...