当前位置: 首页 > news >正文

线上购物网站开发新闻报道策划案模板范文

线上购物网站开发,新闻报道策划案模板范文,东莞网站制作购买,响应式网站跟自适应网站的区别目录 一、问题综述 1. 进程和线程的区别#xff1f; 2. 进程的状态有哪些#xff1f; 3. 进程之间的通信方式? #xff08;1#xff09;管道 #xff08;2#xff09;消息队列 #xff08;3#xff09;共享内存 #xff08;4#xff09;信号量 #xff08…目录 一、问题综述 1. 进程和线程的区别 2. 进程的状态有哪些 3. 进程之间的通信方式? 1管道 2消息队列 3共享内存 4信号量 5信号 6Socket 4. 解释一下进程同步和互斥以及解决这些问题的方法 1互斥的概念 2同步的概念 3锁 4信号量 5使用信号量和 PV 操作 5. 你知道的线程同步的方式有哪些 1互斥锁 2读写锁 读写锁的工作原理 3条件变量 4信号量 二、相关问题 1. 介绍一下你知道的锁 1互斥锁 2自旋锁 3读写锁 4悲观锁 5乐观锁 2. 什么是死锁如何避免死锁 1互斥条件 2持有并等待条件 3不可剥夺条件 4环路等待条件 ​​​​​​​5方法 一、问题综述 1. 进程和线程的区别 进程是 系统进行 资源分配 和 调度 的基本单位。         线程 Thread 是 操作系统能够 进行运算调度的 最小单位线程是 进程的 子任务是进程内的 执行单元。         一个进程 至少有一个线程一个 进程可以 运行多个线程这些线程 共享同一块 内存。 资源开销 进程由于 每个进程都有 独立的 内存空间创建 和 销毁 进程的 开销较大。进程间 切换 需要 保存 和 恢复 整个进程的 状态因此 上下文切换 的 开销较高。线程线程 共享相同的 内存空间创建 和 销毁线程的 开销较小。线程间 切换 只需要 保存 和 恢复少量 的线程上下文因此 上下文切换的 开销较小。 通信与同步 进程由于 进程间 相互隔离进程之间的 通信需要 使用一些 特殊机制如 管道、消息队列、共享内存 等。线程由于 线程共享相同的 内存空间它们之间 可以 直接访问 共享数据线程间通信 更加方便。 安全性 进程由于 进程间 相互隔离一个进程的 崩溃不会 直接影响 其他进程的 稳定性。线程由于 线程共享相同的 内存空间一个线程的 错误可能会 影响整个进程的 稳定性。 2. 进程的状态有哪些 进程有着「运行-暂停-运行」的活动规律。一般说来一个进程 并不是 自始至终 连续不停地运行的它与 并发执行 中的 其他 进程的 执行是 相互制约 的。它 有时 处于 运行状态有时又 由于 某种 原因而 暂停运行 处于 等待状态当使它 暂停的 原因消失后它又进入 准备 运行状态 下述为 五个基本状态 运行状态Running该时刻 进程占用 CPU就绪状态Ready可运行由于 其他进程 处于运行状态 而暂时停止运行阻塞状态Blocked该 进程 正在等待某一事件发生如 等待输入/输出操作 的完成而 暂时 停止运行这时即使给它 CPU 控制权它也无法运行创建状态new进程 正在被创建时的 状态结束状态Exit讲程 正在从系统中 消失时的 状态 再来 详细说明一下进程的 状态变迁 NULL - 创建状态一个新进程被 创建时的 第一个状态创建状态 - 就绪状态当 进程 被创建完成 并初始化后一切 就绪准备运行 时变为 就绪状态这个 过程是 很快的就绪态 - 运行状态处于 就绪状态的 进程被操 作系统的 进程调度器 选中后就分配给 CPU 正式运行 该进程运行状态 -结束状态当进程 已经运行 完成 或 出错时会被 操作系统 作结束 状态处理运行状态 - 就绪状态处于 运行状态的 进程在 运行过程 中由于 分配给 它的 运行 时间片用完操作系统 会把 该进程变为 就绪态接着 从就绪态 选中另外一个 进程运行运行状态 - 阻塞状态当 进程请求 某个事件且 必须等待时例如 请求 I/O 事件阻塞状态 - 就绪状态当 进程要等待的 事件完成 时它从 阻塞状态 变到 就绪状态 如果 有大量 处于 阻塞状态的 进程进程 可能会 占用着 物理 内存空间显然 不是我们 所希望的毕竟 物理 内存空间是 有限的被 阻塞状态的 进程 占用着 物理内存 就一种 浪费 物理 内存的行为。所以在 虚拟内存 管理的 操作系统 中通常会 把阻塞状态的 进程 的 物理内存 空间 换出到 硬盘等 需要再次 运行的时候再从 硬盘 换入到 物理内存。 那么就需要 一个 新的状态来 描述进程 没有 占用实际的 物理 内存空间的 情况这个状态就是 挂起状态。这跟 阻塞状态是不一样阻塞状态 是等待 某个事件的 返回。 挂起状态 可以分为 两种 阻塞挂起状态进程 在外存硬盘并 等待某个事件的 出现就绪挂起状态进程 在外存硬盘但只要 进入内存即刻 立刻运行 这 两种挂起状态加上 前面的 五种状态就变成了 七种状态变迁见如下图 3. 进程之间的通信方式? 每个进程的 用户地址空间 都是 独立的一般 而言是 不能互相访问的但内核空间 是 每个进程都 共享的所以 进程之间要 通信必须通过内核。 1管道 所谓的 管道就是 内核 里面的 一串缓存。从 管道的 一段 写入的数据实际上 是 缓存在 内核中的另一端 读取也就是从内核中读取这段数据。另外管道传输的数据是无格式的流且大小受限。 这 两个 描述符都是 在一个 进程里面并 没有起到 进程间 通信的 作用怎么样 才能 使得 管道是 跨过 两个进程的 呢 我们可以 使用 fork 创建 子进程创建的 子进程 会复制 父进程的 文件描述符这样 就 做到了 两个进程各 有两个「fd[0] 与 fd[1]」两个进程 就可以 通过 各自的 fd 写入 和 读取 同一个管道文件 实现 跨进程 通信了。 管道 只能 一端写入另一端读出所以上面 这种模式容易 造成混乱因为 父进程 和 子进程 都可以同时写入也都可以读出。为了避 免 这种情况通常的做法是 父进程 关闭读取 的 fd[0]只保留 写入 的 fd[1]子进程 关闭写入 的 fd[1]只保留 读取 的 fd[0] 所以说 如果 需要 双向通信则应该 创建 两个管道。 2消息队列 管道的 通信方式 是 效率低的因此 管道 不适合进程间频繁地交换数据。对于这个问题消息队列 的 通信模式就 可以解决。 比如A 进程要 给 B 进程 发送消息A 进程 把数据放在对应的 消息队列 后就可以 正常 返回了B 进程 需要的 时候再 去读取数据 就可以了。同理B 进程 要给 A 进程 发送消息 也是如此。 再来消息队列 是 保存在 内核中的 消息链表在发送数据时会分成 一个一个 独立的 数据单元也就是 消息体数据块消息体是 用户 自定义的 数据类型消息的 发送方 和 接收方 要约定好 消息体的 数据类型所以 每个消息体都 是 固定大小的 存储块不像 管道是 无格式的 字节流 数据。 如果 进程 从 消息队列 中读取了 消息体内核就会 把这个 消息体 删除。消息队列 生命周期 随内核如果 没有释放 消息队列 或者 没有关闭 操作系统消息队列 会一直存在。 消息 这种模型两个进程之间的 通信 就像 平时发邮件 一样你来一封我回一封可以 频繁沟通了。但 邮件的 通信方式 存在 不足 的地方有 两点一是 通信 不及时二是 附件也有 大小限制这同样也是 消息队列 通信不足的 点。 消息队列 不适合 比较大 数据的 传输因为 在内核中 每个消息体 都有一个 最大长度的 限制同时 所有队列 所包含的 全部消息体 的总长度 也是有 上限。 在 Linux 内核中会有 两个宏定义 MSGMAX 和 MSGMNB它们以 字节 为单位分别 定义了 一条消息的 最大长度 和 一个队列的 最大长度。消息队列 通信 过程中存在 用户态 与 内核态 之间的 数据拷贝 开销因为 进程 写入数据到 内核中 的消息队列 时会发生 从用户态 拷贝 数据到 内核态的 过程同理 另一进程 读取 内核中的 消息数据时会 发生从 内核态拷贝数据 到 用户态的过程。​​​​​​​ 3共享内存 消息队列的读取和写入的过程都会有 发生 用户态 与 内核态 之间的 消息拷贝 过程。那 共享内存的方式就很好的解决了这一问题。 现代操作系统对于 内存管理采用的是 虚拟内存技术也就是 每个进程 都有 自己 独立的 虚拟内存空间不同进程的 虚拟内存 映射到 不同的 物理内存 中。所以即使 进程 A 和 进程 B 的虚拟地址 是一样的其实 访问的是 不同的 物理内存地址对于 数据的 增删查改 互不影响。 共享内存的 机制就是拿出一块 虚拟地址 空间 来映射到 相同的 物理内存 中。这样 这个 进程写入的 东西另外一个 进程马上 就能看到了都不需要 拷贝来拷贝 去传来传去大大提高了进程间通信的速度。 4信号量 用了共享内存通信方式带来新的问题那就是如果 多个进程 同时修改 同一个 共享内存很有 可能就 冲突了。例如 两个进程都 同时 写一个地址那 先写的 那个进程 会发现 内容 被别人覆盖了。为了防止 多进程竞争 共享资源而 造成的 数据错乱所以 需要 保护机制使得 共享的 资源在 任意时刻 只能被一个 进程访问。正好信号量就实现了这一保护机制。 信号量 其实是一个 整型的 计数器主要 用于 实现 进程间的 互斥与同步而不是 用于 缓存进程间通信的 数据。信号量 表示 资源的 数量控制信号量 的方式 有两种 原子操作 一个是 P 操作这个操作会 把信号量 减去 1相減后 如果 信号量0则 表明资源 已被 占用进程需 阻塞等待相減后 如果 信号量 0则 表明 还有资源 可使用进程 可正常 继续执行。另一个是 V 操作这个 操作 会 把信号量 加上 1相加后 如果 信号量0则 表明 当前 有阻塞中的 进程于是 会将 该进程 唤醒运行相加后 如果 信号量 0则 表明 当前 没有阻塞中的 进程 P 操作是 用在进入 共享资源 之前V 操作 是用在 离开 共享资源 之后这 两个操作是 必须 成对出现的。 接下来举个例子如果要使得两个进程互斥访问共享内存我们可以初始化信号量为 1。 具体的过程如下 进程 A 在 访问 共享内存 前先执行了 P 操作由于 信号量的 初始值为 1故在 进程 A 执行 P 操作后 信号量 变为 0表示 共享资源 可用于是 进程 A 就可以 访问 共享内存。若此时进程 B 也想访问 共享内存执行了 P 操作结果 信号量 变为了 -1这就 意味着 临界资源 已被占用因此 进程 B 被阻塞。直到 进程 A 访问完 共享内存才会 执行 V 操作使得 信号量 恢复为 0接着 就会 唤醒 阻塞中的 进程 B使得 进程 B 可以 访问 共享内存最后 完成 共享内存的 访问后执行 V 操作使 信号量 恢复到 初始值 1。 可以发现信号 初始化 为 1就 代表着是 互斥信号量它 可以 保证 共享内存 在任何 时刻 只有一个 进程在 访问这就 很好的 保护了 共享内存。 另外在 多进程 里每个 进程 并不一定是 顺序执行的它们 基本是 以各自独立的、不可预知的速度 向前推进但 有时候 我们 又希望 多个进程能 密切合作以 实现一个 共同的 任务。 例如进程 A 是 负责 生产数据而 进程 B 是负责 读取数据这 两个进程是 相互合作、相互依赖的进程 A 必须先 生产了数据进程 B 才能 读取到数据所以 执行是 有前后 顺序的。那么 这时候就可以 用信号量 来实现 多进程 同步的 方式我们 可以 初始化 信号量为 0。 具体过程 如果 进程 B 比 进程 A 先执行了那么 执行到 P 操作时由于 信号量 初始值 为 0故 信号量 会变为 -1表示 进程 A 还没 生产数据于是 进程 B 就 阻塞等待接着当 进程 A 生产完数据 后执行了 V 操作就会 使得 信号量 变 0于是就会 唤醒 阻塞在 P 操作的 进程 B最后进程 B 被唤醒 后意味着 进程 A 已经 生产了 数据于是 进程 B 就 可以 正常 读取 数据了。 可以发现信号 初始化 为 0就代表着是 同步信号量它 可以 保证 进程 A 应在 进程 B 之前执行。 5信号 上述进程间通信都是常规状态下的工作模式。对于异常情况下的工作模式就需要 用「信号」的方式来 通知 进程。 信号用于 通知 接收进程 某个事件 已经发生从而 迫使进程 执行信号 处理程序。 运行在 shell 终端的 进程我们 可以通过 键盘输入 某些 组合键的时候给 进程发送 信号。例如 CtrlC 产生 SIGINT 信号表示终止该进程CtrlZ 产生 SIGTSTP 信号表示停止该进程但还未结束如果进程在后台运行且知道进程 PID 号可以通过 kill 命令的方式给进程发送信号kill-91050表示给 PID 为 1050 的进程发送 SIGKILL 信号用来 立即结束 该进程 所以信号事件的 来源 主要有 硬件来源如键盘 CltrC和 软件来源如 kill 命令。 6Socket 上述 管道、消息队列、共享内存、信号量 和 信号 都是在 同一台主机上 进行 进程间通信那 要想跨网络 与 不同主机上的 进程之间 通信就需要 Socket 通信。 4. 解释一下进程同步和互斥以及解决这些问题的方法 1互斥的概念 假设同一个进程中的 线程 1 和 线程 2 同时执行对变量 i 的 加 1 操作每个线程执行 10000 次那么它对应的汇编指令执行过程是这样的 但由于 时钟中断发生 造成上下文切换使得 最后的结果 不等于 20000针对上面 线程 1 和 线程 2 的执行过程产生这种情况的 流程图如下 上面展示的 情况 称为 竞争条件race condition当 多线程 相互竞争 操作 共享变量 时由于运气 不好即在 执行过程中 发生了 上下文切换我们 得到了 错误的结果事实上每次 运行 都可能 得到不同的 结果因此 输出的 结果 存在 不确定性indeterminate。 由于 多线程 执行 操作共享变量的 这段代码 可能会 导致 竞争状态因此 我们将 此段 代码 称为临界区criticalsection它是 访问 共享资源的 代码片段一定 不能 给 多线程 同时执行。我们希望 这段代码是 互斥mutualexclusion的也就 说保证 一个线程在 临界区执行 时其他 线程 应该被 阻止进入临界区说白了就是这段代码执行过程中最多只能出现一个线程。 2同步的概念 互斥解决了 并发进程/线程 对临界区的 使用问题。这种 基于临界区 控制的 交互作用 是 比较简单的只要 一个进程/线程 进入了 临界区其他 试图想 进入临界区的 进程/线程 都会 被阻塞着直到 第一个进程/线程 离开了 临界区。在 多线程里每个线程 并不一定 是 顺序执行的它们 基本是 以各自 独立的、不可预知的 速度 向前推进但 有时候 我们又希望 多个 线程 能密切合作以 实现一个 共同的 任务。 例如线程 1 是负责 读入 数据的而 线程 2 是负责 处理数据的这 两个线程 是 相互合作、相互依赖的。线程 2 在 没有 收到 线程 1 的唤醒通知时就会 一直阻塞等 待当 线程 1 读完 数据需要把 数据传给 线程 2 时线程 1 会唤醒 线程 2并 把数据 交给 线程 2 处理。 进程同步是 指 多个 并发执行的进程 之间协调 和 管理 它们的 执行顺序以 确保它们 按照一定的顺序 或 时间间隔 执行。 同步就好比「操作 A 应在 操作 B 之前 执行」「操作 C 必须在 操作 A 和 操作 B 都完成之后才能执行」等互斥就好比「操作 A 和 操作 B 不能在 同一时刻 执行」 3锁 使用 加锁操作 和 解锁操作 可以解决 并发线程/进程 的互斥问题。任何想 进入临界区 的线程必须 先执行 加锁操作。若 加锁操作 顺利通过则 线程 可进入 临界区在 完成 对临界资源的 访问后 再执行 解锁操作以 释放该 临界资源。 4信号量 信号量 是 操作系统 提供的 一种 协调共享资源 访问的方法。通常 信号量 表示 资源的数量对应的 变量是一个 整型sem变量。另外还有 两个 原子操作的 系统调用函数 来控制信号量的分别是 P 操作将 sem 减1相減后如果 sem0则 进程/线程 进入 阻塞等待否则继续表明 P 操作可能会 阻塞V 操作将 sem 加1相加后如果 sem0唤醒一个 等待中的 进程/线程表明 V 操作 不会阻塞 原子操作 就是 要么全部执行要么 都不执行不能 出现执行到 一半的 中间状态。 P 操作 是 用在 进入临界区 之前V 操作 是用在 离开临界区 之后这 两个操作 是必须 成对 出现的。举个类比2 个 资源的 信号量相当于 2 条 火车轨道PV 操作 如下图过程 PV 操作的函数是由操作系统管理和实现的所以 操作系统 已经使得 执行 PV 函数时是 具有 原子性的。 5使用信号量和 PV 操作 为 每类 共享资源 设置一个 信号量 s其初值为 1表示 该临界资源 未被占用。只要 把 进入临界区的 操作置于 Ps和 Vs之间即可 实现 进程/线程 互斥 此时任何 想进入 临界区 的线程必先在 互斥信号量 上 执行 P 操作在 完成 对临界资源的 访问后再 执行 V 操作。 由于 互斥信号量 的 初始值 为 1故在 第一个 线程 执行 P 操作后 s 值 变为 0表示临界资源 为空闲可 分配给 该线程使之 进入 临界区。若此时 又有 第二个 线程 想进入临界区也应 先执行 P 操作结果使 s 变为 负值这就 意味着 临界资源 已被 占用因此第二个线程 被 阻塞。 并且直到 第一个 线程 执行 V 操作释放 临界资源 而 恢复 s 值 为 0 后才 唤醒 第二个 线程使之 进入 临界区待它 完成 临界资源 的 访问后又 执行 V 操作使 s 恢复到 初始值 1。对于 两个 并发线程互斥信号量 的值 仅 取 1、0 和 -1 三个值分别表示 如果 互斥信号量为 1表示 没有线程 进入临界区。如果 互斥信号量为 0表示 有一个线程 进入临界区。如果 互斥信号量为 -1表示 一个线程 进入临界区另一个线程 等待进入。 通过 互斥信号量 的方式就能 保证临界区 任何时刻 只有 一个线程 在执行就达到了 互斥的效果。 5. 你知道的线程同步的方式有哪些 线程同步机制是 指在 多线程编程 中为了 保证 线程之间 的 互不干扰而 采用的 一种机制。常见的 线程同步机制 有以下 几种 1互斥锁 加锁的 目的 就是 保证共享资源 在任意时间里只有 一个线程 访问这样就 可以 避免 多线程 导致 共享数据 错乱的问题。当 已经 有一个 线程加锁 后其他 线程 加锁 则就会失败。互斥锁 加锁失败后线程会释放 CPU给其他 线程。 互斥锁 是一种「独占锁」比如当 线程 A 加锁 成功后此时 互斥锁 已经 被 线程 A 独占了只要 线程 A 没有 释放 手中的 锁线程 B 加锁 就会 失败于是 就会 释放 CPU 让给 其他 线程既然 线程 B 释放掉了 CPU自然 线程 B 加锁的 代码 就会 被阻塞。 对于 互斥锁 加锁失败 而阻塞的 现象是由 操作系统 内核 实现的。当 加锁失败时内核 会 将线程置为「睡眠」状态等到 锁被 释放后内核 会在合适的 时机 唤醒线程当 这个线程 成功获取到 锁 后于是就可以 继续执行。如下图 所以互斥锁 加锁失败时会从 用户态 陷入到 内核态让 内核 帮我们 切换线程虽然 简化了使用 锁的 难度但是 存在一定的 性能 开销成本。 这个 开销成本即 会有 两次线程 上下文切换的 成本 当线程 加锁失败 时内核会 把线程的 状态 从「运行」状态 设置为「睡眠」状态然后把 CPU 切换给 其他线程 运行。接着当 锁 被释放时之前「睡眠」状态的 线程会 变为「就绪」状态然后 内核会 在 合适的 时间把 CPU 切换给该线程运行。 线程的上下文切换即当两个线程是属于同一个进程因为虚拟内存是共享的所以在切换时虚拟内存这些资源就保持不动只需要切换线程的私有数据、寄存器等不共享的数据。         上下切换的 耗时 有大佬 统计过大概在 几十纳秒 到 几微秒之间如果 锁住的 代码执行 时间 比较短那可能 上下文切换的 时间 都比锁住的代码 执行时间 还要长。 2读写锁 读写锁 由「读锁」和「写锁」两部分 构成如果 只读取 共享资源 用「读锁」加锁如果 要 修改共享资源 则用「写锁」加锁。所以读写锁 适用于 能明确 区分 读操作 和 写操作的 场景。 读写锁的工作原理 当「写锁」没有 被线程 持有时多个线程 能够 并发地 持有 读锁这 大大 提高了 共享资源的 访问效率因为「读锁」是 用于 读取 共享资源的 场景所以 多个线程 同时 持有 读锁也 不会 破坏共享资源的 数据。但是一旦「写锁」被线程持有后读线程的 获取 读锁的 操作 会被阻塞而且 其他 写线程的 获取 写锁 的操作 也会 被阻塞。 所以说写锁是 独占锁因为 任何时刻 只能有一个 线程 持有写锁类似 互斥锁而 读锁 是共享锁因为 读锁 可以被 多个线程 同时 持有。 3条件变量 条件变量 用于 线程间 通信允许 一个线程 等待 某个 条件满足而 其他线程 可以 发出 信号通知 等待线程。通常 与 互斥锁 一起使用。 4信号量 用于控制 多个线程 对共享资源 进行 访问的工具。 二、相关问题 1. 介绍一下你知道的锁 两个基础的锁。 1互斥锁 互斥锁 是一种 最 常见的锁 类型用于 实现 互斥访问 共享资源。在 任何时刻只有 一个线程 可以持有 互斥锁其他线程 必须 等待 直到 锁被释放。这 确保了 同一时间 只有一个 线程 能够访问 被保护的 资源。 2自旋锁 加锁的 目的就是 保证 共享资源 在任意时间里只有 一个 线程访问这样就 可以 避免 多线程 导致 共享 数据错乱的 问题。当已经 有一个 线程 加锁后其他线程 加锁则就 会失败。 自旋锁 加锁 失败后线程会 忙等待直到 它拿到锁。 自旋锁是 通过 CPU 提供的 CAS 函数Compare And Swap在「用户态」完成 加锁 和 解锁 操作不会 主动 产生 线程 上下文切换所以 相比 互斥锁 来说会快一些开销也小一些。一般加锁的过程包含两个步骤 第一步查看 锁的状态如果 锁是 空闲的则 执行 第二步第二步将 锁 设置为 当前 线程 持有 CAS 函数 就 把 这两个步骤 合并成一条 硬件级 指令形成 原子 指令这样就 保证了 这两个步骤是 不可分割的要么 一次性 执行 完两个步骤要么 两个步骤 都不执行。 比如设 锁 为变量 lock整数 0 表示 锁 是空闲状态整数 pid 表示线程 ID那么 CASlock, 0, pid就表示 自旋锁的 加锁 操作CASlock, pid, 0 则表示 解锁操作。 使用 自旋锁 的时候当 发生 多线程 竞争锁的 情况加锁 失败的 线程会「忙等待」直到它 拿到锁。这里的「忙等待」可以用 while 循环等待实现不过 最好是 使用 CPU 提供的 PAUSE 指令来实现「忙等待」因为可以减少 循环等待时的 耗电量。 自旋锁 是 最比较简单的 一种锁一直 自旋利用 CPU 周期直到 锁可用。 注意在 单核 CPU 上需要 抢占式的 调度器即 不断 通过时钟 中断一个 线程运行 其他线程。否则自旋锁在 单 CPU 上 无法使用因为 一个自旋的 线程 永远不会 放弃 CPU。 自旋锁 开销少在 多核系统下 一般 不会 主动 产生 线程 切换适合 异步、协程等 在用户态 切换请求的 编程方式但 如果 被锁住的 代码 执行时间 过长自旋的 线程会 长时间 占用 CPU 资源所以 自旋的时间 和 被锁住的 代码 执行的 时间是 成「正比」的关系。 自旋锁 与 互斥锁 使用 层面比较 相似但 实现 层面上 完全不同当 加锁失败 时互斥锁 用「线程切换」来 应对自旋锁 则用「忙等待」来 应对。         自旋锁 与 互斥锁 是锁的 最基本 处理方式更高级的锁 都会 选择 其中一个来 实现比如 读写锁 既可以选择互斥锁实现也可以基于自旋锁实现。 3读写锁 允许 多个线程 同时 读共享资源只 允许一个 线程 进行 写操作。分为读共享和 写排他两种状态。 4悲观锁 互斥锁、自旋锁、读写锁都是属于 悲观锁。悲观锁 做事 比较悲观它认为 多线程 同时 修改 共享资源的 概率 比较高于是 很容易 出现冲突所以 访问共享 资源前先要 上锁。 5乐观锁 与 悲观锁 相反的如果 多线程 同时 修改 共享资源的 概率 比较低就可以 采用 乐观锁。 乐观锁 做事 比较 乐观它 假定 冲突的 概率 很低它的 工作方式 是先 修改完 共享资源再 验证 这段时间内 有没有 发生冲突如果 没有 其他线程 在修改资源那么 操作完成如果 发现有 其他线程 已经 修改过 这个资源就 放弃 本次操作。放弃后 如何重试这跟 业务场景 息息相关虽然 重试的 成本很高但是 冲突的 概率足够低的话还是可以接受的。可见乐观锁的 心态是不管 三七二十一先改了 资源再说。 乐观锁 全程并 没有加锁所以它也叫 无锁编程。 这里 举一个 场景例子在线文档。 在线文档 可以 同时 多人编辑如果 使用了 悲观锁那么 只要 有一个用户 正在 编辑文档此时其他用户 就 无法打开 相同的 文档了这 用户体验 当然不好了。那 实现多人 同时编辑实际上是用了 乐观锁它 允许 多个用户 打开 同一个 文档 进行编辑编辑完 提交之后 才 验证修改的 内容 是否 有冲突。怎么样才算发生冲突 这里 举个例子比如 用户 A 先在 浏览器 编辑文档之后 用户 B 在浏览器 也 打开了 相同的 文档进行 编辑但是 用户 B 比 用户 A 提交 早这一过程 用户 A 是 不知道的当 A 提交 修改完的 内容时那么 A 和 B 之间 并行 修改的 地方就 会 发生冲突。服务端 要 怎么验证 是否 冲突了呢 通常方案如下 由于 发生冲突的 概率 比较低所以 先让 用户 编辑文档但是 浏览器 在下载文档时 会记录 下服务端 返回的 文档 版本号。当 用户 提交修改 时发给 服务端的 请求会 带上 原始 文档版本号服务器 收到后 将它 与 当前 版本号 进行比较如果 版本号 不一致则 提交失败如果 版本号 一致则 修改成功然后 服务端版本号 更新到 最新的 版本号。 实际上我们常见的 SVN 和 Git 也是用了 乐观锁的 思想先 让 用户 编辑代码然后 提交的时候通过 版本号 来 判断 是否 产生了 冲突发生了 冲突的 地方需要 我们 自己修改后再 重新提交。 乐观锁 虽然 去除了 加锁 解锁的 操作但是 一旦 发生冲突重试的 成本 非常高所以 只有 在 冲突概率 非常低且 加锁成本 非常高的 场景时才 考虑使用 乐观锁。 2. 什么是死锁如何避免死锁 在多线程编程中为了防止多线程竞争共享资源而导致数据错乱都会在操作共享资源之前加上互斥锁只有成功获得到锁的线程才能操作共享资源获取不到锁的线程就只能等待直到锁被释放。 那么当 两个线程 为了 保护 两个不同的 共享资源 而使用了 两个互斥锁那么 这两个 互斥锁 应用不当的 时候可能会 造成 两个线程 都在 等待对方 释放锁在 没有外力的 作用下这些 线程会 一直 相互等待就 没办法 继续运行这种情况 就是发生了 死锁。 死锁 只有 同时满足以下 四个条件 才会发生 互斥条件持有并等待条件不可剥夺条件环路等待条件 1互斥条件 互斥条件是 指 多个线程 不能 同时使用 同一个资源。比如下图如果 线程 A 已经 持有的 资源不能再 同时 被 线程 B 持有如果 线程 B 请求 获取 线程 A 已经 占用的资源那 线程 B 只能等待直到 线程 A 释放了资源。 2持有并等待条件 持有并等待条件是指当 线程 A 已经持有了 资源 1又想 申请 资源 2而 资源 2 已经 被 线程 C 持有了所以 线程 A 就会处于 等待状态但是 线程 A 在 等待 资源 2 的同时 并不会 释放 自己已经持有的 资源 1。 3不可剥夺条件 不可剥夺条件 是指当 线程 已经持有了 资源在 自己 使用完 之前 不能被 其他 线程获取线程 B 如果 也想使用 此资源则 只能在 线程 A 使用完 并释放后 才能获取。 4环路等待条件 环路等待条件 指的是在 死锁 发生的 时候两个线程 获取资源的 顺序 构成了 环形链。比如线程 A 已经 持有 资源 2而 想请求 资源 1线程 B 已经 获取了 资源 1而想 请求 资源 2这就形成 资源请求 等待的 环形图。 ​​​​​​​5方法 只需要破坏上面一个条件就可以破坏死锁 破坏持有并等待条件一次性申请所有的资源。破坏不可剥夺条件占用 部分资源的 线程 进一步 申请 其他资源时如果 申请不到可以 主动释放 它占有的 资源。破坏环路等待条件靠 按序 申请资源 来预防。让 所有 进程 按照 相同的 顺序 请求资源释放 资源则 反序释放。 破坏环路等待条件下         线程 A 和 线程 B 获取资源的 顺序要 一样当 线程 A 是 先尝试 获取 资源 A然后 尝试 获取 资源 B 的时候线程 B 同样也是先 尝试 获取资源 A然后 尝试 获取 资源 B。也就是说线程 A 和 线程 B 总是以 相同的顺序 申请自己 想要的 资源。
文章转载自:
http://www.morning.pjrgb.cn.gov.cn.pjrgb.cn
http://www.morning.ryxyz.cn.gov.cn.ryxyz.cn
http://www.morning.yksf.cn.gov.cn.yksf.cn
http://www.morning.wpcfh.cn.gov.cn.wpcfh.cn
http://www.morning.kdldx.cn.gov.cn.kdldx.cn
http://www.morning.zypnt.cn.gov.cn.zypnt.cn
http://www.morning.tgyzk.cn.gov.cn.tgyzk.cn
http://www.morning.gccrn.cn.gov.cn.gccrn.cn
http://www.morning.tqrjj.cn.gov.cn.tqrjj.cn
http://www.morning.pnmtk.cn.gov.cn.pnmtk.cn
http://www.morning.jfbpf.cn.gov.cn.jfbpf.cn
http://www.morning.lmpfk.cn.gov.cn.lmpfk.cn
http://www.morning.jfbpf.cn.gov.cn.jfbpf.cn
http://www.morning.wdhlc.cn.gov.cn.wdhlc.cn
http://www.morning.pxspq.cn.gov.cn.pxspq.cn
http://www.morning.drnjn.cn.gov.cn.drnjn.cn
http://www.morning.btcgq.cn.gov.cn.btcgq.cn
http://www.morning.xdpjf.cn.gov.cn.xdpjf.cn
http://www.morning.crfjj.cn.gov.cn.crfjj.cn
http://www.morning.kqbwr.cn.gov.cn.kqbwr.cn
http://www.morning.chxsn.cn.gov.cn.chxsn.cn
http://www.morning.ycmpk.cn.gov.cn.ycmpk.cn
http://www.morning.spqtq.cn.gov.cn.spqtq.cn
http://www.morning.dfdhx.cn.gov.cn.dfdhx.cn
http://www.morning.bdsyu.cn.gov.cn.bdsyu.cn
http://www.morning.ymwcs.cn.gov.cn.ymwcs.cn
http://www.morning.sgpny.cn.gov.cn.sgpny.cn
http://www.morning.bpncd.cn.gov.cn.bpncd.cn
http://www.morning.qdzqf.cn.gov.cn.qdzqf.cn
http://www.morning.rsbqq.cn.gov.cn.rsbqq.cn
http://www.morning.ltzkk.cn.gov.cn.ltzkk.cn
http://www.morning.qpljg.cn.gov.cn.qpljg.cn
http://www.morning.mspkz.cn.gov.cn.mspkz.cn
http://www.morning.ggrzk.cn.gov.cn.ggrzk.cn
http://www.morning.dgsx.cn.gov.cn.dgsx.cn
http://www.morning.dtnyl.cn.gov.cn.dtnyl.cn
http://www.morning.jnzfs.cn.gov.cn.jnzfs.cn
http://www.morning.zmlnp.cn.gov.cn.zmlnp.cn
http://www.morning.pdmml.cn.gov.cn.pdmml.cn
http://www.morning.nccyc.cn.gov.cn.nccyc.cn
http://www.morning.fssmx.com.gov.cn.fssmx.com
http://www.morning.kkjlz.cn.gov.cn.kkjlz.cn
http://www.morning.fgsqz.cn.gov.cn.fgsqz.cn
http://www.morning.byjwl.cn.gov.cn.byjwl.cn
http://www.morning.cldgh.cn.gov.cn.cldgh.cn
http://www.morning.nfccq.cn.gov.cn.nfccq.cn
http://www.morning.grxsc.cn.gov.cn.grxsc.cn
http://www.morning.ymdhq.cn.gov.cn.ymdhq.cn
http://www.morning.hbqfh.cn.gov.cn.hbqfh.cn
http://www.morning.wnkqt.cn.gov.cn.wnkqt.cn
http://www.morning.qgtbx.cn.gov.cn.qgtbx.cn
http://www.morning.dnls.cn.gov.cn.dnls.cn
http://www.morning.xkhxl.cn.gov.cn.xkhxl.cn
http://www.morning.drfcj.cn.gov.cn.drfcj.cn
http://www.morning.pndhh.cn.gov.cn.pndhh.cn
http://www.morning.mjzgg.cn.gov.cn.mjzgg.cn
http://www.morning.pqppj.cn.gov.cn.pqppj.cn
http://www.morning.ubpsa.cn.gov.cn.ubpsa.cn
http://www.morning.tkgxg.cn.gov.cn.tkgxg.cn
http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn
http://www.morning.mqfw.cn.gov.cn.mqfw.cn
http://www.morning.xqcst.cn.gov.cn.xqcst.cn
http://www.morning.lxjcr.cn.gov.cn.lxjcr.cn
http://www.morning.pggkr.cn.gov.cn.pggkr.cn
http://www.morning.tbzcl.cn.gov.cn.tbzcl.cn
http://www.morning.tfpmf.cn.gov.cn.tfpmf.cn
http://www.morning.lskyz.cn.gov.cn.lskyz.cn
http://www.morning.npgwb.cn.gov.cn.npgwb.cn
http://www.morning.dnbkz.cn.gov.cn.dnbkz.cn
http://www.morning.prjty.cn.gov.cn.prjty.cn
http://www.morning.ysgnb.cn.gov.cn.ysgnb.cn
http://www.morning.bwkzn.cn.gov.cn.bwkzn.cn
http://www.morning.txzmy.cn.gov.cn.txzmy.cn
http://www.morning.rrms.cn.gov.cn.rrms.cn
http://www.morning.feites.com.gov.cn.feites.com
http://www.morning.wfyzs.cn.gov.cn.wfyzs.cn
http://www.morning.rgmd.cn.gov.cn.rgmd.cn
http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn
http://www.morning.gkdqt.cn.gov.cn.gkdqt.cn
http://www.morning.hffpy.cn.gov.cn.hffpy.cn
http://www.tj-hxxt.cn/news/248615.html

相关文章:

  • 微小店网站建设哪家好概述网站建设的流程
  • 做照片书的网站好湖南省建设厅208号文
  • 天津网站推广有哪些网页代码小游戏
  • 宁夏网站建设哪个好wordpress 站点收录
  • 百度推广怎么做网站最新新闻事件2023
  • 凡科网站产品导航怎么做哪家网站开发好
  • 网站优化前景做的网站怎么打开是白板
  • 网站模板 响应式邯郸做网络推广的公司
  • cad图做网站链接做投票链接网站
  • 崂山网站建设wordpress 文章推荐插件
  • 网站倒计时重庆网站建设找重庆最佳科技
  • 怎么建立企业网站有没有一些网站可以做问卷
  • 长春建站价格适合vue做的网站类型
  • 新公司怎么建立自己的网站本地佛山顺德网站设计
  • 网站建设案例包括哪些济南招考院网站
  • 网站改版html营销网站手机站
  • 溧阳常州做网站人工智能在未来可以
  • 学校的网站怎么做的泉州seo网站关键词优
  • 中文个人网站模板下载wordpress翻转框
  • 网站建设费用什么意思衡水seo网站建设优化排名
  • 网站做1920px好吗36氪国外做网站
  • 南宁公司做网站wordpress手机端粘性菜单
  • 网站界面设计内容网站建设一条龙怎么样
  • 论坛网站建设用工具软件企业网络推广的方法有哪些
  • 什么叫宣传型网站生成logo的网站
  • wordpress微信插件开发如何优化网页加载速度
  • p2p网站建设cms网站建设经营服务合同范本
  • 网站如何在360做提交wordpress设置静态
  • 大足网站设计原网站开发新功能
  • 网站上传 文件夹结构东莞企业网站教程