系统编程之进程控制编程(一)
来源:互联网 发布:星际老男孩的淘宝店 编辑:程序博客网 时间:2024/06/06 14:23
1、进程与程序的区别
程序:放到磁盘的可执行文件。
进程:程序执行的实例(正在执行的程序)。
2、进程
每个进程都有自己的地址空间和执行状态。
地址空间:从低地址到高地址依次为代码段、数据段、堆、堆栈。
3、执行状态:
执行:进程正在占用CPU。
就绪:进程已具备一切条件,等待分配CPU。
阻塞:进程不能使用CPU,若等待的事件发生则可将其唤醒。
4、进程ID(PID):每个进程都有一个ID(ID是一个正整数),唯一标识了系统中的这个进程。
父进程ID(PPID):每个进程都有一个创建它的进程,叫父进程。
启动进程的用户ID(UID)。
所有进程的祖先是init进程,其PID为1。
在Linux终端可以使用ps -ef或ps aux的命令查看进程(ps -ef | grep 进程名,可以选择你需要查看的进程),pstree命令可以查看进程的树状图。
#include <sys/types.h>#include <unistd.h>#include <stdio.h>int main(){printf("当前进程PID = %d\n",getpid());printf("父进程 PPID = %d\n",getppid());printf("当前用户UID = %d\n",getuid());while(1); return 0;}
root用户的用户ID为0。
5、进程特点:
动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行。
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
结构特征:进程由程序、数据和进程控制块三部分组成.。
6、进程互斥:
进程互斥是指当有若干进程都要使用某一共享资源时,任何时候最多允许一个进程使用,其他要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。
7、临界资源:
操作系统中将一次只允许一个进程访问的资源称为临界资源。
8、临界区:
进程中访问临界资源的那段程序代码称为临界区。为实现对临界资源的互斥访问,应保证诸进程互斥的进入各自的临界区。
9、进程同步:
一组并发进程按一定的顺序执行的过程称为进程间的同步。
具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。
10、进程调度:
先来先服务调度算法First-Come,First-ServedScheduling(FCFS)。
先来先服务调度算法First-Come,First-ServedScheduling(FCFS)。
基于优先级调度 (Priority Scheduling)。
循环调度(Round-RobinScheduling(RR))或时间片轮转法。
11、进程死锁:
多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进。
12、进程创建fork():
头文件:#include <unistd.h>
函数原型:pid_t fork(void);
功能:创建子进程。
返回值:在父进程中,fork返回新创建的子进程的PID;在子进程中,fork返回0;如果出现错误,fork返回一个负值。
#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <stdio.h>int main(){pid_t pid = fork();//创建子进程if(pid < 0)//出错{perror("fork");return -1;}else if(pid > 0)//在父进程中{printf("我是父进程pid = %d\n",pid);}else//在子进程中{printf("我是子进程pid = %d\n",pid);}while(1); return 0;}
说明:
当fork()顺利完成任务时,就会存在两个进程,每个进程都从fork()返回处开始继续执行。
两个进程执行相同的代码(text)段,但是有各自的堆栈(stack)段、数据(data)段以及堆(heap)。
子进程的stack、data、heap segments是从父进程拷贝过来的。
fork()之后,哪一个进程先执行(scheduled to use the CPU)不确定。
13、思考题:
#include <sys/types.h>#include <unistd.h>#include <stdio.h>int main(){fork();fork() && fork() || fork();fork();printf("fork\n");while(1); return 0;}以上代码执行后一共有多少个进程?
答案是20个。
14、进程创建vfork():
#include <sys/types.h>#include <unistd.h>#include <stdlib.h>#include <stdio.h>int main(){int count = 0;pid_t pid = vfork();if(pid < 0)//出错{perror("vfork");return -1;}count++;if(pid > 0) //父进程{printf("父进程中:pid = %d,count = %d\n",pid,count);}else //子进程{printf("子进程中:pid = %d,count = %d\n",pid,count);while(1);exit(0);} return 0;}
说明:
vfork的子进程必须要显示调用exit(),否则会出现段错误。
vfork进程和父进程共享数据。
vfork的子进程先于父进程执行,子进程执行完,CPU才能调度到父进程。
- 系统编程之进程控制编程(一)
- Linux系统编程--进程控制(一)
- 系统编程之进程控制
- 系统编程之进程控制编程(二)
- Linux系统编程学习之《进程控制》
- 嵌入式LinuxC编程之进程控制(一)
- linux系统编程之进程(一):进程基本概述
- linux系统编程之进程(一):进程与程序
- linux系统编程之进程(一):进程与程序
- linux系统编程之进程(一):进程基本概述
- linux系统编程之进程(二):进程生命周期与PCB(进程控制块)
- linux系统编程之进程(二):进程生命周期与PCB(进程控制块)
- linux系统编程之进程(二):进程生命周期与PCB(进程控制块)
- Linux编程之进程控制(1)
- linux系统编程之进程(五):终端、作业控制与守护进程
- Linux系统编程(8)—— 进程之进程控制函数fork
- Linux系统编程(9)—— 进程之进程控制函数exec系列函数
- linux系统编程之进程(五):终端、作业控制与守护进程
- 在VC下执行DOS命令
- C++中的static关键字的总结
- 基础知识
- 51NOD-最长公共子序列问题
- 随感
- 系统编程之进程控制编程(一)
- Gym
- 排队的奶牛(Cows in a Row)
- 2017 Multi-University Training Contest 5
- Jacoco & Cobertura代码覆盖率分析对比
- Debug 技巧整理(持续更新)
- mapReduce中重要参数调优
- [HDU
- 线程与进程