Linux 之进程概念:>>

2019-07-14 12:37发布

基本概念:>> 一.描述进程: '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 '系统调用' :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 #include /* 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!! "); return -1; } else if(pid == 0) { //子进程 printf("this is child!!! %d ", getpid()); } else { //父进程 printf("this is parent!!! %d ", getpid()); } while(1){ printf("pid:%d neihoua!!!:%d ", getpid(), value); sleep(1); } printf("Hello world "); return 0; } main.c #include #include int main() { pid_t pid = getpid(); printf("current process id:%d ", pid); while(1) { sleep(1); } printf("Hello world "); return 0; }