Linux 之进程概念:>>

版权声明: https://blog.csdn.net/qq_41880190/article/details/83827962
基本概念:>>
	
	一.描述进程: 'PCB -- {描述进程}'
		Linux 下这个结构的名字叫做 task_struct
	1.什么是进程?
	:进程就是运行起来的一个程序
	,站在操作系统的角度下进程就是一个 PCB 
	,在 Linux 系统下用 结构体 task_struct 描述进程

	
	
****Linux 下关于进程的命令{
		:ls /proc/ '包含所有进程信息'	以进程 id 命名
		,ps aux '查看所有进程'
		,ps -ef | grep exe '查看可执行程序 exe 的进程'
		,head -n 50 | tail -n 1
		,top 'Linux 下查看资源管理器  动态刷新'
		ps -l '查看进程优先级'{
			:PRI '优先级'
			,NI 'nice 值' 调整优先级的参数  'PRI 与 nice 相加'
			,UID 执行者的身份
			,PRI 值越小优先级更高   PRI(new) = PRI(old) + nice
		};
		nice -n 5 ./main
		renice -n 10 -p 666 '设置优先级' 
		pe -efl
		
		top '修改已存在进程的 nice 值'
		echo $PATH '查看系统环境变量'
		export '声明变量'
		export MYVALUE = 1;
		env
		unset MYVALUE '干掉环境变量' 删除
		查看环境变量{
			:env
			,set
			
			
		};
		
	};
	
	
	
****Linux 下关于进程的函数{
		#include <unistd.h> '系统调用'
		:getpid() '获取进程 ID ' 返回类型 'pid_t'
		,fork() '创建进程'
		*##*fork() 的返回值  '做子进程与父进程的分流'{
		
			pid_t pid = fork();
			if(pid < 0){
				return -1;
			}
			else if(pid == 0){
				'子进程'
				}
			else{
			'父进程'
			}
			,pid '子进程 ID' ppid '父进程 id' 
			操作系统以父进程为模板创建子进程
				,父子进程代码段相同
				,但是书据各自独有
			fork 的返回值起到分流的作用
			通过 fork 的返回值来进行判断哪个是父进程
			,哪个是子进程
			对于父进程来说返回值是子进程 id 
			对于子进程返回的是 0 值
			出错没有子进程 返回值 -1
			
			'复制的是 PCB' 内存指针
			
			
			
			
		}
	};
	
	二.进程状态:{
		R(running)/* 0 */
		S(sleeping)/* 1 */
		D(disk sleep)/* 2 */不可中断睡眠状态,唤醒方式特殊
		T(stopped)/* 4 */睡眠状态,停止状态 
		Z(zombie)/* 32 */僵尸状态
	};'进程状态略看'
	僵尸进程:
		产生原因:	
		0.子进程先于父进程退出
		1.子进程退出为了保存自己退出的原因
		,因此这个退出后资源不会被完全释放
		,等待父进程来获取推出状态,然后释放紫子进程所有资源
		2.假如父进程没有关心子进程的退出
		,那么这个时候这个退出的子进程将成为一个僵尸进程
		,占据着系统资源而不释放
		危害:资源泄露,正常进程可能无法创建
	孤儿进程 '后台运行'
三.进程优先级.
	交互式进程:
	
****如何将一个进程绑定在某个 CPU 核心上运行{进程独占 CPU 核心}'
	数据 拷贝到 寄存器'
	每个 CPU 核心可以独自运行
	
	批处理进程:
	竞争性,独立性,并行,并发
	
	环境变量:>
	PATH 
	echo $PATH '打印环境变量'
	环境变量具有全局性;
		程序地址空间:

                +---------------------------+    
                +---------------------------+
                |                                  |
                +---------------------------+
                | 命令行参数环境变量 |
                +---------------------------+
                |             栈区              |
                +---------------------------+
                |                \/                |
                +---------------------------+
                |            共享区           |
                +---------------------------+
                |                 /\               |
                +---------------------------+
                |              堆区             |
                +---------------------------+
                | 未初始化全局数据区 |
                +---------------------------+
                |                                  |
                |  初始化全局数据段   |
                +---------------------------+
                |            代码段           |
                +---------------------------+
                +---------------------------+

进程地址空间:>> 虚拟地址空间
			页表:
				:记录虚拟地址空间与物理地址之间的映射关系
$$$$****进程调度队列:{
			:CPU 如何调度;
			,调度的是什么
			,调度 PCB 
			,调度队列里面存放着 结构体:
		
		
		}
		
		
		
		
****Makefile 文档替换
	all:fork
	main:main.c
		gcc $^ -o $@
	fork:fork.c
		gcc $^ -o $@
	:nums/main/fork/g
	

有关代码:

#include <stdio.h>
#include <unistd.h>
/*
namespace N
{
    int value = 100;
}
*/
//int value = 100;
int main()
{
    int value = 100;
    pid_t pid = fork();
    if(pid < 0)
    {
        printf("create child process failed!!\n");
        return -1;
    }
    else if(pid == 0)
    {
        //子进程
        printf("this is child!!! %d\n", getpid());
    }
    else
    {
        //父进程
        printf("this is parent!!! %d\n", getpid());
    }
    while(1){
        printf("pid:%d neihoua!!!:%d\n", getpid(), value);
        sleep(1);
    }
    printf("Hello world\n");
    return 0;
}

main.c

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

int main()
{
    pid_t pid = getpid();
    printf("current process id:%d\n", pid);
    while(1)
    {
        sleep(1);
    }
    printf("Hello world\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41880190/article/details/83827962