Unix下进程与线程的异同(linux进程和线程)
Unix操作系统是多任务操作系统,它支持使用多个进程和线程来有效地利用处理器。Unix下的进程与线程有各自的特点,并且有着明显的异同。
首先来看Unix下进程与线程的相同之处。他们被Unix操作系统中的调度器管理, 都有对应的PID,都具有资源的识别与拥有权,都支持内存的共享及拥有他们自己的独立的地址空间和系统调用环境。
从Unix操作系统的角度来看二者有明显的不同之处。从角度来看,进程是一个全局性的实体,线程是进程的子实体。Unix下的进程是一个运行在内存中的程序,它占用着独立的地址空间;而线程则是进程中的控制块,它共享着父进程地址空间,而且可以在一个进程中创建多个线程,同时一个进程只有一个线程也是支持的。
从性能角度来看,由于进程的复杂的地址空间切换,系统开销会比较大,进程开销会更大,线程拥有较低的创建开销,比较容易处理,因此在多处理器系统,它们能够实现更好的优势。
举个例子,Unix下的进程可以派生出子进程,子进程共享父进程的堆栈,代码和数据段,但是它们有各自的虚拟内存空间,而线程却是共享同一个虚拟内存空间,这就意味着Unix系统中的线程可以独立执行,而进程则不行,这也是UNIX解决多任务的重要依据。
下面以一段c语言代码来说明Unix下创建新的进程和线程的区别:
1 #include
2 #include
3 #include
4 #include
5
6 void *run(void *arg);
7
8 int main(int argc, char *argv[])
9 {
10 pid_t pid;
11 pthread_t tid;
12
13 // 创建一个子进程
14 pid = fork();
15 if (pid == 0) {
16 printf(“child process run!\n”);
17 }
18
19 // 创建一个线程
20 pthread_create(&tid, NULL, run, NULL);
21
22 while (1) {
23 sleep(1);
24 }
25
26 return 0;
27 }
28
29 void *run(void *arg)
30 {
31 printf(“thread run!\n”);
32 }
从上面的代码可以看出,Unix下创建新的进程使用fork()函数,线程则使用pthread_create()函数。
综上,Unix下的进程与线程有多个明显的异同,这些异同在不同方面都有重要意义。Unix操作系统可以高效地处理多任务,提高了系统的性能,这要归功于Unix下加入进程与线程这样的调度器。