将程序的不同部分分成不同的过程似乎(对我而言)制作一个更优雅的程序,而不仅仅是线程化所有东西.在什么情况下,让事情在线程上运行而不是将程序分成不同的进程是有意义的?我什么时候应该使用线程?
关于它们如何(或者如果)对单核和多核采取不同行为的任何事情也会有所帮助.
Java应用程序是否可以使用其名称(而不是其位置)以独立于平台的方式加载到单独的进程中?
我知道你可以通过...执行一个程序
Process process = Runtime.getRuntime().exec( COMMAND );
Run Code Online (Sandbox Code Playgroud)
...这种方法的主要问题是这种调用是特定于平台的.
理想情况下,我将方法包装成简单的方法......
EXECUTE.application( CLASS_TO_BE_EXECUTED );
Run Code Online (Sandbox Code Playgroud)
...并传入应用程序类的完全限定名称CLASS_TO_BE_EXECUTED.
我很困惑,但以下线程清除了我的疑虑:
但它从硬件角度解决了查询问题.我想知道这些硬件功能如何映射到软件?
显而易见的一点是MultiProcessor(= Mutlicpu)和MultiCore之间没有区别,除了多核中所有cpus都驻留在一个芯片(die)上,而在多处理器中,所有cpus都在它们自己的芯片上并连接在一起.
因此,mutlicore /多处理器系统能够在"同一时间"执行多个进程(firefox,mediaplayer,googletalk)(不同于在单个处理器系统上切换这些进程的上下文)对吗?
如果它是正确的.到目前为止我很清楚.但是当多线程出现时会出现混乱.
MultiThreading"用于"并行处理.对?
cpu中的多线程涉及哪些元素?图?对于我来说,利用并行处理两个独立任务的能力,CPU的要求应该是什么?
当人们说线程的上下文切换时.我真的不明白.因为如果它的上下文切换线程然后它不是并行处理.线程必须"同时执行".对?
我的多线程概念是:考虑使用单个cpu的系统.当进程上下文切换到firefox时.(假设)firefox的每个选项卡都是一个线程,所有线程都严格同时执行.不像一个线程已经执行了一段时间,然后又一个线程已经采取直到上下文切换时间到达.
如果我在无法处理线程的处理器上运行多线程软件会发生什么?我的意思是cpu如何处理这样的软件?
如果到目前为止一切都很好,现在问题是多少线?它必须受硬件限制,我想?如果硬件只支持2个线程,我在我的进程中启动10个线程.cpu如何处理它?优点缺点?从软件工程的角度来看,在开发将由各种系统中的用户使用的软件时,那么我如何决定是否应该进行多线程处理?如果是这样,有多少线程?
是否有可能只从运行的nginx进程中获取nginx使用的conf?
获取conf文件路径.有时会ps aux揭示它,有时它不会.它可能就像nginx: master process /usr/sbin/nginx(相同/proc/PID/cmdline)
nginx -V唯一的解决办法?我正在寻找名为"MyApp.exe"的进程,我想确保获得特定用户拥有的进程.
我使用以下代码获取进程列表:
Process[] processes = Process.GetProcessesByName("MyApp");
Run Code Online (Sandbox Code Playgroud)
这给了我一个进程列表,但是在Process类中似乎没有办法确定谁拥有该进程?有关如何做到这一点的任何想法?
我使用以下代码来触发iexplore进程.这是在一个简单的控制台应用程序中完成
public static void StartIExplorer()
{
var info = new ProcessStartInfo("iexplore");
info.UseShellExecute = false;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
string password = "password";
SecureString securePassword = new SecureString();
for (int i = 0; i < password.Length; i++)
securePassword.AppendChar(Convert.ToChar(password[i]));
info.UserName = "userName";
info.Password = securePassword;
info.Domain = "domain";
try
{
Process.Start(info);
}
catch (System.ComponentModel.Win32Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码抛出错误The system cannot find the file specified.运行时相同的代码而不指定用户凭据可以正常工作.我不确定为什么会抛出这个错误.
有人可以解释一下吗?
让我解释一下:我已经在Linux上开发了一个应用程序,它分叉并执行外部二进制文件并等待它完成.结果由fork +进程独有的shm文件传递.整个代码封装在一个类中.
现在我正在考虑线程化这个过程以加快速度.拥有许多不同的类函数实例,并行地(使用不同的参数)分叉和执行二进制文件,并使用自己独特的shm文件传递结果.
这个线程安全吗?如果我在一个线程中分叉,除了安全之外,还有什么我需要注意的吗?任何建议或帮助非常感谢!
据我所知,用户可以拥有一个进程,每个进程都有一个地址空间(包含有效的内存位置,这个进程可以参考).我知道进程可以调用系统调用并将参数传递给它,就像任何其他库函数一样.这似乎表明所有系统调用都是通过共享内存等进入进程地址空间.但也许,这只是一个错觉,因为在高级编程语言中,系统调用看起来像任何其他函数,当进程叫它.
但是,现在让我更进一步,更深入地分析引擎盖下发生的事情.编译器如何编译系统调用?它可能会将进程提供的系统调用名称和参数压入堆栈,然后将汇编指令说成"TRAP"或其他东西 - 基本上是用于调用软件中断的汇编指令.
该TRAP汇编指令由硬件执行,首先将模式位从用户切换到内核,然后将代码指针设置为说明中断服务程序的开始.从这一点开始,ISR在内核模式下执行,从堆栈中获取参数(这是可能的,因为内核可以访问任何内存位置,甚至是用户进程拥有的内存位置)并执行系统调用end放弃CPU,再次切换模式位,用户进程从停止的位置开始.
我的理解是否正确?
附上我理解的粗略图:

compiler-construction operating-system process interrupt system-calls
我希望有人可以解释如何让父母等待所有子进程完成后再继续fork之后.我有清理代码,我想运行,但子进程需要返回才能发生这种情况.
for (int id=0; id<n; id++) {
if (fork()==0) {
// Child
exit(0);
} else {
// Parent
...
}
...
}
Run Code Online (Sandbox Code Playgroud)