栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux系统编程-进程

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux系统编程-进程

CPU

存储是越靠近CPU速度越快,容量越小
网络->硬盘->内存->缓存(缓存中还分等级)->寄存器(4byte(32位,1byte = 8 bit,32/8=4))

CPU中有预取器(取指令)->译码器(就是个翻译官)->ALU(算数逻辑单元(只能做加法和左移))->最后到寄存器然后在缓存等等到磁盘

MMU(大小是4K)

将虚拟地址映射到物理地址上

MMU会把内存分级,常规等级,还有系统等级(当然这个是我说的,不过分级是真的存在)

内核

内核(操作系统)在内存中只有一份(内核是共享的),管理进程控制(PCB(一个结构体)),也就是说不同进程之间在内存中,使用的是同一个内核.从而进行进程见通信

进程和程序

程序磁盘上的一个可执行文件

进程:运行中的程序,占用系统资源CPU,内存等

并发

操作系统一个时间段有多个进程,但是一个时刻上只会有要给进程执行.
之所以能同时进行几个程序,是因一个进程,分成几个时间片,然后分段执行(分时复用)(当然了,CUP的速度看起来就是一起执行的),如今就更方便了,都是几核的CUP-_-

单道程序设计

所有进程排队执行,已淘汰(dos)

也就是串行,一个一个执行

多道程序设计

几个进程,相互交替执行运行

结合到如今的CPU也就是真的并行,可以同一时间段同时处理N条指令(但是并发和并行并不一样)
并发就是一起出发,但是到达终点的顺序可以有先后
并行就是同时出发同时到达终点

时钟中断

在一个进程获得CPU开始,经过一个时间单位系统会强制让该进程让出CUP资源

进程控制块(PCB)

/usr/src/linuxxxxx/include/linux/sched.h中可以查看struct task_struct结构定义(PCB进程块所代表的结构体)

这个结构体很大很大很大具体就不谈了

进程ID(每个进程都有唯一的ID,是一个非负整数(C中用pid_t表示))

进程状态(就绪(等待CPU分配时间片(就绪中包含初始)),运行,挂起(挂起的时候会主动放弃CPU(等待除CUP之外的资源)),终止)

信号相关信息等等

常用环境变量

命令 env可以列出所有环境变量

fork(创建子进程) 头文件

#include
#include

原型

pid_t fork(void);

pid_t 就是一个非负的整数

返回值

创建子进程相当于复制一份父进程
只是创建子进程之前的指令,以被父进程执行完
子进程无法执行,创建子进程后的命令父子进程一起执行
执行结束后,子进程返回0,父进程返回子进程ID

成功返回0和子进程ID
失败返回-1,设置errno

案例
#include 
#include 
#include 

using namespace std;

int main(int argc, char** argv)
{
	cout << "1" << endl;
	cout << "2" << endl;
	cout << "3" << endl;
	cout << "4" << endl;
	cout << "5" << endl;

	// 创建子进程
	pid_t pid = fork();
	if (pid == -1)
	{
		perror("pid_t pid = fork();");
		exit(1);
	}
	// 大于0是父进程的返回值,也就是子进程的pid
	else if (pid > 0)
	{
		cout << "parent process return " << pid << endl;
	}
	else if (pid == 0)
	{
		cout << "child process return " << pid << endl;
	}

	cout << "6" << endl;
	cout << "7" << endl;
	cout << "8" << endl;

	return 0;
}

 getpid/getppid(获得进程id/获得父进程id) 头文件

#include
#include

原型

pid_t getpid(void);
pid_t getppid(void);

返回值

getpid 返回当前进程id

getppid 返回父进程id

该函数不会返回失败

案例
#include 
#include 
#include 

using namespace std;

int main(int argc, char** argv)
{
	cout << "1" << endl;
	cout << "2" << endl;
	cout << "3" << endl;
	cout << "4" << endl;
	cout << "5" << endl;

	// 创建子进程
	pid_t pid = fork();
	if (pid == -1)
	{
		perror("pid_t pid = fork();");
		exit(1);
	}
	// 大于0是父进程的返回值,也就是子进程的pid
	else if (pid > 0)
	{
		cout << "process id " << getpid() << endl;
		cout << "parent process id " << getppid() << endl;
		cout << "parent process return " << pid << endl;
	}
	else if (pid == 0)
	{
		cout << "process id	" << getpid() << endl;
		cout << "parent process id " << getppid() << endl;
		cout << "child process return " << pid << endl;
	}

	cout << "6" << endl;
	cout << "7" << endl;
	cout << "8" << endl;

	return 0;
}

 

 父进程的父进程是bash,这个很好理解,就是当前进程(程序)也就是bash进程中的子程序(进程)

循环创建多个子进程,子进程父进程的顺序是不固定(因为并发)

案例
#include 
#include 
#include 

using namespace std;

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

	// 直接循环创建 会创建2的n次方-1 减的是父进程
	for (int i = 0; i < 5; i++)
	{
		pid = fork();
		if (pid == 0)
		{
			cout << "process " << i + 1 << endl;
		}
	}

	return 0;
}

我这里程序无法退出,但是这个不绝对,造成这种情况的原因是时间片的争抢

案例
#include 
#include 
#include 

using namespace std;

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

	// 直接循环创建 会创建2的n次方-1 减的是父进程
	for (i = 0; i < 5; i++)
	{
		pid = fork();
		if (pid == 0)
		{
			// 父进程创建五个子进程,子进程直接退出
			// 这样确保是五个进程
			break;
		}
	}
	if (pid > 0)
	{
		cout << "parent process" << endl;
	}
    if(pid == 0)
    {
        cout << "child process " << i+1 << endl;
    }

	return 0;
}

原理一样,就是因为父子进程之间相互争抢时间片

案例
#include 
#include 
#include 

using namespace std;

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

	// 直接循环创建 会创建2的n次方-1 减的是父进程
	for (i = 0; i < 5; i++)
	{
		pid = fork();
		if (pid == 0)
		{
			// 父进程创建五个子进程,子进程直接退出
			// 这样确保是五个进程
			break;
		}
	}
	if (pid > 0)
	{
		cout << "parent process" << endl;
		// 可以让父进程最后退出
		sleep(1);
	}
	if (pid == 0)
	{
		cout << "child process " << i + 1 << endl;
	}

	return 0;
}

最终案例
#include 
#include 
#include 

using namespace std;

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

	// 直接循环创建 会创建2的n次方-1 减的是父进程
	for (i = 0; i < 5; i++)
	{
		pid = fork();
		if (pid == 0)
		{
			// 父进程创建五个子进程,子进程直接退出
			// 这样确保是五个进程
			break;
		}
	}
	if (pid > 0)
	{
		// 可以让父进程最后退出
		// 循环五次嘛 五秒之后父进程退出
		sleep(5);
		cout << "parent process" << endl;
	}
	if (pid == 0)
	{
		// 一秒输出一个
		sleep(i);
		cout << "child process " << i + 1 << endl;
	}

	return 0;
}
进程共享

不同处:进程id, fork返回值, 父进程ID, 进程运行时间(父进程一直运行,子进程在fork之后), 闹钟(定时器), 未决信号集

进程间读时共享,写时复制

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/613855.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号