我知道操作系统中有三种线程映射模型.

  1. 一对一
  2. 多对一
  3. 多对多

在这个问题中,我假设我们使用一对一 model.

比方说,现在我重新启动计算机,有10个内核级线程已经在运行.

过了一段时间,我决定运行一个python程序,该程序将启动一个具有四个线程的进程.其中三个线程必须运行一个执行系统调用的函数.

Here is a question, what is the correct scenario when I run the python program.

A)当一个python程序启动时,内核将立即在内核空间中启动另外4个线程(所以现在内核空间中有14个线程).当用户级的3个线程发起系统调用时,内核会将这些用户级线程映射到4个内核级线程中的3个,这也意味着我们将浪费1个内核级线程.

B)当一个python程序启动时,内核will not立即在内核空间中启动另外4个线程.相反,每当这3个用户级线程发起系统调用并准备与内核对话时,内核都会创建新的内核级线程.在这种情况下,内核将恰好创建3个线程,这也意味着我们不会浪费任何内核级线程.

C)与第二种情况非常相似,但在这种情况下,当这3个用户级线程准备运行系统调用并与内核交谈时,内核将做的是让已经创建的3个内核级线程停止执行它们当前的工作,然后让它们做Python程序要求内核做的工作.

这意味着调度程序将挑选3个随机的内核级线程来停止它们正在做的事情,然后将这些任务信息存储到某个地方.之后,调度器将要求这3个内核级线程首先完成python程序作业(job).在本例中,我们始终只有10个内核级线程.

任何回复和建议的学习material ,我们将不胜感激!

推荐答案

内核线程就像一个专门的任务,负责执行特定的操作(不会持续很长时间).它们不是等待来自用户端线程的传入请求的线程.此外,系统调用不会系统地创建内核线程(有关系统调用的更多信息,请参见this post,有关系统调用的一些上下文,请参阅this one):当需要后台任务时启动内核线程,例如处理IO请求(this post显示了一个很好的实际 case ,尽管描述有点深入).基本系统调用只是在相同的用户线程中运行,但具有更高的权限.注内核函数使用专用的内核堆栈:每个用户级线程在Linux上都有两个堆栈:一个用于用户域函数,另一个用于内核域函数(出于安全考虑).

因此,在实践中,我认为在通常情况下所有的答案都是错误的(即.假设目标操作不需要创建内核线程).如果完成的目标系统调用实际上需要创建内核线程,则b)是正确的答案.事实上,内核线程就像前面所说的一次性专门化任务.创建/销毁新的内核线程并不是很昂贵,因为它在内部基本上只是一个相对轻量级的task_struct数据 struct .

Linux相关问答推荐

Azure Linux B1s VM-Jenkins Sever已安装,但主页未打开

AWK:按第一列匹配两个文件不起作用

未找到 SDL_Vertex 和 SDL_RenderGeometry

为什么rsp寄存器从0x7FFFFFFFDFD0开始

Google Cloud Ops Agent Mongo 集成错误 - AuthenticationFailed:SCRAM 身份验证失败,storedKey 不匹配

如果 bash 中已经存在文件名,则创建新文件但添加数字

如何使用 __attribute__((visibility("default")))?

如何找出哪个进程正在消耗等待 CPU(即 I/O 阻塞)

Bash 变量:是否区分大小写?

如何在 Ubuntu 上安装 chkconfig?

从 Linux shell 将多个文件从一个目录复制到另一个目录

为什么 XGrabKey 会生成额外的聚焦和聚焦事件?

如何准确复制文件夹

Docker Volume 没有挂载任何文件

在 Emacs 中匹配括号的命令是什么?

使用 C++ 代码在 Linux 中清除终端

Linux下的签名可执行文件

在 bash 中将输出作为 cp 的参数传递

在 Linux 中的特定行向文件添加文本

Postgresql -bash:psql:找不到命令