我在我的应用程序之前,使用线程,并且知道它的概念很好,但最近在我的操作系统讲座中,我通过fork出来()。 这是类似的东西线程。
我的google搜索的区别两者之间,我才知道:
- 叉只不过是一个新的工艺,看起来酷似老或父进程,但仍然是一个不同的过程用不同的进程ID,并有它自己的内存。
- 线程是轻量级进程其具有较少的开销
但是,仍然有在我脑海中的一些问题。
- 当你应该更喜欢叉()在线程和副诗句?
- 如果我要调用外部应用程序作为一个孩子,那么我应该使用fork()或线程做呢?
- 虽然这样做谷歌搜索,我发现人们说这是坏事调用fork()的线程中。 人们为什么要调用fork()的线程内,当他们做类似的事情?
- 这是真的,叉()不能充分利用多处理器系统中,因为父子进程不会同时运行?
分叉和线程方法之间的主要区别是操作系统体系结构中的一个。 早在当Unix的设计时代,分叉是一个容易的,简单的系统,最好的回答大型机和服务器类型的需求,因此它是普及的Unix系统。 当微软重新设计的从零开始的NT内核,它更侧重于线程模型。 因此今天还有与Unix系统是高效与派生,和Windows使用线程更高效的一个显着的区别。 你可以最明显的是看到这个阿帕奇它使用Unix上的prefork的策略,和线程池在Windows上。
具体到你的问题:
当你应该更喜欢叉()在线程和副诗句?
在Unix系统中,你正在做的不仅仅是实例化一个工人,或者你想单独进程的隐式安全沙箱一个更为复杂的任务。
如果我要调用外部应用程序作为一个孩子,那么我应该使用fork()或线程做呢?
如果孩子会做相同的任务交给了父母,具有相同的代码,用叉子。 对于较小的子任务使用线程。 对于单独的外部进程都不使用,只是叫他们用正确的API调用。
虽然这样做谷歌搜索,我发现人们说这是坏事调用fork()的线程中。 人们为什么要调用fork()的线程内,当他们做类似的事情?
不能完全肯定,但我认为这是计算上相当昂贵的复制过程和大量的子线程的。
这是真的,叉()不能充分利用多处理器系统中,因为父子进程不会同时运行?
这是假的,叉创建一个新的进程,然后需要的可在操作系统任务调度程序的所有功能。
A forked process is called a heavy-weight process, whereas a threaded process is called light-weight process.
The following are the difference between them:
- A forked process is considered a child process whereas a threaded process is called a sibling.
- Forked process shares no resource like code, data, stack etc with the parent process whereas a threaded process can share code but has its own stack.
- Process switching requires the help of OS but thread switching it is not required
- Creating multiple processes is a resource intensive task whereas creating multiple thread is less resource intensive task
- Each process can run independently whereas one thread can read/write another threads data.
Thread and process lecture
fork()
派生过程中的新副本,因为你已经注意到。 什么是不上面提到的是exec()
经常如下调用。 这个替换为新的过程(一个新的可执行文件),因此,现有工艺fork()
/ exec()
是从旧一个产生一个新的进程的标准手段。
例如,这是怎么你的shell会在命令行中调用一个过程。 您指定的过程( ls
,说)和外壳叉,然后高管ls
。
请注意,这个工作在从线程一个非常不同的级别。 线程运行执行过程内的多条线。 分岔是创建新进程的一种手段。