在bash中,使用后台任务来实现任务的“多进程化”。在不加控制的模式下,不管有多少任务,全部都后台执行。也就是说,在这种情况下,有多少任务就有多少“进程”在同时执行。我们就先实现第一种情况:
实例一:正常情况脚本
———————————————————————————–
#!/bin/bash
for ((i=0;i<5;i++));do
{
sleep 1;echo 1>>aa && echo ”done!”
}
done
cat aa|wc -l
rm aa
———————————————————————————–
这种情况下,程序顺序执行,每个循环3s,共需15s左右。
$ time bash test.sh
done!
done!
done!
done!
done!
5
real 0m15.030s
user 0m0.002s
sys 0m0.003s
实例二:“多进程”实现
———————————————————————————–
#!/bin/bash
for ((i=0;i<5;i++));do
{
sleep 3;echo 1>>aa && echo ”done!”
} &
done
wait
cat aa|wc -l
rm aa
———————————————————————————–
这个实例实际上就在上面基础上多加了一个后台执行&符号,此时应该是5个循环任务并发执行,最后需要3s左右时间。
$ time bash test.sh
done!
done!
done!
done!
done!
5
real 0m3.011s
user 0m0.002s
sys 0m0.004s
效果非常明显。
这里需要说明一下wait的左右。wait是等待前面的后台任务全部完成才往下执行,否则程序本身是不会等待的,这样对后面依赖前面任务结果的命令来说就可能出错。例如上面wc -l的命令就报错:不存在aa这个文件。
以上所讲的实例都是进程数目不可控制的情况,下面描述如何准确控制并发的进程数目。
——————————————————————————————————————
#!/bin/bash
# 2006-7-12, by wwy
#———————————————————————————–
# 此例子说明了一种用wait、read命令模拟多线程的一种技巧
# 此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况
# 还说明了多线程的控制
#———————————————————————————–
function a_sub { # 此处定义一个函数,作为一个线程(子进程)
sleep 3 # 线程的作用是sleep 3s
}
tmp_fifofile=”/tmp/$.fifo”
mkfifo $tmp_fifofile # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile # 将fd6指向fifo类型
rm $tmp_fifofile
thread=15 # 此处定义线程数
for ((i=0;i<$thread;i++));do
echo
done >&6 # 事实上就是在fd6中放置了$thread个回车符
for ((i=0;i<50;i++));do # 50次循环,可以理解为50个主机,或其他
read -u6
# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
{ # 此处子进程开始执行,被放到后台
a_sub && { # 此处可以用来判断子进程的逻辑
echo ”a_sub is finished”
} || {
echo ”sub error”
}
echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
} &
done
wait # 等待所有的后台子进程结束
exec 6>&- # 关闭df6
exit 0
——————————————————————————————————————
sleep 3s,线程数为15,一共循环50次,所以,此脚本一共的执行时间大约为12秒
即:
15×3=45, 所以 3 x 3s = 9s
(50-45=5)<15, 所以 1 x 3s = 3s
所以 9s + 3s = 12s
$ time ./multithread.sh >/dev/null
real 0m12.025s
user 0m0.020s
sys 0m0.064s
而当不使用多线程技巧的时候,执行时间为:50 x 3s = 150s。
此程序中的命令 mkfifo tmpfile和linux中的命令 mknod tmpfile p效果相同。
区别是mkfifo为POSIX标准,因此推荐使用它。该命令创建了一个先入先出的管道文件,并为其分配文件标志符6。管道文件是进程之间通信的一种方式,注意这一句很重要
exec 6<>$tmp_fifofile # 将fd6指向fifo类型
如果没有这句,在向文件$tmp_fifofile或者&6写入数据时,程序会被阻塞,直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在程序运行期间不断向fifo类型的文件写入数据而不会阻塞,并且数据会被保存下来以供read程序读出
相关推荐
在多进程并发执行中,操作系统通过时间片分配机制来实现对CPU资源的有效利用。这意味着每个进程只能获得有限的CPU时间,然后必须将CPU让给其他进程,这个过程不断循环,直到所有进程都执行完毕或达到某种终止条件。 ...
总结起来,虽然Shell本身不支持多线程,但我们可以通过FIFO文件和进程间的通信来模拟多线程行为,实现批量处理任务,例如在当前目录下批量插入MySQL数据库。这种方法在处理大量并发任务时非常有用,提高了工作效率。
操作系统课程设计中的进程并发是一个重要的学习主题,它涵盖了操作系统如何管理和调度多个同时运行的程序,以实现系统的高效利用。在本课程设计中,学生将深入理解进程的基本概念、创建、同步与通信,以及死锁等问题...
在IT领域,Shell脚本是Linux/Unix系统中...总结来说,Shell脚本实现多线程主要是通过后台运行命令或创建子进程来模拟并发执行,适用于简单的任务调度和自动化场景。而实际的多线程编程则需要借助其他更强大的编程语言。
在Linux服务器上,可以利用shell脚本启动多个PHP进程来模拟多线程并发。通过`&`符号可以在后台运行命令,使得每次循环都会创建一个新的PHP进程: ```bash #!/bin/bash for i in {1..10} do php -q test.php & done...
Linux shell是操作系统提供的一个命令解释器,用户通过输入命令来执行操作,如文件管理、进程控制等。仿Linux shell命令的邮箱客户端,意味着它会提供相似的命令语法,让用户可以像操作文件系统一样操作邮箱,比如...
9. **多线程**:在某些高级实现中,Shell可能会使用多线程来并发处理多个命令。这需要了解Windows下的线程API,如`CreateThread`。 10. **测试与调试**:完成Shell后,需要编写测试用例以确保其正确性,同时掌握...
通过多进程,我们可以实现并发执行,提高系统资源利用率。例如,一个服务器程序可能需要同时处理多个客户端请求,这时就可以创建多个子进程来处理。 5. 多线程编程: 相比于多进程,多线程在同一进程中创建多个...
本文介绍了一种结合shell脚本来实现PHP多线程的方法,这在处理一些需要并发执行的任务时非常有用,比如批量数据处理、文件下载等。 首先,我们来看一个简单的PHP脚本(test.php): ```php for ($i = 0; $i ; $i+...
在Shell中,我们可以通过模拟多线程的行为来达到类似的效果。这个解决方案的核心在于创建一个主脚本(如`jobs.sh`),它负责调度子脚本(如`job_1`至`job_100`)的执行。 在给出的示例中,`jobs.sh`是主脚本,它...
在Linux环境中,由于Shell本身并不支持真正的多线程编程,我们通常通过巧妙的利用管道(pipe)和重定向等机制来模拟多线程的效果。上述脚本就是通过创建FIFO(命名管道)来实现这一目的。下面将详细解析这段脚本的...
Linux提供`nohup`、`screen`或`tmux`等工具来后台运行进程,而多线程或多进程编程(如Python的`multiprocessing`模块)则可以在单个系统上同时执行多个用例。 10. **性能测试**:Linux还提供了诸如`stress`、`ab`...
理解Linux的文件系统、进程管理、权限模型以及shell脚本编写是进行此类开发的基础。 2. **C语言**:C语言是这个项目的主要编程语言,它允许低级别的内存管理和系统调用,适合进行系统级编程。开发者需要掌握指针...
并发执行是指在同一时间段内,多个进程交替执行,但由于执行速度快,给人的感觉就像是同时执行一样。实现并发执行的关键技术是**时间片轮转**和**多路复用**。 - **时间片轮转**:操作系统将CPU时间划分成一系列小...
线程是进程中执行的单一顺序控制流,轻量级进程,共享进程资源,能并发执行。 【Linux进程结构】 Linux进程由正文段(代码)、用户数据段(数据、堆)和系统数据段(PCB)组成。 【Vi编辑器】 Vi编辑器有命令模式...
- 探索Linux线程/进程编程,理解并发执行的机制。 - 学习Linux网络编程,实现网络通信功能。 - 熟悉Linux QT编程,以及在不同平台上的移植技术。 - 开始接触Linux内核编程,理解内核工作原理。 - 学习Linux驱动...
首先,C/M/S模型是Concurrent Multitasking/Message Passing System(并发多任务/消息传递系统)的缩写,它是UNIX和Linux操作系统中常见的进程通信机制。在这个模型中,C代表客户(Client),M代表中间人...
- `-P 2`设置并发连接数为2,可以模拟多线程或多进程传输,更好地反映实际环境中的性能。 通过这个脚本,你可以获取到网络的带宽和吞吐量信息,这对于诊断网络瓶颈、优化网络配置或者监控网络性能都是很有帮助的。...
这部分实验涉及进程的管理和控制,包括进程同步、互斥、调度等概念,学生将通过编程实现这些功能,加深对操作系统中并发执行的理解。 实验五:进程间通信 实验五重点在于进程间的通信机制,如信号量、消息队列等,...