linux进程


unistd.h 是  C 和  C++ 程序设计语言中提供对  POSIX 操作系统  API 的访问功能的 头文件对于类 Unix 系统,unistd.h 中所定义的接口通常都是大量针对 系统调用 的封装( 英语 :wrapper functions),如 fork、pipe 以及各种  I/O  原语(read、write、close 等等)。
sys/types.h中文名称为基本系统 数据类型 在应用程序源文件中包含 <sys/types.h> 以访问 _LP64 和 _ILP32 的定义。此头文件还包含适当时应使用的多个基本派生类型。尤其是以下类型更为重要:
caddr_t 核心地址。
clock_t 表示系统时间(以 时钟周期为单位)。
comp_t 压缩的时钟滴答。
dev_t 用于设备号。
fd_set 文件描述集。
fpos_t 文件位置。
gid_t  数组值ID。
ino_t i节点编号。
off_t 用于文件大小和 偏移量
mode_t 文件类型,文件创建模式。
 pid_t进程ID和进程组ID
ptrdiff_t 是一种带符号 整型,用于对两个指针执行减法运算后所得的结果。
rlim_t 资源限制;
size_t 反映内存中对象的大小(以 字节为单位)。
ssize_t 供返回字节计数或错误提示的函数使用。
time_t 以秒为单位计时。
uid_t 数值用户ID。
wchar_t 能表示所有不同的字符码。
所有这些类型在 ILP32 编译环境中保持为 32 位值,并会在 LP64 编译环境中增长为 64 位值。
一、启动一个新进程

Fork创建新的进程。新进程几乎与原进程一模一样的,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。



代码如下:

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

int main()
{
	pid_t pid;
	char * message;
	int n;
	
	printf("fork program starting\n");
	pid = fork();
	switch(pid)
	{
	case -1:
	    perror("fork failed");
	    exit(1);
	case 0:
	    message = "This is the child";
	    n = 5;
	    break;
	default:
	    message = "This is the parent";
	    n = 3;
	    break;
	}
	
	for(; n > 0; n--) {
		puts(message);
		sleep(1);
	}
	exit(0);




}

执行结果如下:



 二、等待一个进程

 wait系统调用将暂停父进程直到它的子进程结束为止。这个调用返回子进程的PID,它通常是已经结束运行的子进程的PID。

sys/wait.h 文件中包含了一些宏,WIFEXITED(stat_val) 表示 如果子进程正常结束,它就取一个非零值。WEXITSTATUS(stat_val)表示如果WIFEXITED非零,它返回子进程的退出码。


代码如下:

#include <sys/types.h>
#include <sys/wait.h>

#include <unistd.h>
#include <stdio.h>

int main()
{
	pid_t pid;
	char * message;
	int n;
		
	int exit_code;
	
	printf("fork program starting \n");
	pid = fork();
	switch(pid)
	{
		case -1:
		    perror("fork failed");
		    exit(1);
		case 0:
		    message = "This is the child";
 		    n = 5;
		    break;
		default:
		    message = "This is the parent";
		    n = 3;
		    break;
	}
	for(; n > 0; n--) {
		puts(message);
		sleep(1);
	}
	// 此部分等待子进程完成
	if(pid != 0) {
		int stat_val;
		pid_t child_pid;
		
		child_pid = wait(&stat_val);
		printf("Child has finished: PID = %d\n", child_pid);
		if(WIFEXITED(stat_val))
			printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
		else
			printf("Child terminated abnormally\n");
	}
	printf("before exit\n");
	exit(exit_code);
}

执行结果如下:



第一个"before exit"由子进程打印,第二个“before exit”由父进程打印。

 

 

三、僵尸进程

个进程在调用exit命令结束自己的生命的时候,其实

linux中的僵尸进程

linux中的僵尸进程

它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的 数据结构 (系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。

在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,

子进程终止时,它与父进程之间的关联还会保持,直到父进程也正常终止或父进程调用wait才告结束。因此,进程表中代表子进程的表象不会立刻释放。虽然子进程已经不再运行,但它仍然存在与系统中,因为它的退出码还需要保存起来以备父进程今后的wait调用使用。这是它将成为一个僵尸进程。

 

 

 

 


深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值