用户线程与内核线程如何映射?

第一个问题:用户线程和内核线程之间的区别是什么?它只是一个由用户程序生成的,另一个由操作系统生成,后者可以访问特权指令?他们在概念上是一样的还是在线程本身有实际的差异?

解决方案

内核线程是由操作系统维护的线程对象。它是能够由处理器调度和执行的实际线程。通常,系统线程是具有权限设置,优先级等的重量级对象。内核线程调度程序负责调度内核线程。用户程序可以使他们自己的线程调度程序太。他们可以制作自己的“线程”,并模拟上下文切换以在它们之间切换。但是,这些线程不是内核线程。每个用户线程实际上不能独立运行,用户线程运行的唯一方法是如果内核线程实际上被告知要执行用户线程中包含的代码。也就是说,用户线程比内核线程有更大的优势。他们可以更轻量级,因为他们不一定需要有自己的优先级,可以通过单个进程(可能有更好的信息,有关什么线程需要运行),并且不创建大量的内核对象用于安全和锁定。

第二个问题,我的问题的真正的问题是:我使用的书说“关系必须存在于用户线程和内核线程之间,“接下来列出这种关系的不同模型。但该书未能清楚地解释为什么用户线程必须始终映射到特定的内核线程。为什么是这样?

用户线程必须与内核线程相关联的原因是,用户线程本身只是一堆数据用户程序。内核线程是系统中的真正线程,因此对于用户线程来说,用户程序必须让它的调度器采用用户线程,然后在内核线程上运行它。用户线程和内核线程之间的映射不必是一对一(1:1)映射;你可以有多个用户线程共享相同的内核线程(每次只运行其中一个用户线程),并且你可以有一个单独的用户线程在不同的内核线程(1:n)映射之间循环。

 

转载于:https://www.cnblogs.com/jjmcao/p/9314937.html

用户线程内核线程之间的同步通常通过以下机制实现: 1. 信号量:信号量是一种经典的同步机制,适用于多个用户线程之间或用户线程内核线程之间的同步。它提供了两个操作:P(proberen)操作和V(verhogen)操作,分别用于获取和释放信号量。当信号量的值为0时,P操作会阻塞当前线程,直到信号量的值大于0;而V操作会增加信号量的值,从而唤醒等待的线程。 2. 互斥锁:互斥锁是一种常用的同步机制,用于保护临界区的访问。在用户线程内核线程之间同步时,通常使用pthread_mutex_t类型的互斥锁。用户线程可以通过pthread_mutex_lock函数来获取锁,如果锁已经被其他线程持有,则当前线程会被阻塞;而内核线程可以通过内核提供的mutex_lock函数来获取锁,如果锁已经被其他线程持有,则内核会将线程挂起,直到锁被释放。 3. 条件变量:条件变量是一种在互斥锁的基础上实现线程同步的机制。用户线程可以通过pthread_cond_wait函数来等待条件变量的满足,该函数会自动释放锁并阻塞当前线程,直到条件满足;而内核线程可以通过内核提供的wait_event函数来等待条件变量的满足,该函数会将线程挂起并释放CPU,直到条件满足。 总的来说,用户线程内核线程之间的同步通常是通过信号量、互斥锁和条件变量等机制来实现的。不同的同步机制适用于不同的场景,应根据具体的应用需求来选择合适的机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值