进程和线程的区别分析

进程:有独立的进程地址空间。有独立的PCB进程控制块。
线程:有独立的PCB进程控制块。没有独立的进程地址空间。
在Linux下,线程是最小的执行单位。进程是最小分配资源单位,可看成只有一个线程的进程。区别在于是否共享地址空间。
当执行一个可执行文件a.out后产生进程,才有3G~4G进程地址空间,里面有PCB进程控制块。利用pthread_create()创建2个线程,最后会使得a.out进程变成线程,如下图所示。
在这里插入图片描述
查看线程号,Ubuntu系统下启动火狐浏览器,ps aux获取火狐浏览器进程ID号
在这里插入图片描述
获取线程号LWP。NLWP代表线程池,火狐浏览器一个进程有61个线程。

ps -Lf 进程id 

在这里插入图片描述
从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB在指向内存资源的三级页表是相同的。CPU会认为线程是进程,即一个进程有3个线程,此时抢占CPU的概率会更大一些。
进程:当执行一个可执行文件a.out后产生进程,产生0G~4G(Linux32位系统下可用虚拟地址)进程地址空间,3G到4G属于内核区,里面有PCB进程控制块,用于描述进程。
借助MMU使得虚拟地址映射到一片物理内存上。不同的进程的内核空间是借助MMU映射在同一块物理内存区域上,因为物理内存区域有能力存放不同的pcb(结构体)。
三级映射:进程PCB–>页目录(可以看出数组,首地址位于)。

循环创建N个子进程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

int main(int argc, char* argv[])
{
	int i;
	pid_t pid;

	for (i = 0; i < 5; i++) {
		if (fork() == 0)		//如果是子进程就跳出 
			break;				//但此时父进程依然在循环里,当i等于5是跳出
	}
	if (5 == i) {				//父进程执行
		sleep(5);
		printf("I'm parent \n");
	}
	else {						//子进程执行
		sleep(i);
		printf("I'm %dth child", i + 1);
	}

	return 0;
}

输出结果如下:
在这里插入图片描述

循环创建N个子线程

函数原型:int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*start_rountn)(void *), void *arg);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>

void sys_err(char* str)
{
	perror(str);
	exit(-1);
}

void* tfn(void* arg)
{
	long i = (long)arg;
	sleep(i);
	printf("----I'm %ld th thread:pid = %d, tid = %lu\n",i+1, getpid(), pthread_self());
	
	return NULL;
}

int main(int argc, char* argv[])
{
	long i;
	int ret;
	pthread_t tid;
	for (i = 0; i < 5; i++) {
		ret = pthread_create(&tid, NULL, tfn, (void *)i);
		if (ret != 0) {
			sys_err("pthread_create error");
		}
	}

	sleep(i);
	printf("main: I'm Main. pid = %d, tid = %lu\n", getpid(), pthread_self());

	return 0;
}

输出结果如下
在这里插入图片描述
进程和线程的控制原语区别:
1、创建进程使用fork()函数;创建线程使用pthread_create()函数
2、获取进程ID,getpid()函数;获取线程,pthread_self()函数
3、退出进程exit();退出线程pthread_exit()
4、回收进程wait()/waitpid();回收线程pthread_join()
5、杀死进程kill();杀死线程pthread_cancel()
6、分离线程pthread_detach()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值