该文章转载于:

android用memtester内存压力测试_W歹匕示申W的博客-CSDN博客

Android内存压力测试工具(memtester移植)_甜牛奶蛋糕的博客-CSDN博客_android 内存压力测试

DRR参考配置OK之后,首先需要的是对DDR进行压力测试保证DDR的稳定性,否则DDR出问题之后,很容易引起奇奇怪怪的问题,很难分析问题原因

memtester说明:

memtester主要用于测试内存稳定性
官网:https://pyropus.ca./software/memtester/old-versions/
版本:memtester-4.3.0.tar.gz(目前最新版本-2018.10.21)
官方已经预编译了大部分Linux系统的二进制文件,可以直接使用,现在我们将它移植到Android系统中。

移植

首先我们看看Makefile文件它在Linux系统是怎么编译的,这里移植memtester-4.3.0.tar.gz压缩包里的文件不需要任何修改。

memtester: \
$(OBJECTS) memtester.c tests.h tests.c tests.h conf-cc Makefile load extra-libs./load memtester tests.o `cat extra-libs`

从上面的Makefile可以知道,要编译memtester需要编译memtester.c和tests.c以及相关的头文件,所以我们可以写出下面的Android.mk文件。

​LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := memtester.c tests.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_MODULE := memtester
include $(BUILD_EXECUTABLE)

memtester-4.3.0.tar.gz解压到system/core/目录下,并命名为memtester目录,并把Android.mk放到同一目录。文件如下显示。

~/project$ tar -zxvf memtester-4.3.0.tar.gz -C AndroidO_8827LGO_20181207/system/core/
~/project$ cd AndroidO_8827LGO_20181207/system/core/memtester
~/project/AndroidO_8827LGO_20181207/system/core/memtester$tree
.
├── Android.mk
├── BUGS
├── CHANGELOG
├── conf-cc
├── conf-ld
├── COPYING
├── extra-libs.sh
├── find-systype.sh
├── make-compile.sh
├── Makefile
├── make-load.sh
├── make-makelib.sh
├── memtester.8
├── memtester.c
├── memtester.h
├── README
├── README.tests
├── sizes.h
├── tests.c
├── tests.h
├── trycpp.c
├── types.h
└── warn-auto.sh

先编译成模块进行测试:

~/project/AndroidO_8827LGO_20181207/system/core/memtester$ mm -j8
........
5 warnings generated.
[100% 6/6] Install: out/target/product/petrel-p1/system/bin/memtester
make: Leaving directory '/home/lemon/Develop/OrangePi_Lite2/android'#### make completed successfully ####

然后就可以通过

adb push memtester /system/bin/
adb shell "chmod 777 /system/bin/memtester"
adb shell memtester 

最后添加到device.mk中,系统全编译时打包到系统,所以还需要在device.mk里面进行定义

PRODUCT_PACKAGES += memtester

测试

使用方法:Usage: memtester [-p physaddrbase [-d device]] [B|K|M|G] [loops],比如memtester 5M 1,对应测试1次5M内存

PS C:\Users\zhaojr\Documents\adb> ./adb root
adbd is already running as root
PS C:\Users\zhaojr\Documents\adb> ./adb remount
remount succeeded
PS C:\Users\zhaojr\Documents\adb> ./adb shell
8227LGO_demo:/ # memtester
memtester version 4.3.0 (32-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).pagesize is 4096
pagesizemask is 0xfffff000
need memory argument, in MBUsage: memtester [-p physaddrbase [-d device]] <mem>[B|K|M|G] [loops]

查看系统空闲内存,还有251M

8227LGO_demo:/ # free -h
free -htotal        used        free      shared     buffers
Mem:             443M        432M         11M        328K        576K
-/+ buffers/cache:           431M         12M
Swap:            329M         73M        256M
8227LGO_demo:/ #

演示:memtester 5M 1,这里只是演示,测试1次5M内存,实际项目中这两个参数应尽可能大,才能覆盖整块内存,才能达到压力测试的结果,测试时失败有相应的log,我这里比较难复现就不贴了。

8227LGO_demo:/ # memtester 5M 1
memtester version 4.3.0 (32-bit)
Copyright (C) 2001-2012 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).pagesize is 4096
pagesizemask is 0xfffff000
want 5MB (5242880 bytes)
got 5MB (5242880 bytes), trying mlock ...locked.
Loop 1/1:Stuck Address : ok         Random Value : okCompare XOR : okCompare SUB : okCompare MUL : okCompare DIV : okCompare OR : okCompare AND : okSequential Increment: okSolid Bits : ok         Block Sequential : ok         Checkerboard : ok         Bit Spread : ok         Bit Flip : ok         Walking Ones : ok         Walking Zeroes : ok         Done.
8227LGO_demo:/ #

Android APK的应用

主文件:
package com.example.ddr;import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;public class MainActivity extends Activity {
private static final String TAG = null;
private static TextView test_result = null;
static String test_setText = "";
static int Testing_times = 0;
String asdddd1 = "screencap -p /sdcard/screen1.png";
String asdddd2 = "screencap -p /sdcard/screen2.png";
String dir = "/data/data/com.example.ddr/files/";
Context ctxDealFile = null;
String oldPath1 = "file:///android_asset/memtester";
String oldPath2 = "file:///memtester";
String newPath1 = Environment.getRootDirectory().getPath();//"system/";//"system/bin/";
String MemtesterFileName = "/data/memtester_result.txt";
String simpleMemtester_1 = "memtester -b -g -f 1190400--1190400 64M 1";
String complexMemtester_1 = "memtester -b -j 0 -k 4 -g -l 40 -a 64M";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);test_result = (TextView)findViewById(R.id.Memtester_01);System.out.println("csh ddr star");Memtester(simpleMemtester_1);Memtester(complexMemtester_1);//ReadTxtFile(MemtesterFileName);//copyFile(oldPath2,newPath1);/*String uiFileName = "memtester";try {
ctxDealFile = this.createPackageContext("com.example.ddr",
Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
deepFile(ctxDealFile, uiFileName);*/}public void deepFile(Context ctxDealFile, String path) {
try {
String str[] = ctxDealFile.getAssets().list(path);
if (str.length > 0) {
System.out.println("csh deepFile 1");
File file = new File("/system/" + path);
file.mkdirs();
for (String string : str) {
path = path + "/" + string;
System.out.println("zhoulc:\t" + path);
// textView.setText(textView.getText()+"\t"+path+"\t");
deepFile(ctxDealFile, path);
path = path.substring(0, path.lastIndexOf('/'));
}
} else {
System.out.println("csh deepFile 2");
InputStream is = ctxDealFile.getAssets().open(path);
//FileOutputStream fos = new FileOutputStream(new File(getFilesDir().getAbsolutePath()+"/memtester"));
FileOutputStream fos = ctxDealFile.openFileOutput(path,
ctxDealFile.MODE_WORLD_READABLE |ctxDealFile.MODE_WORLD_WRITEABLE);
byte[] buffer = new byte[1024];
int count = 0;
while (true) {
count++;
int len = is.read(buffer);
if (len == -1) {
break;
}
fos.write(buffer, 0, len);
}
is.close();
fos.close();}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Process p;
Process p2;
try {
p = Runtime.getRuntime().exec("chmod 777 " + dir + path);
p.waitFor();
p2 = Runtime.getRuntime().exec("cp /data/data/com.example.ddr/files/memtester > /data/data/com.example.ddr/files/memtester2");
p2.waitFor();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}public void  Memtester(String command){Runtime r = Runtime.getRuntime();Process p;Testing_times ++;try {p = r.exec(command);BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));String inline;while ((inline = br.readLine()) != null) {System.out.println(inline);}br.close();
p.waitFor();
ReadTxtFile(MemtesterFileName);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*public void  Memtester2(String command){DataOutputStream os = null;Process p;try{p =Runtime.getRuntime().exec(isRoot?COMMAND_SU:COMMAND_SH);os = new DataOutputStream(p.getOutputStream());for (String command:commands){if(command==null){continue;}//donnotuseos.writeBytes(commmand),avoidchinesecharseterroros.write(command.getBytes());os.writeBytes(COMMAND_LINE_END);os.flush();try{}catch(Exception e){e.printStackTrace();}}*/public static String ReadTxtFile(String strFilePath){String path = strFilePath;String content = "";File file = new File(path);if (file.isDirectory()){Log.d("TestFile", "The File doesn't not exist.");}else{try {InputStream instream = new FileInputStream(file); if (instream != null) {InputStreamReader inputreader = new InputStreamReader(instream);BufferedReader buffreader = new BufferedReader(inputreader);String line;while (( line = buffreader.readLine()) != null) {content += line + "\n";//if(inline.equals("SUCCESS")){if(line.indexOf("SUCCESS")!=-1){test_setText += Testing_times + " : " + "SUCCESS \n";test_result.setText(test_setText);}else{test_setText += Testing_times + " : " + "FAIL \n";test_result.setText(test_setText);}}                instream.close();}}catch (java.io.FileNotFoundException e) {Log.d("TestFile", "The File doesn't not exist.");} catch (IOException e) {Log.d("TestFile", e.getMessage());}}return content;}    /*private void simpleMemtester(){Log.d(TAG, "do simple memory test");openCmdList1.clear();try {openCmdList1.add("memtester -b -g -f 1190400--1190400 64M 1");exec(openCmdList1);memoryTestResult();} catch (Exception e) {e.printStackTrace();}}private void complexMemtester(){Log.d(TAG, "do complex memory test");openCmdList1.clear();try {openCmdList1.add("memtester -b -j 0 -k 4 -g -l 40 -a 64M");exec(openCmdList1);memoryTestResult();} catch (Exception e) {e.printStackTrace();}}*/@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

APK预置到代码里面给个系统权限:

Android.mkLOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := ddr
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))配置文件配置手机UID权限:<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.memtester_ckt"android:versionCode="1"android:versionName="1.0"
android:sharedUserId="android.uid.system"><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="21" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

把文件用android代码预置到手机system/bin下面,也就给手机配置了脚本环境:

CSH_DDR_PATH := packages/apps/ddr/assets
PRODUCT_COPY_FILES := $(CSH_DDR_PATH)/memtester:system/bin/memtester $(PRODUCT_COPY_FILES)

linux嵌入式环境下的使用:

#!/bin/sh# Memory Tester Scripts
# by KaKa
# version = date
VERSION="Fri Oct 19 11:56:57 CST 2007"
# trap for irruptions
MEMTESTER=${PWD}/memtester
PPIDKILL=$$
SIDKILL=$$
trap "pkill -9 -P ${PPIDKILL};kill -9 $$" INT
trap "pkill -9 -P ${PPIDKILL};kill -9 $$" KILL
cat <<-EOF_vpps >&2
Version: ${VERSION}
PID: $$
PPIDKILL: ${PPIDKILL}
SIDKILL: ${PPIDKILL}
EOF_vpps
CORE_NUM=$(grep -i ^processor /proc/cpuinfo|wc -l)
MEMTESTERCOPY=${CORE_NUM}
MEM_TOTAL_K=$(awk '/^MemTotal/{print $2}'  /proc/meminfo)
MEM_RESERVE_PERCENTAGE=$((1000*50/1024))
MEM_RESERVED=$((MEM_TOTAL_K/1024*MEM_RESERVE_PERCENTAGE/1000))
MEM_TOTAL_TOBETESTED=$((MEM_TOTAL_K/1024-MEM_RESERVED))
MEM_PER_COPY=$((MEM_TOTAL_TOBETESTED/MEMTESTERCOPY))
RUN_DURATION_TIME=0
RUN_LOOPS=-1
RUN_DURATION_TIME_FLAG=0
RUN_LOOPS_FLAG=0
DDPERCOPY_TIME=6s
LOGDIR=/tmp/memtester-log-${$}
mkdir -p ${LOGDIR}show_help () {cat <<HELPEOF >&2Version: ${VERSION}Usage: $(basename ${0})-r Directory: the root location of memtester binary file-c NUMBER: the copies of memtester should be run-m NUMBER: how many memory should be tested totally (in MB)-t TIME:   duration mode, how long will the tests go-l NUMBER: loops mode,how many loops will each memtester should goThe option -t and -l are exclusive, which means tests could workonly with   1. duration mode or 2. loops modeRUN 4 copies memtester with in 24 hours, to test total 4000 MB memory:$(basename ${0}) -t 24h -c 4 -m 4000RUN 2 copies memtester with in 1 hours, to test total 4000 MB memory:$(basename ${0}) -t 1h -c 4 -m 4000RUN 4 copies memtester with in 2 loops, to test total 3600 MB memory:$(basename ${0}) -l 2 -c 4 -m 3600-V/-h/-H: show this info.
HELPEOFexit 0
}while getopts :c:m:t:l:r:p:hHVvx OPTION
docase ${OPTION} inc)#echo "-c ${OPTARG}"MEMTESTERCOPY=${OPTARG};;m)#echo "-m ${OPTARG} MB"MEM_TOTAL_TOBETESTED=${OPTARG}MEM_RESERVED=$((MEM_TOTAL_K/1024-MEM_TOTAL_TOBETESTED));;t)#echo "-t ${OPTARG}"[ 0 -ne ${RUN_LOOPS_FLAG} ] && echo "-t and -l are exclusive." && exit 222RUN_DURATION_TIME=${OPTARG}RUN_DURATION_TIME_FLAG=1;;l)#echo "-l ${OPTARG}"[ 0 -ne ${RUN_DURATION_TIME_FLAG} ] && echo && echo "-t and -l are exclusive." && show_help && echo && exit 223RUN_LOOPS=${OPTARG};RUN_LOOPS_FLAG=1;;d)#echo "-r ${OPTARG}"MEMTESTER=${OPTARG}/memtester;;p)#echo "-p ${OPTARG}"MEMTESTER=${OPTARG};;V|h|H)show_help;;v)set -v;;x)set -x;;?)echo "Error...";echo "?Unknown args..."exit 224;;*)#echo "*Unknown args..."esac
done#exit
[ 0 -eq ${RUN_DURATION_TIME_FLAG} ] && [ 0 -eq ${RUN_LOOPS_FLAG} ] &&
echo && echo "Please specified which mode should we run... -t or -l" &&
show_help && echo && exit 225
MEM_PER_COPY=$((MEM_TOTAL_TOBETESTED/MEMTESTERCOPY))echo "Mem total: " $((MEM_TOTAL_K/1024)) MBecho "Core total: "${CORE_NUM}echo "Memtester copys: " ${MEMTESTERCOPY}echo "Mem per copy: "${MEM_PER_COPY}echo "Mem total to used: "${MEM_TOTAL_TOBETESTED} MBif [ ${MEM_RESERVED} -lt 1 ]; thenecho "Mem reserved: -- No more memory reserved..."else echo "Mem reserved: "${MEM_RESERVED} MBfi#exit# GOGOGOif [ 0 -ne ${RUN_DURATION_TIME_FLAG} ]; thenecho "Run within a duration: ${RUN_DURATION_TIME}"elif [ 0 -ne ${RUN_LOOPS_FLAG} ]; thenecho "Run within a loop: ${RUN_LOOPS}"fiecho "Working directory: " $PWDecho "Memtester: " ${MEMTESTER}echo "LOGs directory: " $LOGDIRechoecho -n "Jobs started at date: "date #+%Y/%m/%d\ %H:%Mecho#exit
########################
# Run testing within a duration time.if [ 0 -ne ${RUN_DURATION_TIME_FLAG} ]; then# prepareing the sleeping killerssleep ${RUN_DURATION_TIME}echo -n "End of testing(TIMEOUT)... "echo "KILL CHILD" && kill -9 $(pgrep -P ${PPIDKILL} memtester) && echo"Childen processes - KILLED."# attention to how the memtesters are forked...echo "KILL PARENT" && kill $$  && echo "KILLED." &echo "Finished the memtester"echo -n "Jobs finished at date: "date #+%Y/%m/%d\ %H:%Mfi &echo -n "Waiting (PID: $$) for ${MEMTESTERCOPY}memtesters(${MEM_PER_COPY}MB for each). "if [ 0 -ne ${RUN_DURATION_TIME_FLAG} ]; thenecho -n "For time: ${RUN_DURATION_TIME} "fiif [ 0 -ne ${RUN_LOOPS_FLAG} ]; thenecho -n "For loops: ${RUN_LOOPS} "fiecho "..."while truedoMEMTESTER_NUM=0echo -n "{"while [ ${MEMTESTER_NUM} -lt ${MEMTESTERCOPY} ]doecho -n " ${MEMTESTER_NUM} "if [ 0 -ne ${RUN_DURATION_TIME_FLAG} ]; thenRUN_LOOPS=0fi${MEMTESTER} ${MEM_PER_COPY} ${RUN_LOOPS} 2>&1 >> ${LOGDIR}/${MEMTESTER_NUM}.log &# set loops = 0 to make memtester run loop infinitely...# .pogo version will run only one loop by defaultsleep ${DDPERCOPY_TIME}MEMTESTER_NUM=$(expr $MEMTESTER_NUM + 1)doneecho -n "}"wait[ 0 -ne ${RUN_LOOPS_FLAG} ] && break# memtesters' loops...done
########################
echo
echo -n "End of testing(Excution ended)... "
pkill -9 -P ${PPIDKILL}
kill $$
echo "Finished the memtester"
echo -n "Jobs finished at date: "
date #+%Y/%m/%d\ %H:%M

运行这个脚本:

sh memory.sh -c <number> -l <number> -m <memory>

-c:运行几个memtester

-l:运行几次

-m:测试多大的内存,直接填测试总数即可,程序会自动分配个平均值给每个memtester,这样省去我们自己的计算,也不用多开几个终端了,单位MB,例如我有一个四核CPU,32G 内存的机器,就可以这样运行:

sh memory.sh -c 4 -l 1 -m 3100

大家可以看这个脚本中还可以限定时间,例如我想运行24个小时

sh memory.sh -t 24h -c 4 -m 3100

Android内存压力测试工具(memtester移植)相关推荐

  1. android内存压力测试,Android内存压力测试工具(memtester移植)

    标签: 环境 博主测试环境是在Android 7.0上,理论上不用任何修改就可以适合所有Android版本. memtester memtester主要用于测试内存稳定性 官网:http://pyro ...

  2. 内存正确性测试工具 memtester

    概述 之前有写博文(系统综合性能测试工具 lmbench )介绍的 lmbench,里面就有一个 bw_mem 可以用来测试 DDR 内存的带宽.这里准备介绍的 memtester 主要是为了测试 D ...

  3. android服务器压力测试工具,Android自动化压力测试图解教程——Monkey工具

    有时候我们需要对一个软件进行压力测试,检查该软件的性能.如果是人工进行测试的话,效率会低很多,而且会比较枯燥.这时,中的一个命令行工具Monkey就可以为我们减轻很多重复而又繁琐的工作. 一.Monk ...

  4. Linux下内存压力测试工具memtest(使用心得)

    这里写目录标题 前言 1. 下载memtest 2. 安装 3. 交叉编译 4. 执行测试 5. 如何确认物理地址? 6. 关于uboot重定位 前言 关于memtest的介绍,网上内容很多很多.感兴 ...

  5. linux下的CPU、内存、IO、网络的压力测试工具与方法

    一.CPU压力测试工具Super Pi forLinux Super PI是利用CPU的浮点运算能力来计算出π(圆周率),所以目前普遍被超频玩家用做测试系统稳定性和测试CPU计算完后特定位数圆周率所需 ...

  6. 内存测试工具memtester使用详解

    memtester的下载地址:http://pyropus.ca/software/memtester/  有源码安装包.deb包.rpm包等. 源码已经编译好,在linux下只要make一下就好了. ...

  7. android cpu 压力测试,两个古董级压力测试工具 leakyapp.exe 和 cpustre.exe

    两个古董级压力测试工具 leakyapp.exe 和 cpustre.exe,应该是在NT的 Windows Resource Kit Tools里面--连2000的里面都没有. Leakyapp.e ...

  8. android monkey压力测试(二)

    一.什么是Monkey 顾名思义,Monkey就是猴子,  Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试.  猴子什么都不懂, 只知道乱敲 通过Monkey程序模拟用户触摸屏幕.滑动T ...

  9. Android Monkey压力测试

    一. JAVA环境的搭建 安装jdk-8u151-windows-x64,可以到官网或者应用中心下载. JAVA环境变量的搭建: 在"我的电脑"-"属性"-&q ...

最新文章

  1. 马斯克遭“天劫”:40颗星链卫星葬身地磁风暴,数千万美元打了水漂
  2. MainService流程
  3. 深度学习表征的不合理有效性——从头开始构建图像搜索服务(一)
  4. 避免在 ASP.NET Core 3.0 中为启动类注入服务
  5. Wannafly挑战赛24 无限手套(生成函数)
  6. python requests库api_python利用requests库进行接口测试的方法详解
  7. 苹果发布会不够酷?库克又送来了 iOS 12.2!
  8. dfs-girlcat
  9. HP DV3 笔记本 重装系统
  10. Python常用的一些库(仅供参考)
  11. 从零开始的C++(操作符函数重载)
  12. 最新Oracle官网JDK 8.0的下载
  13. [jQuery.FQcomputer] 分期商城汇率计算器
  14. 剑指Offer —— 面试题(十六)
  15. VLAN 基础实验2:VLAN 应用Hybird接口
  16. matlab做二元garch m,多元garch模型的matlab程序如何运行?能否举例说明下啊,希望高手指点...
  17. firebase使用_这就是我希望在开始使用Firebase之前所要知道的
  18. 【二叉树】515. 在每个树行中找最大值
  19. 简单好用的树莓派磁盘空间管理工具
  20. Java多线程——生产者消费者问题

热门文章

  1. 2021年安全员-A证(山东省-2021版)最新解析及安全员-A证(山东省-2021版)实操考试视频
  2. K-means算法详解
  3. (WPF)360安全卫士界面设计
  4. 前缀树实现敏感词过滤
  5. 统计输入的10个字符中数字字符、空格字符、其他字符的个数。本题要求读入10个字符(不含回车)后以回车结束。
  6. linux 复制文件夹命令
  7. (C语言)实现函数逆序输出一组数据
  8. 华为watch 3 Pro和GT3 Pro的区别 哪个好
  9. html 画圆的阴影,CSS3(1)---圆角边框、边框阴影
  10. 文章:为什么软件开发方法论让你觉得糟糕