门户网站建设专业,御花园网站建设公司,网站内容注意事项,网站建设常态化工作机制目录
线程的初步认识
为什么需要线程
怎么让代码分成多个执行流并发执行呢#xff1f;
管理线程 线程的初步认识 线程是进程内部的一个执行分支#xff0c;线程是CPU调度的基本单位。 在Linux操作系统中#xff0c;线程是程序执行流的最小单位。一个进程可以包含多个线…目录
线程的初步认识
为什么需要线程
怎么让代码分成多个执行流并发执行呢
管理线程 线程的初步认识 线程是进程内部的一个执行分支线程是CPU调度的基本单位。 在Linux操作系统中线程是程序执行流的最小单位。一个进程可以包含多个线程这些线程共享进程的资源如内存空间、文件描述符等但每个线程有自己的程序计数器、栈和栈指针。这使得多线程程序能够并行执行多个任务从而提高程序的效率和响应性。
为什么需要线程
在过去我们认为在一个进程中正文代码中的函数是串行调用的如下图所示我们认为
调用 A执行完成后返回。调用 B执行完成后返回。调用 C执行完成后返回。调用 D执行完成后返回。 如果任务中有耗时的操作如 I/O 操作、网络请求等串行调用会让整个程序的执行速度受到影响。 如下图如果我们把代码分成两个执行流调用即并行调用多个任务可以同时执行而不是一个接一个地执行可以大大减少总的执行时间。 怎么让代码分成多个执行流并发执行呢
我们需要知道创建一个子进程实际上也是创建了一个执行流父子进程相互独立各自执行自己的代码。在创建子进程时需要给子进程设置进程地址空间、创建页表等这些操作的开销比较大。也就是说如果创建多个进程来让代码分成多个执行流并发执行其开销是比较大的。 从另一个角度想同一个可执行程序创建多个进程分成多个执行流并发执行并没有必要让所有的执行流都私有一份地址空间和页表因为每个执行流看到的进程地址空间和页表内的数据都是一样的对同一份资源拷贝多次消耗了时间和空间。 我们只需要创建出多个 task_struct 让这些 task_struct 都指向同一个进程地址空间就可以省下这些开销。如下图所示 如果把代码区的代码分成三部分A进程执行第一部分B进程执行第二部分C进程执行第三部分这样就实现了代码分成多个执行流并发执行 现在需要修正一下其实A、B、C进程也就是线程。 所以线程是进程内部的一个执行分支也就是说我们之前认为的进程其实是内部只有一个线程的进程而今天理解的进程是内部至少有一个线程的进程 管理线程
有了线程就需要对线程进行管理操作系统要创建线程、标识线程、按照优先级调度线程、要对线程进行上下文保护、要释放线程、回收相关的资源对线程的管理方式其实和进程的管理方式是相似的而且线程和进程都是执行流在 Linux 的设计者认为没有必要为了管理线程单独设计数据结构和算法直接复用进程的相关代码即可 那么CPU在调度时不用管 task_struct 是进程还是线程只要调度就好了因为进程和线程都是执行流反过来CPU在调度时拿到的执行流可能是进程也可能是线程Linux中没有物理意义的线程所以在Linux中执行流也叫轻量级进程