Mindquantum实现变分量子奇异值分解

news/2024/4/30 13:54:46/文章来源:https://blog.csdn.net/Kenji_Shinji/article/details/127281386

论文题目:Variational Quantum Singular Value Deposition(VQSVD)

项目介绍

复现过程

案例1:分解随机生成的8*8复数矩阵

先引入需要使用的包:

import os
os.environ['OMP_NUM_THREADS'] = '1'​
import mindspore as ms
from mindquantum import Simulator, MQAnsatzOnlyLayer, add_prefix
from mindquantum import Hamiltonian, Circuit, RY, RZ, X
​
import numpy as np
from scipy.sparse import csr_matrix
from scipy.linalg import norm
from matplotlib import pyplot
import tqdm

定义常数并设置权重:

n_qubits = 3  # qbits number
cir_depth = 20  # circuit depth
N = 2**n_qubits
rank = 8  # learning rank
step = 3
ITR = 200  # iterations
LR = 0.02  # learning rate
​
# Set equal learning weights
if step == 0:weight = ms.Tensor(np.ones(rank))
else:weight = ms.Tensor(np.arange(rank * step, 0, -step))

随机生成一个8*8的复数矩阵M

# Define random seed
np.random.seed(42)
​
​
def mat_generator():'''Generate a random complex matrix'''matrix = np.random.randint(10, size=(N, N)) + 1j * np.random.randint(10, size=(N, N))return matrix​​
# Generate matrix M which will be decomposed
M = mat_generator()
​
# m_copy is generated to error analysis
m_copy = np.copy(M)
​
# Print M
print('Random matrix M is: ')
print(M)​
# Get SVD results
U, D, v_dagger = np.linalg.svd(M, full_matrices=True)
Random matrix M is: 
[[6.+1.j 3.+9.j 7.+3.j 4.+7.j 6.+6.j 9.+8.j 2.+7.j 6.+4.j][7.+1.j 4.+4.j 3.+7.j 7.+9.j 7.+8.j 2.+8.j 5.+0.j 4.+8.j][1.+6.j 7.+8.j 5.+7.j 1.+0.j 4.+7.j 0.+7.j 9.+2.j 5.+0.j][8.+7.j 0.+2.j 9.+2.j 2.+0.j 6.+4.j 3.+9.j 8.+6.j 2.+9.j][4.+8.j 2.+6.j 6.+8.j 4.+7.j 8.+1.j 6.+0.j 1.+6.j 3.+6.j][8.+7.j 1.+4.j 9.+2.j 8.+7.j 9.+5.j 4.+2.j 1.+0.j 3.+2.j][6.+4.j 7.+2.j 2.+0.j 0.+4.j 3.+9.j 1.+6.j 7.+6.j 3.+8.j][1.+9.j 5.+9.j 5.+2.j 9.+6.j 3.+0.j 5.+3.j 1.+3.j 9.+4.j]]

定义论文中使用的ansatz类:

class Ansatz:'''Define ansatz'''
​def __init__(self, n, depth):self.circ = Circuit()num = 0for _ in range(depth):
​for i in range(n):self.circ += RY('theta' + str(num)).on(i)num += 1
​for i in range(n):self.circ += RZ('theta' + str(num)).on(i)num += 1
​for i in range(n - 1):self.circ += X.on(i + 1, i)
​self.circ += X.on(0, n - 1)

定义画出优化过程中的学习曲线的函数:

def loss_plot(loss):'''Plot loss over iteration'''pyplot.plot(list(range(1, len(loss) + 1)), loss)pyplot.xlabel('iteration')pyplot.ylabel('loss')pyplot.title('Loss Over Iteration')pyplot.suptitle('step = ' + str(step))pyplot.show()

def quantnet(qubits_num, hams, circ_right, circ_left=None, base=None):'''Generate quantum net using hams, circ_right and circ_left under given base'''sim = Simulator('projectq', qubits_num)
​if base is None:passelse:sim.set_qs(base)grad_ops = sim.get_expectation_with_grad(hams, circ_right, circ_left)
​ms.context.set_context(mode=ms.context.PYNATIVE_MODE, device_target="CPU")
​quantumnet = MQAnsatzOnlyLayer(grad_ops, 'ones')
​return quantumnet

实例化要使用到的ansatz:U_ansatz和V_ansatz

# Define ansatz
u_ansatz = add_prefix(Ansatz(n_qubits, cir_depth).circ, 'u')
v_ansatz = add_prefix(Ansatz(n_qubits, cir_depth).circ, 'v')
v_ansatz
q0: ──RY(v_theta0)────RZ(v_theta3)────●─────────X────RY(v_theta6)─────RZ(v_theta9)────●─────────X────RY(v_theta12)────RZ(v_theta15)────●─────────X────RY(v_theta18)────RZ(v_theta21)────●─────────X────RY(v_theta24)────RZ(v_theta27)────●─────────X────RY(v_theta30)────RZ(v_theta33)────●─────────X────RY(v_theta36)────RZ(v_theta39)────●─────────X────RY(v_theta42)────RZ(v_theta45)────●─────────X────RY(v_theta48)────RZ(v_theta51)────●─────────X────RY(v_theta54)────RZ(v_theta57)────●─────────X────RY(v_theta60)────RZ(v_theta63)────●─────────X────RY(v_theta66)────RZ(v_theta69)────●─────────X────RY(v_theta72)────RZ(v_theta75)────●─────────X────RY(v_theta78)────RZ(v_theta81)────●─────────X────RY(v_theta84)────RZ(v_theta87)────●─────────X────RY(v_theta90)────RZ(v_theta93)────●─────────X────RY(v_theta96)────RZ(v_theta99)─────●─────────X────RY(v_theta102)────RZ(v_theta105)────●─────────X────RY(v_theta108)────RZ(v_theta111)────●─────────X────RY(v_theta114)────RZ(v_theta117)────●─────────X──│         │                                     │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                      │         │                                       │         │                                        │         │                                        │         │                                        │         │
q1: ──RY(v_theta1)────RZ(v_theta4)────X────●────┼────RY(v_theta7)────RZ(v_theta10)────X────●────┼────RY(v_theta13)────RZ(v_theta16)────X────●────┼────RY(v_theta19)────RZ(v_theta22)────X────●────┼────RY(v_theta25)────RZ(v_theta28)────X────●────┼────RY(v_theta31)────RZ(v_theta34)────X────●────┼────RY(v_theta37)────RZ(v_theta40)────X────●────┼────RY(v_theta43)────RZ(v_theta46)────X────●────┼────RY(v_theta49)────RZ(v_theta52)────X────●────┼────RY(v_theta55)────RZ(v_theta58)────X────●────┼────RY(v_theta61)────RZ(v_theta64)────X────●────┼────RY(v_theta67)────RZ(v_theta70)────X────●────┼────RY(v_theta73)────RZ(v_theta76)────X────●────┼────RY(v_theta79)────RZ(v_theta82)────X────●────┼────RY(v_theta85)────RZ(v_theta88)────X────●────┼────RY(v_theta91)────RZ(v_theta94)────X────●────┼────RY(v_theta97)────RZ(v_theta100)────X────●────┼────RY(v_theta103)────RZ(v_theta106)────X────●────┼────RY(v_theta109)────RZ(v_theta112)────X────●────┼────RY(v_theta115)────RZ(v_theta118)────X────●────┼──│    │                                          │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                           │    │                                            │    │                                             │    │                                             │    │                                             │    │
q2: ──RY(v_theta2)────RZ(v_theta5)─────────X────●────RY(v_theta8)────RZ(v_theta11)─────────X────●────RY(v_theta14)────RZ(v_theta17)─────────X────●────RY(v_theta20)────RZ(v_theta23)─────────X────●────RY(v_theta26)────RZ(v_theta29)─────────X────●────RY(v_theta32)────RZ(v_theta35)─────────X────●────RY(v_theta38)────RZ(v_theta41)─────────X────●────RY(v_theta44)────RZ(v_theta47)─────────X────●────RY(v_theta50)────RZ(v_theta53)─────────X────●────RY(v_theta56)────RZ(v_theta59)─────────X────●────RY(v_theta62)────RZ(v_theta65)─────────X────●────RY(v_theta68)────RZ(v_theta71)─────────X────●────RY(v_theta74)────RZ(v_theta77)─────────X────●────RY(v_theta80)────RZ(v_theta83)─────────X────●────RY(v_theta86)────RZ(v_theta89)─────────X────●────RY(v_theta92)────RZ(v_theta95)─────────X────●────RY(v_theta98)────RZ(v_theta101)─────────X────●────RY(v_theta104)────RZ(v_theta107)─────────X────●────RY(v_theta110)────RZ(v_theta113)─────────X────●────RY(v_theta116)────RZ(v_theta119)─────────X────●──

# Embed M matrix into Hamiltonian ham
ham = Hamiltonian(csr_matrix(M))​
i_matrix = np.identity(N)
quantum_models = dict()
quantum_models['net_0'] = quantnet(n_qubits, ham, v_ansatz, u_ansatz,i_matrix[0])
for s in range(1, rank):quantum_models["net_" + str(s)] = quantnet(n_qubits, ham, v_ansatz,u_ansatz, i_matrix[s])quantum_models["net_" + str(s)].weight = quantum_models['net_0'].weight

class MyNet(ms.nn.Cell):'''define quantum-classic net'''​     def __init__(self):super(MyNet, self).__init__()​         self.build_block = ms.nn.CellList()for j in range(rank):self.build_block.append(quantum_models["net_" + str(j)])​     def construct(self):x = self.build_block[0]() * weight[0]k = 1​         for layer in self.build_block[1:]:x += layer() * weight[k]k += 1​         return -x

实例化量子经典混合网络并调用MindSpore的API开始训练:

# Define network
net = MyNet()
​
# Define optimizer
opt = ms.nn.Adam(net.trainable_params(), learning_rate=LR)
​
# Simple gradient descent
train_net = ms.nn.TrainOneStepCell(net, opt)
​
# Start to train net
loss_list = list()
for itr in tqdm.tqdm(range(ITR)):res = train_net()loss_list.append(res.asnumpy().tolist())
100%|██████████| 200/200 [00:42<00:00,  4.72it/s]

读取训练出的结果,即奇异值:

# Get singular value results
singular_value = list()
​
for _, qnet in quantum_models.items():singular_value.append(qnet().asnumpy()[0])

观察学习曲线以判断是否收敛:

# Plot loss over iteration
loss_plot(loss_list)

通过学习曲线我们可以发现损失函数已收敛。

接下来打印出学习到的奇异值结果,并与经典比较:

print('Predicted singular values from large to small:', singular_value)
print("True singular values from large to small:", D)
Predicted singular values from large to small: [54.83174, 19.169168, 14.88653, 11.093878, 10.533753, 7.648352, 5.5560594, -0.3320913]
True singular values from large to small: [54.83484985 19.18141073 14.98866247 11.61419557 10.15927045  7.60223249 5.81040539  3.30116001]

直观上我们可以看到使用量子经典混合网络学习出的奇异值与真实奇异值相差不大。

为了测量误差,我们首先取出网络中的参数值并赋给U_ansatz和V_ansatz,以获得学习出的奇异矩阵:

# Get parameters value
value = quantum_models['net_0'].weight.asnumpy()
v_value = value[:120]
u_value = value[120:]
​
# Calculate U and V
u_learned = u_ansatz.matrix(u_value)
v_learned = v_ansatz.matrix(v_value)
​
v_dagger_learned = np.conj(v_learned.T)
d_learned = np.array(singular_value)

我们将学习到的奇异值分解结果组装回去,与原矩阵计算 Frobenius-norm 误差以观察效果,并与经典奇异值分解的误差作比较:

err_subfull, err_local, err_svd = [], [], []
U, D, v_dagger = np.linalg.svd(M, full_matrices=True)
​
# Calculate Frobenius-norm error
for t in range(rank):lowrank_mat = np.matrix(U[:, :t]) * np.diag(D[:t]) * np.matrix(v_dagger[:t, :])recons_mat = np.matrix(u_learned[:, :t]) * np.diag(d_learned[:t]) * np.matrix(v_dagger_learned[:t, :])err_local.append(norm(lowrank_mat - recons_mat))err_subfull.append(norm(m_copy - recons_mat))err_svd.append(norm(m_copy - lowrank_mat))
​
# Plot SVD error and VQSVD error
fig, ax = pyplot.subplots()
ax.plot(list(range(1, rank + 1)),err_subfull,"o-.",label='Reconstruction via VQSVD')
ax.plot(list(range(1, rank + 1)),err_svd,"^--",label='Reconstruction via SVD')
# ax.plot(list(range(1, rank + 1)), err_local, "*--", label='SVD V/S QSVD')
pyplot.xlabel('Singular Value Used (Rank)', fontsize=14)
pyplot.ylabel('Norm Distance', fontsize=14)
leg = pyplot.legend(frameon=True)
leg.get_frame().set_edgecolor('k')

可以看到,使用量子神经网络分解出的奇异值结果误差与经典奇异值分解的误差十分接近。


案例2:图像压缩

我们先引入图像处理的包,并导入提前准备好的图片。

from PIL import Image
​
# Open figure MNIST_32.jpg and get matrix form
img = Image.open(r'.\\figure\\MNIST_32.png')
imgmat = np.array(list(img.getdata(band=0)), float)
imgmat.shape = (img.size[1], img.size[0])
imgmat = np.matrix(imgmat) / 255

使用经典SVD压缩图像的效果

我们分别取前5、10、15个奇异值作图像压缩,观察结果。

 量子版本的分解效果:

此处我们展示取前8个奇异值作图像压缩的过程及最终结果。

# Set super parameters
n_qubits = 5  # qbits number
cir_depth = 40  # circuit depth
N = 2**n_qubits
rank = 8  # learning rank
step = 2
ITR = 200  # iterations
LR = 0.02  # learning rate
SEED = 14  # random seed
​
# Set equal learning weights
if step == 0:weight = ms.Tensor(np.ones(rank))
else:weight = ms.Tensor(np.arange(rank * step, 0, -step))
​
​
def mat_generator(image):'''Generate matrix by input image'''img_matrix = np.array(list(image.getdata(band=0)), float)img_matrix.shape = (image.size[1], image.size[0])img_np = np.matrix(img_matrix)return img_np
​
​
# Generate matrix M which will be decomposed
M = mat_generator(img)
​
# Get SVD results
U, D, v_dagger = np.linalg.svd(M, full_matrices=True)

定义论文中使用的ansatz类:

class Ansatz:'''Define ansatz'''
​def __init__(self, n, depth):self.circ = Circuit()num = 0for _ in range(depth):
​for i in range(n):self.circ += RY('theta' + str(num)).on(i)num += 1
​for i in range(n - 1):self.circ += X.on(i + 1, i)
def quantnet(qubits_num, hams, circ_right, circ_left=None, base=None):'''Generate quantum net using hams, circ_right and circ_left under given base'''sim = Simulator('projectq', qubits_num)
​if base is None:passelse:sim.set_qs(base)grad_ops = sim.get_expectation_with_grad(hams, circ_right, circ_left)
​ms.context.set_context(mode=ms.context.PYNATIVE_MODE, device_target="CPU")
​quantumnet = MQAnsatzOnlyLayer(grad_ops, 'ones')
​return quantumnet
# Define ansatz
u_ansatz = add_prefix(Ansatz(n_qubits, cir_depth).circ, 'u')
v_ansatz = add_prefix(Ansatz(n_qubits, cir_depth).circ, 'v')
# Embed M matrix into Hamiltonian ham
ham = Hamiltonian(csr_matrix(M))
​
i_matrix = np.identity(N)
quantum_models = dict()
quantum_models['net_0'] = quantnet(n_qubits, ham, v_ansatz, u_ansatz,i_matrix[0])
for s in range(1, rank):quantum_models["net_" + str(s)] = quantnet(n_qubits, ham, v_ansatz,u_ansatz, i_matrix[s])quantum_models["net_" + str(s)].weight = quantum_models['net_0'].weight
class MyNet(ms.nn.Cell):'''define quantum-classic net'''
​def __init__(self):super(MyNet, self).__init__()
​self.build_block = ms.nn.CellList()for j in range(rank):self.build_block.append(quantum_models["net_" + str(j)])
​def construct(self):x = self.build_block[0]() * weight[0]k = 1
​for layer in self.build_block[1:]:x += layer() * weight[k]k += 1
​return -x
# Define network
net = MyNet()
​
# Define optimizer
opt = ms.nn.Adam(net.trainable_params(), learning_rate=LR)
​
# Simple gradient descent
train_net = ms.nn.TrainOneStepCell(net, opt)
​
# Start to train net
loss_list = list()
for itr in tqdm.tqdm(range(ITR)):res = train_net()loss_list.append(res.asnumpy().tolist())
100%|██████████| 200/200 [00:18<00:00, 10.58it/s]
# Get singular value results
singular_value = list()
​
for _, qnet in quantum_models.items():singular_value.append(qnet().asnumpy()[0])
# Get parameters value
value = quantum_models['net_0'].weight.asnumpy()
v_value = value[:200]
u_value = value[200:]
​
# Calculate U and V
u_learned = u_ansatz.matrix(u_value)
v_learned = v_ansatz.matrix(v_value)
​
v_dagger_learned = np.conj(v_learned.T)
d_learned = np.array(singular_value)

将学习到的奇异值分解结果组装回去,并使用pyplot包的imshow直观展示,以观察图像压缩的结果:

# Calculate recombined matrix mat
mat = np.matrix(u_learned[:, :rank]) * np.diag(d_learned[:rank]) * np.matrix(v_dagger_learned[:rank, :])
​
# Show recombination result
reconstimg = np.abs(mat)
pyplot.imshow(-reconstimg, cmap='gray')

可以看到,图像压缩只取前8个奇异值作近似得到的结果仍具有较好的辨识度。

项目总结

本次复现我完成了量子版本的奇异值分解变分算法,成功应用算法分解随机8*8的复数矩阵、压缩矩阵分析误差并与经典奇异值分解算法结果相对比。

虽然论文里理论上是使用变分量子神经网络来近似优化,但在实际代码中,原作者使用的是将量子网络转换成经典张量网络优化,又转换回了经典计算机上,并未利用到量子计算机的特性。

这种方法更符合量子计算的逻辑,更能发挥出量子ansatz的优势,从最终结果来看,这种方法的误差也要优于原作者转换成张量网络求解的方法。

下面两图是量子奇异值分解(VQSVD)误差与经典奇异值分解误差(SVD)对比,其中第一图是使用新算法复现出的结果,第二图是使用原算法画出的图,二者对比可以发现新算法的误差优于原算法。

下面两图是在案例二:图像压缩中运行出的结果,其中第一图是使用新算法复现出的结果,第二图是使用原算法画出的图,二者对比可以发现使用新算法压缩出的图片效果要优于原算法。

 本论文展示出了变分量子线路的强大,它只需几个比特就可以完成指数级矩阵的运算,未来我们可以考虑基于变分量子线路,通过搭建量子经典混合神经网络求解量子奇异值转换的多项式参数,从而解决算法的精度问题。


参考文献

[1] Wang, X., Song, Z., & Wang, Y. Variational Quantum Singular Value Decomposition. Quantum, 5, 483 (2021).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_22385.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformer解读之:Transformer 中的 Attention 机制

encoder 的 attention 场景&#xff1a;现在要训练的内容是 I love my dog -> 我喜欢我的狗那么在 encoder 端的输入是&#xff1a; I love my dog&#xff1b;假设经过 embedding 和位置编码后&#xff0c;I love my dog 这句话肯定已经变成了一个向量&#xff0c;但是在这…

一文彻底搞清Linux中块设备驱动的深层次原理和编写方法

【摘要】本文主要讲述了在Linux环境下的块设备驱动的常见数据结构和内核接口&#xff0c;并以一个实际例子讲述了块设备驱动的编写方法。 1.前提知识 一个块驱动提供对块存储设备&#xff08;比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等&…

Bed Bath Beyond EDI 856提前发货通知

自从1971年创业以来&#xff0c;Bed Bath&Beyond&#xff08;以下简称为BBB&#xff09;一直在为用户提供货真价实的卫浴用品&#xff0c;床上用品等家用商品。Bed Bath&Beyond 致力于成为一个勇于承担责任的公司团体&#xff0c;在市场建立起良好的信誉&#xff0c;提…

JavaSE 案例练习——精算师 double精度丢失解决思路

案例介绍 具体的内容是这样的&#xff1a; 编写一个程序&#xff0c;提示输入一个代表总钱数的双精度值&#xff0c;然后确定每种纸币和硬币需要的最少数量以达到输入的总钱数。 假设人民币种类如下&#xff1a;佰圆纸钞&#xff0c;伍拾圆纸钞&#xff0c;贰拾圆纸钞&#…

Asible最佳实践-进阶版-RHCA447 定义分组与变量

Asible最佳实践-进阶版-RHCA447 -------定义角组变量/主机变量/变量文件6.1 所有受管节点设置sudo免密[root@libin libin]# vim /etc/sudoers.d/devops libin ALL=(ALL) NOPASSWD:ALL [root@libin sudoers.d]# scp devops 192.168.124.134:`pwd` 6.2 自定义ansible目录[root@l…

学习使用jquery控制select下拉选项的字体样式

学习使用jquery控制select下拉选项的字体样式实现代码实现代码 <script src"../jquery-2.1.4.min.js"></script><style>div#container {padding: 30px;font-family: verdana, lucida;}a {color: #777;display: block;background-color: #ccc;widt…

向开发者开放免费注册!“远眺捷码”提供一站式软件快速开发平台

近日&#xff0c;远眺科技旗下具有自主知识产权的国产一站式软件快速开发平台——“远眺捷码”宣布正式开放免费注册&#xff0c;有各类软件应用开发等需求开发者、软件开发企业&#xff0c;可访问捷码官网https://www.gemcoder.com/ 操作步骤&#xff1a; Step1、打开捷码PC端…

客户成功 | 数据解码技能提升,Smartbi助力长沙烟草找到“新路子”

让数据会“说话”能“干活”&#xff0c;为客户挖掘出更深层的数据价值&#xff0c;是Smartbi一直以来助力企业数字化转型的目标和方向。大数据时代&#xff0c;每个科学的决策离不开数据的支撑&#xff0c;数字化精益管理是各行业提升自身运营管理的必然选择。数字化转型的成色…

实验1c语言开发环境使用和数据类型,运算符和表达式

1.试验任务1 (1)在垂直方向上打印两个字符小人的源代码,以及运行结果截图\\在垂直方向上打印两个字符小人#include<stdio.h> int main() {printf(" o\n");printf("<H>\n");printf("I I\n");printf("\n\n");printf(&quo…

【PMP学习笔记】第10章 项目沟通管理

【PMP学习笔记】第10章 项目沟通管理 什么是项目沟通管理? 让正确的信息在正确的时间通过正确的方式传递给正确的人,达到正确的效果。一、规划沟通管理规划沟通管理是基于每个相关方或相关方群体的信息需求、可用的组织资产,以及具体项目的需求,为项目沟通活动制定恰当的方…

基于SSM的网上餐厅管理系统

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1研究背景及意义 1 1.2研究现状 1 1.3章节安排 2 第二章 相关技术说明 3 2.1 JSP(Java Server Page)简介 3 2.2 Spring框架简介 3 2.3 Spring MVC框架简介 5 2.4 MyBatis 框架简介 5 2.4 MySql数据库简介 6 2.5 Eclipse简介 6 2.6 T…

顺序表的实现

函数接口定义:顺序表描述的结构体为 typedef struct {ElemType *elem; //存储空间的基地址int length; //当前长度 } SqList;需要实现函数的接口分别为:int GetElem(SqList L, int i, ElemType &e) 顺序表的取值 判断i值是否合理,若不合理,返回0;[i-1]单元存储第i个数…

服务器开发26:Linux中线程和进程的联系与区别(游戏后端请和游戏思考10一起食用)

文章目录一、线程创建方法&#xff08;以redis举例&#xff09;1&#xff09;创建线程函数讲解2&#xff09;线程创建的标记二、内核中对线程的数据结构表示1&#xff09;task_struct具体定义2&#xff09;线程与进程的区别三、进程、线程创建过程及异同1&#xff09;进程创建(…

Oracle Form Builder 安装时遇到的问题记录

Oracle Form Builder 安装时遇到的问题记录 问题1&#xff1a;Checking operating system version: must be 5.0, 5.1 or 5.2. Actual 6.1 Checking operating system version: must be 5.0, 5.1 or 5.2. Actual 6.1 Failed <<<< 解决方法&#xff1a; 修改x:\ds…

JAVAEE多线程synchronized 优化过程

文章目录synchronized 优化过程一、锁升级/锁膨胀1. 偏向锁2. 轻量级锁3. 重量级锁二、锁消除三、锁粗化总结synchronized 优化过程 对于synchronized 1.既是乐观锁,也是悲观锁 2.既是轻量级锁,也是重量级锁 3.乐观锁的部分是基于自旋锁实现的,悲观锁的部分是基于挂起等待锁实…

springboot+jsp云课堂在线教育系统javaweb

“云课堂”在线教育系统是由高校学生依据兴趣爱好自愿组成&#xff0c;按照章程自主开展在线教育课程。“云课堂”在线教育系统是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高学生综合素质、引导学生适应社会、促进学生成才就业等方面发挥着重要作用…

【23种设计模式】组合模式(Composite Pattern) .Net Core实现

文章目录需求变更我们应该怎么做?组合和单个对象是指什么呢?使用组合模式来设计菜单组合迭代器来源组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&…

【服务器数据恢复】AIX环境下误删除逻辑卷的数据恢复方案

一、AIX存储层面相关的知识&AIX环境下LV误删除后的恢复方案。 对于AIX而言&#xff0c;PV相当于物理磁盘&#xff0c;一个VG由若干个PV组成&#xff0c;这让我们可以将容量不同的存储空间组合起来进行统一分配。AIX把同一个VG的所有PV按相同大小的存储颗粒&#xff08;PP&…

自制操作系统系列(二):软盘读取

代码仓库地址&#xff1a;https://github.com/freedom-xiao007/operating-system 简介 在上一篇中&#xff0c;我们使用汇编编写了一个直接显示hello的程序&#xff0c;接下来我们继续探索如果使用汇编读取软盘数据 软盘数据读取准备 在上一篇中&#xff0c;我们使用nasm将…

让运维化繁为简,云原生可观测平台 Alibaba Cloud Lens 正式发布

9 月 28 日&#xff0c;阿里云正式推出云产品可观测平台 Alibaba Cloud Lens&#xff08;Lens 透镜&#xff0c;意为洞察细微变化&#xff09;&#xff0c;从成本、性能、安全、数据保护、稳定性、访问分析六个维度&#xff0c;为用户提供对存储类、网络类、数据库类等云产品的…