详解GaussDB(DWS)用户监控原理及应用

摘要:本文将聚焦于用户监控的原理及应用进行介绍。

本文分享自华为云社区《GaussDB(DWS)监控工具指南(二)用户级监控》,作者:幕后小黑爪 。

前言

资源监控是整个运维乃至整个产品生命周期重要的一环,事前及时语句发现故障,事后提供详实的数据用于追查定位问题。GaussDB(DWS)整个资源监控体系分为作业级监控、用户监控和资源池监控。本文将聚焦于用户监控的原理及应用进行介绍。

1、GuassDB(DWS)用户体系

对于一个产品来说,最简单的用户分类是普通用户、系统管理员、超级管理员三层体系。超级管理员拥有最高级的权限,普通用户作为最基本的用户,用户操作系统的部分权限,系统管理员也拥有部分权限,同时他也可改变普通用户的权限。超级管理员拥有所有权限,但是不轻易使用。

1.1 两层用户机制介绍

对于一个企业来说,对数据库的操作也是分部门运作,每个部门单独有的表,同时每个部门也有单独的优先级,有鉴于此,GaussDB(DWS)设计的用户体系也分为两层:

第一层为组用户,该层用户关联组资源池,不作为执行作业的用户使用。

第二层为业务用户,该层用户关联业务资源池,可作为执行作业的用户使用。

组用户之间可使用的资源也可单独设置。每个业务用户之间亦可设置单独的资源。相较于以往单层的用户机制而言,两层的用户机制可实现对用户资源进行粒度更小的管控。

示例:

# 创建cgroup控制组
gs_ssh -c "gs_cgroup -c -S ClassG1 -G wn1"
# 创建组资源池resource_pool_a绑定ClassG1控制组。
CREATE RESOURCE POOL resource_pool_a WITH (control_group = 'ClassG1');
# 创建业务资源池resource_pool_a1绑定wn1控制组。
CREATE RESOURCE POOL resource_pool_a1 WITH (control_group = 'ClassG1:wn1');
# 创建组用户关联到组资源池。例如,名称为“tenant_a”的组用户关联到“resource_pool_a”组资源池
CREATE USER tenant_a RESOURCE POOL 'resource_pool_a' PASSWORD '********';
# 创建业务用户关联到业务资源池和组用户。例如,名称为“tenant_a1”的业务用户关联到“resource_pool_a1”组资源池和“tenant_a”组用户。
CREATE USER tenant_a1 RESOURCE POOL 'resource_pool_a1' USER GROUP 'tenant_a' PASSWORD '********';

1.2 赋权

当我们需要普通用户访问某个表时,可使用grant语法对用户赋权限或者收回权限,该操作需要拥有sysadmin权限的用户进行,举个例子

# 将public表空间下的lineitem表的查询权限赋给user_1:
grant select on public.lineitem to user_1;
# 回收user_1的public表空间下的lineitem表的查询权限:
Revoke select on public.lineitem from user_1;

2、用户资源监控

2.1 目标

一般情况下,数仓产品会同时有多个用户对数据库进行操作,每个用户使用的资源量有差异,举个极端的例子,当某个用户下发了慢SQL,导致集群整体性能劣化,此时我们就需要确定这个作业是哪个用户下发的,然后找到对应的慢SQL,对其进行管理。

对于管理员用户而言,用户监控可以帮助管理员以用户的维度了解系统的性能状况,及时发现并解决资源瓶颈和故障,提高系统的可靠性和稳定性。还可区分每个用户在整个集群中使用的资源量,确定哪些用户使用的资源量超标,然后对超标的用户进行限制。

2.2 监控维度

用户监控支持对CPU、内存、存储空间、临时空间、算子落盘空间、磁盘IO、网络等方面的监控,通过对这些资源的监控,管理员可以了解系统的负载情况、进程的运行状态、磁盘空间的使用情况、网络带宽的利用率等信息。这些信息可以帮助管理员及时发现系统的异常情况,及时采取措施,避免系统崩溃或者服务中断。

使用示例:

postgres=# SELECT * FROM PG_TOTAL_USER_RESOURCE_INFO;
     username     | used_memory | total_memory | used_cpu | total_cpu | used_space | total_space | used_temp_space | total_temp_space | used_spill_space | total_spill_space | read_kbytes | write_kbytes | read_cou
nts | write_counts | read_speed | write_speed | send_speed | recv_speed
------------------+-------------+--------------+----------+-----------+------------+-------------+-----------------+------------------+------------------+-------------------+-------------+--------------+---------
----+--------------+------------+-------------+------------+------------
 user_grp_1       | 0 | 4928 | 0 | 16 | 1573880 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 perfadm | 0 | 0 | 0 | 0 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 user_normal | 0 | 24643 | 0 | 16 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 usr1             | 0 | 69763 | 0 | 40 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 logical_cluster1 | 0 | 24643 | 0 | 16 | 1834424 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 user_2           | 0 | 985 | 0 | 16 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 user_1           | 0 | 3942 | 0 | 16 | 1573880 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 logical_cluster2 | 0 | 45120 | 0 | 24 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 user_default | 0 | 24643 | 0 | 16 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
 wjx | 0 | 24643 | 0 | 16 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 0 | 0 | 
 0 | 0 | 0 | 0 | 0 | 0
(10 rows)
postgres=# select * from GS_WLM_USER_RESOURCE_HISTORY;
     username     |           timestamp           | used_memory | total_memory | used_cpu | total_cpu | used_space | total_space | used_temp_space | total_temp_space | used_spill_space | total_spill_space | read_
kbytes | write_kbytes | read_counts | write_counts | read_speed | write_speed | send_speed | recv_speed
------------------+-------------------------------+-------------+--------------+----------+-----------+------------+-------------+-----------------+------------------+------------------+-------------------+------
-------+--------------+-------------+--------------+------------+-------------+------------+------------
 user_grp_1       | 2023-05-22 16:51:03.380482+08 | 0 | 4928 | 0 | 16 | 1573880 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 wjx | 2023-05-22 16:51:03.380482+08 | 0 | 24643 | 0 | 16 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 user_default | 2023-05-22 16:51:03.380482+08 | 0 | 24643 | 0 | 16 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 logical_cluster2 | 2023-05-22 16:51:03.380482+08 | 0 | 45120 | 0 | 24 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 user_1           | 2023-05-22 16:51:03.380482+08 | 0 | 3942 | 0 | 16 | 1573880 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 user_2           | 2023-05-22 16:51:03.380482+08 | 0 | 985 | 0 | 16 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 logical_cluster1 | 2023-05-22 16:51:03.380482+08 | 0 | 24643 | 0 | 16 | 1834424 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 usr1             | 2023-05-22 16:51:03.380482+08 | 0 | 69763 | 0 | 40 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
 user_normal | 2023-05-22 16:51:03.380482+08 | 0 | 24643 | 0 | 16 | 0 |          -1 | 0 |               -1 | 0 |                -1 | 
 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0

2.3 监控原理

内核在作业运行时,依据作业携带的用户信息,进行相关资源字段的累计,每隔一段时间将信息汇总至用户监控历史表中。此外,该功能的使用有些规格:

2.3.1 相关GUC参数

enable_logical_io_statistics:用户资源监控和资源池资源监控IO相关数值的开关,默认为on,开启后用户监控中io相关记录(read_kbytes、write_kbytes、read_counts、write_counts、read_speed和write_speed)会进行统计。

enable_user_metric_persistent:否开启用户/资源池历史资源监控转存功能,开启后会将监控记录转存到历史表中。

user_metric_retention_time:设置用户历史资源监控数据的保存天数,默认为7天

2.3.2 相关说明

当前用户监控可同时监控快慢车道的所有作业的CPU、IO和内存使用情况。

当用户在CN上进行查询时,显示的为所有DN资源池使用和资源限制的累积和。在DN查询时仅统计本DN上资源池使用和资源限制信息。

DN上数据收集周期为5s,CN每隔5s从DN上收集一次信息。辅助线程每30s自动进行持久化操作,持久化用户监控数据。

对于初始管理用户暂不进行资源监控,因为该用户是超级管理员用户,没必要监控。

2.4 案例分析

2.4.1 当出现内存不可用时,可通过该视图查看是哪个用户使用的内存过高

2.4.2 可以监控用户网络使用情况,比如网络的收发速率等。

 

点击关注,第一时间了解华为云新鲜技术~

本文转载于网络 如有侵权请联系删除

相关文章

  • Java实现RSA加密解密、数字签名及验签

    RSA公钥加密算法是1977年由罗纳德-李维斯特(RonRivest)、阿迪-萨莫尔(AdiShamir)和伦纳德-阿德曼(LeonardAdleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密算法。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。另外一个rsa加密明文的长度是有限制的,如果要进行长数据加密需要进行分段加密。Base64类:packagersa;publicfinalclassBase64{staticprivatefinalintBASELENGTH=128;staticprivatefinalintLOOKUPLENGTH=64;staticprivatefinalintTWENTYFOURBITGROUP=24;staticprivatefinalintEIGHTBIT=8;staticprivatefinalintSIXTEENBIT=16

  • 美团到店二面:讲一下 TCP 糊涂窗口综合症

    前文详细介绍了滑动窗口,TCP通过滑动窗口来完成流量控制,当接收方发现自己跟不上发送的速度了,就缩小接收窗口大小,抑制发送方的发送速度,防止发送方发送太快。这里面其实有一个隐藏的问题,那就是接收方的接收能力越来越差怎么办?甚至一次性能接收的数据量就几个字节几个字节是个什么概念TCP报文首部就占20字节了,如果每次接收方只允许发送方发送两三个字节,那就为了传输这么几个有效的字节,还得附加上20字节的数据。这开销属实是划不来。这就好比古时行军二十个后勤人员才能补充前线一个战士所需的粮草,几天几夜跑过去就给人送一个小土豆所以TCP糊涂窗口综合症(SillyWindowSyndrome,SWS)简单来说,其实就是接收方接收能力变差,窗口变小,导致发送方犯傻,其发送的数据只有一个大大的头部,真正携带的数据很少。接收方和发送方都有问题:•接收方:通告了发送方窗口缩小•发送方:即使窗口很小也还是发送数据所以,解决接收方和发送方各自的问题,就能避免糊涂窗口综合症的出现。老规矩,背诵版在文末接收方的策略接收方的策略很简单,目的就是防止发送方发送小数据嘛•那只要窗口大小<某个值(内核缓冲区大小的一半

  • 给数据科学家的10个提示和技巧Vol.4

    原文:10TipsAndTricksForDataScientistsVol.4[1]译者:赵西西原博客简介:PredictiveHacks是与数据科学相关的一切的在线资源中心。该博客由一群数据科学家所运营,专注于讲解在各种领域如何使用大数据技术(从机器学习和人工智能到业务领域)。1引言前面已经介绍了一些数据分析的技巧,主要是用Python和R实现。具体内容可见:翻译|给数据科学家的10个提示和技巧Vol.1;翻译|给数据科学家的10个提示和技巧Vol.2;给数据科学家的10个提示和技巧Vol.3。今天主要是对博客的第4,5篇进行整合,并进行筛选,给出最为常用的一些数据处理的技巧。主要讲解R,如果你对python感兴趣可以看文末的链接噢!2R2.1对不同元素进行累积计数有时,我们会遇到有重复元素的列表(或向量),并需要对其中包含的不同值进行累积计数,这时只需要累加列表(或向量)中新元素出现的次数。例如,有如下列表:x=c("e","a","a","b","a","b"

  • 「华哥有约第一期」云开发CloudBase热点问题Q&A

    栏目介绍「华哥有约」是云开发CloudBase官方出品的问答专栏,将由云开发社区产品经理分主题从不同维度解答云开发的热门问题、剖析常见误区,帮助开发者更高效地使用云开发。Q1:微信云开发账号如何登录腾讯云控制台?华哥:进入腾讯云控制台,在登录方式处选择“小程序公众号”方式,扫码后选择所开通微信云开发的小程序,即可登录该小程序所对应的腾讯云账号。Q2:微信云开发账号如何关联/解绑腾讯云控制台?华哥:前往腾讯云控制台-账号中心-账号信息-登录方式进行关联/解绑。Q3:一个腾讯云账号只能同时绑定一个小程序吗?华哥:是的。但是你可在微信开发者工具中使用环境共享能力,将小程序的云开发资源授权给同主体下其他小程序/公众号使用。 路径:云开发控制台-->更多->环境共享Q4:微信云开发怎么使用腾讯云创建的云开发环境?华哥:云开发已推出环境转换功能,只需在最新版微信开发者工具->设置->环境设置,点击环境名称->管理我的环境->使用已有腾讯云环境,选择所需腾讯云环境,即可在微信云开发控制台使用该环境:Q5:微信开发者工具中“云开发”按钮消失/变灰?华哥: a.使用了

  • 小米2021春招面试

    来源于读者投稿,作者love_you。投递岗位:嵌入式软件工程师-BSP方向面试时间:2021.03.29岗位描述:一面(30分钟) 主要问你简历自己写的东西。1、做一个英文自我介绍。2、uboot启动流程?回答:从uboot如何引导内核启动,kernel启动时怎么挂载根文件系统从头到尾说了一下。3、面试官说通过了,进入下一轮。二面(25分钟)1、驱动下半部分需要做些什么?2、C语言和C++有什么区别?比如static,malloc和new。3、C++的三大特征说一下。4、你C++学的怎么样?回答:主要用C语言,不太了解C++。5、问简历中项目实现框架和细节。补充关于嵌入式方向“驱动工程师”和“BSP工程师”的区别,做了一点总结,欢迎补充。 BSP即BoardSupportPackage,板级支持包。它来源于嵌入式操作系统与硬件无关的设计思想,操作系统被设计为运行在虚拟的硬件平台上。对于具体的硬件平台,与硬件相关的代码都被封装在BSP中,由BSP向上提供虚拟的硬件平台,BSP与操作系统通过定义好的接口进行交互。BSP是所有与硬件相关的代码体的集合。BSP在嵌入式系统中的角色,很相似于在

  • pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作

    问题描述有时在加载已训练好的模型时,会出现outofmemory的错误提示,但仔细检测使用的GPU卡并没有再用且内存也没有超出。经查阅发现原来是训练模型时使用的GPU卡和加载时使用的GPU卡不一样导致的。个人感觉,因为pytorch的模型中是会记录有GPU信息的,所以有时使用不同的GPU加载时会报错。解决方法gpu之间的相互转换。即,将训练时的gpu卡转换为加载时的gpu卡。torch.load(‘modelparameters.pth’,map_location={‘cuda:1′:’cuda:0’})#gpu1—gpu0当然,你也可以直接将加载模型时使用的gpu卡改为和训练时的一样。但在多人使用一个服务器时,你想用的gpu卡已被使用,就需按上面方法转换gpu。拓展cpu—cpu或gpu—gpucheckpoint=torch.load(‘modelparameters.pth’) model.load_state_dict(checkpoint) cpu—gpu0torch.load(‘modelparameters.pth’,map_location=lambdastorage,

  • Python使用UDP协议实现局域网内屏幕广播

    3年前推送过一篇使用TCP协议进行局域网内屏幕广播的文章,见 Python实现局域网内屏幕广播的技术要点分析 众所周知,TCP协议尽管有良好的流量控制、拥塞控制等传输质量保证机制,但开销比较大且只能单播。尽管当时的设计中结合了多线程技术,在局域网内机器多的时候仍有一定的延迟,并且教师机压力较大。 本文使用UDP协议重新实现这一功能,虽然UDP协议没有流量控制等QoS保障技术,但能够进行广播,这一点能给教师机减轻大部分压力。虽然确实有丢包的可能,但在局域网内丢包率非常低,视频、音频数据的传输又恰好容错性较好,不需要在应用层实现可靠传输。所以,UDP协议在视频点播类似的场合中有着重要应用和优势。功能描述:局域网内屏幕广播与分享。发送端运行程序后每秒中对自己计算机屏幕截图两次,发送给局域网内所有计算机,其他计算机作为接收端接收到数据之后还原为图像并在本地显示。参考代码: 1)发送端运行界面:2)接收端,我故意在代码中删掉了一个语句,设计了一个bug,按照这个代码抄下来运行一会儿屏幕会卡住,重新启动之后就能继续,再过一会儿又会卡住。能够找出这个bug原因并解决的朋友可以在文末留言,第一位成功解

  • Codeforces 839B Game of the Rows【贪心】

    B.GameoftheRowstimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputDaenerysTargaryenhasanarmyconsistingofkgroupsofsoldiers,thei-thgroupcontainsaisoldiers.ShewantstobringherarmytotheothersideoftheseatogettheIronThrone.Shehasrecentlyboughtanairplanetocarryherarmythroughthesea.Theairplanehasnrows,eachofthemhas8seats.Wecalltwoseatsneighbor,iftheyareinthesamerowandinseats{1, 2},{3, 4},{4, 5},{5, 6}or{7, 8}.ArowintheairplaneDaenerysTargaryenwantstoplaceherarm

  • 针对B2B的多触点归因追踪分析平台——Proof介绍

    译者注:  国内已经开始有专门针对营销渠道归因的分析平台(例如目标科技),而美国人在这一块做的更多,已经有数个相当高质量的专门归因分析的工具问世。Proof是其中很有代表性的一个。  这篇文章带大家快速了解这一工具。这是一个经历多年B2B实践磨砺的新技术解决方案。与B2C售卖方式不同,B2B往往需要花费好几个月的时间才能达成最终的售卖。而在如此长的延时情况下如何去测量和评估市场营销,广告投放,公关策划等手段对于售卖的贡献成了一个难题。 12月份凤凰城的一家创业公司新发布了一款为了解决以上问题的商业分析平台Proof(https://proofanalytics.ai)。这家2015年成立的公司宣称Proof是行业中第一个能对市场营销与传播在商业中的效果予以分析的平台。Proof通过对商业效果的相关性分析以及对市场营销传播活动效果滞后性的考量定义出一套“影响分析学”。Proof平台的归因分析引擎可以展现出很多具有延时性效果的工作对最终售卖的影响。比如像市场营销活动,以及为了提升售卖率、消费者认知度、员工留任率等的努力。这套引擎正在申请专利中。 proof-impact-value-cha

  • Equation Group泄露文件分析

    *本文原创作者:白泽安全团队,本文属FreeBuf原创奖励计划,未经许可禁止转载从这几天网上公开的信息和材料分析,美国的NSA很可能已经被黑。一个名为“TheShadowBrokers”的黑客组织声称他们黑进了方程式黑客组织(EquationGroup)–一个据称与美国情报机构国家安全局(NSA)有关系的网络攻击组织,并下载了他们大量的攻击工具(包括恶意软件、私有的攻击框架及其它攻击工具)。上周末它们在网上公布了部分的资料,并发起了一次拍卖,声明在收到100万个比特币(当前价值约为5.6亿刀)后将公布剩余的资料。许多人员从对已公开资料的分析判断,TheShadowBrokers在网上公布的资料具有比较高的真实性。文件下载地址:https://mega.nz/#!zEAU1AQL!oWJ63n-D6lCuCQ4AY0Cv_405hX8kn7MEsa1iLH5UjKU下载并解压缩文件后,其中有两个重要的文件,“eqgrp-free-file.tar.xz.gpg“和”eqgrp-auction-file.tar.xz.gpg“。两个文件都被使用GPG加密算法加密了,第一个根据提供的密码可以

  • Git 重命名操作

    截至目前,Tome和Jerry 都使用手动命令来编译自己的项目。Jerry 决定为他们的项目创建Makefile,并给予适当的名称来命名“string.c”文件。 [jerry@CentOSproject]$pwd/home/jerry/jerry_repo/project [jerry@CentOSproject]$lsREADMEsrc[jerry@CentOSproject]$cdsrc/ [jerry@CentOSsrc]$gitaddMakefile[jerry@CentOSsrc]$gitmvstring.cstring_operations.c [jerry@CentOSsrc]$gitstatus-sAMakefileRstring.c−>string_operations.c Git是显示R在文件之前名称来指示文件已更名。 对于提交操作Jerry使用 -a标志,这使得git提交自动检测修改过的文件。 [jerry@CentOSsrc]$gitcommit-a-m‘AddedMakefileandrenamedstrings.ctos

  • 我的博客目录

    我的博客目录  Python基础: 1、Pycharm使用激活补丁永久激活+汉化 2、安装python第三方库 3、PyCharm常用习惯设置 4、Pycharm默认快捷键 5、os.path模块常用方法详解 6、random的高级玩法 7、*args,**args的详细用法 8、json.dumps()和json.loads()、json.dump()和json.load()的区分 9、利用pandas处理Excel数据 10、zip函数的使用 11、自定义文件模板 12、基本数据类型 13、函数递归调用 14、文件操作 15、迭代器、生成器 16、内置函数(mapfilterreducelambda) 17、Python基础练习题 Python爬虫: 1、Requests库的基本使用 2、正则表达式与re模块 3、BeautifulSoup网页解析库 4、PyQuery解析库 5、selenium基础用法     前端开发-HMTL 1、【Python全栈-HTML】HTML入门 2、HTML如何做出分割线效果 3、HTML<!--...-

  • 交换两个整型变量的数值,

    #include<stdio.h> intmain(){ intswap(int*p,int*q);//声明swap函数 inta,b;//定义了两个整型变量 scanf("%d%d",&a,&b);//用输入函数输入两个整型变量 int*p,*q;//定义两个指针变量p=&a; q=&b;//把指针p,q分别指向a,b swap(p,q);//调用一个swap函数 printf("%d%d\n",*p,*q);//输出a,b交换后的值 return0; } intswap(int*p,int*q)//定义一个swap函数{ intt; t=*p; *p=*q; *q=t;//让*p,*q完成交换 }复制 总结;不是特别明白还是,希望老师可以讲的慢一些,我在朋友的帮助下才整明白复制   #include<stdio.h> intmain() { intswap(int*p,int*q); inta,b; scanf("%d%d",&a,&b); int*p,*q; p=&a; q=&

  • 链表的基本操作(Basic Operations on a Linked List)

    链表可以进行如下操作: 创建新链表 增加新元素 遍历链表 打印链表 下面定义了对应以上操作的基本函数。 创建新链表 新链表创建之后里面并没有任何元素,我们要为数据在内存中分配节点,再将节点插入链表。由于这个链表只有一个节点,它所指向的下一个节点为NULL。 /* Definingafunctiontocreateanewlist. Thereturntypeofthefunctionisstructnode,becausewewillreturntheheadnode Theparameterswillbethenode,passedfromthemainfunction. Thesecondparameterwillbethedataelement. */ structnode*createList(structnode*head,intnumber) { //creatingatemporarynodeforourinitializationpurpose //thebelowlineallocatesaspaceinmemorythatcanholdthedatainano

  • linux 系统资源查看命令

    缓存和缓冲的区别 缓存(cache)是用来加载数据从磁盘中“读取”, 缓冲(buffer)是用来加载数据“写入”硬盘的。   vmstat:vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。 free:用于显示内存状态。显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。 cat/proc/cpuinfo:查看cpu内存 uptime:相当于top命令的第一行 uname[选项]:查看系统内核  (-a:查看系统所有相关的信息 ;-r:查看内核版本;-s:查看内核名称) file/bin/ls:可查看系统的操作位数 (64/32) lsof|more:查看系统中所有进程调用的文件 lsof/sbin/init:查询某个文件被那个进程调用 (文件只能是系统创建的,比如init) lsof-chttpd:查看httpd进程调用了那些文件 lsof-uroot:按用户名,查询某个

  • Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是JavaWeb的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已,Spring的加载过程相对是不太透明的,不太好去找加载的代码入口。 下面有很简单的一段代码可以作为Spring代码加载的入口: 1 2 ApplicationContextac=newClassPathXmlApplicationContext("spring.xml"); ac.getBean(XXX.class); ClassPathXmlApplicationContext用于加载CLASSPATH下的Spring配置文件,可以看到,第二行就已经可以获取到Bean的实例了,那么必然第一行就已经完成了对所有Bean实例的加载,因此可以通过ClassPathXmlApplicationContext作为入口。为了后面便于代码阅读,先给出一下ClassPathXmlApplicationContext这个类的继承关系: 大致的继承关系是如上图所示的,由于

  • Windows启动项更改

    笔者遇到的问题: 之前新装了Windows10系统,但没注意到的是竟然是deepin和Windows10双系统,一是用不到deepin系统,二是占用C盘空间太多,就重新装回了Windows7系统,但重装后启动页面只有deepin和windows10两个系统的启动选项,并没有windows7的启动选项 解决办法: 启动时进入主板页面,选择启动菜单,选择高级,对启动选项进行更改即可,注意:一定要保存后退出。

  • 字符串匹配和KMP模式匹配(没太学懂,暂时不写)

    //字符串匹配 intstringMatching(stringlongstr,stringsmallstr){ intlLen=longstr.size(),sLen=smallstr.size(); for(inti=0;i<lLen-sLen;++i){ for(intj=0;j<sLen;++j){ if(longstr[i+j]!=smallstr[j]){ break; } if(j==sLen-1)//代表所有字符都匹配上了 returni;//返回长字符串中的匹配起始位置 } } return-1;//代表没找到 } intmain() { stringlongstr,smallstr; cin>>longstr; fflush(stdin);//清空缓冲区,主要是清除输入第一个字符串后的回车符号 cin>>smallstr; intposition=stringMatching(longstr,smallstr); if(position!=-1){ cout<&

  • poj 3581 -- 后缀数组

    #include<iostream> #include<algorithm> usingnamespacestd; #definelllonglong constintN=2e5+10; intnn,k; intrank1[N*2]; inttemp[N*2]; inta[N]; intsa[N*2]; intrev[N*2]; boolcompare_sa(inti,intj) { if(rank1[i]!=rank1[j]) returnrank1[i]<rank1[j]; else { intri=i+k<=nn?rank1[i+k]:-1; intrj=j+k<=nn?rank1[j+k]:-1; returnri<rj; } } voidconstruct_sa(int*S,intn,int*sa) { //intn=S.length(); for(inti=0;i<=n;i++) { sa[i]=i; rank1[i]=i<n?S[i]:-1; } for(k=1;k<=n;k*=2) { sort(sa,s

  • 结队项目:自动生成小学四则运算题目(带有GUI功能)

    结队项目:自动生成小学四则运算题目(带有GUI功能)   一、Github项目地址(合作人:黄煜淇、郭沛)   https://github.com/huange7/arithmetic 二、题目叙述 2.1题目数字以及运算符要求: 真分数:1/2,1/3,2/3,1/4,1’1/2,…。 自然数:0,1,2,…。 运算符:+,−,×,÷。 括号:(,)。 等号:=。 分隔符:空格(用于四则运算符和等号前后)。 算术表达式:     e=n|e1 +e2 |e1 −e2 |e1 ×e2 |e1 ÷e2 |(e),     其中e,e1和e2为表达式,n为自然数或真分数。 四则运算题目:e=,其中e为算术表达式。  2.2生成题目具体操作过程及格式: 使用-n参数控制生成题目的个数,例如:Myapp.exe-n10 将生成10个题目。 使用-r参数控制题目中数值(自然数、真分数和真分数分母)的范围,例如:Myapp.exe-r10 将生成10以内(不包括

  • java向下递归,构造树形结构

        代码逻辑如下: //xxx组织机构树形列表方法 publicList<Organization>xxxTreeOrg(xxxxx){ //所有的组织机构list   List<Organization>allOrganizationList=xxxDao.findAllOrgList(); //所有一级组织机构List   List<Organization>oneOrganizationList=xxxDao.findOneOrgList();   for(OrganizationoneOrganization:oneOrganizationList){   oneOrganization.setChild(doOrgIterator(oneOrganization,allOrganizationList));   }  returnoneOrganizationList; } //向下递归的方法 privateList<Organization>doOrgIterator(Organizatio

相关推荐

推荐阅读