内核对象和两种同步

这篇具有很好参考价值的文章主要介绍了内核对象和两种同步。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

Windows 中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进
行访问

它的所有者:内核对象的所有者是操作系统内核,而非进程,也就是说当进程退出,内核对象不一定会销毁

法即规则,假设进程A创建了内核对象1,那么它的使用计数便为1,因为初次创建内核对象,使用计数为 1,而如果有其他进程访问内核对象,引用计数便加1,只要引用计数不为0,内核对象1永远不会被销毁,即使进程A退出了,也只会导致引用计数减1,只要它不为0,它就不会被销毁

内核对象和其他对象的区别:主要看是否有安全属性这个参数,

使用方式

通过句柄进行操作,当使用相关创建函数,比如CreateEventW、CreateMutex都会返回一个句柄

表示了所创建的内核对象

知识扩展*:每个进程中都有一个句柄表,存放了所有句柄的handle值

调用规则

hThread = CreateThread(... , &threadId);

这行代码做了两件事

  1. 调用CreateThread创建了一个线程对象(内核对象)

  2. hThread = CreateThread这句代码本身也打开(引用)了这个线程对象,将其句柄存入hThread变量

调用 API CreateThread 的时候,不仅仅是创建了一个内核对象,引用计数+1,还打开了内核对象
+1,所以引用计数变为 2

调用 CloseHandle(hThread),即关闭hthread,然后就不能再通过hthread访问了,但是线程没有关闭,也就是说这个内核对象的引用计数仍为1,那么线程和这个对象之间通过什么联系呢?这个hthread已经关闭了,他们就是通过&threadId进行联系。

具体解释可以看我提的问题

线程同步之信号量

信号量(semaphore)就相当于停车场的门卫,线程好比要停的车

semaphore的组成

1.计数器 该内核对象被使用的次数

2.最大资源数,好比车位

3.当前资源数,好比没被占用的可停车的车位

法即规则,如果当前资源数大于0,那么信号量处于可触发状态,表示有可用资源

2.如果当前资源等于0,未触发状态,表示无可用资源,当前资源数不会小于0,也不会大于最大资源数

3.信号量允许多个线程共享同一份资源,而互斥量不允许,这是他们的区别,但是信号量允许的多个线程的数量是有限制的

CreateSemaphoreW (
    _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, /安全属性
    _In_ LONG lInitialCount, 
/初始化时,共有多少个资源是可以用的。
    _In_ LONG lMaximumCount, /能够处理的最大的资源数量 
    _In_opt_ LPCWSTR lpName /NULL 信号量的名称
);
WINAPI
ReleaseSemaphore (
    _In_ HANDLE hSemaphore, /信号量的句柄
    _In_ LONG lReleaseCount, /将lReleaseCount值加到信号量的当前资源计数上面 
    _Out_opt_ LPLONG lpPreviousCount /当前资源计数的原始值
);
关闭句柄
CloseHandle (
    _In_ _Post_ptr_invalid_ HANDLE hObject
);

线程同步之关键代码段

关键代码段也称临界区,通常指多线程中访问同一种资源的那部分代码,工作在用户方式下,在代码执行前,它必须独占对某些资源的访问权,关键代码段不是内核对象,属于用户对象

使用步骤

初始化关键代码段
调用 InitializeCriticalSection 函数初始化一个关键代码段。
InitializeCriticalSection(
    _Out_ LPCRITICAL_SECTION lpCriticalSection
);

 首先需要构造一个 CRITICAL_SCTION 结构体类型的对象,然后将该对象的地址传递给InitializeCriticalSection 函数。

进入关键代码段
VOID
WINAPI
EnterCriticalSection (
    _Inout_ LPCRITICAL_SECTION lpCriticalSection
);

 获得指定的临界区对象的所有权,该函数等待指定的临界区对象的所有权,如果该所有权赋予了调用线程,则该函数就返回;否则该函数会一直等待,从而导致线程等待,即阻塞在这里

退出关键代码段
VOID
WINAPI
LeaveCriticalSection (
    _Inout_ LPCRITICAL_SECTION lpCriticalSection
);

 释放指定的临界区对象的所有权。之后,其他想要获得该临界区对象所有权的线程就可以获得该所有权,和事件里的SetEvent差不多

WINBASEAPI
VOID
WINAPI
DeleteCriticalSection (
    _Inout_ LPCRITICAL_SECTION lpCriticalSection
);

关键代码段和事件对象的区别在于,执行完线程A可以继续执行线程A,而在事件对象里,执行完线程A后 就必须等待其他线程的SetEvent。内核对象的线程同步,比如互斥量、事件对象、信号量对象不会发生死锁 ,为什么呢?

利用内核对象线程同步的时候,速度较慢,关键代码段速度较快

内核对象可以跨进程,因为它是内核对象,而关键代码段只能作用本进程文章来源地址https://www.toymoban.com/news/detail-465616.html

到了这里,关于内核对象和两种同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux 服务器查看每个用户或者当前用户的磁盘占用量及文件同步

    [1]ubuntu查看每个用户或者当前用户的磁盘占用量及磁盘空间清理

    2024年03月26日
    浏览(49)
  • 《Linux 内核设计与实现》10. 内核同步方法

    原子操作:可以保证指令以原子的方式执行,即执行过程不被打断。 原子整数操作 整数的原子操作只针对 atomic_t 类型。因为: 让原子函数只接收 atomic_t 类型的操作数,可以确保原子操作只与这种特殊类型数据一起使用。同时这也保证了该类型的数据不会被传递给任何非原

    2024年02月04日
    浏览(37)
  • 如何修改JSON数组中的每个对象的userType属性值

    要修改JSON数组中的每个对象的`userType`属性值,您可以使用JavaScript的`map`函数或`forEach`循环。 以下是使用`map`函数的示例: ```javascript ``` 在上述示例中,我们使用`map`函数遍历原始数据数组,对于每个对象,我们检查是否存在`userType`属性,然后将其值修改为新值(在这里将其

    2024年02月10日
    浏览(52)
  • 深入理解Linux内核网络——内核与用户进程协作之同步阻塞方案(BIO)

    系列文章: 深入理解Linux网络——内核是如何接收到网络包的 深入理解Linux网络——内核与用户进程协作之同步阻塞方案(BIO) 深入理解Linux网络——内核与用户进程协作之多路复用方案(epoll) 深入理解Linux网络——内核是如何发送网络包的 深入理解Linux网络——本机网络

    2024年02月13日
    浏览(44)
  • 内核态、用户态概念

    MTU(Maximum Transmission Unit,最大传输单元)是指在网络中传输的数据包的最大长度限制,它是一个重要的网络参数,影响着网络的可靠性、稳定性和性能。在TCP/IP协议栈中,MTU涉及到内核态和用户态两个方面。 在内核态中,网络设备的MTU由网络驱动程序设置并保存在内核中。

    2024年02月16日
    浏览(31)
  • 虚拟化内核概念

    虚拟化与云计算 2022年9月13日 13:51 VMM X86系统是完全运行在裸机上的。X86提供四个特权等级,分别是ring 0-1,ring 0 的级别是最高的。 在Linux+X86中,操作系统需要直接访问内存和硬件所以需要运行在ring0上,而应用程序需要运行在ring3上,如果需要进行访问磁盘、读写文件的操作

    2024年02月04日
    浏览(42)
  • 【Linux内核解析-linux-5.14.10-内核源码注释】关于Linux同步机制知识点整理

    在Linux系统中,同步机制是操作系统中非常重要的一部分,以下是一些基本要点: 什么是同步机制?同步机制是一种操作系统提供的机制,用于协调多个进程或线程之间的访问共享资源,防止出现竞态条件和死锁等问题。 Linux中常用的同步机制有哪些?Linux中常用的同步机制

    2024年02月04日
    浏览(48)
  • Linux 内核概念和学习详解

        本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是Linux内核,能看懂Linux内核。 拥有超过1300万行的代码,Linux内核是世界上最大的开源项目之一,但是内核是什么,它用于什么?     内核是与计算机硬件接口的易替

    2024年02月16日
    浏览(46)
  • 两种方法帮你搞定Centos时间同步

    在 Linux 操作系统中,正确的时间同步是非常重要的,因为它对于很多应用程序都是必需的。本文将介绍两种在 Centos 系统中同步当前时间的方式。 ntpdate 命令是一种简单快捷的同步当前时间的方式,步骤如下: 打开终端输入以下三条命令: 通过以上命令,系统将会从 ntp3.a

    2024年02月12日
    浏览(45)
  • Linux内核的两种安全策略:基于inode的安全与基于文件路径的安全

    在Linux中,一切皆为文件,实现系统安全的策略主要可分为两种:基于 inode 的安全、基于文件路径的安全。 基于inode的安全 为文件引入安全属性,安全属性不属于文件内容,它是文件的元数据,应该与 inode 关联,一些内核安全模块将安全属性存储在文件的扩展属性中,这种

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包