进程 线程

本文详细介绍了Linux下的进程和线程。进程是资源分配的最小单位,包括交互进程、批处理进程和守护进程。创建守护进程涉及fork、setsid等步骤。进程状态包括运行态、等待态、停止态和死亡态。进程间通信方法包括传统Unix通信、SystemV通信,如无名管道、有名管道、消息队列、共享内存和信号量。线程是轻量级进程,使用多线程可以提高效率,线程间通信可通过互斥锁、信号量等方式实现。
摘要由CSDN通过智能技术生成

一、进程

1.1什么是进程

进程与程序的区别:

程序:

     静态的,存储在磁盘上的指令的有序集合

进程:

     正在运行的程序,动态的,创建进程,进程运行,进程消亡.进程是资源分配的最小单位

Linux为了更好的管理进程,每个进程都有独立的资源空间 (4G ---->虚拟资源空间),

资源空间分为两部分:1G内核空间资源和3G用户空间资源

内核空间资源:这部分资源在进程退出时,必须由另一个进程(父进程)来回收该资源,否则该进程成为僵尸进程

用户空间资源:堆区,栈区,全局区,常量区,数据段,代码段等 当进程退出时,该资源会自动释放

1.2如何查看进程

Windows: ctrl+alt+Del

linux:ps -aux

           ps -ef

           top

           pstree

           kill -l

1.3进程的分类

(1)交互进程 (既可以在前台运行,也可以在后台运行)

(2)批处理进程(一般不接触,不做介绍)gcc编译器

(3)守护进程

1.特点:

(1).守护进程,也就是通常所说的Daemon进程,是Linux三种进程之一,通常在系统启动时运行,在系统关闭时结束.

(2).始终运行在后台,后台服务进程

(3).独立于任何终端(和终端无关)。

(4).周期性地执行某种任务或等待处理特定事件。

2.会话

 Linux是以会话(session),进程组的方式管理进程.每个进程属于一个进程组,子进程同属于该进程组.

会话是由一个或者多个进程组的集合,通常用户打开一个终端,系统就会创建一个会话,所有通过该终端运行都属于这个会话,shell进程--->会话组的组长,一个会话最多打开一个控制终端,当控制终端结束时,所有的进程也跟着结束。

3.创建守护进程

(1)创建子进程,父进程退出 fork()

(2)创建新的会话 setsid()

(3)修改工作目录 chdir()

(4)修改文件掩码  umask()

(5)关闭从父进程继承下来的文件描述符

        int i=0;

        for(i=0;i<getdtablesize();i++)

        {

                      close(i);

        }

(6)周期性的执行某种任务

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>

int main()
{
	//1.创建子进程,父进程退出fork()
	//2.创建新的会话 setsid()
	//3.修改文件目录 chdir()
	//4.修改文件掩码  umask()
	//5.关闭从父进程继承下来的文件描述符 getdtablesize()
	//6.周期性的每隔5秒写入你的系统时间
	

	//1.创建子进程,父进程退出fork()
	pid_t pid;
	pid=fork();

	if(pid<0)
	{
		perror("fork error");
		return -1;
	}
	else if(pid>0)
	{
		exit(0);
	}
	//2.创建新的对话
	if(setsid()<0)
	{
		perror("setsid error");
		return -1;
	}
	//3.修改文件目录
	chdir("/tmp");
	//4.修改文件掩码 umask()
	umask(0);
	//5.关闭从父进程继承下来的文件描述符 getdtablesize()
	int i=0;
	for(i=0;i<getdtablesize();i++)
	{
		close(i);
	}
	//6.周期性的每隔5秒写入你的系统时间
    while(1)
	{
		system("date >> 2.txt");
		sleep(5);
	}

	return 0;

}

1.4进程的状态

1.运行态/就绪态:    进程正在运行,或者准备运行 R    running or runnable (on run queue)

2.等待态(阻塞态):    进程在等待一个事件的发生或某种系统资源   

    可中断的等待态    S

不可中断的等待态  D

3.停止态   进程被中断  T

4.死亡态   X (僵尸态Z) 已终止进程,但内核空间资源没有被回收,僵尸态

1.5进程的相关函数 

1.进程的创建

(1)用fork() 创建

 子进程几乎复制了父进程所有的资源,如栈区,堆区,数据段,

(2)用vfork()创建

vfork也创建新进程,但不产生父进程的副本, 它通过允许父子进程可访问相同物理内存从而伪装了对进程地址空间的真实拷贝,当子进程需要改变内存中数据时才拷贝父进程。这就是著名的“写操作时拷贝”(copy-on-write)技术

forkvfork区别:

1.数据段不同

fork(): 子进程拷贝父进程的数据段,代码段

vfork():子进程与父进程共享数据段.

2.执行次序不同

fork(): 父子进程的执行次序不确定.

vfork():保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。

父子进程:

(1).父子进程执行顺序不确定,看内核的调度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

じ刂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值