例如,在 OSX 上,它甚至小于 512k。
考虑到应用程序不使用递归并且不分配大量堆栈变量,是否有任何推荐的大小?
我知道这个问题太广泛了,它在很大程度上取决于使用情况,但仍然想问,因为我想知道这个庞大的数字背后是否有一些隐藏的/内部/系统原因。
我想知道,因为我打算在我的应用程序中将堆栈大小更改为 512 KiB - 这听起来仍然是一个巨大的数字,但它比 8MiB 小得多 - 并且会导致进程的虚拟内存显着减少,因为我有很多线程(I/O)。
我也知道这并没有什么坏处,这里有很好的解释:pthreads 的默认堆栈大小
当我运行时top -H,我看到我的多个mysql线程都具有相同的 PID。但是,在ps -eLf我看来,每个人都有不同的 PID:
ps -eLf
UID PID PPID LWP C NLWP STIME TTY TIME CMD
mysql 1424 1 1424 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1481 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1482 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1483 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1484 0 17 18:41 ? 00:00:00 /usr/sbin/mysqld
mysql 1424 1 1485 0 17 18:41 …Run Code Online (Sandbox Code Playgroud) 有什么方法可以在系统范围内make使用多线程(6 个线程在我的系统上是理想的),而不是仅仅添加-j6到命令行?那么,如果我跑了make,它的作用就和我在跑一样make -j6?我想要这个功能,因为我使用pacaur(我在 Arch 上)从 AUR 安装了很多包,所以我不直接运行 make 命令,但我仍然希望多线程更快地构建包。
我编写了一个 bash 脚本,格式如下:
#!/bin/bash
start=$(date +%s)
inFile="input.txt"
outFile="output.csv"
rm -f $inFile $outFile
while read line
do
-- Block of Commands
done < "$inFile"
end=$(date +%s)
runtime=$((end-start))
echo "Program has finished execution in $runtime seconds."
Run Code Online (Sandbox Code Playgroud)
该while循环将从读取$inFile,上线执行一些活动和转储结果$outFile。
由于$inFile有 3500 多行长,脚本完全执行需要 6-7 个小时。为了尽量减少这个时间,我计划在这个脚本中使用多线程或分叉。如果我创建 8 个子进程,$inFile将同时处理 8 行。
如何才能做到这一点?
我有一个从另一个应用程序调用的服务。以下是我正在调用的服务 URL -
http://www.betaservice.domain.host.com/web/hasChanged?ver=0
Run Code Online (Sandbox Code Playgroud)
我需要以多线程方式对我上面的服务 URL 进行一些负载测试,而不是一个一个依次调用。
bash shell 脚本有什么办法,我可以通过以多线程方式调用上面的服务 URL 来加载它吗?如果可能的话,我可以让 60-70 个线程非常快地并行调用上面的 URL 吗?
我有一个巨大的(我的意思是巨大的)文本文件,我将使用vim. 我可以使用两台不同的(debian)机器来处理它。
一种是双核,一种是八核。我的双核盒子上的单核比我的八核盒子上的单核快。
'vim' 是否以某种方式利用多线程来使我的工作在八核机器上运行得更快?
我正在使用 htop 并查看启动多个线程来搜索文件中文本的进程(rg),这是以下中的树视图htop:
PID Command
1019 |- rg 'search this'
1021 |- rg 'search this'
1022 |- rg 'search this'
1023 |- rg 'search this'
Run Code Online (Sandbox Code Playgroud)
为什么我会看到进程线程的 PID?我认为线程没有 PID,它们只是共享其父级的 PID。
在阅读 Linux 设备驱动程序时,我可以理解进程描述符(类型struct task_struct)包含有关特定任务的所有信息。进程描述符由slab分配器动态分配。
我想知道的是需要引入一个称为thread_info存储在堆栈底部的新结构(假设为 x86)。为什么这样做?
为什么不能将当前正在执行的任务地址 ( struct task_struct)的地址放入内核堆栈?
我的服务器一直在运行 Amazon Ec2 linux。我里面有一个 mongodb 服务器。mongodb 服务器一直在高负载下运行,不幸的是,我遇到了问题:/
众所周知,mongodb 为每个客户端连接创建新线程,这在以前工作得很好。我不知道为什么,但是 MongoDB 作为非特权用户(它在 mongod 用户下运行)不能在主机上创建超过 975 个连接。但是当我以 root 用户身份运行它时,它最多可以处理 20000 个连接(mongodb 内部限制)。但是,进一步的调查表明,问题不是 MongoDB 服务器,而是 linux 本身。
我找到了一个简单的程序,它检查最大连接数:
/* compile with: gcc -lpthread -o thread-limit thread-limit.c */
/* originally from: http://www.volano.com/linuxnotes.html */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define MAX_THREADS 100000
#define PTHREAD_STACK_MIN 1*1024*1024*1024
int i;
void run(void) {
sleep(60 * 60);
}
int main(int argc, char *argv[]) {
int rc = 0;
pthread_t thread[MAX_THREADS];
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setstacksize(&thread_attr, …Run Code Online (Sandbox Code Playgroud) 我正在运行一个集群,其中每个节点都有一个 Intel Xeon E5430。/proc/cpuinfo 报告 8 个内核。我在 Ubuntu 16.04LTS 上使用用 gcc ver 5.3.1 编译的 C/C++。
将我的工作分发到每个节点是很容易的部分。我的问题与在每个节点上运行的进程有关。如何创建 8 个并发线程并保证每个线程都在单独的核心上产生?
15 年前,当我使用 32 个处理器的 SGI 时,fork 命令采用一个整数参数,即物理处理器 ID。在 fork 或 threading 中是否有类似的调用将线程放置在物理核心上?
multithreading ×10
linux ×4
process ×2
shell-script ×2
bash ×1
c ×1
command-line ×1
compiling ×1
download ×1
kernel ×1
make ×1
osx ×1
parallelism ×1
pid ×1
stack ×1
vim ×1