c - 实现用户级线程库启动一个新线程[作业]

标签 c multithreading assembly userland

我看过这个:Implementing a User-Level Threads Package它不适用。

Thread_new(int func(void*)) 的执行过程中,分配一个线程 创建一个堆栈,我想不出办法设置程序计数器 (%eip) 如果我是正确的,那么当调度程序启动线程时,它从给定函数的 (func) 入口点开始。

虽然我见过很多纯 c(无汇编)实现,但我们得到了以下代码 (x86):

_thrstart:
    pushl  %edi
    call *%esi
    pushl %eax
    call Thread_exit

是否有特定原因将 %edi 压入堆栈?除了字节复制,我似乎找不到 esi/edi 的其他用途。

我意识到对 *%esi 的间接调用可能用于从新线程的上下文中调用该函数,但除此之外,我似乎不明白如何(或what) %esi 指向从 Thread_new 调用 _thrstart 时有效的函数地址

注意事项:

thread_exit是清理线程,用c实现。

这是家庭作业

最佳答案

一般来说;您可以将“调度程序”分解为 4 个部分。

第一部分是从一个线程切换到另一个线程的机制。这主要涉及将前一个线程的状态存储在某处并从某处加载下一个线程的状态。在这里,“某处”可以是某种线程控制 block ,也可以是线程的堆栈,或两者兼而有之,或其他。线程的状态可能包括通用寄存器的内容、栈顶(esp)、指令指针(eip)和其他任何内容(MMX/SSE/AVX 寄存器) ).但是,对于协作调度,线程的状态可能要少得多(例如,线程的大部分状态都被线程切换所破坏,并且使用协作调度以便线程本身知道其状态何时将被破坏并可以为此做好准备).

第二部分是决定什么时候进行线程切换,切换到哪个线程。对于不同的调度程序,这差异很大。

第三部分是启动一个线程。这主要涉及构建将在线程切换期间加载的数据。但是,可以以“惰性”方式执行此操作,即在首次创建线程时仅创建最少的状态,然后在获得 CPU 时间后完成线程状态的其余部分的创建。

第四部分是终止一个线程。这涉及销毁/释放将在线程切换期间加载的数据;但也可能意味着清理线程未能释放的任何资源(例如文件句柄、网络连接、线程本地存储等),这样您就不会以“资源泄漏”告终。

关于c - 实现用户级线程库启动一个新线程[作业],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26445912/

相关文章:

cgo 使用 c struct 数组并在 go 中赋值

c - C 中的 Boss Worker Pthreads Web 服务器 - 如果发送的请求多于线程数,服务器会崩溃

c - 具有两个 double 的结构的对齐方式为 4,即使 double 对齐为 8(32 位)

c - 为什么在头文件中使用 typedef 而不是只在 .c 中做所有事情

multithreading - 如何在Perl中控制多线程同步

汇编:如何定义格式转换(SHL、SHR)

c# - 如何中止线程

python - 使用线程获取文件中每个单词的计数

c++ - 为什么 icc 会为一个简单的 main 生成奇怪的程序集?

assembly - 为什么即使启用了 intel_syntax,十六进制 'h' 后缀在 GNU 汇编器中也不起作用?