我已经为项目使用clamAV签名数据库对病毒扫描程序进行了编码。为了提高速度,我使用线程。(组合框和等待)我的代码如何工作:
它读取文件夹和子文件夹中的所有文件
function recursive_files()
{
files=$(find $folder_path -type f)
for f in $files
do
raw_and_scan "$f" &
done
wait
}
正如您所看到的,每个文件都有一个线程。
function raw_and_scan()
{
raw_test_file $1
read_signature_db_by_line $1
}
阅读签名(_S)。。读取签名数据库的每一行
function read_signature_db_by_line()
{
cat $signature_path | (while read LINE ; do
stringtokenizer_line_db $LINE $1 $raw_file &
done
wait
) }
正如您所看到的,对于DB的每一行都有一个线程。
我做双线程实现是因为我看到了巨大的性能(使用时间基准)
当我用50行扫描50个文件到数据库中时。它运行良好。
但当我扫描我的主文件夹(800个文件)时,它不起作用,更糟糕的是,我收到了警告(不能再分叉()),我的电脑冻结了,它需要重新启动。
我观察这个过程(htop),直到它完成5000个任务。
你可以提交我的项目https://github.com/peondusud/Bash.antivir
最后,我要用数据库扫描文件夹65000行。
如果你有任何限制线程或类似的想法。
谢谢。
您看到从一个进程(而不是线程)到两个进程的巨大改进,这并不意味着您将使用5000个进程实现超快的速度!事实上恰恰相反——如果你计划让进程做密集的工作,你应该把它限制在系统中的cpu核心数量的2*以内(这是一个通用的经验法则)