学习路线-后端-操作系统-线程与并发

线程

线程是进程中的一条执行路径,当系统支持多线程处理时,线程时任务调度的单位,但不是系统资源的分配单位。线程完全继承父进程占有的资源,只是当它活动时有自己的运行现场。

与进程区别

序号 进程 线程
1 进程是重量级,资源密集型 轻量级,消耗更小的资源(与进程比)
2 进程切换需要与操作系统交互 线程切换不需要与操作系统交互
3 多进程,相同代码,但每个进程拥有自己的资源 所有的线程可共用资源
4 当一个进程阻塞,其他进程等待 当一个线程阻塞,后续线程可执行
5 多进程中不用线程会用更多的资源 多线程进程用更傻少的资源
6 多进程中,每个进程都是相互独立的 一个线程可以改变读,写,改变其它线程的数据

特点

  • 线程创建与管理的开销小得多,因为多线程可以共享父进程的所有程序和全局数据,这意味着创建一个新线程只涉及最小量的主存分配(线程表),也意味着一个进程创建的多个线程可以共享地址区域和数据。
  • 在进程内创建多线程,可以提高系统的并行处理能力。
  • 线程降低了上下文切换的时间
  • 多线程使得在进程中并发执行任务
  • 有效的通信
  • 线程的创建和切换上下文更加经济
  • 线程使得多处理器架构伸缩性更高、更有效

状态转换

线程是处理机调度的最小单位,而不是进程。一个进程可以创建一个线程,那么它具有单一的控制路径,一个进程也可以创建多个线程,那么它具有多个控制路径。
这时,线程是争夺CPU的单位
线程的过程:创建,运行,等待,就绪或终止

用户线程和内核线程

用户线程:在内核支持下,在用户层通过线程库实现的。线程库提供对线程创建、调度和管理等方面的支持。用户线程的创建和调度是在用户空间进行的,不需要内核干预,因此用户级线程通常能快速地创建和管理。
缺点:如果内核是单线程的,那么任何一个用户级线程执行了一个线程等待的系统调用,就会引起整个进程的阻塞。

内核线程:操作系统直接支持。管理由操作系统完成。内核在其空间内执行线程创建,调度和管理。内核线程的创建和管理比在用户级创建和管理用户线程要慢,但正是由于内核管理线程,当一个线程执行等待的系统调用时,内核能调度应用程序内的另一个线程去运行。

多线程

单进程(单线程与多线程)

学习路线-后端-操作系统-线程与并发_第1张图片

并发

并发与并行

  • 并发:指两个或多个事件在同一个时间段内发生。
  • 并行:指两个或多个事件在同一时刻发生(同时发生)。

学习路线-后端-操作系统-线程与并发_第2张图片

在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分 时交替运行的时间是非常短的。 而在多个 CPU 系统中,则这些可以并发执行的程序便可以分配到多个处理器上(CPU),实现多任务并行执行, 即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行。目前电脑市场上说的多核 CPU,便是多核处理器,核越多,并行处理的程序越多,能大大的提高电脑运行的效率。

注意:单核处理器的计算机肯定是不能并行的处理多个任务的,只能是多个任务在单个CPU上并发运行。同理,线程也是一样的,从宏观角度上理解线程是并行运行的,但是从微观角度上分析却是串行运行的,即一个线程一个线程的去运行,当系统只有一个CPU时,线程会以某种顺序执行多个线程,我们把这种情况称之为线程调度。

并发机制

在UNIX/Linux系统中,创建一个新进程的唯一方法就是调用系统调用fork。调用fork的为父进程,新创建的进程叫做子进程。格式:

pid = fork();

完成以下操作:

  1. 为新进程分配一个新的PCB结构;
  2. 为子进程赋一个唯一的进程标识号(PID);
  3. 做一个父进程上下文的逻辑副本。正文代码区无需拷贝,只需增加引用数即可。父子进程将执行相同的代码。但数据段和堆栈段属于进程的私有数据,需要拷贝到新的内存区中。
  4. 增加与该进程相关联的文件表和索引节点表的引用数。父进程打开的文件子进程可以继续使用。
  5. 对父进程返回子进程的进程号,对子进程返回零。

你可能感兴趣的:(后端学习路线,#,操作系统,内核,操作系统,多线程,并发编程)